Revizyon 1: Varyasyon sayısını arttırdım türetme kısmı için. Ayrıca dolu olanlar için kaç gün sonra düşeceği bilgisini ekledim.

<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DomGen Elite | Geri Sayım & Gelişmiş Türetme</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Sora:wght@300;400;600;700&display=swap');
body { font-family: 'Sora', sans-serif; background: #0b0f1a; color: #f1f5f9; }
.glass { background: rgba(22, 30, 46, 0.8); backdrop-filter: blur(12px); border: 1px solid rgba(255,255,255,0.05); }
.spinner { border: 2px solid rgba(255,255,255,0.1); border-top: 2px solid #3b82f6; border-radius: 50%; width: 14px; height: 14px; animation: spin 0.8s linear infinite; }
@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
.star-active { color: #fbbf24 !important; }
.expiring-badge { background: rgba(239, 68, 68, 0.1); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.2); }
</style>
</head>
<body class="min-h-screen pb-20">
<div class="max-w-7xl mx-auto px-4 pt-10">
<header class="flex flex-col md:flex-row justify-between items-center mb-10 gap-4">
<div>
<h1 class="text-4xl font-black text-white tracking-tighter">DOMGEN <span class="text-blue-500 text-2xl">ULTRA</span></h1>
<p id="statusInfo" class="text-[10px] font-bold text-slate-500 uppercase tracking-widest">Gelişmiş Takip Sistemi Aktif</p>
</div>
<button onclick="toggleFavPanel()" class="px-5 py-2.5 bg-slate-800 hover:bg-slate-700 rounded-xl text-sm font-bold flex items-center gap-2 transition shadow-xl">
<i class="fas fa-star text-amber-400"></i> Favoriler (<span id="favCount">0</span>)
</button>
</header>
<div class="grid grid-cols-1 lg:grid-cols-12 gap-8">
<div class="lg:col-span-4 space-y-6">
<div class="glass p-6 rounded-[2rem] shadow-2xl">
<label class="block text-[11px] font-black text-slate-500 mb-3 uppercase tracking-widest">Domain Listesi</label>
<textarea id="bulkInput" rows="6" placeholder="Her satıra bir kelime..."
class="w-full bg-slate-900 border border-slate-700/50 rounded-2xl p-4 text-sm focus:border-blue-500 outline-none transition-all resize-none mb-6"></textarea>
<div class="flex items-center justify-between mb-6 p-4 bg-white/5 rounded-2xl">
<div class="flex flex-col">
<span class="text-xs font-bold">Turbo Türetme</span>
<span class="text-[9px] text-slate-500">50+ Farklı Kombinasyon</span>
</div>
<input type="checkbox" id="generateSwitch" checked class="w-5 h-5 accent-blue-600">
</div>
<button onclick="startAdvancedScan()" id="scanBtn" class="w-full py-4 bg-blue-600 hover:bg-blue-500 text-white rounded-2xl font-black shadow-lg transition-all flex items-center justify-center gap-2">
<i class="fas fa-bolt"></i> ANALİZİ BAŞLAT
</button>
</div>
</div>
<div class="lg:col-span-8">
<div id="resultsGrid" class="grid grid-cols-1 md:grid-cols-2 gap-4"></div>
</div>
</div>
</div>
<div id="favPanel" class="fixed inset-0 bg-black/90 backdrop-blur-xl z-50 hidden flex justify-end">
<div class="w-full max-w-md bg-slate-900 h-full p-8 overflow-y-auto border-l border-white/10">
<div class="flex justify-between items-center mb-8 border-b border-white/5 pb-4">
<h2 class="text-2xl font-bold">Yıldızlılar</h2>
<button onclick="toggleFavPanel()" class="text-slate-400 hover:text-white"><i class="fas fa-times fa-lg"></i></button>
</div>
<div id="favList" class="space-y-4"></div>
</div>
</div>
<script>
const trMap = {'ç':'c','ğ':'g','ı':'i','ö':'o','ş':'s','ü':'u'};
const delay = ms => new Promise(res => setTimeout(res, ms));
let favorites = JSON.parse(localStorage.getItem('domgen_ultra_favs')) || [];
// Gelişmiş Varyasyon Kütüphanesi
const variations = {
pre: ['get', 'the', 'my', 'go', 'try', 'smart', 'pure', 'net', 'app', 'hub', 'all', 'hey', 'pro', 'eco', 'fast', 'top', 'easy', 'vibe', 'neo', 'cloud'],
suf: ['ly', 'ify', 'hub', 'lab', 'io', 'base', 'zone', 'plus', 'expert', 'world', 'box', 'tech', 'online', 'space', 'site', 'center', 'flow', 'wave', 'kit', 'spot'],
tr_suf: ['sepeti', 'pazari', 'dukkani', 'rehberi', 'burada', 'evi', 'diyari', 'merkezi', 'ofisi', 'hatti', 'vadisi', 'meydani']
};
function slug(t) { return t.toLowerCase().trim().replace(/[çğıöşü]/g, m => trMap[m]).replace(/[^a-z0-9]/g, ''); }
function calculateDaysLeft(expiryDate) {
const now = new Date();
const exp = new Date(expiryDate);
const diff = exp - now;
return Math.ceil(diff / (1000 * 60 * 60 * 24));
}
async function startAdvancedScan() {
const grid = document.getElementById('resultsGrid');
const input = document.getElementById('bulkInput').value;
const isGen = document.getElementById('generateSwitch').checked;
const status = document.getElementById('statusInfo');
const btn = document.getElementById('scanBtn');
let words = input.split(/[\n,]+/).map(w => slug(w)).filter(w => w.length > 0);
if(words.length === 0) return alert("Kelime girin!");
grid.innerHTML = '';
btn.disabled = true;
let queue = [];
words.forEach(w => {
queue.push(`${w}.com`);
if(isGen) {
variations.pre.forEach(p => queue.push(`${p}${w}.com`));
variations.suf.forEach(s => queue.push(`${w}${s}.com`));
variations.tr_suf.forEach(ts => queue.push(`${w}${ts}.com`));
}
});
// Tekrarları temizle
queue = [...new Set(queue)];
for(let i = 0; i < queue.length; i++) {
status.innerText = `Kalan: ${queue.length - i} | Sorgu: ${queue[i]}`;
await performCheck(queue[i]);
await delay(1200); // Rate limit koruması
}
btn.disabled = false;
status.innerText = "Analiz Tamamlandı";
}
async function performCheck(domain) {
const grid = document.getElementById('resultsGrid');
const card = document.createElement('div');
card.className = "glass p-5 rounded-2xl flex flex-col gap-3 animate-in fade-in duration-300 border border-transparent hover:border-white/10 transition-all";
card.innerHTML = `<div class="flex justify-between font-bold text-sm"><span>${domain}</span><div class="spinner"></div></div>`;
grid.prepend(card);
try {
const res = await fetch(`https://rdap.org/domain/${domain}`);
if(res.status === 404) {
// BOŞTA
const isFav = favorites.includes(domain);
card.classList.add('border-l-4', 'border-l-green-500');
card.innerHTML = `
<div class="flex justify-between items-center">
<div class="flex items-center gap-3">
<button onclick="toggleFav('${domain}', this)" class="text-white hover:text-amber-400 transition ${isFav ? 'star-active' : ''}">
<i class="fas fa-star fa-lg"></i>
</button>
<span class="font-bold text-white text-sm">${domain}</span>
</div>
<span class="bg-green-500 text-[8px] px-2 py-1 rounded font-black text-white uppercase">Boşta</span>
</div>
<a href="https://www.google.com/search?q=buy+${domain}" target="_blank" class="text-center py-2 bg-blue-600 rounded-lg text-[10px] font-bold hover:bg-blue-500">SATIN AL</a>
`;
} else {
// DOLU
const data = await res.json();
const expEvent = data.events?.find(e => e.eventAction === 'expiration');
let countdownHTML = '';
if(expEvent) {
const days = calculateDaysLeft(expEvent.eventDate);
countdownHTML = days > 0
? `<div class="mt-2 text-[10px] font-bold expiring-badge px-2 py-1 rounded flex items-center gap-1"><i class="fas fa-hourglass-half"></i> Düşmesine ${days} gün kaldı</div>`
: `<div class="mt-2 text-[10px] font-bold bg-slate-800 text-slate-400 px-2 py-1 rounded">Süresi dolmuş/İşleniyor</div>`;
}
card.style.opacity = "0.5";
card.innerHTML = `
<div class="flex justify-between items-center">
<span class="text-sm font-medium text-slate-400">${domain}</span>
<span class="text-red-500 text-[8px] font-bold uppercase">Dolu</span>
</div>
${countdownHTML}
`;
}
} catch {
card.innerHTML = `<span class="text-[10px] text-slate-500">${domain} (Limit/Hata)</span>`;
}
}
// Favori Fonksiyonları
function toggleFav(domain, btn) {
if(favorites.includes(domain)) {
favorites = favorites.filter(d => d !== domain);
btn.classList.remove('star-active');
} else {
favorites.push(domain);
btn.classList.add('star-active');
}
updateFavUI();
}
function updateFavUI() {
const list = document.getElementById('favList');
document.getElementById('favCount').innerText = favorites.length;
list.innerHTML = '';
favorites.forEach(d => {
const item = document.createElement('div');
item.className = "glass p-4 rounded-xl flex justify-between items-center";
item.innerHTML = `
<span class="font-bold text-xs text-blue-300">${d}</span>
<button onclick="toggleFav('${d}')" class="text-red-400 hover:text-red-500"><i class="fas fa-times"></i></button>
`;
list.appendChild(item);
});
localStorage.setItem('domgen_ultra_favs', JSON.stringify(favorites));
}
function toggleFavPanel() { document.getElementById('favPanel').classList.toggle('hidden'); }
updateFavUI();
</script>
</body>
</html>