borsa / nextjs-app /src /app /page.tsx
GitHub Copilot
Harden Telegram menu webhook
96964a0
import { StockList } from '@/components/StockList'
import { MarketOverview } from '@/components/MarketOverview'
import { TopMovers } from '@/components/TopMovers'
import TopMLPredictions from '@/components/TopMLPredictions'
import Link from 'next/link'
import {
TrendingUp, BarChart3, Brain, Zap, Target, Search,
Activity, Newspaper, Building2, Briefcase, ArrowRight
} from 'lucide-react'
export default function Home() {
return (
<div className="container mx-auto px-4 py-6">
{/* Ana Başlık */}
<div className="mb-6 text-center">
<h1 className="text-3xl md:text-4xl font-bold text-gray-900 mb-2">
Borsa İstanbul Hisse Analiz Paneli
</h1>
<p className="text-lg text-gray-600">
Teknik tarama (deterministik), model çıktısı (best-effort) ve piyasa özeti
</p>
</div>
{/* Hızlı Erişim Butonları */}
<div className="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-3 mb-6">
<QuickAccessCard
href="/stocks"
icon={<BarChart3 className="h-5 w-5" />}
title="Hisse Analizi"
color="blue"
/>
<QuickAccessCard
href="/ml-scan"
icon={<Zap className="h-5 w-5" />}
title="ML Tarama"
color="purple"
/>
<QuickAccessCard
href="/scanner"
icon={<Search className="h-5 w-5" />}
title="Teknik Tarayıcı"
color="green"
/>
<QuickAccessCard
href="/ai-analysis"
icon={<Brain className="h-5 w-5" />}
title="AI Analiz"
color="pink"
/>
<QuickAccessCard
href="/backtest"
icon={<Target className="h-5 w-5" />}
title="Backtest (Baseline)"
color="orange"
/>
<QuickAccessCard
href="/bist100"
icon={<Activity className="h-5 w-5" />}
title="BIST100"
color="indigo"
/>
</div>
<MarketOverview />
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8">
<div className="lg:col-span-2 space-y-6">
<StockList />
{/* Özellik Kartları */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<FeatureCard
href="/scanner"
icon={<Search className="h-6 w-6 text-green-600" />}
title="Teknik Tarayıcı"
description="RSI, MACD, Bollinger pozisyonu ve hacim oranı ile deterministik tarama (best-effort)"
items={['RSI Aralığı', 'MACD Bullish/Bearish', 'Bollinger Pozisyonu']}
/>
<FeatureCard
href="/ai-analysis"
icon={<Brain className="h-6 w-6 text-pink-600" />}
title="AI Analiz"
description="Piyasa özeti + hisse için model çıktısı (best-effort)"
items={['Piyasa Özeti', 'Fiyat Tahmini', 'Model Çıktısı (Best-effort)']}
/>
<FeatureCard
href="/profiles"
icon={<Building2 className="h-6 w-6 text-blue-600" />}
title="Hisse Profilleri"
description="API'den gelen özet metrikler (best-effort)"
items={['Fiyat', 'Günlük Değişim', 'Hacim & RSI (varsa)']}
/>
<FeatureCard
href="/news"
icon={<Newspaper className="h-6 w-6 text-amber-600" />}
title="Haberler"
description="Google News RSS (best-effort). Sentiment varsa gösterilir; yoksa boş bırakılır"
items={['Hisse Haberleri', 'Kaynak Filtreleme', 'Sentiment: varsa']}
/>
</div>
</div>
<div className="space-y-6">
<TopMLPredictions />
<TopMovers />
{/* ML Modelleri Bilgi Kartı */}
<div className="bg-gradient-to-br from-purple-50 to-blue-50 rounded-lg p-4 border border-purple-200">
<h3 className="font-semibold text-gray-900 mb-3 flex items-center gap-2">
<Zap className="h-5 w-5 text-purple-600" />
ML Model Seçenekleri
</h3>
<div className="space-y-2 text-sm">
<div className="flex items-center justify-between">
<span className="text-gray-600">XGBoost</span>
<span className="text-green-600 font-medium">Kullanımda</span>
</div>
<div className="flex items-center justify-between">
<span className="text-gray-600">LightGBM</span>
<span className="text-green-600 font-medium">Kullanımda</span>
</div>
<div className="flex items-center justify-between">
<span className="text-gray-600">RandomForest</span>
<span className="text-green-600 font-medium">Kullanımda</span>
</div>
<div className="flex items-center justify-between">
<span className="text-gray-600">Ensemble (3 Model)</span>
<span className="text-purple-600 font-medium">Varsayılan</span>
</div>
</div>
<Link
href="/ml-scan"
className="mt-3 block text-center text-sm text-purple-600 hover:text-purple-800 font-medium"
>
ML Tarama Yap →
</Link>
</div>
</div>
</div>
</div>
)
}
function QuickAccessCard({
href,
icon,
title,
color
}: {
href: string
icon: React.ReactNode
title: string
color: string
}) {
const colorClasses: Record<string, string> = {
blue: 'bg-blue-50 text-blue-600 hover:bg-blue-100 border-blue-200',
purple: 'bg-purple-50 text-purple-600 hover:bg-purple-100 border-purple-200',
green: 'bg-green-50 text-green-600 hover:bg-green-100 border-green-200',
pink: 'bg-pink-50 text-pink-600 hover:bg-pink-100 border-pink-200',
orange: 'bg-orange-50 text-orange-600 hover:bg-orange-100 border-orange-200',
indigo: 'bg-indigo-50 text-indigo-600 hover:bg-indigo-100 border-indigo-200',
}
return (
<Link
href={href}
className={`flex flex-col items-center justify-center p-3 rounded-lg border transition-colors ${colorClasses[color]}`}
>
{icon}
<span className="mt-1 text-xs font-medium text-gray-700">{title}</span>
</Link>
)
}
function FeatureCard({
href,
icon,
title,
description,
items
}: {
href: string
icon: React.ReactNode
title: string
description: string
items: string[]
}) {
return (
<Link
href={href}
className="block bg-white rounded-lg border border-gray-200 p-4 hover:shadow-md hover:border-gray-300 transition-all group"
>
<div className="flex items-start gap-3">
<div className="flex-shrink-0 p-2 bg-gray-50 rounded-lg group-hover:bg-gray-100">
{icon}
</div>
<div className="flex-1 min-w-0">
<h3 className="font-semibold text-gray-900 flex items-center gap-2">
{title}
<ArrowRight className="h-4 w-4 text-gray-400 group-hover:text-gray-600 group-hover:translate-x-1 transition-transform" />
</h3>
<p className="text-sm text-gray-500 mt-1">{description}</p>
<div className="flex flex-wrap gap-1 mt-2">
{items.map((item, i) => (
<span key={i} className="text-xs bg-gray-100 text-gray-600 px-2 py-0.5 rounded">
{item}
</span>
))}
</div>
</div>
</div>
</Link>
)
}