feat: Add Logos page, refactor Testimonials to RelationManager, and improve designs
This commit is contained in:
@@ -71,12 +71,6 @@ class BlogForm
|
|||||||
->disk('public')
|
->disk('public')
|
||||||
->directory('blogs/featured')
|
->directory('blogs/featured')
|
||||||
->visibility('public')
|
->visibility('public')
|
||||||
->imageEditor()
|
|
||||||
->imageEditorAspectRatios([
|
|
||||||
'16:9',
|
|
||||||
'4:3',
|
|
||||||
'1:1',
|
|
||||||
])
|
|
||||||
->helperText(__('blog.featured_image_helper'))
|
->helperText(__('blog.featured_image_helper'))
|
||||||
->columnSpanFull(),
|
->columnSpanFull(),
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,12 +21,6 @@ class PageSettingsSection
|
|||||||
->disk('public')
|
->disk('public')
|
||||||
->directory('pages/featured')
|
->directory('pages/featured')
|
||||||
->visibility('public')
|
->visibility('public')
|
||||||
->imageEditor()
|
|
||||||
->imageEditorAspectRatios([
|
|
||||||
'16:9',
|
|
||||||
'4:3',
|
|
||||||
'1:1',
|
|
||||||
])
|
|
||||||
->helperText(__('pages.featured_image_helper_text'))
|
->helperText(__('pages.featured_image_helper_text'))
|
||||||
->columnSpanFull(),
|
->columnSpanFull(),
|
||||||
|
|
||||||
@@ -70,6 +64,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
$settings = $this->getSettings();
|
||||||
|
|
||||||
|
$page = Page::with(['headerTemplate', 'footerTemplate'])
|
||||||
|
->where('is_homepage', true)
|
||||||
|
->where('status', 'published')
|
||||||
|
->latest('updated_at')
|
||||||
|
->first();
|
||||||
|
|
||||||
// 1. Statik "home" Template Kontrolü
|
// 1. Statik "home" Template Kontrolü
|
||||||
if (view()->exists('templates.home')) {
|
if (view()->exists('templates.home')) {
|
||||||
$page = Page::with(['headerTemplate', 'footerTemplate'])
|
return $this->renderView('templates.home', $page, $settings);
|
||||||
->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) {
|
// Hiç sayfa yoksa fallback
|
||||||
$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'])
|
|
||||||
->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;
|
|
||||||
|
|
||||||
// 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,8 +65,72 @@ 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render a page with full dynamic logic
|
||||||
|
*/
|
||||||
|
protected function renderPage(Page $page, $settings)
|
||||||
|
{
|
||||||
|
$template = $page->template
|
||||||
|
?? (($page->is_homepage ?? false) ? 'home' : 'generic');
|
||||||
|
|
||||||
|
$view = view()->exists("templates.$template")
|
||||||
|
? "templates.$template"
|
||||||
|
: 'templates.generic';
|
||||||
|
|
||||||
|
return $this->renderView($view, $page, $settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shared rendering logic for both static and dynamic templates
|
||||||
|
*/
|
||||||
|
protected function renderView(string $view, ?Page $page, $settings)
|
||||||
|
{
|
||||||
|
$renderedHeader = null;
|
||||||
|
$renderedFooter = null;
|
||||||
|
|
||||||
|
if ($page) {
|
||||||
|
$renderedHeader = $this->renderHeader($page, $settings);
|
||||||
|
$renderedFooter = $this->renderFooter($page, $settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
return view($view, [
|
||||||
|
'page' => $page,
|
||||||
|
'settings' => $settings,
|
||||||
|
'sections' => $page ? ($page->parsed_sections ?? $page->sections ?? $page->data ?? []) : [],
|
||||||
|
'templatedSections' => $page ? ($page->templated_sections ?? collect([])) : collect([]),
|
||||||
|
'renderedHeader' => $renderedHeader,
|
||||||
|
'renderedFooter' => $renderedFooter,
|
||||||
|
'meta' => $this->getMeta($page, $settings),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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')
|
$metaTitle = method_exists($page, 'translate')
|
||||||
? ($page->translate('meta_title') ?: $page->translate('title'))
|
? ($page->translate('meta_title') ?: $page->translate('title'))
|
||||||
: ($page->meta_title ?? $page->title ?? null);
|
: ($page->meta_title ?? $page->title ?? null);
|
||||||
@@ -330,100 +139,80 @@ class PageController extends Controller
|
|||||||
? ($page->translate('meta_description') ?: ($page->excerpt ?? null))
|
? ($page->translate('meta_description') ?: ($page->excerpt ?? null))
|
||||||
: ($page->meta_description ?? $page->excerpt ?? null);
|
: ($page->meta_description ?? $page->excerpt ?? null);
|
||||||
|
|
||||||
// Use parsed_sections for easier template usage (key-value format)
|
if ($page->featured_image) {
|
||||||
$sections = $page->parsed_sections ?? $page->sections ?? $page->data ?? [];
|
$metaImage = asset('storage/' . $page->featured_image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Yeni dinamik template sistemi için sections_data varsa onu da al
|
return [
|
||||||
$templatedSections = $page->templated_sections ?? collect([]);
|
'title' => $metaTitle ?: ($settings->default_meta_title ?? config('app.name')),
|
||||||
|
'description' => $metaDescription ?: ($settings->default_meta_description ?? null),
|
||||||
// Template belirleme mantığı:
|
'image' => $metaImage,
|
||||||
// 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
|
|
||||||
?? (($slug === 'home' || ($page->is_homepage ?? false)) ? 'home' : 'generic');
|
|
||||||
|
|
||||||
$view = view()->exists("templates.$template")
|
|
||||||
? "templates.$template"
|
|
||||||
: 'templates.generic';
|
|
||||||
|
|
||||||
// Render Header Template
|
|
||||||
$renderedHeader = null;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render header template
|
||||||
|
*/
|
||||||
|
protected function renderHeader(Page $page, $settings)
|
||||||
|
{
|
||||||
// 1. Önce özel blade dosyası var mı kontrol et
|
// 1. Önce özel blade dosyası var mı kontrol et
|
||||||
if (!empty($page->custom_header_blade) && view()->exists($page->custom_header_blade)) {
|
if (!empty($page->custom_header_blade) && view()->exists($page->custom_header_blade)) {
|
||||||
$renderedHeader = view($page->custom_header_blade, ['page' => $page])->render();
|
return view($page->custom_header_blade, ['page' => $page])->render();
|
||||||
} else {
|
}
|
||||||
|
|
||||||
// 2. Yoksa Header Template sistemini kullan
|
// 2. Yoksa Header Template sistemini kullan
|
||||||
$headerTemplate = $page->headerTemplate;
|
$headerTemplate = $page->headerTemplate;
|
||||||
|
|
||||||
// Eğer sayfa için header seçilmemişse, en son aktif header template'i kullan
|
if (!$headerTemplate && isset($settings->default_header)) {
|
||||||
if (!$headerTemplate) {
|
$headerTemplate = HeaderTemplate::find($settings->default_header);
|
||||||
$defaultHeaderId = $settings->default_header ?? null;
|
|
||||||
if ($defaultHeaderId) {
|
|
||||||
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($headerTemplate) {
|
if ($headerTemplate) {
|
||||||
// Merge template defaults with page data (page data overrides defaults)
|
|
||||||
$templateDefaults = $headerTemplate->default_data ?? [];
|
$templateDefaults = $headerTemplate->default_data ?? [];
|
||||||
$pageData = $page->header_data ?? [];
|
$pageData = $page->header_data ?? [];
|
||||||
$mergedHeaderData = array_merge($templateDefaults, $pageData);
|
$mergedHeaderData = array_merge($templateDefaults, $pageData);
|
||||||
|
|
||||||
$renderedHeader = TemplateService::replacePlaceholders(
|
return TemplateService::replacePlaceholders(
|
||||||
$headerTemplate->html_content,
|
$headerTemplate->html_content,
|
||||||
$mergedHeaderData,
|
$mergedHeaderData,
|
||||||
$page
|
$page
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render Footer Template
|
/**
|
||||||
$renderedFooter = null;
|
* Render footer template
|
||||||
|
*/
|
||||||
|
protected function renderFooter(Page $page, $settings)
|
||||||
|
{
|
||||||
// 1. Önce özel blade dosyası var mı kontrol et
|
// 1. Önce özel blade dosyası var mı kontrol et
|
||||||
if (!empty($page->custom_footer_blade) && view()->exists($page->custom_footer_blade)) {
|
if (!empty($page->custom_footer_blade) && view()->exists($page->custom_footer_blade)) {
|
||||||
$renderedFooter = view($page->custom_footer_blade, ['page' => $page])->render();
|
return view($page->custom_footer_blade, ['page' => $page])->render();
|
||||||
} else {
|
}
|
||||||
|
|
||||||
// 2. Yoksa Footer Template sistemini kullan
|
// 2. Yoksa Footer Template sistemini kullan
|
||||||
$footerTemplate = $page->footerTemplate;
|
$footerTemplate = $page->footerTemplate;
|
||||||
|
|
||||||
// Eğer sayfa için footer seçilmemişse, en son aktif footer template'i kullan
|
if (!$footerTemplate && isset($settings->default_footer)) {
|
||||||
if (!$footerTemplate) {
|
$footerTemplate = FooterTemplate::find($settings->default_footer);
|
||||||
$defaultFooterId = $settings->default_footer ?? null;
|
|
||||||
if ($defaultFooterId) {
|
|
||||||
$footerTemplate = FooterTemplate::find($defaultFooterId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($footerTemplate) {
|
if ($footerTemplate) {
|
||||||
// Merge template defaults with page data (page data overrides defaults)
|
|
||||||
$templateDefaults = $footerTemplate->default_data ?? [];
|
$templateDefaults = $footerTemplate->default_data ?? [];
|
||||||
$pageData = $page->footer_data ?? [];
|
$pageData = $page->footer_data ?? [];
|
||||||
$mergedFooterData = array_merge($templateDefaults, $pageData);
|
$mergedFooterData = array_merge($templateDefaults, $pageData);
|
||||||
|
|
||||||
$renderedFooter = TemplateService::replacePlaceholders(
|
return TemplateService::replacePlaceholders(
|
||||||
$footerTemplate->html_content,
|
$footerTemplate->html_content,
|
||||||
$mergedFooterData,
|
$mergedFooterData,
|
||||||
$page
|
$page
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return view($view, [
|
return null;
|
||||||
'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,
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
@@ -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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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!');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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'],
|
||||||
|
|||||||
Generated
+147
-115
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
</div>
|
@endforelse
|
||||||
</blockquote>
|
|
||||||
</div>
|
|
||||||
<!--/.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>
|
|
||||||
<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
@@ -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');
|
||||||
|
|||||||
Reference in New Issue
Block a user