<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Smart Dictionary with Top/Bottom Ads</title>
<style>
/* ... Poora CSS code waisa hi rahega ... */
:root {
--primary-color: #1e88e5; --background-light: #f5f7fa; --text-light: #333; --box-light: #ffffff; --accent-color: #1565c0;
--background-dark: #121212; --text-dark: #eeeeee; --box-dark: #1e1e1e;
--error-color: #e53935;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Segoe UI', 'Roboto', sans-serif; background-color: var(--background-light); color: var(--text-light); display: flex; flex-direction: column; align-items: center; min-height: 100vh; padding: 20px 10px; transition: background-color 0.3s, color 0.3s; }
body.dark { background-color: var(--background-dark); color: var(--text-dark); }
/* === AD CONTAINER STYLES === */
.ad-container {
width: 100%;
max-width: 728px; /* Standard banner width */
margin: 15px auto;
display: flex;
justify-content: center;
align-items: center;
min-height: 90px; /* Standard banner height */
/* background-color: #f0f0f0; /* Optional: background for when ad doesn't load */
}
body.dark .container { background-color: var(--box-dark); box-shadow: 0 8px 24px rgba(0,0,0,0.4); }
body.dark .toggle-dark { color: #fff; border-color: #fff; }
.container { background-color: var(--box-light); border-radius: 16px; box-shadow: 0 8px 24px rgba(0,0,0,0.1); padding: 30px; max-width: 500px; width: 100%; text-align: center; transition: background-color 0.3s, box-shadow 0.3s; }
h1 { color: var(--primary-color); margin-bottom: 20px; font-weight: 600; }
.input-wrapper { position: relative; }
#wordInput { width: 100%; padding: 14px; font-size: 16px; border-radius: 8px; border: 1px solid #ccc; margin-bottom: 15px; }
body.dark #wordInput { background-color: #333; border-color: #555; color: var(--text-dark); }
.toolbar { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.toolbar button, .search-btn { padding: 12px; font-size: 16px; border-radius: 8px; border: none; background-color: var(--primary-color); color: white; cursor: pointer; transition: background-color 0.3s, transform 0.2s; display: flex; align-items: center; justify-content: center; gap: 8px; }
.search-btn { grid-column: 1 / -1; margin-bottom: 10px; }
.toolbar button:hover, .search-btn:hover { background-color: var(--accent-color); transform: translateY(-2px); }
.toolbar button:disabled, .search-btn:disabled { background-color: #90caf9; cursor: not-allowed; transform: none; }
#results-container { margin-top: 25px; text-align: left; font-size: 16px; line-height: 1.7; min-height: 80px; }
.result-item { margin-bottom: 15px; }
.result-item strong { color: var(--primary-color); }
body.dark .result-item strong { color: #64b5f6; }
.error { color: var(--error-color); font-weight: 500; }
#history { margin-top: 20px; font-size: 14px; color: #777; }
body.dark #history { color: #888; }
.toggle-dark { position: absolute; top: 20px; right: 20px; background: none; border: 2px solid var(--primary-color); padding: 8px 14px; border-radius: 20px; color: var(--primary-color); cursor: pointer; font-weight: 500; transition: all 0.3s; }
.toggle-dark:hover { background-color: var(--primary-color); color: white; }
.loader { width: 20px; height: 20px; border: 3px solid rgba(255, 255, 255, 0.3); border-radius: 50%; border-top-color: #fff; animation: spin 1s ease-in-out infinite; }
@keyframes spin { to { transform: rotate(360deg); } }
@media (max-width: 600px) { body { padding: 10px 5px; } .container { padding: 20px; } .toolbar { grid-template-columns: 1fr; } .toggle-dark { top: 10px; right: 10px; padding: 6px 10px; font-size: 12px; }}
</style>
</head>
<body>
<!-- =============================== -->
<!-- ===== TOP BANNER AD (728x90) ===== -->
<!-- =============================== -->
<div id="top-ad-container" class="ad-container">
<!-- Adsterra ka TOP banner ad code yahan paste karein -->
<!-- Example format: -->
<!--
<script type="text/javascript">
atOptions = {
'key' : 'YOUR_TOP_BANNER_AD_KEY',
'format' : 'iframe',
'height' : 90,
'width' : 728,
'params' : {}
};
</script>
<script type="text/javascript" src="//www.your-adsterra-domain.com/YOUR_TOP_BANNER_AD_KEY/invoke.js"></script>
-->
<p style="color: #ccc;">Top Ad (728x90)</p> <!-- Placeholder text -->
</div>
<button class="toggle-dark" id="darkModeToggle">🌙 Dark Mode</button>
<main class="container">
<header>
<h1>🌐 Smart Dictionary</h1>
</header>
<div class="input-wrapper">
<input type="text" id="wordInput" placeholder="Enter a word...">
</div>
<button class="search-btn" id="searchBtn">
<span id="searchBtnText">🔍 Search</span>
<div class="loader" id="loader" style="display: none;"></div>
</button>
<div class="toolbar">
<button id="pronounceBtn">🔊 Pronounce</button>
<button id="copyBtn">📋 Copy Meaning</button>
</div>
<section id="results-container"></section>
<footer id="history"></footer>
</main>
<!-- =============================== -->
<!-- ==== BOTTOM BANNER AD (728x90) ==== -->
<!-- =============================== -->
<div id="bottom-ad-container" class="ad-container">
<!-- Adsterra ka BOTTOM banner ad code yahan paste karein -->
<!-- Example format: -->
<!--
<script type="text/javascript">
atOptions = {
'key' : 'YOUR_BOTTOM_BANNER_AD_KEY',
'format' : 'iframe',
'height' : 90,
'width' : 728,
'params' : {}
};
</script>
<script type="text/javascript" src="//www.your-adsterra-domain.com/YOUR_BOTTOM_BANNER_AD_KEY/invoke.js"></script>
-->
<p style="color: #ccc;">Bottom Ad (728x90)</p> <!-- Placeholder text -->
</div>
<!-- =================================================================== -->
<!-- OTHER ADSTERRA SCRIPTS (POP-UNDER, SOCIAL BAR, ETC.) -->
<!-- =================================================================== -->
<!-- Agar aap Pop-under ya Social Bar jaise ads bhi istemal karna chahte hain, to unke scripts yahan daalein -->
<!--
<script type='text/javascript' src='//www.your-adsterra-domain.com/YOUR_POP_UNDER_KEY/invoke.js'></script>
<script type='text/javascript' src='//www.your-adsterra-domain.com/YOUR_SOCIAL_BAR_KEY/invoke.js'></script>
-->
<script>
// Poora JavaScript code bilkul waisa hi rahega jaisa pichle jawab mein tha.
// Us mein koi bhi tabdeeli karne ki zaroorat nahi hai.
// === DOM Element Selection ===
const wordInput = document.getElementById('wordInput');
const searchBtn = document.getElementById('searchBtn');
const searchBtnText = document.getElementById('searchBtnText');
const loader = document.getElementById('loader');
const pronounceBtn = document.getElementById('pronounceBtn');
const copyBtn = document.getElementById('copyBtn');
const resultsContainer = document.getElementById('results-container');
const historyDiv = document.getElementById('history');
const darkModeToggle = document.getElementById('darkModeToggle');
// === Event Listeners ===
document.addEventListener('DOMContentLoaded', () => {
loadWordOfTheDay();
showHistory();
});
searchBtn.addEventListener('click', handleSearch);
wordInput.addEventListener('keyup', (e) => {
if (e.key === 'Enter') handleSearch();
});
darkModeToggle.addEventListener('click', toggleDarkMode);
pronounceBtn.addEventListener('click', speakWord);
copyBtn.addEventListener('click', copyMeaning);
// === Core Functions & Helper Functions ===
// ... (yahan poora pichla JavaScript code paste karein, 'handleSearch' se lekar 'loadWordOfTheDay' tak) ...
async function handleSearch() {
const word = wordInput.value.trim();
if (!word) {
showError("Please enter a word to search.");
return;
}
setLoading(true);
resultsContainer.innerHTML = '';
try {
const [dictData, transData] = await Promise.all([
fetchDictionaryData(word),
fetchUrduTranslation(word)
]);
displayResults(word, dictData, transData);
updateHistory(word);
} catch (error) {
console.error("Search failed:", error);
showError(error.message || "Could not find the word or an error occurred.");
} finally {
setLoading(false);
}
}
async function fetchDictionaryData(word) {
const response = await fetch(`https://api.dictionaryapi.dev/api/v2/entries/en/${word}`);
if (!response.ok) {
if (response.status === 404) return null;
throw new Error('Dictionary API failed.');
}
const data = await response.json();
return data[0] ? [data[0]] : null;
}
async function fetchUrduTranslation(word) {
const url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=ur&dt=t&q=${encodeURIComponent(word)}`;
const response = await fetch(url);
if (!response.ok) throw new Error('Translation API failed.');
const data = await response.json();
return data[0][0][0];
}
function displayResults(word, dictDataArray, urduMeaning) {
resultsContainer.innerHTML = '';
let content = '';
if (urduMeaning) {
content += `<div class="result-item"><strong>📖 Urdu Meaning:</strong><p>${urduMeaning}</p></div>`;
}
if (dictDataArray) {
const dictData = dictDataArray[0];
const definition = dictData.meanings[0]?.definitions[0]?.definition;
const synonyms = dictData.meanings[0]?.synonyms || [];
if (definition) {
content += `<div class="result-item"><strong>🇬🇧 English Definition:</strong><p>${definition}</p></div>`;
}
if (synonyms.length > 0) {
content += `<div class="result-item"><strong>🔄 Synonyms:</strong><p>${synonyms.slice(0, 5).join(', ')}</p></div>`;
}
}
if (!content) {
showError(`Sorry, no results found for "${word}".`);
return;
}
resultsContainer.innerHTML = content;
}
function toggleDarkMode() {
document.body.classList.toggle('dark');
darkModeToggle.textContent = document.body.classList.contains('dark') ? '☀️ Light Mode' : '🌙 Dark Mode';
}
function speakWord() {
const word = wordInput.value.trim();
if (word && 'speechSynthesis' in window) {
const utterance = new SpeechSynthesisUtterance(word);
utterance.lang = 'en-US';
speechSynthesis.speak(utterance);
} else {
alert('Your browser does not support text-to-speech.');
}
}
function copyMeaning() {
const textToCopy = resultsContainer.innerText;
if (textToCopy) {
navigator.clipboard.writeText(textToCopy).then(() => {
const originalText = copyBtn.innerHTML;
copyBtn.innerHTML = '✅ Copied!';
setTimeout(() => { copyBtn.innerHTML = originalText; }, 2000);
}).catch(err => {
console.error('Failed to copy text: ', err);
alert('Could not copy text.');
});
}
}
function updateHistory(word) {
let history = JSON.parse(localStorage.getItem("searchHistory")) || [];
history = history.filter(item => item.toLowerCase() !== word.toLowerCase());
history.unshift(word);
if (history.length > 5) history.pop();
localStorage.setItem("searchHistory", JSON.stringify(history));
showHistory();
}
function showHistory() {
const history = JSON.parse(localStorage.getItem("searchHistory")) || [];
historyDiv.innerHTML = history.length > 0 ? `<strong>Recent:</strong> ${history.join(', ')}` : '';
}
function showError(message) {
resultsContainer.innerHTML = `<p class="error">❌ ${message}</p>`;
}
function setLoading(isLoading) {
searchBtnText.style.display = isLoading ? 'none' : 'block';
loader.style.display = isLoading ? 'block' : 'none';
searchBtn.disabled = isLoading;
pronounceBtn.disabled = isLoading;
copyBtn.disabled = isLoading;
}
async function loadWordOfTheDay() {
try {
const response = await fetch('https://random-word-api.herokuapp.com/word');
const [word] = await response.json();
wordInput.value = word;
await handleSearch();
} catch (err) {
console.error("Failed to load Word of the Day", err);
}
}
</script>
</body>
</html>
0 Comments