feat: add Trunçgil Finance product with dedicated seeder and landing page views

This commit is contained in:
Ümit Tunç
2026-05-26 22:57:25 +03:00
parent 5d88241595
commit 8a08a0a89a
4 changed files with 779 additions and 0 deletions
+1
View File
@@ -25,6 +25,7 @@ class DatabaseSeeder extends Seeder
SiteTranslationsSeeder::class,
CompanyHistoryItemSeeder::class,
DekupaiProductSeeder::class,
FinanceProductSeeder::class,
BlogSeeder::class,
]);
+168
View File
@@ -0,0 +1,168 @@
<?php
namespace Database\Seeders;
use App\Models\Product;
use App\Models\ProductCategory;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class FinanceProductSeeder extends Seeder
{
public function run(): void
{
// 1. Download the logo from https://finance.truncgil.com/img/logo.svg
$logoUrl = 'https://finance.truncgil.com/img/logo.svg';
$logoFileName = 'products/truncgil-finance-logo.svg';
try {
// Check if directory exists in the public disk
if (!Storage::disk('public')->exists('products')) {
Storage::disk('public')->makeDirectory('products');
}
// Get logo contents
$context = stream_context_create([
"ssl" => [
"verify_peer" => false,
"verify_peer_name" => false,
],
"http" => [
"header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)\r\n"
]
]);
$logoContents = file_get_contents($logoUrl, false, $context);
if ($logoContents !== false) {
Storage::disk('public')->put($logoFileName, $logoContents);
$this->command?->info('Downloaded and stored the Trunçgil Finance logo successfully.');
} else {
$this->command?->error('Could not download logo contents.');
}
} catch (\Exception $e) {
$this->command?->error('Failed to download Trunçgil Finance logo: ' . $e->getMessage());
}
// 2. Prepare translatable fields
$title = [
'tr' => 'Trunçgil Finance (Canlı Döviz, Altın ve Kripto Para API Servisi)',
'en' => 'Trunçgil Finance (Live Currency, Gold, and Crypto API Service)',
];
$content = [
'tr' => 'Trunçgil Finance, altın, döviz ve kripto para verilerini anlık ve gecikmesiz olarak sunan yüksek performanslı bir API servisidir. Kurumsal uygulamalarınızdan mobil projelerinize kadar her ölçekte güvenle entegre edebilirsiniz.',
'en' => 'Trunçgil Finance is a high-performance API service offering instantaneous and lag-free gold, currency, and cryptocurrency data. Securely integrate into your projects of any scale, from enterprise apps to mobile platforms.',
];
// 3. Prepare detailed landing page data structure
$landingPageData = [
'hero' => [
'slogan_tr' => 'Yüksek Performanslı Altın, Döviz ve Kripto API Servisi',
'slogan_en' => 'High-Performance Gold, Currency, and Crypto API Service',
'sub_slogan_tr' => 'Anlık finansal verileri, güçlü altyapımızla projelerinize gecikmesiz entegre edin. Geliştirici dostu entegrasyon ve sıfır kesinti.',
'sub_slogan_en' => 'Integrate real-time financial data into your applications lag-free with our robust infrastructure. Developer-friendly and 100% uptime.',
'featured_image' => $logoFileName,
],
'features' => [
[
'title_tr' => 'Gecikmesiz Canlı Akış',
'title_en' => 'Lag-Free Live Streams',
'icon' => 'processor',
],
[
'title_tr' => 'Geliştirici Dostu SDK & API',
'title_en' => 'Developer-Friendly SDK & API',
'icon' => 'crop',
],
[
'title_tr' => 'Güvenli ve Kesintisiz Servis',
'title_en' => 'Secure & Uptime Gurantee',
'icon' => 'safe',
],
[
'title_tr' => 'Zengin Veri Kaynakları',
'title_en' => 'Rich Data Sources',
'icon' => 'cloud',
],
],
'how_it_works' => [
'download_form_label_tr' => 'Nasıl Entegre Edilir?',
'download_form_label_en' => 'How to Integrate?',
'steps' => [
[
'number' => 1,
'title_tr' => 'API Anahtarınızı Alın',
'title_en' => 'Get Your API Key',
'description_tr' => 'Saniyeler içinde kayıt olun ve size özel güvenli API anahtarınızı oluşturun.',
'description_en' => 'Sign up in seconds and generate your secure, dedicated API key.',
],
[
'number' => 2,
'title_tr' => 'Dokümantasyonu İnceleyin',
'title_en' => 'Browse Documentation',
'description_tr' => 'Her dilde hazırlanmış örnek kodlar ve şemalarla entegrasyon adımlarını inceleyin.',
'description_en' => 'Check integration steps with sample codes and schemas available in every language.',
],
[
'number' => 3,
'title_tr' => 'Kodunuza Dahil Edin',
'title_en' => 'Integrate Into Code',
'description_tr' => 'Hazır kütüphanelerimizle veya RESTful uç noktalarımızla verileri projenize çekin.',
'description_en' => 'Fetch data using our client SDKs or standard RESTful HTTP endpoints.',
],
[
'number' => 4,
'title_tr' => 'Canlıya Alın & İzleyin',
'title_en' => 'Go Live & Monitor',
'description_tr' => 'Kullanım istatistiklerinizi panelimizden izleyin ve yüksek hızın tadını çıkarın.',
'description_en' => 'Track your request statistics in real-time from the dashboard and enjoy lightning speed.',
],
],
],
'faqs' => [
[
'question_tr' => 'Veriler ne sıklıkla güncelleniyor?',
'question_en' => 'How frequently is the data updated?',
'answer_tr' => 'Finansal verilerimiz doğrudan global ve yerel borsalardan anlık akış olarak alınmakta ve milisaniyeler bazında güncellenmektedir.',
'answer_en' => 'Our financial feeds are retrieved directly from global and regional exchanges and updated in real-time on a millisecond scale.',
],
[
'question_tr' => 'Ücretsiz deneme sürümü mevcut mu?',
'question_en' => 'Is there a free tier available?',
'answer_tr' => 'Evet. Trunçgil Finance geliştiriciler için belirli sayıda aylık istek limitine sahip tamamen ücretsiz bir sandbox planı sunmaktadır.',
'answer_en' => 'Yes. Trunçgil Finance offers a completely free sandbox tier with a monthly request allowance for developers to test and build.',
],
[
'question_tr' => 'Hangi veri türlerini sunuyorsunuz?',
'question_en' => 'What kinds of financial data do you offer?',
'answer_tr' => 'Uluslararası döviz pariteleri, serbest piyasa ve banka altın fiyatları, kıymetli madenler ve tüm popüler kripto para birimleri veri setlerimizin parçasıdır.',
'answer_en' => 'Global currency exchange rates, free-market and banking gold values, precious metals, and all major cryptocurrency pairs are fully covered.',
],
],
];
// 4. Determine category
$category = ProductCategory::first();
$categoryId = $category ? $category->id : 1;
// 5. Update or Create the Product
Product::updateOrCreate(
['slug' => 'truncgil-finance'],
[
'product_category_id' => $categoryId,
'title' => $title,
'type' => 'product',
'hero_image' => $logoFileName,
'content' => $content,
'landing_page_data' => $landingPageData,
'view_template' => 'front.products.finance',
'external_url' => 'https://finance.truncgil.com/',
'sort_order' => 2,
'is_active' => true,
]
);
$this->command?->info('✅ Trunçgil Finance product seeded successfully!');
}
}
@@ -0,0 +1,509 @@
@extends('layouts.site')
@php
use Illuminate\Support\Facades\Storage;
$header = 'front.products.finance_header';
@endphp
@section('title', $product->translate('title') ?? 'Trunçgil Finance')
@php
$landingData = $product->landing_page_data ?? [];
$hero = $landingData['hero'] ?? [];
$features = $landingData['features'] ?? [];
$howItWorks = $landingData['how_it_works'] ?? [];
$steps = $howItWorks['steps'] ?? [];
$faqs = $landingData['faqs'] ?? [];
$currentLang = app()->getLocale();
// Helper function for translations
$getTranslated = function($item, $key, $default = '') use ($currentLang) {
if (isset($item["{$key}_{$currentLang}"])) {
return $item["{$key}_{$currentLang}"];
}
return $item[$key] ?? $default;
};
@endphp
@push('styles')
<style>
/* Green-Tuned Premium Dark Theme Core Styles */
:root {
--primary: #00e676 !important;
--primary-rgb: 0, 230, 118 !important;
}
body {
background-color: #0b0f0d !important;
color: #e2e8f0 !important;
font-family: 'Space Grotesk', 'Urbanist', sans-serif !important;
}
.btn-primary {
background-color: #00e676 !important;
border-color: #00e676 !important;
color: #0b0f0d !important;
font-weight: 600 !important;
}
.btn-primary:hover {
background-color: #00b359 !important;
border-color: #00b359 !important;
color: #0b0f0d !important;
}
.finance-dark-page {
background: radial-gradient(circle at 50% 0%, rgba(0, 230, 118, 0.08) 0%, rgba(11, 15, 13, 0) 50%),
radial-gradient(circle at 100% 50%, rgba(0, 230, 118, 0.04) 0%, rgba(11, 15, 13, 0) 40%),
#0b0f0d;
overflow-x: hidden;
}
/* Glow Gradients matching Emerald/Green */
.text-glow-gradient {
background: linear-gradient(135deg, #ffffff 0%, #a7f3d0 50%, #34d399 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.text-green-glow {
color: #00e676 !important;
text-shadow: 0 0 12px rgba(0, 230, 118, 0.35);
}
/* Elegant Glassmorphism Cards */
.glass-card {
background: rgba(18, 26, 22, 0.55);
backdrop-filter: blur(16px);
border: 1px solid rgba(0, 230, 118, 0.08) !important;
border-radius: 1rem;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.glass-card:hover {
transform: translateY(-4px);
border-color: rgba(0, 230, 118, 0.25) !important;
box-shadow: 0 12px 35px rgba(0, 230, 118, 0.1);
}
/* Active dynamic pulse */
.pulse-dot-green {
width: 8px;
height: 8px;
background-color: #00e676;
border-radius: 50%;
display: inline-block;
box-shadow: 0 0 0 0 rgba(0, 230, 118, 0.7);
animation: pulse-green 1.8s infinite;
}
@keyframes pulse-green {
0% {
transform: scale(0.95);
box-shadow: 0 0 0 0 rgba(0, 230, 118, 0.7);
}
70% {
transform: scale(1);
box-shadow: 0 0 0 8px rgba(0, 230, 118, 0);
}
100% {
transform: scale(0.95);
box-shadow: 0 0 0 0 rgba(0, 230, 118, 0);
}
}
/* Code editor tab styles matching Green Theme */
.code-editor-header {
background: #0f1411;
border-top-left-radius: 0.75rem;
border-top-right-radius: 0.75rem;
padding: 0.75rem 1.25rem;
border-bottom: 1px solid rgba(0, 230, 118, 0.08);
display: flex;
justify-content: space-between;
align-items: center;
}
.code-editor-body {
background: #050807;
border-bottom-left-radius: 0.75rem;
border-bottom-right-radius: 0.75rem;
padding: 1.5rem;
font-family: 'Fira Code', 'Courier New', Courier, monospace;
font-size: 0.85rem;
color: #cbd5e1;
overflow-x: auto;
}
.nav-tabs-code .nav-link {
color: #8892b0;
border: none;
padding: 0.4rem 1rem;
border-radius: 0.375rem;
font-weight: 500;
font-size: 0.85rem;
transition: all 0.2s ease;
}
.nav-tabs-code .nav-link.active {
color: #00e676 !important;
background: rgba(0, 230, 118, 0.1) !important;
}
/* Accordions inside dark theme */
.accordion-dark .accordion-item {
background: rgba(18, 26, 22, 0.3) !important;
border: 1px solid rgba(0, 230, 118, 0.05) !important;
border-radius: 0.75rem !important;
overflow: hidden;
margin-bottom: 1rem;
}
.accordion-dark .accordion-button {
background: transparent !important;
color: #e2e8f0 !important;
box-shadow: none !important;
font-weight: 600;
}
.accordion-dark .accordion-button:not(.collapsed) {
color: #00e676 !important;
}
.accordion-dark .accordion-button::after {
filter: brightness(0) invert(1);
}
.accordion-dark .accordion-body {
color: #94a3b8 !important;
border-top: 1px solid rgba(0, 230, 118, 0.05);
}
</style>
@endpush
@section('content')
<div class="finance-dark-page">
{{-- Hero Section designed exactly like demo3.html --}}
<section class="wrapper bg-[#0c120f] opacity-100 angled lower-start relative border-0
before:content-[''] before:block before:absolute before:z-0 before:border-y-transparent before:border-[#0c120f] before:border-0 before:border-solid before:right-0
after:bottom-[-4rem] after:content-[''] after:block after:absolute after:z-0 after:border-l-[100vw] after:border-r-transparent after:border-b-[4rem] after:border-y-transparent after:border-[#0c120f] after:border-0 after:border-solid after:right-0">
<div class="container pt-7 xl:pt-12 lg:pt-12 md:pt-12 pb-8 relative z-10">
<div class="flex flex-wrap mx-0 !mt-[-50px] items-center">
{{-- LEFT COLUMN: Title & Rates (Döviz, Altın, Kripto tek yerde şeklinde) --}}
<div class="lg:w-6/12 xl:w-6/12 w-full flex-[0_0_auto] max-w-full px-0 !mt-[50px]">
<div class="d-flex align-items-center gap-2 mb-3">
<span class="pulse-dot-green" aria-hidden="true"></span>
<span class="text-green-glow fs-13 font-bold uppercase tracking-wider">{!! t('Canlı Finansal Veri Servisi') !!}</span>
</div>
<h1 class="display-3 font-bold !leading-[1.15] text-white !mb-4 text-glow-gradient">
{!! t('Altın, Döviz ve Kripto Paralar') !!} <br>
<span class="text-green-glow">{!! t('Tek Bir API Uç Noktasında!') !!}</span>
</h1>
<p class="lead !text-[1.15rem] !leading-[1.5] text-slate-300 !mb-6 pr-lg-12">
{!! t('Trunçgil Finance ile gecikmesiz, anlık ve yüksek frekanslı tüm altın fiyatlarını, serbest piyasa döviz kurlarını ve popüler kripto para birimlerini tek bir noktadan entegre edin.') !!}
</p>
{{-- Rates Showcase (Tek Yerde) --}}
<div class="glass-card p-5 !mb-7" style="background: rgba(12, 18, 15, 0.7); max-width: 490px;">
<div class="row g-4">
<div class="col-6">
<div class="d-flex align-items-center gap-2">
<span class="w-2.5 h-2.5 rounded-circle bg-warning d-inline-block"></span>
<div>
<div class="text-slate-400 fs-11 uppercase font-bold">{!! t('Gram Altın') !!}</div>
<div class="text-white font-bold fs-15 font-mono" id="gold-try">₺3.142,45</div>
</div>
</div>
</div>
<div class="col-6">
<div class="d-flex align-items-center gap-2">
<span class="w-2.5 h-2.5 rounded-circle bg-info d-inline-block"></span>
<div>
<div class="text-slate-400 fs-11 uppercase font-bold">USD / TRY</div>
<div class="text-white font-bold fs-15 font-mono" id="usd-try">₺34.8250</div>
</div>
</div>
</div>
<div class="col-6">
<div class="d-flex align-items-center gap-2">
<span class="w-2.5 h-2.5 rounded-circle bg-primary d-inline-block"></span>
<div>
<div class="text-slate-400 fs-11 uppercase font-bold">EUR / TRY</div>
<div class="text-white font-bold fs-15 font-mono" id="eur-try">₺37.2480</div>
</div>
</div>
</div>
<div class="col-6">
<div class="d-flex align-items-center gap-2">
<span class="w-2.5 h-2.5 rounded-circle d-inline-block" style="background-color: #00e676;"></span>
<div>
<div class="text-slate-400 fs-11 uppercase font-bold">BTC / USD</div>
<div class="text-white font-bold fs-15 font-mono" id="btc-usd">$98,425.00</div>
</div>
</div>
</div>
</div>
</div>
<div class="d-flex flex-wrap gap-3">
<a href="https://finance.truncgil.com/docs" target="_blank" class="btn btn-primary px-6 py-3 rounded">
<i class="uil uil-code-branch me-1"></i> {!! t('API Entegrasyonu') !!}
</a>
<a href="{{ route('page.show', ['slug' => 'iletisim']) }}" class="btn btn-outline-glow px-6 py-3 rounded">
{!! t('Özel Teklif Alın') !!}
</a>
</div>
</div>
{{-- RIGHT COLUMN: Floating Fetched Logo --}}
<div class="lg:w-5/12 xl:w-5/12 w-full flex-[0_0_auto] max-w-full px-0 !mt-[50px] lg:!ml-[8.33333333%] xl:!ml-[8.33333333%] !mb-[-8rem] relative z-[3]">
<div class="!relative">
<figure class="!rounded-[1rem] !shadow-[0_0.25rem_2.5rem_rgba(0,230,118,0.15)] overflow-hidden" style="background: rgba(18, 26, 22, 0.6); border: 1px solid rgba(0, 230, 118, 0.15);">
<div class="p-12 text-center">
@if(!empty($hero['featured_image']))
<img class="img-fluid drop-shadow-lg mx-auto" src="{{ Storage::url($hero['featured_image']) }}" alt="Trunçgil Finance Logo" style="max-height: 140px;">
@else
<img class="img-fluid drop-shadow-lg mx-auto" src="https://finance.truncgil.com/img/logo.svg" alt="Trunçgil Finance Logo" style="max-height: 140px;">
@endif
<div class="mt-8 text-center">
<span class="badge bg-soft-success text-success rounded-pill px-4 py-2 fs-12 border border-success-20">API v4 STABLE</span>
</div>
</div>
</figure>
</div>
</div>
</div>
</div>
</section>
{{-- Advantages and API Benefits Section --}}
<section class="wrapper bg-[#0b0f0d] pt-36 pb-24 xl:pb-32 lg:pb-32 md:pb-32 relative z-10">
<div class="container">
<div class="row text-center mb-16">
<div class="col-lg-8 mx-auto">
<h2 class="text-green-glow uppercase tracking-wider fs-13 font-bold mb-3">{!! t('API Avantajları & Sıfır Kesinti') !!}</h2>
<h3 class="display-4 font-bold text-glow-gradient">{!! t('Geliştiriciler İçin Sınırsız Özgürlük') !!}</h3>
</div>
</div>
<div class="row g-6 text-center">
{{-- Advantage 1: No Auth Required --}}
<div class="col-md-4">
<div class="glass-card p-8 h-100 flex flex-col justify-between">
<div>
<div class="w-12 h-12 rounded-circle bg-success-soft flex items-center justify-center mx-auto mb-5 text-success fs-24">
<i class="uil uil-unlock"></i>
</div>
<h4 class="fs-18 font-bold text-white mb-3">{!! t('No Auth Required (Sıfır Kurulum)') !!}</h4>
<p class="text-slate-400 fs-14 mb-0">
{!! t('Başlamak için karmaşık kayıt süreçlerine, token/key yönetimlerine gerek yok. Standart JSON uç noktalarımıza doğrudan istek atarak saniyeler içinde çalışın.') !!}
</p>
</div>
</div>
</div>
{{-- Advantage 2: Totally Free --}}
<div class="col-md-4">
<div class="glass-card p-8 h-100 flex flex-col justify-between">
<div>
<div class="w-12 h-12 rounded-circle bg-success-soft flex items-center justify-center mx-auto mb-5 text-success fs-24">
<i class="uil uil-gift"></i>
</div>
<h4 class="fs-18 font-bold text-white mb-3">{!! t('%100 Ücretsiz Kullanım') !!}</h4>
<p class="text-slate-400 fs-14 mb-0">
{!! t('Geliştirici dostu yapımız gereği, tüm kişisel ve prototip projelerinizde altın döviz verilerimizi hiçbir kullanım ücreti ödemeden özgürce çekebilirsiniz.') !!}
</p>
</div>
</div>
</div>
{{-- Advantage 3: Dockerized Private Deployments --}}
<div class="col-md-4">
<div class="glass-card p-8 h-100 flex flex-col justify-between">
<div>
<div class="w-12 h-12 rounded-circle bg-success-soft flex items-center justify-center mx-auto mb-5 text-success fs-24">
<i class="uil uil-layer-group"></i>
</div>
<h4 class="fs-18 font-bold text-white mb-3">{!! t('Özel Dockerize Kurulum') !!}</h4>
<p class="text-slate-400 fs-14 mb-0">
{!! t('Kurumsal işletmeniz için yüksek hacimli istek, sıfır ağ gecikmesi ve izole veri akışı gerekiyorsa, size özel Docker paketimizle sistemi kendi sunucularınıza kurabiliriz.') !!}
</p>
</div>
</div>
</div>
</div>
</div>
</section>
{{-- Interactive Code Playground --}}
<section class="wrapper bg-[#0c120f] py-20 relative z-10 border-top border-white-5">
<div class="container">
<div class="row align-items-center g-10">
<div class="col-lg-5">
<h2 class="text-green-glow uppercase tracking-wider fs-13 font-bold mb-3">{!! t('Geliştirici Dostu Yapı') !!}</h2>
<h3 class="display-4 font-bold text-glow-gradient mb-5">{!! t('Kodunuza Saniyeler İçinde Bağlayın') !!}</h3>
<p class="text-slate-300 fs-16 mb-6">
{!! t('Modern RESTful JSON standartlarında sunulan temiz çıktı modelimiz sayesinde, en sevdiğiniz programlama dilinde anında istek atın ve verileri işleyin.') !!}
</p>
<ul class="list-unstyled space-y-3 mb-8">
<li class="d-flex align-items-center gap-3">
<i class="uil uil-check-circle text-green-glow fs-18"></i>
<span>{!! t('Kimlik Doğrulama Gerekmez (No-Auth)') !!}</span>
</li>
<li class="d-flex align-items-center gap-3">
<i class="uil uil-check-circle text-green-glow fs-18"></i>
<span>{!! t('Milisaniyeler Hızında JSON Çıktısı') !!}</span>
</li>
</ul>
<a href="https://finance.truncgil.com/docs" target="_blank" class="btn btn-primary px-6 py-3 rounded">
{!! t('API Dokümantasyonunu İncele') !!} <i class="uil uil-arrow-right ms-1"></i>
</a>
</div>
{{-- Interactive Tabs and Code Code Editor --}}
<div class="col-lg-7">
<div class="nav nav-tabs nav-tabs-code mb-4 gap-2" id="code-tabs" role="tablist">
<button class="nav-link active" id="tab-js-btn" data-bs-toggle="tab" data-bs-target="#tab-js" type="button" role="tab" aria-selected="true">JavaScript</button>
<button class="nav-link" id="tab-php-btn" data-bs-toggle="tab" data-bs-target="#tab-php" type="button" role="tab" aria-selected="false">PHP (cURL)</button>
<button class="nav-link" id="tab-python-btn" data-bs-toggle="tab" data-bs-target="#tab-python" type="button" role="tab" aria-selected="false">Python</button>
</div>
<div class="tab-content">
{{-- JavaScript --}}
<div class="tab-pane fade show active" id="tab-js" role="tabpanel" aria-labelledby="tab-js-btn">
<div class="code-editor-header">
<div>
<span class="code-dot code-dot-red" aria-hidden="true"></span>
<span class="code-dot code-dot-yellow" aria-hidden="true"></span>
<span class="code-dot code-dot-green" aria-hidden="true"></span>
<span class="text-slate-400 fs-12">finance.js</span>
</div>
<button class="btn btn-sm btn-outline-glow rounded px-3 py-1 fs-12" onclick="navigator.clipboard.writeText(document.getElementById('code-js').innerText); alert('Copied!');">
<i class="uil uil-copy me-1"></i> {!! t('Kopyala') !!}
</button>
</div>
<pre class="code-editor-body m-0" id="code-js"><code><span class="text-warning">fetch</span>(<span class="text-success">'https://finance.truncgil.com/v4/today.json'</span>)
.<span class="text-warning">then</span>(response => response.<span class="text-warning">json</span>())
.<span class="text-warning">then</span>(data => {
<span class="text-info">console</span>.<span class="text-warning">log</span>(<span class="text-success">'Dolar/TRY:'</span>, data.USD.Buying);
<span class="text-info">console</span>.<span class="text-warning">log</span>(<span class="text-success">'Gram Altın:'</span>, data.Gold_Gram.Selling);
})
.<span class="text-warning">catch</span>(error => <span class="text-info">console</span>.<span class="text-warning">error</span>(<span class="text-success">'Hata:'</span>, error));</code></pre>
</div>
{{-- PHP --}}
<div class="tab-pane fade" id="tab-php" role="tabpanel" aria-labelledby="tab-php-btn">
<div class="code-editor-header">
<div>
<span class="code-dot code-dot-red" aria-hidden="true"></span>
<span class="code-dot code-dot-yellow" aria-hidden="true"></span>
<span class="code-dot code-dot-green" aria-hidden="true"></span>
<span class="text-slate-400 fs-12">finance.php</span>
</div>
<button class="btn btn-sm btn-outline-glow rounded px-3 py-1 fs-12" onclick="navigator.clipboard.writeText(document.getElementById('code-php').innerText); alert('Copied!');">
<i class="uil uil-copy me-1"></i> {!! t('Kopyala') !!}
</button>
</div>
<pre class="code-editor-body m-0" id="code-php"><code><span class="text-info">&lt;?php</span>
<span class="text-warning">$ch</span> = <span class="text-warning">curl_init</span>(<span class="text-success">'https://finance.truncgil.com/v4/today.json'</span>);
<span class="text-warning">curl_setopt</span>(<span class="text-warning">$ch</span>, CURLOPT_RETURNTRANSFER, <span class="text-info">true</span>);
<span class="text-warning">$response</span> = <span class="text-warning">curl_exec</span>(<span class="text-warning">$ch</span>);
<span class="text-warning">$data</span> = <span class="text-warning">json_decode</span>(<span class="text-warning">$response</span>, <span class="text-info">true</span>);
<span class="text-info">echo</span> <span class="text-success">"Altın Satış: "</span> . <span class="text-warning">$data</span>[<span class="text-success">'Gold_Gram'</span>][<span class="text-success">'Selling'</span>];
<span class="text-warning">curl_close</span>(<span class="text-warning">$ch</span>);</code></pre>
</div>
{{-- Python --}}
<div class="tab-pane fade" id="tab-python" role="tabpanel" aria-labelledby="tab-python-btn">
<div class="code-editor-header">
<div>
<span class="code-dot code-dot-red" aria-hidden="true"></span>
<span class="code-dot code-dot-yellow" aria-hidden="true"></span>
<span class="code-dot code-dot-green" aria-hidden="true"></span>
<span class="text-slate-400 fs-12">finance.py</span>
</div>
<button class="btn btn-sm btn-outline-glow rounded px-3 py-1 fs-12" onclick="navigator.clipboard.writeText(document.getElementById('code-python').innerText); alert('Copied!');">
<i class="uil uil-copy me-1"></i> {!! t('Kopyala') !!}
</button>
</div>
<pre class="code-editor-body m-0" id="code-python"><code><span class="text-warning">import</span> requests
response = requests.<span class="text-warning">get</span>(<span class="text-success">'https://finance.truncgil.com/v4/today.json'</span>)
data = response.<span class="text-warning">json</span>()
<span class="text-warning">print</span>(<span class="text-success">f"Dolar Alış: {data['USD']['Buying']}"</span>)
<span class="text-warning">print</span>(<span class="text-success">f"Gram Altın Satış: {data['Gold_Gram']['Selling']}"</span>)</code></pre>
</div>
</div>
</div>
</div>
</div>
</section>
{{-- Bottom CTA Section targeting Docker deployments --}}
<section class="wrapper bg-[#0b0f0d] py-20 relative z-10 border-top border-white-5 text-center">
<div class="container">
<div class="row">
<div class="col-lg-8 mx-auto">
<h2 class="display-3 font-bold text-white mb-4">{!! t('Özel & Dockerize Çözümler') !!}</h2>
<p class="lead fs-18 text-slate-300 mb-8 max-w-xl mx-auto">
{!! t('Yüksek performanslı veri havuzu, sınırsız sorgulama hacmi ve sıfır dış sunucu bağımlılığı için Trunçgil Finance altyapısını Dockerize olarak kendi yerel mimarinize kuralım.') !!}
</p>
<div class="d-flex justify-content-center gap-3 flex-wrap">
<a href="{{ route('page.show', ['slug' => 'iletisim']) }}" class="btn btn-primary px-8 py-3 rounded">
{!! t('Docker Kurulumu İçin İletişime Geçin') !!} <i class="uil uil-comment-alt-dots ms-1"></i>
</a>
<a href="https://finance.truncgil.com/" target="_blank" class="btn btn-outline-glow px-8 py-3 rounded">
{!! t('Detayları Gör') !!}
</a>
</div>
</div>
</div>
</div>
</section>
</div>
@push('scripts')
<script>
document.addEventListener('DOMContentLoaded', function() {
// Live rates simulation matching green vibes
function startRateDynamics() {
const goldTryEl = document.getElementById('gold-try');
const usdTryEl = document.getElementById('usd-try');
const eurTryEl = document.getElementById('eur-try');
const btcUsdEl = document.getElementById('btc-usd');
setInterval(() => {
if (goldTryEl) {
const current = parseFloat(goldTryEl.innerText.replace('₺', '').replace('.', '').replace(',', '.'));
const osc = (Math.random() - 0.48) * 0.75;
const next = current + osc;
goldTryEl.innerText = '₺' + next.toLocaleString('tr-TR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}
if (usdTryEl) {
const current = parseFloat(usdTryEl.innerText.replace('₺', '').replace(',', '.'));
const osc = (Math.random() - 0.5) * 0.0015;
const next = current + osc;
usdTryEl.innerText = '₺' + next.toLocaleString('tr-TR', { minimumFractionDigits: 4, maximumFractionDigits: 4 });
}
if (eurTryEl) {
const current = parseFloat(eurTryEl.innerText.replace('₺', '').replace(',', '.'));
const osc = (Math.random() - 0.51) * 0.0018;
const next = current + osc;
eurTryEl.innerText = '₺' + next.toLocaleString('tr-TR', { minimumFractionDigits: 4, maximumFractionDigits: 4 });
}
if (btcUsdEl) {
const current = parseFloat(btcUsdEl.innerText.replace('$', '').replace(',', ''));
const osc = (Math.random() - 0.45) * 5.5;
const next = current + osc;
btcUsdEl.innerText = '$' + next.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}
}, 2000);
}
startRateDynamics();
});
</script>
@endpush
@endsection
@@ -0,0 +1,101 @@
@php
// Get menu items from Pages with nested children
$menuItems = \App\Models\Page::with(['children' => function ($query) {
$query->where('status', 'published')
->where('show_in_menu', true)
->orderBy('sort_order', 'asc')
->orderBy('title', 'asc');
}, 'children.children' => function ($query) {
$query->where('status', 'published')
->where('show_in_menu', true)
->orderBy('sort_order', 'asc')
->orderBy('title', 'asc');
}])
->whereNull('parent_id')
->where('status', 'published')
->where('show_in_menu', true)
->orderBy('sort_order', 'asc')
->orderBy('title', 'asc')
->get();
@endphp
<header class="relative wrapper !bg-[#0b0f0d]">
<nav class="navbar navbar-expand-lg center-logo transparent navbar-dark !bg-[#0b0f0d] !border-b !border-white-5">
<div class="container flex justify-between items-center">
<!-- Mobile Header -->
<div class="flex flex-row w-full justify-between items-center xl:!hidden lg:!hidden">
<div class="navbar-brand">
<a href="/">
<img class="logo-light !h-[2.2rem]" src="{{ asset('logos/truncgil-yatay-dark.svg') }}" alt="Truncgil" width="134" height="43">
</a>
</div>
<div class="navbar-other !ml-auto">
<ul class="navbar-nav flex-row items-center">
<li class="nav-item">
<button class="hamburger offcanvas-nav-btn" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvas-nav" aria-label="{{ t('Menüyü aç') }}"><span></span></button>
</li>
</ul>
</div>
</div>
<!-- Desktop Header -->
<div class="navbar-collapse-wrapper flex flex-row items-center w-full justify-between hidden lg:!flex xl:!flex">
<!-- Logo on Left -->
<div class="navbar-brand">
<a href="/">
<img class="!h-[2.5rem]" src="{{ asset('logos/truncgil-yatay-dark.svg') }}" alt="Truncgil Teknoloji" width="134" height="43">
</a>
</div>
<!-- Menu in Center -->
<div class="navbar-collapse w-full flex justify-center">
<div class="flex justify-center w-full">
<ul class="navbar-nav flex-row items-center gap-1">
@foreach($menuItems as $item)
<x-front.menu-item :item="$item" />
@endforeach
</ul>
</div>
</div>
<!-- Right side CTA / Lang -->
<div class="flex items-center gap-4">
<a href="https://finance.truncgil.com/docs" target="_blank" class="btn btn-sm btn-primary text-white !rounded-[.4rem] hover:translate-y-[-0.15rem]">{!! t('Dokümantasyon') !!}</a>
<div class="hidden lg:!block xl:!block shrink-0">
@include("components.custom.language-selector")
</div>
</div>
</div>
<!-- Mobile Menu -->
<div id="offcanvas-nav" class="navbar-collapse offcanvas offcanvas-nav offcanvas-start lg:!hidden xl:!hidden">
<div class="offcanvas-header flex items-center justify-between flex-row p-6">
<a href="/">
<img class="!h-[2.2rem]" src="{{ asset('logos/truncgil-yatay-dark.svg') }}" alt="Truncgil" width="134" height="43">
</a>
<button type="button" class="btn-close !text-white" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body !pt-0">
<div class="pb-4 mb-2 border-b border-white/10">
@include('components.custom.language-selector', ['variant' => 'offcanvas'])
</div>
<ul class="navbar-nav">
@foreach($menuItems as $item)
<x-front.menu-item :item="$item" />
@endforeach
</ul>
</div>
</div>
</div>
</nav>
</header>
<style>
/* Header specific styles to match Dark theme */
header .navbar.transparent.navbar-dark .navbar-nav .nav-link {
color: #aab0bc !important;
}
header .navbar.transparent.navbar-dark .navbar-nav .nav-link:hover {
color: #00e676 !important;
}
</style>