Multi-Tenant Tema Sistemi - Kapsamli Referans Dokumani
Yeni tenant nasil olusturulur? Teknik adimlar
Central DB'de Tenant::create() ile yeni kayit olusturulur.
tenant_id, slug, data, theme_id
Benzersiz MySQL veritabani yaratilir.
tenant_[slug]_[6hex]
100+ tablo migre edilir, baslangic verileri yuklenir.
2 kullanici, 4 rol, menu yapisi
Tenant'a ozgu depolama klasorleri hazirlanir.
storage/tenant{id}/
Domain eklenince www versiyonu otomatik olusur.
example.com + www.example.com
Let's Encrypt sertifikasi senkron olusturulur.
Plesk API entegrasyonu
app/Providers/TenancyServiceProvider.php
Event yonetimi, merkezi konfigurasyon
app/Listeners/RegisterTenantDatabaseToPlesk.php
Plesk veritabani entegrasyonu
app/Listeners/RegisterDomainAliasInPlesk.php
Domain alias islemleri
app/Jobs/RenewSSLCertificate.php
SSL sertifika yenileme
Bu dokumani kullanarak tenant sitesi nasil gelistirilir?
// Bu promptu AI'ya ver:
"{domain}.tuufi.com icin tam site gelistirmesi yap.
1. OKUMA: Once {TENANT}_ICERIK.md dosyasini oku. Tum sayfa, hizmet ve icerik bilgileri burada.
2. KURALLAR: https://ixtif.com/readme/2026/01/18/tema-sistemi-analiz/ dokumanindaki TUM kurallara %100 uy.
3. TODO: Dokumandaki her bolumu TodoWrite ile listele, tamamladikca isaretle.
4. TEK DOSYA: Tema dosyalari SADECE resources/views/themes/t-{id}/ altinda. Modules icinde tema YASAK!
5. VERITABANI: Homepage haric TUM icerikler DB'ye (pages.body, services.body) HTML olarak eklenecek.
6. SECTION YAPISI: Body icerikleri full-width section'lar ile:
<section class="bg-white dark:bg-gray-900 py-12 md:py-16">
<div class="container mx-auto px-4">...</div>
</section>
7. SETTINGS: site_name, contact_phone_1, primary_color vs. tenant settings tablosuna ekle.
8. GORSELLER: Leonardo AI ile 10 Altin Kural + site rengi ile profesyonel gorseller uret.
9. CACHE: Her degisiklikten sonra php artisan cache:clear && view:clear calistir.
Bastan sona tamamla, hic bir adim atlama!"
Ipucu: {domain} ve {TENANT} yerlerine gercek degerler yaz. Ornek: ecrin.tuufi.com ve ECRIN_TURIZM_ICERIK.md
Tenant icin hazirlanmis {TENANT}_ICERIK.md dosyasini oku. Bu dosya tum sayfa iceriklerini, hizmet aciklamalarini, SSS sorularini icerir.
// Ornek dosya isimleri: ECRIN_TURIZM_ICERIK.md // Ecrin Turizm icerikleri UNIMAD_MADENCILIK_ICERIK.md // UNIMAD icerikleri YILDIRIM_PANJUR_ICERIK.md // Panjur icerikleri
Bu dokumandaki tum bolumleri TODO olarak listele. Her adimi tamamladikca isaretle. TodoWrite tool kullan!
// Todo listesi ornegi:
[ ] 1. Tema klasoru olustur (resources/views/themes/t-{id}/)
[ ] 2. Layout dosyalarini olustur (app, header, footer)
[ ] 3. Homepage.blade.php olustur
[ ] 4. Settings ayarlarini yap (site_name, contact_phone_1, vs.)
[ ] 5. Logo yukle (LogoService pattern)
[ ] 6. Page icerikleri DB'ye ekle (Hakkimizda, Iletisim, vs.)
[ ] 7. Service icerikleri DB'ye ekle (Hizmetler)
[ ] 8. Leonardo AI ile gorseller uret
[ ] 9. Dark mode test et
[ ] 10. Cache temizle ve kontrol et
Modules icinde TEMA DOSYASI OLUSTURMA! Her sey resources/views/themes/t-{id}/ icinde olacak.
YAPMA!
Modules/Page/views/themes/t-{id}/
DOGRU!
resources/views/themes/t-{id}/
Homepage haric TUM icerikler veritabanindan cekilecek. Page ve Service modullerini kullanarak icerikleri DB'ye ekle.
// Tenant DB'sine baglan ve icerikleri ekle: // 1. Pages tablosuna: INSERT INTO pages (title, slug, body, is_active) VALUES ('Hakkimizda', 'hakkimizda', '<HTML ICERIK>', 1), ('Iletisim', 'iletisim', '<HTML ICERIK>', 1); // 2. Services tablosuna: INSERT INTO services (title, slug, body, is_active) VALUES ('Hizmet Adi', 'hizmet-slug', '<HTML ICERIK>', 1); // Body alani Tailwind HTML icermeli!
Tenant settings tablosuna gerekli ayarlari ekle. Fallback deger KULLANMA!
// Settings tablosuna ekle: site_name = 'Ecrin Turizm' site_slogan = 'Profesyonel Tur Hizmetleri' contact_phone_1 = '+90 XXX XXX XX XX' contact_whatsapp_1 = '90XXXXXXXXXX' contact_email = 'info@ecrinturizm.com' contact_address = 'Adres bilgisi' social_instagram = 'https://instagram.com/...' social_facebook = 'https://facebook.com/...' primary_color = '#f97316' // Site ana rengi
10 Altin Kural + SITE RENGI ile profesyonel gorseller uret. ZORUNLU!
// Leonardo AI kurallari: 1. 10 Altin Kural formulunu kullan 2. Site rengini MUTLAKA detaylarda kullan (kiyafet, ekipman, aksan) 3. Gorsel boyutlari: - Hero: 1472x832 (yatay) - Service: 1024x1024 (kare) - Blog: 1472x832 (yatay) // Site rengi #f97316 ise: "...worker wearing orange safety vest..."
Bu dokumandaki tum tasarim kurallarini uygula:
Container
1280px altinda %100 + padding
Subheader
Minimal (gradient YOK)
Ikon Hover
Thin → Solid (card hover'da)
Dark Mode
FOUC prevention + Alpine state
Islem tamamlaninca cache temizle ve tum sayfalari test et.
// Cache temizleme: php artisan cache:clear php artisan view:clear php artisan responsecache:clear // Test edilecekler: [ ] Homepage gorunumu [ ] Dark/Light mode gecisi [ ] Mobil gorunum (320px - 768px) [ ] Tum sayfa linkleri [ ] Form calismalari [ ] Gorsel yuklemeleri
Modules icinde tema dosyasi
Her sey resources/views/themes/ icinde!
Standalone dosya (DOCTYPE)
Sadece @extends kullanan dosyalar!
Settings fallback deger
setting('x') ?: 'varsayilan' YAPMA!
Hardcode if/else icerik
Tum icerikler DB'den gelmeli!
Leonardo gorselsiz icerik
Her sayfa/hizmet gorsel icermeli!
Site renksiz gorsel
Leonardo'da site rengi ZORUNLU!
| Gorev | Kaynak | Dokuman Bolumu |
|---|---|---|
| Tema klasor yapisi | resources/views/themes/t-{id}/ |
Tek Dosya Prensibi |
| Sayfa icerikleri | pages.body (HTML) |
Icerik Olusturma |
| Hizmet icerikleri | services.body (HTML) |
Service Modulu |
| Gorsel uretimi | Leonardo AI |
Leonardo AI |
| Site ayarlari | settings tablosu |
Settings Pattern |
| Logo yonetimi | LogoService |
Logo Service |
Kurumsal Web Sitesi Standartlari
Profesyonel, duzenli ve sektore uygun kurumsal web sitesi.
Temiz Layout
Okunabilir Tipografi
Tutarli Spacing
Modern, profesyonel ve premium ama sakin hissettirmeli.
Tailwind CSS v4 (CDN)
Ana stil framework'u
Alpine.js
Interaktivite
Ek Kutuphaneler (Gerektiginde)
CSS custom properties (degiskenler) ile renk sistemi kur.
/* CSS Custom Properties */ :root { --color-primary: #f97316; /* Ana renk */ --color-secondary: #0ea5e9; /* Ikincil renk */ --color-accent: #8b5cf6; /* Vurgu rengi */ --color-neutral-50: #f8fafc; /* Notr tonlar */ --color-neutral-900: #0f172a; }
UYARI: Renkleri TUTUMLU kullan! Renk cumbusune cevirme. Sektore uygun ve marka renklerine uygun renk psikolojisi uygula.
FontAwesome Pro kullan:
fa-thin
fa-light
VARSAYILAN
fa-regular
fa-solid
HOVER'DA
fa-duotone
KURAL: Varsayilan ince stiller (fal), ANA CARD'a hover yapilinca solid'e (fas) gecis - animasyonlu!
Tam genislik (fluid)
max-width container icinde
Mobil Oncelikli
Mobile-first responsive
Mobil Menu
Hamburger menu
Dark/Light Mode
PREMIUM - MUTLAKA!
Header cok onemli; mumkunse mega menu yapisi olsun.
Mega menu dropdown'lari MUTLAKA parent linkin altinda ORTALI acilmali!
/* Dropdown Ortalama CSS */ .mega-dropdown { position: absolute; left: 50%; transform: translateX(-50%); }
Footer zengin olmali, asagidaki ogeleri icermeli:
Iletisim Bilgileri
Sosyal Medya
Hizli Erisim
Mini Site Haritasi
t-{id} = Tenant temasi. Sadece ozel dosyalar burada.
simple = Fallback (mevcut, zaten var). t-{id}'de yoksa buradan alir.
Ornek: t-3/homepage.blade.php var -> onu kullan, t-3/blog/show.blade.php yok -> simple'dan al
Modullerin icinde tema dosyasi OLMAYACAK! Her sey resources/views/themes/t-{id}/ icinde olacak. Anasayfa (homepage.blade.php) haric tum icerikler veritabanindan cekilecek.
// YAPMA! Modul icinde tema dosyasi Modules/Page/resources/views/themes/t-3/ Modules/Service/resources/views/themes/t-3/ Modules/Blog/resources/views/themes/t-3/ // Bu yaklasim KALDIRILDI!
// DOGRU! Tek yerde tum tema resources/views/themes/t-3/ ├── layouts/ │ ├── app.blade.php │ ├── header.blade.php │ └── footer.blade.php └── homepage.blade.php // Diger icerikler DB'den!
t-3/, t-4/, t-5/... (tenant temaları)panjur/, unimad/... (özel isimli temalar)Sebep: Fallback çalışmaz, bakım zorlaşır!
simple/ (genel fallback)ixtif/ (endüstriyel tema)muzibu/ (müzik teması)Kural: Sadece modül-generic temalar!
| Icerik | Kaynak | Dosya |
|---|---|---|
| Anasayfa | BLADE | homepage.blade.php |
| Page (Sayfalar) | DATABASE | pages tablosu |
| Service (Hizmetler) | DATABASE | services tablosu |
| Blog (Yazilar) | DATABASE | blogs tablosu |
| Portfolio | DATABASE | portfolios tablosu |
| Announcement | DATABASE | announcements tablosu |
Ikonlar varsayilan olarak thin (light) olacak. Ikon'un bulundugu ana card'a (genis alan) hover yapildiginda ikon solid olacak. Efekt net anlasilsin diye genis alan uzerinde tetiklenecek.
fa-light / fal
fa-solid / fas
/* Varsayilan: Thin (Light) ikonlar */ .card-icon { font-family: "Font Awesome 6 Pro"; font-weight: 300; /* light/thin */ transition: font-weight 0.2s ease; } /* Hover: Card'a hover yapilinca Solid */ .card:hover .card-icon, .service-card:hover .card-icon, .feature-card:hover .card-icon { font-weight: 900; /* solid */ } /* ONEMLI: Hover CARD uzerinde, ikon uzerinde degil! */
{{-- Service Card Ornegi --}} <a href="{{ $service->url }}" class="service-card group block bg-white dark:bg-gray-800 rounded-xl p-6 shadow-sm hover:shadow-lg transition-all"> {{-- Ikon: Varsayilan thin, hover'da solid --}} <div class="w-16 h-16 bg-primary-100 dark:bg-primary-900/30 rounded-xl flex items-center justify-center mb-4"> <i class="fal fa-{{ $service->icon ?? 'cog' }} text-3xl text-primary-600 card-icon group-hover:font-black"></i> </div> <h3>{{ $service->title }}</h3> <p>{{ $service->excerpt }}</p> </a> {{-- Tailwind Alternatifi (group-hover ile) --}} <i class="fal fa-cog group-hover:fas"></i>
fal
Light (300)
far
Regular (400)
fas
Solid (900)
fat
Thin (100)
Hero basliklarinda ve onemli ana basliklarda animated gradient text kullanilacak. Gradient renkleri farkli ve belirgin olmali, animasyon gorunur sekilde hareket etmeli. Renkler site temasina uygun ama birbirinden ayirt edilebilir olmali.
Renkler: Cyan → Emerald → Cyan (hareket ediyor)
#22d3ee → #34d399 → #22d3ee
Cyan → Emerald
#3b82f6 → #8b5cf6 → #ec4899
Blue → Violet → Pink
#f97316 → #eab308 → #ef4444
Orange → Yellow → Red
#10b981 → #06b6d4 → #22c55e
Emerald → Cyan → Green
/* ===== ANIMATED GRADIENT TEXT ===== */ /* Ana Gradient Text Class */ .gradient-text-animated { background: linear-gradient( 90deg, #22d3ee, /* cyan-400 */ #34d399, /* emerald-400 */ #a78bfa, /* violet-400 */ #22d3ee /* tekrar - seamless loop */ ); background-size: 300% auto; /* Genis boyut = yumusak gecis */ -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; animation: gradientFlow 4s linear infinite; } /* Alternatif: Daha hizli hareket */ .gradient-text-fast { animation: gradientFlow 2s linear infinite; } /* Alternatif: Yavas ve zarif */ .gradient-text-slow { animation: gradientFlow 6s linear infinite; } /* Keyframes */ @keyframes gradientFlow { 0% { background-position: 0% center; } 100% { background-position: 300% center; } }
{{-- Hero Section --}} <section class="min-h-screen flex items-center justify-center bg-slate-900"> <div class="text-center"> {{-- Ana Baslik: Animated Gradient --}} <h1 class="text-5xl md:text-7xl font-bold mb-6 gradient-text-animated"> {{ setting('site_name') }} </h1> {{-- Alt Baslik: Statik veya yavas gradient --}} <p class="text-xl md:text-2xl text-slate-400 mb-8"> {{ setting('site_slogan') }} </p> {{-- CTA Butonlari --}} <div class="flex gap-4 justify-center"> <a href="/hizmetler" class="btn-primary">Hizmetlerimiz</a> <a href="/iletisim" class="btn-secondary">Iletisim</a> </div> </div> </section>
| Site Ana Rengi | Onerilen Gradient |
|---|---|
| Turuncu (#f97316) | Orange → Yellow → Red → Orange |
| Mavi (#3b82f6) | Blue → Cyan → Violet → Blue |
| Yesil (#10b981) | Emerald → Teal → Cyan → Emerald |
| Kirmizi (#ef4444) | Red → Orange → Pink → Red |
| Mor (#8b5cf6) | Violet → Fuchsia → Blue → Violet |
resources/views/themes/{tema}/{modul}/{view}
Modul klasoru ile - YENİ! Ornek: themes.t-3.page.show
resources/views/themes/{tema}/{view}
Direkt view - Ornek: themes.t-3.show (eski uyumluluk)
Modules/{Modul}/views/themes/{tema}/{view}
Modul ici tema - Fallback (resources'da yoksa)
Modules/{Modul}/views/themes/simple/{view}
Simple tema fallback - MODUL ICINDE
{modul}::front.{view}
Son care - Modul front klasoru
Container 1280px altinda %100 genislik, padding ile kenarlarda bosluk. 1280px+ sabit genislik.
| Breakpoint | Ekran | Container | Padding |
|---|---|---|---|
0-767px |
Mobil | 100% | 1.25rem (20px) |
768px+ |
Tablet | 100% | 2rem (32px) |
1024px+ |
Laptop | 100% | 3rem (48px) |
1280px+ |
Desktop | 1280px | 2rem (32px) |
1536px+ |
Large | 1536px | 2rem (32px) |
/* Container full width until xl breakpoint */ .container { max-width: 100% !important; padding-left: 1.25rem !important; padding-right: 1.25rem !important; } @media (min-width: 768px) { .container { padding-left: 2rem !important; padding-right: 2rem !important; } } @media (min-width: 1024px) { .container { padding-left: 3rem !important; padding-right: 3rem !important; } } @media (min-width: 1280px) { .container { max-width: 1280px !important; padding-left: 2rem !important; padding-right: 2rem !important; } } @media (min-width: 1536px) { .container { max-width: 1536px !important; } }
Tailwind CDN kullanildiginda inline class'lar (px-4, md:px-2 gibi) CSS'i override edebilir. !important ile tutarlilik saglanir.
{{-- HTML'de bu class'lar CSS'i override eder --}} <div class="container mx-auto px-4 md:px-2"> {{-- CSS'te !important ile override onlenir --}} .container { padding-left: 2rem !important; }
v28 - Bu kural her tema icin ZORUNLU
<div class="container mx-auto px-4"> <div class="container mx-auto px-4 sm:px-6 md:px-8"> <div class="container mx-auto px-4 lg:px-12 xl:px-16">
Inline class'lar CSS'i override eder!
<div class="container mx-auto">
/* CSS'te tanimla (app.blade.php) */
.container { padding: 1.25rem !important; }
@media (768px) { padding: 2rem !important; }
@media (1024px) { padding: 3rem !important; }
px-* class'i OLMAMALI
!important ile tanimli
Referans: Unimad/ixtif container genisligi STANDARTTIR. Muzibu haric tum tenant'lar bu CSS'i kullanmali!
Gradient header KALDIRILDI! Yerine minimal subheader: Breadcrumb + H1 baslik, gri arkaplan.
{{-- MINIMAL SUBHEADER --}} <section class="bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"> <div class="container mx-auto px-4 sm:px-4 md:px-2 py-4"> {{-- Breadcrumb --}} <nav class="text-sm text-gray-500 dark:text-gray-400 mb-2"> @foreach($breadcrumbsArray as $index => $crumb) ... @endforeach </nav> {{-- H1 Baslik --}} <h1 class="text-2xl md:text-3xl font-bold font-heading text-gray-900 dark:text-white"> {{ $title }} </h1> </div> </section>
Header ve navigasyon icin xl (1280px) breakpoint kullaniyoruz. lg (1024px) kullanmak tablet boyutlarinda sorunlara yol acar!
| Class | Piksel | Kullanim |
|---|---|---|
sm: | 640px | Buyuk telefonlar |
md: | 768px | Tablet dikey |
lg: | 1024px | Tablet yatay / Kucuk laptop |
xl: | 1280px | HEADER BREAKPOINT! |
2xl: | 1536px | Buyuk ekranlar |
Grid yapisi modul tipine gore degisir. Gorsel agirlikli modullerde 2 kolon, text agirlikli modullerde 1 kolon mobilde daha okunabilir.
Sadece gorsel + baslik, az text
| Service | grid-cols-2 md:grid-cols-3 |
| Portfolio | grid-cols-2 md:grid-cols-3 |
| Galeri | grid-cols-2 md:grid-cols-3 lg:grid-cols-4 |
Baslik + aciklama + tarih + okuma suresi
| Blog | grid-cols-1 md:grid-cols-2 lg:grid-cols-3 |
| Page | grid-cols-1 md:grid-cols-2 lg:grid-cols-3 |
| Announcement | grid-cols-1 md:grid-cols-2 lg:grid-cols-3 |
{{-- Icerik alanlari icin --}} <div class="prose prose-base max-w-none font-body dark:prose-invert prose-headings:font-heading prose-headings:text-gray-900 prose-p:text-gray-600 dark:prose-p:text-gray-300 prose-a:text-primary-600 hover:prose-a:underline"> @parsewidgets($body ?? '') </div>
Sayfalar daha hizli acilir, site uygulama olarak yuklenebilir ve offline calisabilir. Tum bunlar otomatik olarak temalarda aktif.
Link'lere mouse ile geldiginde sayfa arka planda onceden yuklenir.
Tarayicida "Uygulamayi Yukle" butonu gosterir.
Sayfalari onbellege alir, offline destek saglar.
Sitede dinamizm ve guzellik icin hover efektleri, animasyonlu gradient text, ikon gecisleri kullanilir. Ancak ASLA scale/zoom/ziplama efekti KULLANMA - sadece renk, border ve shadow degisimi!
Tum gorsellerde loading="lazy" attribute kullan. Hero haric!
hover:scale-*, hover:-translate-y-* - KULLANMA!
Sadece: hover:border-primary-500, hover:shadow-lg
Top Bar
Telefon, WhatsApp, sosyal medya
Main Header (sticky)
Logo, navigasyon, dark mode toggle
Mobile Menu (xl:hidden)
x-show ile acilir/kapanir
| Key | Aciklama |
|---|---|
contact_phone_1 | Ana telefon (sabit) |
contact_phone_2 | Mobil telefon |
contact_whatsapp_1 | WhatsApp numarasi |
contact_email_1 | E-posta |
@php
$logoService = app(\App\Services\LogoService::class);
$logos = $logoService->getLogos();
@endphp
@if($logos['has_light'] && $logos['has_dark'])
<img src="{{ $logos['light_logo_url'] }}" class="dark:hidden h-10">
<img src="{{ $logos['dark_logo_url'] }}" class="hidden dark:block h-10">
@endif
Tenant bazli URL yonetimi - HARDCODE YASAK!
Her tenant (site) kendi URL yapisini ozellestirebilir. Ornegin Blog modulu varsayilan /blog yerine /haberler olabilir. Bu yuzden ASLA href="/blog" gibi hardcode URL yazilmaz!
// YANLIS - Hardcode URL <a href="/blog">Blog</a> <a href="/hizmetler/web-tasarim">...</a> <a href="/sayfa/hakkimizda">...</a> // DOGRU - Dinamik URL <a href="{{ module_locale_url('Blog', 'index') }}">...</a> <a href="{{ $service->getUrl() }}">...</a> <a href="{{ $page->getUrl() }}">...</a>
| Modul | Key | Varsayilan |
|---|---|---|
Blog | index | blog |
Service | index | hizmetler |
Page | show | sayfa |
Portfolio | index | portfolyo |
10 Altin Kural Formulu + Site Renk Entegrasyonu
Leonardo AI, siteler icin profesyonel gorseller ureten yapay zeka sistemidir. Basit bir aciklama verirsin ("Forklift depo ici"), sistem bunu 10 Altin Kural ile gercek fotograf gibi gorunen detayli bir talimata cevirir.
Leonardo AI gorsel uretirken, site rengi MUTLAKA detaylarda kullanilacak!
// Site rengi: #f97316 (turuncu) "...worker wearing orange safety vest, orange accents on machinery, orange warning lights..." // Renk site ayarlarindan alinir!
1472x832 (yatay)
1024x1024 (kare)
1472x832 (yatay)
Anasayfa Haric Tum Sayfalar - DB Body Prensibi
HARDCODE IF/ELSE KESINLIKLE YASAK!
Tum sayfa icerikleri veritabanindaki pages.body alaninda saklanir.
show.blade.php dosyasi sadece @parsewidgets($body) ile icerigi render eder.
@if($slug == 'hakkimizda')
<div>Hakkimizda icerigi...</div>
@elseif($slug == 'iletisim')
<div>Iletisim icerigi...</div>
@endif
{{-- show.blade.php --}} <div class="page-content"> @parsewidgets($body ?? '') </div> {{-- Icerik DB'de! --}}
Her sayfa birbiri ardina gelen section'lardan olusur. Her section'in kendine ozgu arka plan rengi ve ic yapisi vardir.
<!-- SAYFA YAPISI --> <section class="bg-gradient-to-br from-slate-900 via-slate-800 to-primary-900 py-20"> <!-- HERO SECTION --> </section> <section class="bg-white dark:bg-dark-900 py-16"> <!-- CONTENT SECTION 1 --> </section> <section class="bg-slate-50 dark:bg-dark-800 py-16"> <!-- CONTENT SECTION 2 (alternating bg) --> </section> <section class="bg-gradient-to-br from-primary-600 to-primary-800 py-16"> <!-- CTA SECTION --> </section>
Sayfa basinda gradient arka planli, buyuk baslikli bolum
bg-gradient-to-br from-slate-900 via-slate-800 to-primary-900
Istatistik kartlari: 15+ Proje, 7/24 Destek vb.
grid grid-cols-2 md:grid-cols-4 gap-4
2 kolonlu icerik: Sol metin, sag gorsel/liste
grid md:grid-cols-2 gap-8 items-center
Degerlerimiz, ozellikler, avantajlar listesi
grid grid-cols-2 md:grid-cols-3 gap-6
Aksiyon cagirisi: "Bizimle Iletisime Gecin"
bg-gradient-to-br from-primary-600 to-primary-800
Ikonlu kartlar: Misyon, Vizyon, Hizmetler
w-16 h-16 bg-primary-100 rounded-xl
Profesyonel bir hakkimizda sayfasinin bolum siralaması:
Gradient arka plan, buyuk baslik, kisa aciklama
15+ Referans Proje, Kapsamli Hizmet, Profesyonel Kadro, 7/24 Destek
"Biz Kimiz?", Modern Yaklasimimiz, Kalite ve Guvenilirlik
Yan yana 2 kart: Misyonumuz ve Vizyonumuz
6 deger ikonlu kartlar: Bilgi, Guvenilirlik, Verimlilik, Basari, Arastirma, Mevzuat Uyumu
6 avantaj kartları: Uzman Kadro, Modern Teknoloji, Zamaninda Teslimat...
Service kategorilerine linkler
"Birlikte Calisalim" - Iletisim butonu
Gradient arka plan, "Bizimle Iletisime Gecin" basligi
3'lu grid: Adres, Telefon, E-posta kartlari
Sol: Iletisim formu (widget), Sag: Harita veya ek bilgiler
Her tenant icin icerik kaynagi olarak *_ICERIK.md dosyasi kullanilir:
UNIMAD_MADENCILIK_ICERIK.md - UNIMAD icerikleriYILDIRIM_PANJUR_ICERIK.md - Yildirim Panjur icerikleriIXTIF_ICERIK.md - ixtif icerikleriBu dosyalar: Hakkimizda metni, Misyon/Vizyon, Hizmet aciklamalari, SSS sorulari icerir.
Light Sections:
bg-white dark:bg-dark-900
Gray Sections:
bg-slate-50 dark:bg-dark-800
Hero/CTA Gradient:
bg-gradient-to-br from-primary-600 to-primary-800
Dark Footer:
bg-slate-900 dark:bg-dark-950
| Hero Section | py-20 veya py-24 |
| Content Section | py-16 |
| CTA Section | py-16 |
| Grid Gap | gap-6 veya gap-8 |
| Section Basligi | text-3xl md:text-4xl font-bold font-heading |
| Alt Baslik | text-xl font-semibold |
| Paragraf | text-gray-600 dark:text-gray-300 leading-relaxed |
| Badge/Label | text-primary-600 font-semibold text-sm uppercase tracking-wider |
-- Tenant DB'ye baglan USE tenant_unimadmadencilik_8a32cf; -- Hakkimizda sayfasini guncelle UPDATE pages SET body = '{"tr": "<section class=\"...\">...HTML ICERIK...</section>"}' WHERE slug->>'$.tr' = 'hakkimizda'; -- veya PHP Tinker ile $page = Page::where('slug->tr', 'hakkimizda')->first(); $page->body = ['tr' => $htmlContent]; $page->save();
HTML'i JSON'a koyarken " karakterlerini \" ile escape et. Tailwind class'larinda ' kullanilabilir.
yildirimpanjur.com/page/hakkimizda
Hakkimizda sayfa yapisi referansi
unimad.tuufi.com/page/hakkimizda
UNIMAD Madencilik hakkimizda
Page modulu, sitedeki statik sayfalari yonetir: Hakkimizda, Iletisim, Gizlilik Politikasi vb.
title | JSON | Sayfa basligi |
slug | JSON | URL slug |
body | JSON | HTML icerik (TUM TASARIM BURADA!) |
is_homepage | BOOL | Anasayfa mi? |
Service modulu, sirketin sundugu hizmetleri sergiler. Her hizmetin ayri sayfasi, gorseli ve kategorisi olabilir.
hero - KARE 1024x1024gallery - Ek gorseller/hizmetler/{slug}
Blog modulu, haber, makale ve icerik paylasimi icin kullanilir. Zamanlanmis yayinlama, kategori, etiket, FAQ ve HowTo schema destegi vardir.
YAYINDA
is_active=true, published_at=past
ZAMANLANMIS
is_active=true, published_at=future
TASLAK
is_active=false
Kullanici icerik metnini verir, Claude sisteme girer, gorsel uretir ve media tablosuna kaydeder.
ICERIK.md dosyasindan veya direkt metin
Tailwind ile section'lar, kartlar, gridler
pages.body JSON alanina HTML eklenir
10 Altin Kural + Site Rengi ile profesyonel gorsel
php artisan cache:clear && view:clear
| Ozellik | Page | Service | Blog |
|---|---|---|---|
| Kategori | |||
| Etiketler | |||
| Anasayfa Olabilir | |||
| Gorsel Boyutu | 1472x832 | 1024x1024 | 1472x832 |
Site icerigi tamamlandiktan sonra SEO ayarlari yapilacak. Asagidaki detayli analizi takip et.
SEO Management Analiz Dokumani
ixtif.com/readme/2026/01/20/seo-management-analiz/
Sitemap
Robots.txt
Meta Tags
Bu bolumler v11-v15 arasinda vardi, v16'da kaldirildi. Referans icin arsivlendi.
Her sayfanin kendi CSS ve JS kodlarini veritabaninda saklayabilmesi. Sayfa render edilirken bu kodlar otomatik enjekte ediliyordu.
// pages tablosunda ek kolonlar: - css (TEXT) -> Sayfaya ozel CSS - js (TEXT) -> Sayfaya ozel JavaScript // Render sirasinda: @if($page->css) <style>{{ $page->css }}</style> @endif @if($page->js) <script>{{ $page->js }}</script> @endif
Kullanicinin tema tasariminda ISTEMEDIGI seylerin listesi. Bu tercihler kod yazarken referans aliniyordu.
Link'lerde alti cizili stil istemiyorum
"Odeme yapmak ister misiniz?" popup'lari istemiyorum
Farkli sayfalarda farkli margin/padding istemiyorum
Her sayfada sidebar veya CTA zorunlu olmasin
Ayni bilginin birden fazla yerde gosterilmesi istemiyorum
FAQ ve accordion bilesenlerinde kullanilan Alpine.js Collapse plugin'inin yukleme sirasi KRITIK kurali.
{{-- KRITIK SIRA! --}} {{-- 1. ONCE Collapse plugin --}} <script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/collapse@3.x.x/dist/cdn.min.js"></script> {{-- 2. SONRA ana Alpine --}} <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script> // YANLIS SIRA = Collapse calismaz!
Header'da logo yaninda gosterilen root admin erisim butonlari (admin panele hizli gecis, cache temizleme vs.)
{{-- Logo yaninda root admin butonlari --}}
@if(auth()->user()?->is_root)
<div class="flex items-center gap-2 ml-4">
<a href="/admin" class="text-xs bg-blue-600 px-2 py-1 rounded">
<i class="fas fa-cog"></i> Admin
</a>
<a href="/cache-clear" class="text-xs bg-red-600 px-2 py-1 rounded">
<i class="fas fa-broom"></i> Cache
</a>
</div>
@endif
Tema klasorunde DOCTYPE ile baslayan bagimsiz HTML dosyalari YASAK kurali. Tum dosyalar @extends ile layout kullanmali.
<!DOCTYPE html>
<html lang="tr">
<head>...</head>
<body>
... icerik ...
</body>
</html>
@extends('themes.t-3.layouts.app')
@section('content')
... icerik ...
@endsection
// YANLIS Page::where('slug', 'anasayfa') // DOGRU Page::where('is_homepage', true)
// YANLIS asset('storage/image.jpg') // DOGRU cdn('storage/tenant3/image.jpg')
Collection isimleri TUTARLI olmali:toMediaCollection('slider')
=getMedia('slider')
php artisan cache:clear php artisan view:clear php artisan responsecache:clear
Baslik metinlerine hareketli turuncu gradient efekti. Kayma animasyonu ile dikkat cekici basliklar.
.gradient-text-animated {
background: linear-gradient(
90deg,
#f97316 0%,
#fb923c 15%,
#fdba74 30%,
#ea580c 50%,
#c2410c 65%,
#f97316 80%,
#fb923c 100%
);
background-size: 200% auto;
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
animation: gradientShift 4s ease-in-out infinite;
}
@keyframes gradientShift {
0% { background-position: 0% center; }
50% { background-position: 100% center; }
100% { background-position: 0% center; }
}
Galeri lightbox entegrasyonu. Gorsellere tiklandiginda buyuk boyutta gosterim.
{{-- CDN --}} <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/glightbox/dist/css/glightbox.min.css"> <script src="https://cdn.jsdelivr.net/npm/glightbox/dist/js/glightbox.min.js"></script> {{-- HTML --}} <a href="buyuk-gorsel.jpg" class="glightbox" data-gallery="galeri1"> <img src="kucuk-gorsel.jpg"> </a> {{-- JS --}} <script> const lightbox = GLightbox({ selector: '.glightbox' }); </script>
Dokumandaki TUM Maddelerin Kontrol Listesi