Landing: 'Yeni eklenenler' bölümü (11 yetenek) + derin analiz kartı + Yenilikler nav bağlantısı

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 10:03:17 +03:00
co-authored by Claude Fable 5.1
parent 48f0c48732
commit 25dde198d7
+40 -1
View File
@@ -2,8 +2,25 @@ import React, { useEffect, useRef, useState } from 'react';
import { import {
ArrowRight, Bell, Building2, CalendarDays, ChartNoAxesCombined, CheckCircle2, ArrowRight, Bell, Building2, CalendarDays, ChartNoAxesCombined, CheckCircle2,
FileSearch, Gavel, Kanban, MapPin, Radar, Sparkles, Tag, Timer, TrendingUp, Zap, FileSearch, Gavel, Kanban, MapPin, Radar, Sparkles, Tag, Timer, TrendingUp, Zap,
Microscope, FileSignature, Package, Search, Calculator, Trophy, Send, FolderCheck, ScanText, BookOpen, Smartphone,
} from 'lucide-react'; } from 'lucide-react';
/* ---------- yeni eklenenler ---------- */
const YENILIKLER = [
{ icon: FileSignature, baslik: 'İhale dosyası hazırla', metin: 'Analizden sonra teklif mektubu, birim fiyat cetveli ve evrak listesi tek tıkla; eksik bilgiyi sorar, yazıyla tutarı kendisi yazar, yazdırmaya hazır çıkarır.' },
{ icon: Package, baslik: 'Kartta teklif cetveli kalemleri', metin: 'Şartname indirmeden kalem adı, miktar ve birim ihale kartında. Ortak havuz: bir kullanıcının yüklediği doküman herkesin kartını doldurur.' },
{ icon: Search, baslik: 'Ürün arama — cetvel ve şartname içinde', metin: 'Ürününüzün adıyla EKAP teklif cetveli ve teknik şartnamelerin içinde arayın; OKAS koduyla da tarayın. Başlıkta geçmeyen ihaleleri bulun.' },
{ icon: Sparkles, baslik: 'Uyum skoru ve firma eşiği', metin: 'Firma profilinize göre her ihaleye hibrit (sözcük + anlamsal) uyum puanı; eşiğinizi kaydırın, yalnızca size uyanları görün, “Şirketime en uyumlu” sıralayın.' },
{ icon: Calculator, baslik: 'Sınır değer hesaplayıcı', metin: 'Kamu İhale Genel Tebliği 2026 formülleriyle hizmet, personel dayalı, mal ve yapım işleri için sınır değer; aşırı düşük sorgusuna kimin gireceğini önceden görün.' },
{ icon: Trophy, baslik: 'Kazanan istihbaratı', metin: 'Rakip firmanın kazandığı ihaleler, ortalama teklif, kırım oranı ve tek teklif oranı — kısmi ihale tuzağı ayıklanmış olarak.' },
{ icon: Send, baslik: 'Zeyilname, sonuç ve Telegram', metin: 'Takipteki ihalede zeyilname/tarih değişimi ve sonuç açıklanınca uygulama içi bildirim, e-posta ve isterseniz Telegram. Kurulum kılavuzu içeride.' },
{ icon: FolderCheck, baslik: 'Belge deposu süre takibi', metin: 'İmza sirküleri, ISO, yetki belgesi… toplu yükleyin, kategori ve son geçerlilik girin; süresi dolmadan 30 gün önce uyarı gelir.' },
{ icon: ScanText, baslik: 'Taranmış PDF için OCR', metin: 'Metin katmanı olmayan taranmış şartnameler tarayıcıda Türkçe OCR ile okunur; analiz ve kalem çıkarımı bunlarda da çalışır.' },
{ icon: BookOpen, baslik: 'Her ekranda kullanım kılavuzu', metin: 'Sağ alttaki “?” ya da klavyeden ? — bulunduğunuz ekrana özel adım adım kılavuz yan panelde açılır.' },
{ icon: Smartphone, baslik: 'Mobil uyumlu PWA', metin: 'Telefon ana ekranına ekleyin; filtreler çekmecede, kartlar tek sütunda. Bildirimler ve çevrimdışı kabukla cebinizde.' },
];
/* ---------- yardımcılar ---------- */ /* ---------- yardımcılar ---------- */
const useReveal = () => { const useReveal = () => {
@@ -62,6 +79,7 @@ const OZELLIKLER = [
{ icon: Radar, baslik: 'Rakip radarı', metin: 'Hangi firma hangi ihaleyi, hangi bedelle kazandı? Rakiplerinizin izini sürün, stratejinizi veriyle kurun.', renk: 'from-rose-400/20 to-rose-400/0', ikon: 'text-rose-300' }, { icon: Radar, baslik: 'Rakip radarı', metin: 'Hangi firma hangi ihaleyi, hangi bedelle kazandı? Rakiplerinizin izini sürün, stratejinizi veriyle kurun.', renk: 'from-rose-400/20 to-rose-400/0', ikon: 'text-rose-300' },
{ icon: TrendingUp, baslik: 'Fiyat & piyasa analizi', metin: 'Geçmiş sonuçlardan yaklaşık maliyet ve kırım oranı analizi. Teklifinizi tahminle değil, veriyle verin.', renk: 'from-emerald-400/20 to-emerald-400/0', ikon: 'text-emerald-300' }, { icon: TrendingUp, baslik: 'Fiyat & piyasa analizi', metin: 'Geçmiş sonuçlardan yaklaşık maliyet ve kırım oranı analizi. Teklifinizi tahminle değil, veriyle verin.', renk: 'from-emerald-400/20 to-emerald-400/0', ikon: 'text-emerald-300' },
{ icon: Bell, baslik: 'Günlük bülten & uyarılar', metin: 'Kriterlerinize uyan yeni ilanlar her sabah e-postanızda. Son teklif tarihi yaklaşınca otomatik hatırlatma.', renk: 'from-sky-400/20 to-sky-400/0', ikon: 'text-sky-300' }, { icon: Bell, baslik: 'Günlük bülten & uyarılar', metin: 'Kriterlerinize uyan yeni ilanlar her sabah e-postanızda. Son teklif tarihi yaklaşınca otomatik hatırlatma.', renk: 'from-sky-400/20 to-sky-400/0', ikon: 'text-sky-300' },
{ icon: Microscope, baslik: 'Derin analiz + yol haritası', yeni: true, metin: 'Şartname, sözleşme ve teklif cetvelini birlikte okur: elenme riskleri, gözden kaçan ince detaylar, kalem özellikleri, belge kontrol listesi ve teklif gününe geri sayan adım adım yol haritası.', renk: 'from-fuchsia-400/20 to-fuchsia-400/0', ikon: 'text-fuchsia-300' },
{ icon: Tag, baslik: 'AB uyumlu CPV sınıflandırması', metin: 'Türkiye\'de bir ilk: her ihale, Avrupa Birliği standardı CPV koduna göre otomatik sınıflandırılır. Sektörünüze uyan ihaleleri AB standardında filtreleyin.', renk: 'from-teal-400/20 to-teal-400/0', ikon: 'text-teal-300' }, { icon: Tag, baslik: 'AB uyumlu CPV sınıflandırması', metin: 'Türkiye\'de bir ilk: her ihale, Avrupa Birliği standardı CPV koduna göre otomatik sınıflandırılır. Sektörünüze uyan ihaleleri AB standardında filtreleyin.', renk: 'from-teal-400/20 to-teal-400/0', ikon: 'text-teal-300' },
]; ];
@@ -174,6 +192,7 @@ export const LandingPage = ({ onGiris }) => {
</div> </div>
<nav className="hidden items-center gap-8 text-sm font-semibold text-white/60 md:flex"> <nav className="hidden items-center gap-8 text-sm font-semibold text-white/60 md:flex">
<a href="#ozellikler" className="transition hover:text-white">Özellikler</a> <a href="#ozellikler" className="transition hover:text-white">Özellikler</a>
<a href="#yenilikler" className="flex items-center gap-1 transition hover:text-white">Yenilikler <span className="rounded bg-fuchsia-500 px-1 text-[9px] font-black text-white">{YENILIKLER.length}</span></a>
<a href="#nasil" className="transition hover:text-white">Nasıl çalışır?</a> <a href="#nasil" className="transition hover:text-white">Nasıl çalışır?</a>
<a href="#rakamlar" className="transition hover:text-white">Rakamlarla</a> <a href="#rakamlar" className="transition hover:text-white">Rakamlarla</a>
</nav> </nav>
@@ -256,7 +275,7 @@ export const LandingPage = ({ onGiris }) => {
<div className={`pointer-events-none absolute inset-0 bg-gradient-to-br opacity-0 transition duration-300 group-hover:opacity-100 ${o.renk}`} aria-hidden="true" /> <div className={`pointer-events-none absolute inset-0 bg-gradient-to-br opacity-0 transition duration-300 group-hover:opacity-100 ${o.renk}`} aria-hidden="true" />
<div className="relative"> <div className="relative">
<span className={`flex h-12 w-12 items-center justify-center rounded-xl border border-white/10 bg-white/[0.06] ${o.ikon}`}><o.icon size={22} /></span> <span className={`flex h-12 w-12 items-center justify-center rounded-xl border border-white/10 bg-white/[0.06] ${o.ikon}`}><o.icon size={22} /></span>
<h3 className="mt-6 text-xl font-black">{o.baslik}</h3> <h3 className="mt-6 flex items-center gap-2 text-xl font-black">{o.baslik}{o.yeni && <span className="rounded-md bg-fuchsia-500 px-1.5 py-0.5 text-[10px] font-black uppercase tracking-wider text-white">Yeni</span>}</h3>
<p className="mt-2.5 text-sm leading-7 text-white/55">{o.metin}</p> <p className="mt-2.5 text-sm leading-7 text-white/55">{o.metin}</p>
</div> </div>
</article> </article>
@@ -264,6 +283,26 @@ export const LandingPage = ({ onGiris }) => {
</div> </div>
</section> </section>
{/* yeni eklenenler */}
<section id="yenilikler" className="relative z-10 mx-auto max-w-7xl scroll-mt-24 px-5 py-16 sm:px-8">
<div className="lp-reveal max-w-2xl">
<span className="text-xs font-black uppercase tracking-[0.22em] text-fuchsia-300">Yeni eklenenler</span>
<h2 className="mt-4 text-4xl font-black tracking-tight sm:text-5xl">Dosyayı hazırlayan, <span className="lp-underline">sınırı hesaplayan</span> ihale masası.</h2>
<p className="mt-4 text-lg leading-8 text-white/55">Analizden teklif dosyasına, sınır değerden Telegram uyarısına — son güncellemeyle eklenen {YENILIKLER.length} yeni yetenek.</p>
</div>
<div className="mt-12 grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
{YENILIKLER.map((y, i) => (
<article key={y.baslik} className="lp-reveal group relative flex gap-4 rounded-2xl border border-white/10 bg-white/[0.04] p-5 transition duration-300 hover:-translate-y-1 hover:border-fuchsia-300/40" style={{ transitionDelay: `${(i % 3) * 80}ms` }}>
<span className="flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-fuchsia-300/20 bg-fuchsia-400/10 text-fuchsia-300"><y.icon size={20} /></span>
<div>
<h3 className="text-base font-black leading-snug">{y.baslik}</h3>
<p className="mt-1.5 text-sm leading-6 text-white/55">{y.metin}</p>
</div>
</article>
))}
</div>
</section>
{/* nasıl çalışır */} {/* nasıl çalışır */}
<section id="nasil" className="relative z-10 mx-auto max-w-7xl scroll-mt-24 px-5 py-16 sm:px-8"> <section id="nasil" className="relative z-10 mx-auto max-w-7xl scroll-mt-24 px-5 py-16 sm:px-8">
<div className="lp-reveal text-center"> <div className="lp-reveal text-center">