diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md
index fdf6916..f28c2d0 100644
--- a/docs/quality/uygulama-durumu.md
+++ b/docs/quality/uygulama-durumu.md
@@ -2218,3 +2218,9 @@ Browser QA, dinamik sekme yüklemesi sonrası günlük bülten başlığını do
Headless browser kabulü artık giriş sonrası Günlük Bülten sekmesini dinamik olarak açıyor ve `Günlük İhale Bülteni` başlığını doğruluyor. Böylece İstanbul günü düzeltmesiyle birlikte sekme yükleme ve erişilebilir başlık regresyonu da otomatik izleniyor.
Doğrulama: browser QA başarılı; günlük bülten, analitik, ICS, çıktı ve mobil kontrolleri aynı koşuda geçti.
+
+### 2026-09-06 · Örtük düğme gönderimlerinin kaldırılması
+
+Tüm JSX ekranlarında form dışında kalan düğmeler açık `type="button"` kullanacak şekilde standardize edildi. Filtre, gezinme, dışa aktarma, modal, pazar, bildirim ve yönetim eylemleri artık bir form kapsayıcısına taşınsa bile istemeden submit tetiklemiyor; gerçek form gönderimleri `type="submit"` olarak korunuyor.
+
+Doğrulama: 293 otomatik test, üretim derlemesi ve browser QA başarılı. QA akışı Günlük Bülten, Analitik, ICS, çıktı ve 390px mobil kontrollerini geçti.
diff --git a/src/components/AiSpecAnalyzerModal.jsx b/src/components/AiSpecAnalyzerModal.jsx
index 86ee827..d23b1de 100644
--- a/src/components/AiSpecAnalyzerModal.jsx
+++ b/src/components/AiSpecAnalyzerModal.jsx
@@ -371,7 +371,7 @@ export const AiSpecAnalyzerModal = () => {
-
setIsAiSpecAnalyzerOpen(false)}
className="bg-slate-800 hover:bg-slate-700 text-white font-bold text-xs px-6 py-2.5 rounded-xl transition-colors"
>
diff --git a/src/components/KanbanBoard.jsx b/src/components/KanbanBoard.jsx
index 3620e20..a3d817e 100644
--- a/src/components/KanbanBoard.jsx
+++ b/src/components/KanbanBoard.jsx
@@ -139,7 +139,7 @@ export const KanbanBoard = () => {
{info.label}
;
})()}
- setActiveTenderDetail(t)}
className="text-slate-400 hover:text-blue-600 p-0.5"
aria-label={`${t.ikn} ihale detayını aç`}
diff --git a/src/components/LandingPage.jsx b/src/components/LandingPage.jsx
index 1acf3a4..c4a18c2 100644
--- a/src/components/LandingPage.jsx
+++ b/src/components/LandingPage.jsx
@@ -200,7 +200,7 @@ export const LandingPage = ({ onGiris }) => {
Nasıl çalışır?
Rakamlarla
-
+
Giriş Yap
@@ -225,7 +225,7 @@ export const LandingPage = ({ onGiris }) => {
fiyat analizini tek panelde toplar. Siz teklife odaklanın, takibi biz yapalım.
@@ -347,7 +347,7 @@ export const LandingPage = ({ onGiris }) => {
diff --git a/src/components/LeftSidebar.jsx b/src/components/LeftSidebar.jsx
index 007f206..50bc4e9 100644
--- a/src/components/LeftSidebar.jsx
+++ b/src/components/LeftSidebar.jsx
@@ -90,7 +90,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
Hızlı Erişim
{(detailedQueries.institution || detailedQueries.registration || selectedRegion || quickFilter !== 'all' || selectedSektorler.length || selectedCpvler.length || selectedCity || selectedAlimTuru || selectedKurumTipi) && (
-
@@ -103,7 +103,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
const Icon = item.icon;
const isSelected = quickFilter === item.id;
return (
- {
setQuickFilter(item.id);
@@ -156,12 +156,12 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
className="bg-slate-50 hover:bg-slate-100 p-2.5 rounded-lg border border-slate-200 flex items-center justify-between text-xs transition-colors group"
>
-
applySavedFilter(filter)} aria-label={`${filter.name} filtresini uygula`}>{filter.name}
+
applySavedFilter(filter)} aria-label={`${filter.name} filtresini uygula`}>{filter.name}
👤 {filter.user} {filter.sehir && `• 📍 ${filter.sehir}`}
- 0} aria-label={`${filter.name} filtresini sil`} onClick={() => deleteSavedFilter(filter.id)}
title="Filtreyi Sil"
className="text-slate-400 hover:text-red-600 p-1 opacity-60 group-hover:opacity-100 transition-opacity"
@@ -173,7 +173,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
)}
- setActiveTab('smart_filter_builder')}
className="w-full bg-blue-600 hover:bg-blue-500 text-white font-bold py-2 px-3 rounded-lg text-xs flex items-center justify-center gap-2 transition-colors shadow-xs"
>
@@ -187,7 +187,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
{/* Alım Türü */}
-
toggleSection('alimTuru')}
className="w-full px-4 py-3 flex items-center justify-between text-xs font-bold text-slate-800 bg-slate-50/50 hover:bg-slate-100 transition-colors"
>
@@ -219,7 +219,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
{/* Sektörler */}
-
toggleSection('sektorler')}
className="w-full px-4 py-3 flex items-center justify-between text-xs font-bold text-slate-800 bg-slate-50/50 hover:bg-slate-100 transition-colors"
>
@@ -238,7 +238,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
className="w-full border border-slate-200 rounded-lg px-2 py-1.5 mb-1 text-xs focus:outline-hidden focus:ring-2 focus:ring-blue-500/30"
/>
-
{ setSelectedSektorler([]); setActiveTab('list'); }}
className={`w-full text-left px-2 py-1 rounded font-medium ${!selectedSektorler.length ? 'bg-blue-50 text-blue-700 font-bold' : 'text-slate-600 hover:bg-slate-50'}`}
>
@@ -271,7 +271,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
{/* CPV Kodu */}
-
toggleSection('cpv')}
className="w-full px-4 py-3 flex items-center justify-between text-xs font-bold text-slate-800 bg-slate-50/50 hover:bg-slate-100 transition-colors"
>
@@ -313,7 +313,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
className="w-full border border-slate-200 rounded-lg px-2 py-1.5 mb-1 text-xs focus:outline-hidden focus:ring-2 focus:ring-blue-500/30"
/>
-
{ setSelectedCpvler([]); setActiveTab('list'); }}
className={`w-full text-left px-2 py-1 rounded font-medium ${!selectedCpvler.length ? 'bg-blue-50 text-blue-700 font-bold' : 'text-slate-600 hover:bg-slate-50'}`}
>
@@ -346,7 +346,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
{/* Kurum Tipleri */}
-
toggleSection('kurumTipleri')}
className="w-full px-4 py-3 flex items-center justify-between text-xs font-bold text-slate-800 bg-slate-50/50 hover:bg-slate-100 transition-colors"
>
@@ -357,14 +357,14 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
{openSections.kurumTipleri && (
-
{ setSelectedKurumTipi(''); setActiveTab('list'); }}
className={`w-full text-left px-2 py-1 rounded font-medium ${!selectedKurumTipi ? 'bg-blue-50 text-blue-700 font-bold' : 'text-slate-600 hover:bg-slate-50'}`}
>
Tüm Kurumlar
{INSTITUTION_TYPES_LIST.map(k => (
-
{ setSelectedKurumTipi(k); setActiveTab('list'); }}
className={`w-full text-left px-2 py-1 rounded truncate font-medium ${selectedKurumTipi === k ? 'bg-blue-50 text-blue-700 font-bold' : 'text-slate-600 hover:bg-slate-50'}`}
@@ -378,7 +378,7 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
{/* İl Dağılımları */}
-
toggleSection('iller')}
className="w-full px-4 py-3 flex items-center justify-between text-xs font-bold text-slate-800 bg-slate-50/50 hover:bg-slate-100 transition-colors"
>
@@ -389,14 +389,14 @@ export const LeftSidebar = ({onOpenProductSearch} = {}) => {
{openSections.iller && (
-
{ setSelectedCity(''); setActiveTab('list'); }}
className={`w-full text-left px-2 py-1 rounded font-medium ${!selectedCity ? 'bg-blue-50 text-blue-700 font-bold' : 'text-slate-600 hover:bg-slate-50'}`}
>
Tüm Şehirler
{CITIES_LIST.map(city => (
-
{ setSelectedCity(city); setActiveTab('list'); }}
className={`w-full text-left px-2 py-1 rounded font-medium ${selectedCity === city ? 'bg-blue-50 text-blue-700 font-bold' : 'text-slate-600 hover:bg-slate-50'}`}
diff --git a/src/components/SmartFilterBuilder.jsx b/src/components/SmartFilterBuilder.jsx
index c22da1e..4a71792 100644
--- a/src/components/SmartFilterBuilder.jsx
+++ b/src/components/SmartFilterBuilder.jsx
@@ -68,7 +68,7 @@ export const SmartFilterBuilder = () => {
Arama ölçütlerinizi kaydedin; soldaki filtre adına tıklayarak ihale listesine uygulayın. E-posta bildirimleri Yönetim → Mobil PWA bölümünden ayrıca kurulur.
- setActiveTab('list')}
className="bg-slate-800 hover:bg-slate-700 text-white font-semibold text-xs px-4 py-2 rounded-lg flex items-center gap-2 transition-colors shadow-xs"
>
@@ -105,7 +105,7 @@ export const SmartFilterBuilder = () => {
applySavedFilter(f)} aria-label={`${f.name} filtresini uygula`}>{f.name}
- 0} aria-label={`${f.name} filtresini sil`} onClick={async()=>{setSuccessMessage('');await deleteSavedFilter(f.id);}}
className="text-slate-400 hover:text-red-600 text-xs"
>
@@ -117,7 +117,7 @@ export const SmartFilterBuilder = () => {
))}
-
setActiveTab('list')}
className="w-full bg-slate-100 hover:bg-slate-200 text-slate-700 font-bold py-2.5 px-3 rounded-lg text-xs flex items-center justify-center gap-2 transition-colors border border-slate-200"
>
diff --git a/src/components/TenderCard.jsx b/src/components/TenderCard.jsx
index 1d45e97..6744461 100644
--- a/src/components/TenderCard.jsx
+++ b/src/components/TenderCard.jsx
@@ -84,7 +84,7 @@ export const TenderCard = ({ tender }) => {
{tender.kurum}
- { e.stopPropagation(); toggleFavoriteKurum(tender.kurum); }}
disabled={favoriteSaving || !tender.kurum?.trim()}
aria-busy={favoriteSaving} aria-pressed={Boolean(isFavKurum)}
diff --git a/src/components/TenderList.jsx b/src/components/TenderList.jsx
index 96866e6..1dd966e 100644
--- a/src/components/TenderList.jsx
+++ b/src/components/TenderList.jsx
@@ -172,7 +172,7 @@ export const TenderList = () => {
Tarihi Uzak Olanlar
-
@@ -218,7 +218,7 @@ export const TenderList = () => {
{gorunenTenders.length.toLocaleString('tr-TR')} / {filteredTenders.length.toLocaleString('tr-TR')} ihale gösteriliyor
{/* Gözlemci çalışmazsa elle yükleme yolu açık kalsın */}
-
diff --git a/src/components/TopNavigation.jsx b/src/components/TopNavigation.jsx
index bc08d52..0a09208 100644
--- a/src/components/TopNavigation.jsx
+++ b/src/components/TopNavigation.jsx
@@ -151,7 +151,7 @@ export const TopNavigation = () => {
const isActive = bekleyen ? bekleyen === item.id : activeTab === item.id;
const yukleniyor = bekleyen === item.id;
return (
- {
)}
{t.durum}
{/^\d{4}\/\d+$/.test(String(t.ikn || '')) && (
- { openSearchTender(t); setIsUrunAramaOpen(false); }}
className="font-bold text-indigo-700 hover:underline"
>
@@ -312,7 +312,7 @@ export const UrunAramaModal = () => {
{sonuc.totalCount > SAYFA && (
-
sorgula(submitted, durum.sayfa - 1)}
className="text-xs font-bold px-3 py-1.5 rounded-lg border border-slate-300 disabled:opacity-40"
@@ -322,7 +322,7 @@ export const UrunAramaModal = () => {
{durum.sayfa + 1} / {Math.ceil(sonuc.totalCount / SAYFA).toLocaleString('tr-TR')}
- = sonuc.totalCount || durum.yukleniyor}
onClick={() => sorgula(submitted, durum.sayfa + 1)}
className="text-xs font-bold px-3 py-1.5 rounded-lg border border-slate-300 disabled:opacity-40"
diff --git a/src/components/tools/AiModelSettings.jsx b/src/components/tools/AiModelSettings.jsx
index cffab28..07b8906 100644
--- a/src/components/tools/AiModelSettings.jsx
+++ b/src/components/tools/AiModelSettings.jsx
@@ -98,7 +98,7 @@ export const AiModelSettings = () => {
Şartname analizi ve AI özelliklerinde kullanılacak modeli ve yedek (fallback) sırasını belirleyin.
-
@@ -127,11 +127,11 @@ export const AiModelSettings = () => {
className={`flex items-center gap-4 p-4 rounded-xl border ${idx === 0 ? 'border-indigo-300 bg-indigo-50/40 ring-1 ring-indigo-200' : 'border-slate-200 bg-slate-50/60'}`}
>
-
move(idx, -1)} disabled={idx === 0} className="text-slate-400 hover:text-indigo-600 disabled:opacity-30">
+ move(idx, -1)} disabled={idx === 0} className="text-slate-400 hover:text-indigo-600 disabled:opacity-30">
{idx + 1}
- move(idx, 1)} disabled={idx === chain.length - 1} className="text-slate-400 hover:text-indigo-600 disabled:opacity-30">
+ move(idx, 1)} disabled={idx === chain.length - 1} className="text-slate-400 hover:text-indigo-600 disabled:opacity-30">
@@ -155,11 +155,11 @@ export const AiModelSettings = () => {
{idx !== 0 && (
- setPrimary(idx)} className="text-[11px] font-bold text-indigo-600 hover:text-indigo-800 border border-indigo-200 rounded-lg px-2.5 py-1.5">
+ setPrimary(idx)} className="text-[11px] font-bold text-indigo-600 hover:text-indigo-800 border border-indigo-200 rounded-lg px-2.5 py-1.5">
Birincil yap
)}
- remove(idx)} disabled={chain.length <= 1} className="text-slate-400 hover:text-red-500 disabled:opacity-30 p-1.5">
+ remove(idx)} disabled={chain.length <= 1} className="text-slate-400 hover:text-red-500 disabled:opacity-30 p-1.5">
@@ -178,7 +178,7 @@ export const AiModelSettings = () => {
{available.map(m => (
-
add(m.id)}
className="text-left p-4 rounded-xl border border-slate-200 hover:border-indigo-300 hover:bg-indigo-50/40 transition group"
diff --git a/src/components/tools/ApiWebhooks.jsx b/src/components/tools/ApiWebhooks.jsx
index f619b39..55b8c31 100644
--- a/src/components/tools/ApiWebhooks.jsx
+++ b/src/components/tools/ApiWebhooks.jsx
@@ -89,7 +89,7 @@ const ApiKeySession = () => {
return (
- {hata &&
Yeniden dene }
+ {hata &&
Yeniden dene }
@@ -124,7 +124,7 @@ const ApiKeySession = () => {
{yeniAnahtar.anahtar}
- kopyala(yeniAnahtar.anahtar)}
+ kopyala(yeniAnahtar.anahtar)}
className="bg-emerald-600 hover:bg-emerald-500 text-white font-bold text-xs px-3 py-2 rounded-lg flex items-center gap-1.5 shrink-0">
{kopyalandi ? : }
{kopyalandi ? 'Kopyalandı' : 'Kopyala'}
@@ -167,7 +167,7 @@ const ApiKeySession = () => {
{k.son_kullanim ? `son kullanım: ${new Date(k.son_kullanim).toLocaleString('tr-TR')}` : 'hiç kullanılmadı'}
-
iptal(k.id)} disabled={busy || loading}
+ iptal(k.id)} disabled={busy || loading}
className="text-slate-400 hover:text-red-500 shrink-0" title="Anahtarı iptal et">
@@ -180,7 +180,7 @@ const ApiKeySession = () => {
setYeniAd(e.target.value)}
aria-label="Anahtar adı" placeholder="Anahtar adı (ör. ERP Entegrasyonu)" disabled={kilitli || busy || loading || !durum}
className="min-w-0 flex-1 bg-slate-50 border border-slate-200 rounded-lg px-2.5 py-2 text-xs disabled:opacity-50" />
- = limit)}
+ = limit)}
className="bg-violet-600 hover:bg-violet-500 disabled:opacity-40 text-white font-bold text-xs px-4 rounded-lg flex items-center gap-1.5">
{busy ? : } Oluştur
diff --git a/src/components/tools/BriefTercihi.jsx b/src/components/tools/BriefTercihi.jsx
index b400f50..4ec6983 100644
--- a/src/components/tools/BriefTercihi.jsx
+++ b/src/components/tools/BriefTercihi.jsx
@@ -34,9 +34,9 @@ function BriefPanel(){
Haftalık Brief
Haftanın takipli ihaleleri ve geçen hafta sonuçlanan takipliler için özet tercihi. Gönderim, sunucu zamanlayıcısının ve ilgili e-posta/Telegram hizmetinin etkin olmasına bağlıdır.
- {value&&run(false)} className="border rounded px-3 py-2 text-xs">{value.kapali?'Haftalık özet kapalı':'Haftalık özet açık'} }
- run(true)} className="border rounded px-3 py-2 text-xs">Önizle
- setAttempt(n=>n+1)} className="border rounded px-3 py-2 text-xs">Özet ayarını yenile
+ {value&&run(false)} className="border rounded px-3 py-2 text-xs">{value.kapali?'Haftalık özet kapalı':'Haftalık özet açık'} }
+ run(true)} className="border rounded px-3 py-2 text-xs">Önizle
+ setAttempt(n=>n+1)} className="border rounded px-3 py-2 text-xs">Özet ayarını yenile
{busy&&Haftalık özet işlemi sürüyor…
}
{error&&{error}
}
diff --git a/src/components/tools/CompetitorRadar.jsx b/src/components/tools/CompetitorRadar.jsx
index d0b1ebd..9309baf 100644
--- a/src/components/tools/CompetitorRadar.jsx
+++ b/src/components/tools/CompetitorRadar.jsx
@@ -59,7 +59,7 @@ export const CompetitorRadar = () => {
-
setActiveTab('sozlesme')}
className="bg-white/10 hover:bg-white/20 text-white font-bold text-xs px-4 py-2.5 rounded-xl border border-white/20 transition-colors flex items-center gap-2 shrink-0"
>
@@ -120,7 +120,7 @@ export const CompetitorRadar = () => {
)}
- addFromReal(f)}
disabled={competitorSaving || watched.has(f.name.trim().toLocaleLowerCase('tr-TR'))}
className="text-[11px] font-bold px-3 py-1.5 rounded-lg border border-indigo-200 text-indigo-700 hover:bg-indigo-50 disabled:opacity-40 shrink-0"
@@ -207,7 +207,7 @@ export const CompetitorRadar = () => {
{/* Notification Toggles & Actions */}
-
@@ -215,7 +215,7 @@ export const CompetitorRadar = () => {
Teklif uyarısı etkin değil
-
@@ -223,7 +223,7 @@ export const CompetitorRadar = () => {
Kazanım uyarısı etkin değil
- removeCompetitor(comp.id)}
className="p-2 text-slate-400 hover:text-red-600 rounded-lg transition-colors"
title="Radardan Çıkar"
diff --git a/src/components/tools/KikDecisions.jsx b/src/components/tools/KikDecisions.jsx
index d92a642..c11dbe1 100644
--- a/src/components/tools/KikDecisions.jsx
+++ b/src/components/tools/KikDecisions.jsx
@@ -61,7 +61,7 @@ export const KikDecisions = () => {
/>
- ara()}
disabled={loading || !q.trim()}
className="bg-amber-600 hover:bg-amber-500 disabled:opacity-40 text-white font-bold text-xs px-5 rounded-lg flex items-center gap-2"
@@ -74,7 +74,7 @@ export const KikDecisions = () => {
Takibinizdeki idareler:
{oneriler.map((k) => (
-
{ setQ(k); ara(k); }}
+ { setQ(k); ara(k); }}
className="text-[11px] bg-slate-100 hover:bg-slate-200 text-slate-700 px-2 py-1 rounded-md font-medium truncate max-w-[220px]">
{k}
diff --git a/src/components/tools/McpRssKarti.jsx b/src/components/tools/McpRssKarti.jsx
index aebab84..36c86cb 100644
--- a/src/components/tools/McpRssKarti.jsx
+++ b/src/components/tools/McpRssKarti.jsx
@@ -24,7 +24,7 @@ export const McpRssKarti = () => {
{o.ad} — {o.not}
-
kopyala(o.k, o.kod)} className="text-[11px] flex items-center gap-1 border border-slate-200 rounded-lg px-2 py-1 hover:bg-slate-50">{kopya === o.k ? : } Kopyala
+
kopyala(o.k, o.kod)} className="text-[11px] flex items-center gap-1 border border-slate-200 rounded-lg px-2 py-1 hover:bg-slate-50">{kopya === o.k ? : } Kopyala
{o.kod}
@@ -32,7 +32,7 @@ export const McpRssKarti = () => {
RSS beslemesi — Feedly, Outlook, Slack RSS, n8n… (il, sektor, q filtreleri)
-
kopyala('rss', rss)} className="text-[11px] flex items-center gap-1 border border-slate-200 rounded-lg px-2 py-1 hover:bg-slate-50">{kopya === 'rss' ? : } Kopyala
+
kopyala('rss', rss)} className="text-[11px] flex items-center gap-1 border border-slate-200 rounded-lg px-2 py-1 hover:bg-slate-50">{kopya === 'rss' ? : } Kopyala
{rss}
Sonuç ilanları beslemesi anahtarsız: {origin}/api/feeds/sonuc.rss (firma, idare, il filtreleri). Anahtarı ih_live_ANAHTARINIZ yerine yazın.
diff --git a/src/components/tools/NotifySubscriptions.jsx b/src/components/tools/NotifySubscriptions.jsx
index 224d545..88bdf01 100644
--- a/src/components/tools/NotifySubscriptions.jsx
+++ b/src/components/tools/NotifySubscriptions.jsx
@@ -126,7 +126,7 @@ const SubscriptionForm = () => {
{a.deliveryStatus &&
{a.deliveryStatus.state==='uncertain'?'Gönderim sonucu belirsiz. Uygulama yöneticisinin sağlayıcı kaydını kontrol etmesi gerekiyor.':'E-posta gönderimi bekliyor.'} }
- sil(a.id)} disabled={busy} className="text-slate-400 hover:text-red-500 shrink-0 mt-0.5" aria-label={`Aboneliği sil: ${ozet(a)}`} title="Sil">
+ sil(a.id)} disabled={busy} className="text-slate-400 hover:text-red-500 shrink-0 mt-0.5" aria-label={`Aboneliği sil: ${ozet(a)}`} title="Sil">
@@ -143,7 +143,7 @@ const SubscriptionForm = () => {
setSite(e.target.value)}
placeholder="firmasitesi.com"
className="flex-1 bg-white border border-blue-200 rounded-lg px-2.5 py-2 text-xs" />
-
{taraniyor ? : }
{taraniyor ? 'Taranıyor…' : 'Tara'}
@@ -163,7 +163,7 @@ const SubscriptionForm = () => {
Önerilen konular — eklemek için tıklayın:
{oneriler.map((k) => (
- konuEkle(k)}
+ konuEkle(k)}
className="text-[11px] bg-white hover:bg-blue-100 border border-blue-300 text-blue-900 px-2 py-1 rounded-md font-medium">
+ {k}
@@ -185,7 +185,7 @@ const SubscriptionForm = () => {
{konular.map((k) => (
{k}
- konuCikar(k)} className="text-emerald-700 hover:text-red-600">
+ konuCikar(k)} className="text-emerald-700 hover:text-red-600">
))}
@@ -196,14 +196,14 @@ const SubscriptionForm = () => {
onKeyDown={(e) => { if (e.key === 'Enter') { konuEkle(ozelKonu); setOzelKonu(''); } }}
placeholder="Kendi konunuzu yazın ve Enter'a basın"
className="flex-1 bg-slate-50 border border-slate-200 rounded-lg px-2.5 py-2 text-xs" />
- { konuEkle(ozelKonu); setOzelKonu(''); }}
+ { konuEkle(ozelKonu); setOzelKonu(''); }}
className="bg-slate-800 hover:bg-slate-700 text-white font-bold text-xs px-3 rounded-lg">Ekle
Hazır sektörler:
{sektorListesi.map((s) => (
-
konuEkle(s)}
+ konuEkle(s)}
className="text-[11px] bg-slate-100 hover:bg-slate-200 text-slate-700 px-2 py-1 rounded-md">
+ {s}
@@ -213,7 +213,7 @@ const SubscriptionForm = () => {
{/* Gelişmiş daraltma (isteğe bağlı) */}
- setGelismis(!gelismis)} className="text-[11px] font-bold text-slate-500 hover:text-slate-800 flex items-center gap-1">
+ setGelismis(!gelismis)} className="text-[11px] font-bold text-slate-500 hover:text-slate-800 flex items-center gap-1">
{gelismis ? : }
Daha da daralt (isteğe bağlı) — varsayılan: tüm Türkiye
@@ -235,7 +235,7 @@ const SubscriptionForm = () => {
)}
-
{busy ? : }
Bildirimi Kaydet
@@ -244,7 +244,7 @@ const SubscriptionForm = () => {
{error && (
-
{error} Abonelikleri yeniden yükle
+
{error} Abonelikleri yeniden yükle
)}
diff --git a/src/components/tools/Pricing.jsx b/src/components/tools/Pricing.jsx
index 88427a4..aa5d817 100644
--- a/src/components/tools/Pricing.jsx
+++ b/src/components/tools/Pricing.jsx
@@ -62,10 +62,10 @@ export const Pricing = () => {
{/* Aylık / Yıllık */}
- setYillik(true)} className={`px-4 py-2 rounded-lg transition-colors flex items-center gap-1.5 ${yillik ? 'bg-blue-600 text-white' : 'text-slate-600 hover:bg-slate-50'}`}>
+ setYillik(true)} className={`px-4 py-2 rounded-lg transition-colors flex items-center gap-1.5 ${yillik ? 'bg-blue-600 text-white' : 'text-slate-600 hover:bg-slate-50'}`}>
Yıllık %17 indirim
- setYillik(false)} className={`px-4 py-2 rounded-lg transition-colors ${!yillik ? 'bg-blue-600 text-white' : 'text-slate-600 hover:bg-slate-50'}`}>
+ setYillik(false)} className={`px-4 py-2 rounded-lg transition-colors ${!yillik ? 'bg-blue-600 text-white' : 'text-slate-600 hover:bg-slate-50'}`}>
Aylık
@@ -107,7 +107,7 @@ export const Pricing = () => {
{plan.iptalEdilebilir && (
- setIptalAcik(true)}
className="text-xs font-bold text-red-600 hover:text-red-700 hover:bg-red-50 border border-red-200 px-3 py-2 rounded-xl flex items-center gap-1.5 transition-colors"
>
@@ -183,7 +183,7 @@ export const Pricing = () => {
Mevcut planınız
) : (
- upgrade(p.id)}
disabled={!(yillik ? p.satinAlinabilirYillik : p.satinAlinabilir) || busy === p.id || !authUser}
title={!authUser ? 'Önce giriş yapın' : !(yillik ? p.satinAlinabilirYillik : p.satinAlinabilir) ? 'Ödeme altyapısı bağlanmadı' : ''}
diff --git a/src/components/tools/PwaSettings.jsx b/src/components/tools/PwaSettings.jsx
index 02f8b36..3e9ab6b 100644
--- a/src/components/tools/PwaSettings.jsx
+++ b/src/components/tools/PwaSettings.jsx
@@ -162,7 +162,7 @@ const PwaPanel = () => {
-
@@ -192,17 +192,17 @@ const PwaPanel = () => {
{permission === 'denied' ? (
Bu site için bildirimler tarayıcı tarafından engellenmiş. Adres çubuğundaki site bilgileri veya tarayıcının site ayarlarından bildirim iznini değiştirin, ardından buraya dönün.
-
Bildirim iznini yeniden kontrol et
+
Bildirim iznini yeniden kontrol et
) : permission === 'unsupported' ? (
Bu tarayıcıda bildirim özelliği kullanılamıyor. Uygulama içindeki bildirim listesini kullanabilirsiniz.
) : permission !== 'granted' ? (
-
{permissionBusy?'İzin yanıtı bekleniyor…':'Bildirimlere İzin Ver'}
) : (
- notify('Test bildirimi', isQuietNow() || !reminderSettings.pushEnabled ? 'Tarayıcı bildirimi kapalı veya sessiz saatte — listeye eklendi.' : 'Tarayıcı bildirimi gösterim denemesi.')}
+ notify('Test bildirimi', isQuietNow() || !reminderSettings.pushEnabled ? 'Tarayıcı bildirimi kapalı veya sessiz saatte — listeye eklendi.' : 'Tarayıcı bildirimi gösterim denemesi.')}
className="w-full bg-emerald-600 hover:bg-emerald-500 text-white font-bold text-xs py-2.5 rounded-xl">
Test Bildirimi Gönder
@@ -268,7 +268,7 @@ const PwaPanel = () => {
setEmailConfigAttempt(n=>n+1)} className="text-xs underline">E-posta durumunu yenile
E-posta gönderimlerini aşağıdaki bildirim aboneliklerinden yönetin. Tarayıcı bildirim seçimi ve sessiz saatler e-posta aboneliklerini kapatmaz.
- {
İhaleist'i iOS, Android, Windows veya Mac cihazınıza bir tıklama ile uygulama olarak kurun.
- {
{f.aciklama}
{f.tender ? (
- setActiveTenderDetail(f.tender)}
className="text-[11px] font-bold text-blue-700 hover:underline mt-1.5 text-left"
>
diff --git a/src/components/tools/TedTenders.jsx b/src/components/tools/TedTenders.jsx
index 0ea8fb4..bd9d7f1 100644
--- a/src/components/tools/TedTenders.jsx
+++ b/src/components/tools/TedTenders.jsx
@@ -65,7 +65,7 @@ export const TedTenders = () => {
{/* Mod seçici */}
{MODLAR.map((m) => (
-
setMod(m.id)}
className={`px-4 py-2 rounded-xl text-xs font-bold border transition-colors ${
@@ -75,7 +75,7 @@ export const TedTenders = () => {
{m.label}
))}
-
yukle(mod)}
disabled={loading}
className="px-3 py-2 rounded-xl text-xs font-bold border border-slate-200 bg-white text-slate-600 hover:bg-slate-50 flex items-center gap-1.5 disabled:opacity-50"
diff --git a/src/components/tools/TurkeyHeatMap.jsx b/src/components/tools/TurkeyHeatMap.jsx
index 8901474..73ee552 100644
--- a/src/components/tools/TurkeyHeatMap.jsx
+++ b/src/components/tools/TurkeyHeatMap.jsx
@@ -61,7 +61,7 @@ export const TurkeyHeatMap = () => {
const c = density.get(normProvince(il)) || 0;
const { bg, fg } = heat(c, max);
return (
- c && openCity(il)}
disabled={!c}
diff --git a/src/components/tools/VatCalculator.jsx b/src/components/tools/VatCalculator.jsx
index 98d4249..2c708a0 100644
--- a/src/components/tools/VatCalculator.jsx
+++ b/src/components/tools/VatCalculator.jsx
@@ -58,7 +58,7 @@ export const VatCalculator = () => {
{/* Mode Selector */}
-
setMode('haric')}
className={`py-2.5 rounded-lg text-xs font-extrabold transition-all ${
mode === 'haric' ? 'bg-white text-blue-700 shadow-2xs' : 'text-slate-600 hover:text-slate-900'
@@ -66,7 +66,7 @@ export const VatCalculator = () => {
>
KDV Hariç ➔ KDV Dahil Hesapla
-
setMode('dahil')}
className={`py-2.5 rounded-lg text-xs font-extrabold transition-all ${
mode === 'dahil' ? 'bg-white text-blue-700 shadow-2xs' : 'text-slate-600 hover:text-slate-900'
@@ -130,7 +130,7 @@ export const VatCalculator = () => {