Add 2 files
Browse files- index.html +376 -272
- prompts.txt +3 -1
index.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
<head>
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
-
<title>
|
| 7 |
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
| 9 |
<script>
|
|
@@ -11,121 +11,284 @@
|
|
| 11 |
theme: {
|
| 12 |
extend: {
|
| 13 |
colors: {
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
}
|
| 20 |
}
|
| 21 |
}
|
| 22 |
}
|
| 23 |
</script>
|
| 24 |
<style>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
.news-card:hover {
|
| 26 |
-
transform: translateY(-
|
| 27 |
-
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
|
| 28 |
}
|
| 29 |
-
|
| 30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
}
|
| 32 |
-
|
| 33 |
-
|
|
|
|
| 34 |
}
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
|
|
|
|
|
|
| 39 |
}
|
|
|
|
| 40 |
.marquee {
|
| 41 |
white-space: nowrap;
|
| 42 |
overflow: hidden;
|
| 43 |
box-sizing: border-box;
|
| 44 |
}
|
|
|
|
| 45 |
.marquee span {
|
| 46 |
display: inline-block;
|
| 47 |
padding-left: 100%;
|
| 48 |
-
animation: marquee
|
| 49 |
}
|
|
|
|
| 50 |
@keyframes marquee {
|
| 51 |
0% { transform: translate(0, 0); }
|
| 52 |
100% { transform: translate(-100%, 0); }
|
| 53 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
</style>
|
| 55 |
</head>
|
| 56 |
-
<body class="
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
<!-- Header -->
|
| 58 |
-
<header class="
|
| 59 |
-
<div class="container mx-auto px-
|
| 60 |
<div class="flex flex-col md:flex-row justify-between items-center">
|
| 61 |
<div class="flex items-center mb-4 md:mb-0">
|
| 62 |
-
<
|
| 63 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
</div>
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
<
|
| 69 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
</button>
|
| 71 |
</div>
|
| 72 |
-
<div class="hidden md:flex space-x-4 mt-4 md:mt-0">
|
| 73 |
-
<button class="px-4 py-2 rounded-full bg-techBlue hover:bg-blue-600 transition">Sign In</button>
|
| 74 |
-
<button class="px-4 py-2 rounded-full bg-techPurple hover:bg-purple-600 transition">Register</button>
|
| 75 |
-
</div>
|
| 76 |
</div>
|
| 77 |
</div>
|
| 78 |
</header>
|
| 79 |
|
| 80 |
-
<!-- Tech Ticker -->
|
| 81 |
-
<div class="bg-gray-800 text-white py-2 px-4 overflow-hidden">
|
| 82 |
-
<div class="marquee">
|
| 83 |
-
<span id="tech-ticker" class="text-sm">
|
| 84 |
-
Loading technology news headlines...
|
| 85 |
-
</span>
|
| 86 |
-
</div>
|
| 87 |
-
</div>
|
| 88 |
-
|
| 89 |
<!-- Main Content -->
|
| 90 |
-
<main class="container mx-auto px-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
<div class="flex flex-col lg:flex-row gap-8">
|
| 92 |
<!-- Left Column - News Feed -->
|
| 93 |
<div class="w-full lg:w-2/3">
|
| 94 |
-
<
|
| 95 |
-
|
| 96 |
-
<
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
<option value="all">All Categories</option>
|
| 102 |
-
<option value="technology">Technology</option>
|
| 103 |
-
<option value="energy">Energy</option>
|
| 104 |
-
<option value="communication">Communication Services</option>
|
| 105 |
-
<option value="financial">Financial</option>
|
| 106 |
-
<option value="healthcare">Healthcare</option>
|
| 107 |
-
<option value="industrial">Industrial</option>
|
| 108 |
-
<option value="real_estate">Real Estate</option>
|
| 109 |
-
<option value="utilities">Utilities</option>
|
| 110 |
-
</select>
|
| 111 |
-
</div>
|
| 112 |
</div>
|
| 113 |
|
| 114 |
<!-- News Loading Skeleton -->
|
| 115 |
<div id="loading-skeleton" class="space-y-6">
|
| 116 |
-
<div class="
|
| 117 |
-
<div class="h-
|
| 118 |
-
<div class="h-
|
| 119 |
-
<div class="h-
|
| 120 |
-
<div class="h-
|
| 121 |
-
<div class="h-
|
| 122 |
</div>
|
| 123 |
-
<div class="
|
| 124 |
-
<div class="h-
|
| 125 |
-
<div class="h-
|
| 126 |
-
<div class="h-
|
| 127 |
-
<div class="h-
|
| 128 |
-
<div class="h-
|
| 129 |
</div>
|
| 130 |
</div>
|
| 131 |
|
|
@@ -135,71 +298,90 @@
|
|
| 135 |
</div>
|
| 136 |
|
| 137 |
<div class="mt-8 flex justify-center">
|
| 138 |
-
<button id="load-more" class="px-
|
| 139 |
-
|
| 140 |
</button>
|
| 141 |
</div>
|
| 142 |
</div>
|
| 143 |
|
| 144 |
-
<!-- Right Column -
|
| 145 |
<div class="w-full lg:w-1/3">
|
| 146 |
-
<!-- Trending
|
| 147 |
-
<div class="
|
| 148 |
-
<h3 class="text-
|
|
|
|
|
|
|
| 149 |
<div class="space-y-4" id="trending-topics">
|
| 150 |
<div class="flex justify-between items-center animate-pulse">
|
| 151 |
<div class="flex items-center">
|
| 152 |
-
<div class="w-8 h-8 bg-
|
| 153 |
-
<div class="h-4 bg-
|
| 154 |
-
</div>
|
| 155 |
-
<div class="text-right">
|
| 156 |
-
<div class="h-4 bg-gray-200 rounded w-12"></div>
|
| 157 |
</div>
|
|
|
|
| 158 |
</div>
|
| 159 |
<div class="flex justify-between items-center animate-pulse">
|
| 160 |
<div class="flex items-center">
|
| 161 |
-
<div class="w-8 h-8 bg-
|
| 162 |
-
<div class="h-4 bg-
|
| 163 |
-
</div>
|
| 164 |
-
<div class="text-right">
|
| 165 |
-
<div class="h-4 bg-gray-200 rounded w-12"></div>
|
| 166 |
</div>
|
|
|
|
| 167 |
</div>
|
| 168 |
</div>
|
| 169 |
</div>
|
| 170 |
|
| 171 |
-
<!-- Tech
|
| 172 |
-
<div class="
|
| 173 |
-
<h3 class="text-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 182 |
</div>
|
| 183 |
-
<div class="
|
| 184 |
-
<div class="
|
| 185 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 186 |
</div>
|
| 187 |
-
<div class="
|
| 188 |
-
<div class="
|
| 189 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
</div>
|
| 191 |
</div>
|
| 192 |
</div>
|
| 193 |
|
| 194 |
<!-- Newsletter -->
|
| 195 |
-
<div class="
|
| 196 |
-
<h3 class="text-
|
| 197 |
-
|
|
|
|
|
|
|
| 198 |
<form class="space-y-3">
|
| 199 |
-
<input type="email" placeholder="
|
| 200 |
-
class="w-full px-4 py-2 rounded bg-
|
| 201 |
-
<button type="submit" class="w-full px-4 py-2 bg-
|
| 202 |
-
|
| 203 |
</button>
|
| 204 |
</form>
|
| 205 |
</div>
|
|
@@ -208,40 +390,54 @@
|
|
| 208 |
</main>
|
| 209 |
|
| 210 |
<!-- Footer -->
|
| 211 |
-
<footer class="
|
| 212 |
-
<div class="container mx-auto px-
|
| 213 |
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
|
| 214 |
<div>
|
| 215 |
-
<h4 class="text-
|
| 216 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 217 |
</div>
|
| 218 |
<div>
|
| 219 |
-
<h4 class="text-
|
| 220 |
<ul class="space-y-2">
|
| 221 |
-
<li><a href="#" class="text-
|
| 222 |
-
<li><a href="#" class="text-
|
| 223 |
-
<li><a href="#" class="text-
|
| 224 |
-
<li><a href="#" class="text-
|
| 225 |
</ul>
|
| 226 |
</div>
|
| 227 |
<div>
|
| 228 |
-
<h4 class="text-
|
| 229 |
<ul class="space-y-2">
|
| 230 |
-
<li><a href="#" class="text-
|
| 231 |
-
<li><a href="#" class="text-
|
| 232 |
-
<li><a href="#" class="text-
|
| 233 |
-
<li><a href="#" class="text-
|
| 234 |
</ul>
|
| 235 |
</div>
|
| 236 |
<div>
|
| 237 |
-
<h4 class="text-
|
| 238 |
-
<
|
| 239 |
-
<
|
| 240 |
-
<
|
| 241 |
-
<
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 245 |
</div>
|
| 246 |
</div>
|
| 247 |
</div>
|
|
@@ -252,14 +448,17 @@
|
|
| 252 |
const NEWSAPI_API_KEY = 'f764fe522436442d9bdafbae241d7b63';
|
| 253 |
const MARKETAUX_API_TOKEN = 'x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq';
|
| 254 |
|
| 255 |
-
|
| 256 |
// API endpoints for each category
|
| 257 |
const API_ENDPOINTS = {
|
| 258 |
all: [
|
| 259 |
'https://api.marketaux.com/v1/news/all?industries=Technology&filter_entities=true&limit=10&api_token=' + MARKETAUX_API_TOKEN,
|
| 260 |
'https://newsapi.org/v2/everything?q=bitcoin&from=2025-04-23&sortBy=publishedAt&apiKey=' + NEWSAPI_API_KEY,
|
| 261 |
'https://newsapi.org/v2/everything?q=apple&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=' + NEWSAPI_API_KEY,
|
| 262 |
-
'https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=' + NEWSAPI_API_KEY
|
|
|
|
|
|
|
|
|
|
|
|
|
| 263 |
],
|
| 264 |
technology: [
|
| 265 |
'https://newsapi.org/v2/everything?q=technology&from=2025-04-23&sortBy=publishedAt&apiKey=' + NEWSAPI_API_KEY,
|
|
@@ -304,52 +503,25 @@
|
|
| 304 |
loadAllData();
|
| 305 |
|
| 306 |
// Event listeners
|
| 307 |
-
document.getElementById('refresh-btn').addEventListener('click', refreshAllData);
|
| 308 |
document.getElementById('load-more').addEventListener('click', loadMoreNews);
|
| 309 |
-
document.getElementById('news-category').addEventListener('change', function(e) {
|
| 310 |
-
selectedCategory = e.target.value;
|
| 311 |
-
refreshNews();
|
| 312 |
-
});
|
| 313 |
});
|
| 314 |
|
| 315 |
async function loadAllData() {
|
| 316 |
try {
|
| 317 |
await Promise.all([
|
| 318 |
fetchNews(),
|
| 319 |
-
fetchTrendingTopics()
|
| 320 |
-
loadTechCompanies()
|
| 321 |
]);
|
| 322 |
} catch (error) {
|
| 323 |
console.error('Error loading data:', error);
|
| 324 |
-
showError('
|
| 325 |
-
}
|
| 326 |
-
}
|
| 327 |
-
|
| 328 |
-
async function refreshAllData() {
|
| 329 |
-
// Show loading states
|
| 330 |
-
document.getElementById('loading-skeleton').classList.remove('hidden');
|
| 331 |
-
document.getElementById('news-container').classList.add('hidden');
|
| 332 |
-
document.getElementById('tech-ticker').textContent = 'Refreshing data...';
|
| 333 |
-
|
| 334 |
-
// Reset news page
|
| 335 |
-
currentNewsPage = 1;
|
| 336 |
-
|
| 337 |
-
try {
|
| 338 |
-
await Promise.all([
|
| 339 |
-
fetchNews(true), // true indicates refresh
|
| 340 |
-
fetchTrendingTopics(),
|
| 341 |
-
loadTechCompanies()
|
| 342 |
-
]);
|
| 343 |
-
} catch (error) {
|
| 344 |
-
console.error('Error refreshing data:', error);
|
| 345 |
-
showError('Failed to refresh data. Please try again later.');
|
| 346 |
}
|
| 347 |
}
|
| 348 |
|
| 349 |
async function loadMoreNews() {
|
| 350 |
const btn = document.getElementById('load-more');
|
| 351 |
const originalText = btn.innerHTML;
|
| 352 |
-
btn.innerHTML = '<i class="fas fa-spinner fa-spin mr-1"></i>
|
| 353 |
btn.disabled = true;
|
| 354 |
|
| 355 |
currentNewsPage++;
|
|
@@ -358,7 +530,7 @@
|
|
| 358 |
await fetchNews(false, true); // false = not refresh, true = append
|
| 359 |
} catch (error) {
|
| 360 |
console.error('Error loading more news:', error);
|
| 361 |
-
showError('
|
| 362 |
currentNewsPage--; // Revert page increment on failure
|
| 363 |
}
|
| 364 |
|
|
@@ -366,21 +538,6 @@
|
|
| 366 |
btn.disabled = false;
|
| 367 |
}
|
| 368 |
|
| 369 |
-
async function refreshNews() {
|
| 370 |
-
document.getElementById('loading-skeleton').classList.remove('hidden');
|
| 371 |
-
document.getElementById('news-container').classList.add('hidden');
|
| 372 |
-
document.getElementById('news-container').innerHTML = '';
|
| 373 |
-
|
| 374 |
-
currentNewsPage = 1;
|
| 375 |
-
|
| 376 |
-
try {
|
| 377 |
-
await fetchNews(true);
|
| 378 |
-
} catch (error) {
|
| 379 |
-
console.error('Error refreshing news:', error);
|
| 380 |
-
showError('Failed to refresh news. Please try again later.');
|
| 381 |
-
}
|
| 382 |
-
}
|
| 383 |
-
|
| 384 |
// API Fetch Functions
|
| 385 |
async function fetchNews(refresh = false, append = false) {
|
| 386 |
try {
|
|
@@ -429,7 +586,6 @@
|
|
| 429 |
|
| 430 |
if (allArticles.length > 0) {
|
| 431 |
updateNewsUI(allArticles, refresh, append);
|
| 432 |
-
updateTicker(allArticles);
|
| 433 |
}
|
| 434 |
} catch (error) {
|
| 435 |
console.error('Error fetching news:', error);
|
|
@@ -450,13 +606,12 @@
|
|
| 450 |
async function fetchTrendingTopics() {
|
| 451 |
try {
|
| 452 |
// For demo purposes, we'll use a static list
|
| 453 |
-
// In a real app, you might have an API endpoint for trending topics
|
| 454 |
const trendingTopics = [
|
| 455 |
-
{ name: "AI
|
| 456 |
-
{ name: "
|
| 457 |
-
{ name: "5G
|
| 458 |
-
{ name: "
|
| 459 |
-
{ name: "
|
| 460 |
];
|
| 461 |
|
| 462 |
updateTrendingTopicsUI(trendingTopics);
|
|
@@ -466,20 +621,6 @@
|
|
| 466 |
}
|
| 467 |
}
|
| 468 |
|
| 469 |
-
function loadTechCompanies() {
|
| 470 |
-
// Static list of major tech companies
|
| 471 |
-
const techCompanies = [
|
| 472 |
-
{ name: "Apple", symbol: "AAPL", logo: "https://logo.clearbit.com/apple.com" },
|
| 473 |
-
{ name: "Microsoft", symbol: "MSFT", logo: "https://logo.clearbit.com/microsoft.com" },
|
| 474 |
-
{ name: "Google", symbol: "GOOGL", logo: "https://logo.clearbit.com/google.com" },
|
| 475 |
-
{ name: "Amazon", symbol: "AMZN", logo: "https://logo.clearbit.com/amazon.com" },
|
| 476 |
-
{ name: "Meta", symbol: "META", logo: "https://logo.clearbit.com/meta.com" },
|
| 477 |
-
{ name: "Tesla", symbol: "TSLA", logo: "https://logo.clearbit.com/tesla.com" }
|
| 478 |
-
];
|
| 479 |
-
|
| 480 |
-
updateTechCompaniesUI(techCompanies);
|
| 481 |
-
}
|
| 482 |
-
|
| 483 |
// UI Update Functions
|
| 484 |
function updateTrendingTopicsUI(topics) {
|
| 485 |
const trendingContainer = document.getElementById('trending-topics');
|
|
@@ -491,13 +632,13 @@
|
|
| 491 |
|
| 492 |
topicElement.innerHTML = `
|
| 493 |
<div class="flex items-center">
|
| 494 |
-
<div class="w-8 h-8 rounded-full bg-
|
| 495 |
-
|
| 496 |
</div>
|
| 497 |
-
<span>${topic.name}</span>
|
| 498 |
</div>
|
| 499 |
<div class="text-right">
|
| 500 |
-
<span class="text-
|
| 501 |
</div>
|
| 502 |
`;
|
| 503 |
|
|
@@ -505,26 +646,6 @@
|
|
| 505 |
});
|
| 506 |
}
|
| 507 |
|
| 508 |
-
function updateTechCompaniesUI(companies) {
|
| 509 |
-
const companiesContainer = document.getElementById('tech-companies');
|
| 510 |
-
companiesContainer.innerHTML = '';
|
| 511 |
-
|
| 512 |
-
companies.forEach(company => {
|
| 513 |
-
const companyElement = document.createElement('div');
|
| 514 |
-
companyElement.className = 'flex items-center p-3 bg-gray-50 rounded-lg hover:bg-gray-100 transition cursor-pointer';
|
| 515 |
-
|
| 516 |
-
companyElement.innerHTML = `
|
| 517 |
-
<img src="${company.logo}" alt="${company.name}" class="w-10 h-10 rounded-full mr-3" onerror="this.src='https://via.placeholder.com/40?text=${company.symbol}'">
|
| 518 |
-
<div>
|
| 519 |
-
<div class="font-medium">${company.name}</div>
|
| 520 |
-
<div class="text-xs text-gray-500">${company.symbol}</div>
|
| 521 |
-
</div>
|
| 522 |
-
`;
|
| 523 |
-
|
| 524 |
-
companiesContainer.appendChild(companyElement);
|
| 525 |
-
});
|
| 526 |
-
}
|
| 527 |
-
|
| 528 |
function updateNewsUI(articles, refresh, append) {
|
| 529 |
const newsContainer = document.getElementById('news-container');
|
| 530 |
|
|
@@ -544,21 +665,21 @@
|
|
| 544 |
// Add articles to container
|
| 545 |
articles.forEach(article => {
|
| 546 |
const newsCard = document.createElement('div');
|
| 547 |
-
newsCard.className = 'news-card
|
| 548 |
|
| 549 |
// Simple sentiment analysis based on title keywords
|
| 550 |
-
let sentimentColor = 'text-
|
| 551 |
let sentimentIcon = 'fa-newspaper';
|
| 552 |
-
const title = article.title ? article.title.
|
| 553 |
|
| 554 |
-
if (title.includes('
|
| 555 |
-
title.includes('
|
| 556 |
-
sentimentColor = 'text-
|
| 557 |
sentimentIcon = 'fa-arrow-up';
|
| 558 |
-
} else if (title.includes('
|
| 559 |
-
title.includes('
|
| 560 |
-
title.includes('
|
| 561 |
-
sentimentColor = 'text-
|
| 562 |
sentimentIcon = 'fa-arrow-down';
|
| 563 |
}
|
| 564 |
|
|
@@ -568,30 +689,32 @@
|
|
| 568 |
year: 'numeric',
|
| 569 |
month: 'short',
|
| 570 |
day: 'numeric'
|
| 571 |
-
});
|
| 572 |
|
| 573 |
// Get source name
|
| 574 |
-
const sourceName = article.source
|
| 575 |
|
| 576 |
// Create card HTML
|
| 577 |
newsCard.innerHTML = `
|
| 578 |
-
<div class="flex flex-col md:flex-row gap-
|
| 579 |
-
<div class="md:w-1/
|
| 580 |
-
<
|
| 581 |
-
|
| 582 |
-
|
|
|
|
|
|
|
| 583 |
</div>
|
| 584 |
-
<div class="md:w-
|
| 585 |
<div class="flex justify-between items-start mb-2">
|
| 586 |
-
<h3 class="text-xl font-
|
| 587 |
<i class="fas ${sentimentIcon} ${sentimentColor} text-lg"></i>
|
| 588 |
</div>
|
| 589 |
-
<p class="text-
|
| 590 |
-
<div class="flex justify-between items-center text-
|
| 591 |
-
<span>${sourceName} • ${formattedDate}</span>
|
| 592 |
<a href="${article.url || '#'}" target="_blank" rel="noopener noreferrer"
|
| 593 |
-
class="text-
|
| 594 |
-
|
| 595 |
</a>
|
| 596 |
</div>
|
| 597 |
</div>
|
|
@@ -609,35 +732,16 @@
|
|
| 609 |
}
|
| 610 |
}
|
| 611 |
|
| 612 |
-
function updateTicker(articles) {
|
| 613 |
-
let tickerHTML = '';
|
| 614 |
-
|
| 615 |
-
if (articles && articles.length > 0) {
|
| 616 |
-
articles.slice(0, 8).forEach(article => {
|
| 617 |
-
// Truncate title if too long
|
| 618 |
-
const shortTitle = article.title && article.title.length > 50 ?
|
| 619 |
-
article.title.substring(0, 47) + '...' : article.title || 'Tech news';
|
| 620 |
-
|
| 621 |
-
tickerHTML += `
|
| 622 |
-
<span class="font-medium">${shortTitle}</span>
|
| 623 |
-
<span class="mx-3 text-gray-400">|</span>
|
| 624 |
-
`;
|
| 625 |
-
});
|
| 626 |
-
}
|
| 627 |
-
|
| 628 |
-
document.getElementById('tech-ticker').innerHTML = tickerHTML || 'Technology news headlines loaded';
|
| 629 |
-
}
|
| 630 |
-
|
| 631 |
function showError(message) {
|
| 632 |
// Hide loading states
|
| 633 |
document.getElementById('loading-skeleton').classList.add('hidden');
|
| 634 |
|
| 635 |
// Show error message
|
| 636 |
const errorElement = document.createElement('div');
|
| 637 |
-
errorElement.className = '
|
| 638 |
errorElement.innerHTML = `
|
| 639 |
-
<div class="flex items-center">
|
| 640 |
-
<i class="fas fa-exclamation-
|
| 641 |
<span>${message}</span>
|
| 642 |
</div>
|
| 643 |
`;
|
|
|
|
| 3 |
<head>
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>NEXUS | Futuristic Tech News</title>
|
| 7 |
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
| 9 |
<script>
|
|
|
|
| 11 |
theme: {
|
| 12 |
extend: {
|
| 13 |
colors: {
|
| 14 |
+
quantumBlue: '#00e1ff',
|
| 15 |
+
neonPink: '#ff36fc',
|
| 16 |
+
matrixGreen: '#00ff9d',
|
| 17 |
+
cyberPurple: '#a600ff',
|
| 18 |
+
hologramTeal: '#00ffcc',
|
| 19 |
+
voidBlack: '#050510',
|
| 20 |
+
spaceGray: '#1a1a2e',
|
| 21 |
+
uiGray: '#2a2a3a',
|
| 22 |
+
uiLight: '#e0e0ff'
|
| 23 |
+
},
|
| 24 |
+
fontFamily: {
|
| 25 |
+
'sans': ['"Rajdhani"', 'sans-serif'],
|
| 26 |
+
'mono': ['"Space Mono"', 'monospace'],
|
| 27 |
+
'display': ['"Orbitron"', 'sans-serif']
|
| 28 |
+
},
|
| 29 |
+
animation: {
|
| 30 |
+
'glow': 'glow 2s ease-in-out infinite alternate',
|
| 31 |
+
'float': 'float 6s ease-in-out infinite',
|
| 32 |
+
'text-shine': 'text-shine 3s ease-in-out infinite alternate',
|
| 33 |
+
'pulse-slow': 'pulse 5s infinite'
|
| 34 |
+
},
|
| 35 |
+
keyframes: {
|
| 36 |
+
glow: {
|
| 37 |
+
'0%': { 'box-shadow': '0 0 5px rgba(0, 225, 255, 0.3)' },
|
| 38 |
+
'100%': { 'box-shadow': '0 0 20px rgba(0, 225, 255, 0.5)' }
|
| 39 |
+
},
|
| 40 |
+
float: {
|
| 41 |
+
'0%, 100%': { transform: 'translateY(0)' },
|
| 42 |
+
'50%': { transform: 'translateY(-10px)' }
|
| 43 |
+
},
|
| 44 |
+
'text-shine': {
|
| 45 |
+
'0%': { 'background-position': '0% 50%' },
|
| 46 |
+
'100%': { 'background-position': '100% 50%' }
|
| 47 |
+
}
|
| 48 |
}
|
| 49 |
}
|
| 50 |
}
|
| 51 |
}
|
| 52 |
</script>
|
| 53 |
<style>
|
| 54 |
+
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;500;600;700&family=Space+Mono:ital,wght@0,400;0,700;1,400&family=Rajdhani:wght@300;400;500;600;700&display=swap');
|
| 55 |
+
|
| 56 |
+
body {
|
| 57 |
+
background-color: #050510;
|
| 58 |
+
color: #e0e0ff;
|
| 59 |
+
min-height: 100vh;
|
| 60 |
+
position: relative;
|
| 61 |
+
overflow-x: hidden;
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
body::before {
|
| 65 |
+
content: "";
|
| 66 |
+
position: fixed;
|
| 67 |
+
top: 0;
|
| 68 |
+
left: 0;
|
| 69 |
+
width: 100%;
|
| 70 |
+
height: 100%;
|
| 71 |
+
background:
|
| 72 |
+
radial-gradient(circle at 20% 30%, rgba(0, 225, 255, 0.05) 0%, transparent 30%),
|
| 73 |
+
radial-gradient(circle at 80% 70%, rgba(255, 54, 252, 0.05) 0%, transparent 30%);
|
| 74 |
+
pointer-events: none;
|
| 75 |
+
z-index: -1;
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
.ui-panel {
|
| 79 |
+
background: rgba(26, 26, 46, 0.7);
|
| 80 |
+
backdrop-filter: blur(12px);
|
| 81 |
+
border: 1px solid rgba(0, 225, 255, 0.1);
|
| 82 |
+
transition: all 0.3s ease;
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
.ui-panel:hover {
|
| 86 |
+
border-color: rgba(0, 225, 255, 0.3);
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
.news-card {
|
| 90 |
+
transition: all 0.3s ease;
|
| 91 |
+
position: relative;
|
| 92 |
+
overflow: hidden;
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
.news-card:hover {
|
| 96 |
+
transform: translateY(-3px);
|
|
|
|
| 97 |
}
|
| 98 |
+
|
| 99 |
+
.news-card::after {
|
| 100 |
+
content: "";
|
| 101 |
+
position: absolute;
|
| 102 |
+
bottom: 0;
|
| 103 |
+
left: 0;
|
| 104 |
+
width: 100%;
|
| 105 |
+
height: 2px;
|
| 106 |
+
background: linear-gradient(90deg, #00e1ff, #ff36fc);
|
| 107 |
+
transform: scaleX(0);
|
| 108 |
+
transform-origin: left;
|
| 109 |
+
transition: transform 0.3s ease;
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
.news-card:hover::after {
|
| 113 |
+
transform: scaleX(1);
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
.gradient-text {
|
| 117 |
+
background: linear-gradient(90deg, #00e1ff, #ff36fc);
|
| 118 |
+
-webkit-background-clip: text;
|
| 119 |
+
background-clip: text;
|
| 120 |
+
color: transparent;
|
| 121 |
+
background-size: 200% 200%;
|
| 122 |
+
animation: gradient 8s ease infinite;
|
| 123 |
+
}
|
| 124 |
+
|
| 125 |
+
@keyframes gradient {
|
| 126 |
+
0% { background-position: 0% 50%; }
|
| 127 |
+
50% { background-position: 100% 50%; }
|
| 128 |
+
100% { background-position: 0% 50%; }
|
| 129 |
+
}
|
| 130 |
+
|
| 131 |
+
.cyber-button {
|
| 132 |
+
position: relative;
|
| 133 |
+
overflow: hidden;
|
| 134 |
+
transition: all 0.3s;
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
.cyber-button::before {
|
| 138 |
+
content: "";
|
| 139 |
+
position: absolute;
|
| 140 |
+
top: 0;
|
| 141 |
+
left: -100%;
|
| 142 |
+
width: 100%;
|
| 143 |
+
height: 100%;
|
| 144 |
+
background: linear-gradient(
|
| 145 |
+
90deg,
|
| 146 |
+
transparent,
|
| 147 |
+
rgba(0, 225, 255, 0.2),
|
| 148 |
+
transparent
|
| 149 |
+
);
|
| 150 |
+
transition: 0.5s;
|
| 151 |
}
|
| 152 |
+
|
| 153 |
+
.cyber-button:hover::before {
|
| 154 |
+
left: 100%;
|
| 155 |
}
|
| 156 |
+
|
| 157 |
+
.grid-pattern {
|
| 158 |
+
background-image:
|
| 159 |
+
linear-gradient(rgba(0, 225, 255, 0.05) 1px, transparent 1px),
|
| 160 |
+
linear-gradient(90deg, rgba(0, 225, 255, 0.05) 1px, transparent 1px);
|
| 161 |
+
background-size: 20px 20px;
|
| 162 |
}
|
| 163 |
+
|
| 164 |
.marquee {
|
| 165 |
white-space: nowrap;
|
| 166 |
overflow: hidden;
|
| 167 |
box-sizing: border-box;
|
| 168 |
}
|
| 169 |
+
|
| 170 |
.marquee span {
|
| 171 |
display: inline-block;
|
| 172 |
padding-left: 100%;
|
| 173 |
+
animation: marquee 25s linear infinite;
|
| 174 |
}
|
| 175 |
+
|
| 176 |
@keyframes marquee {
|
| 177 |
0% { transform: translate(0, 0); }
|
| 178 |
100% { transform: translate(-100%, 0); }
|
| 179 |
}
|
| 180 |
+
|
| 181 |
+
.holographic-effect {
|
| 182 |
+
position: relative;
|
| 183 |
+
}
|
| 184 |
+
|
| 185 |
+
.holographic-effect::before {
|
| 186 |
+
content: "";
|
| 187 |
+
position: absolute;
|
| 188 |
+
top: 0;
|
| 189 |
+
left: 0;
|
| 190 |
+
width: 100%;
|
| 191 |
+
height: 100%;
|
| 192 |
+
background:
|
| 193 |
+
linear-gradient(135deg,
|
| 194 |
+
rgba(0, 225, 255, 0.03) 0%,
|
| 195 |
+
rgba(255, 54, 252, 0.03) 50%,
|
| 196 |
+
rgba(0, 255, 157, 0.03) 100%);
|
| 197 |
+
pointer-events: none;
|
| 198 |
+
z-index: -1;
|
| 199 |
+
}
|
| 200 |
</style>
|
| 201 |
</head>
|
| 202 |
+
<body class="font-sans">
|
| 203 |
+
<!-- Floating elements -->
|
| 204 |
+
<div class="fixed top-1/4 left-10 w-3 h-3 rounded-full bg-quantumBlue opacity-30 animate-float" style="animation-delay: 0s;"></div>
|
| 205 |
+
<div class="fixed top-1/3 right-20 w-4 h-4 rounded-full bg-neonPink opacity-30 animate-float" style="animation-delay: 1s;"></div>
|
| 206 |
+
<div class="fixed bottom-1/4 left-1/4 w-5 h-5 rounded-full bg-cyberPurple opacity-30 animate-float" style="animation-delay: 2s;"></div>
|
| 207 |
+
|
| 208 |
<!-- Header -->
|
| 209 |
+
<header class="bg-voidBlack border-b border-uiGray/20 sticky top-0 z-50">
|
| 210 |
+
<div class="container mx-auto px-6 py-4">
|
| 211 |
<div class="flex flex-col md:flex-row justify-between items-center">
|
| 212 |
<div class="flex items-center mb-4 md:mb-0">
|
| 213 |
+
<div class="w-10 h-10 rounded-full bg-gradient-to-br from-quantumBlue to-cyberPurple flex items-center justify-center mr-3">
|
| 214 |
+
<i class="fas fa-satellite text-white text-lg"></i>
|
| 215 |
+
</div>
|
| 216 |
+
<h1 class="text-3xl font-bold font-display tracking-tighter">
|
| 217 |
+
<span class="gradient-text">NEXUS</span>
|
| 218 |
+
</h1>
|
| 219 |
</div>
|
| 220 |
+
|
| 221 |
+
<nav class="hidden md:flex space-x-6">
|
| 222 |
+
<a href="#" class="text-uiLight hover:text-quantumBlue transition font-medium">HOME</a>
|
| 223 |
+
<a href="#" class="text-uiLight hover:text-quantumBlue transition font-medium">TECH</a>
|
| 224 |
+
<a href="#" class="text-uiLight hover:text-quantumBlue transition font-medium">AI</a>
|
| 225 |
+
<a href="#" class="text-uiLight hover:text-quantumBlue transition font-medium">CYBER</a>
|
| 226 |
+
<a href="#" class="text-uiLight hover:text-quantumBlue transition font-medium">SPACE</a>
|
| 227 |
+
</nav>
|
| 228 |
+
|
| 229 |
+
<div class="flex items-center space-x-4 mt-4 md:mt-0">
|
| 230 |
+
<button class="px-4 py-2 rounded-md bg-uiGray/50 text-uiLight hover:bg-uiGray/70 transition font-mono text-sm cyber-button">
|
| 231 |
+
<i class="fas fa-user-astronaut mr-2"></i> SIGN IN
|
| 232 |
</button>
|
| 233 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 234 |
</div>
|
| 235 |
</div>
|
| 236 |
</header>
|
| 237 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 238 |
<!-- Main Content -->
|
| 239 |
+
<main class="container mx-auto px-6 py-8">
|
| 240 |
+
<!-- Hero Section -->
|
| 241 |
+
<section class="mb-12 grid-pattern rounded-xl overflow-hidden">
|
| 242 |
+
<div class="h-96 bg-gradient-to-br from-voidBlack to-spaceGray/80 relative flex items-center justify-center">
|
| 243 |
+
<div class="absolute inset-0 flex items-center justify-center">
|
| 244 |
+
<div class="w-full h-full opacity-20" style="background: radial-gradient(circle, rgba(0,225,255,0.3) 0%, transparent 70%);"></div>
|
| 245 |
+
</div>
|
| 246 |
+
<div class="relative z-10 text-center px-6 max-w-4xl">
|
| 247 |
+
<h2 class="text-4xl md:text-5xl font-display font-bold mb-4 tracking-tight">
|
| 248 |
+
<span class="gradient-text">THE FUTURE</span> IN REAL-TIME
|
| 249 |
+
</h2>
|
| 250 |
+
<p class="text-uiLight/80 mb-8 text-lg font-sans">
|
| 251 |
+
Cutting-edge technology news from across the quantum spectrum.
|
| 252 |
+
Stay ahead with our neural network-curated feed.
|
| 253 |
+
</p>
|
| 254 |
+
<div class="relative max-w-xl mx-auto">
|
| 255 |
+
<input type="text" placeholder="SEARCH THE NEXUS..."
|
| 256 |
+
class="w-full px-6 py-3 rounded-full bg-spaceGray/80 text-uiLight placeholder-uiLight/50 border border-uiGray/30 focus:outline-none focus:ring-1 focus:ring-quantumBlue focus:bg-spaceGray font-mono tracking-wider">
|
| 257 |
+
<button class="absolute right-3 top-3 text-uiLight hover:text-quantumBlue transition">
|
| 258 |
+
<i class="fas fa-search"></i>
|
| 259 |
+
</button>
|
| 260 |
+
</div>
|
| 261 |
+
</div>
|
| 262 |
+
</div>
|
| 263 |
+
</section>
|
| 264 |
+
|
| 265 |
<div class="flex flex-col lg:flex-row gap-8">
|
| 266 |
<!-- Left Column - News Feed -->
|
| 267 |
<div class="w-full lg:w-2/3">
|
| 268 |
+
<!-- News Tabs -->
|
| 269 |
+
<div class="flex border-b border-uiGray/20 mb-6">
|
| 270 |
+
<button class="px-4 py-3 border-b-2 border-quantumBlue text-quantumBlue font-medium">LATEST</button>
|
| 271 |
+
<button class="px-4 py-3 text-uiLight/70 hover:text-uiLight transition">TRENDING</button>
|
| 272 |
+
<button class="px-4 py-3 text-uiLight/70 hover:text-uiLight transition">AI</button>
|
| 273 |
+
<button class="px-4 py-3 text-uiLight/70 hover:text-uiLight transition">QUANTUM</button>
|
| 274 |
+
<button class="px-4 py-3 text-uiLight/70 hover:text-uiLight transition">CYBER</button>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 275 |
</div>
|
| 276 |
|
| 277 |
<!-- News Loading Skeleton -->
|
| 278 |
<div id="loading-skeleton" class="space-y-6">
|
| 279 |
+
<div class="ui-panel rounded-lg p-6 animate-pulse">
|
| 280 |
+
<div class="h-6 bg-uiGray/30 rounded w-3/4 mb-4"></div>
|
| 281 |
+
<div class="h-4 bg-uiGray/20 rounded w-full mb-2"></div>
|
| 282 |
+
<div class="h-4 bg-uiGray/20 rounded w-5/6 mb-2"></div>
|
| 283 |
+
<div class="h-4 bg-uiGray/20 rounded w-4/6 mb-4"></div>
|
| 284 |
+
<div class="h-3 bg-uiGray/20 rounded w-1/4"></div>
|
| 285 |
</div>
|
| 286 |
+
<div class="ui-panel rounded-lg p-6 animate-pulse">
|
| 287 |
+
<div class="h-6 bg-uiGray/30 rounded w-3/4 mb-4"></div>
|
| 288 |
+
<div class="h-4 bg-uiGray/20 rounded w-full mb-2"></div>
|
| 289 |
+
<div class="h-4 bg-uiGray/20 rounded w-5/6 mb-2"></div>
|
| 290 |
+
<div class="h-4 bg-uiGray/20 rounded w-4/6 mb-4"></div>
|
| 291 |
+
<div class="h-3 bg-uiGray/20 rounded w-1/4"></div>
|
| 292 |
</div>
|
| 293 |
</div>
|
| 294 |
|
|
|
|
| 298 |
</div>
|
| 299 |
|
| 300 |
<div class="mt-8 flex justify-center">
|
| 301 |
+
<button id="load-more" class="px-8 py-3 bg-gradient-to-r from-cyberPurple to-quantumBlue text-white rounded-md hover:opacity-90 transition-all duration-300 font-mono cyber-button">
|
| 302 |
+
<i class="fas fa-chevron-down mr-2"></i> LOAD MORE
|
| 303 |
</button>
|
| 304 |
</div>
|
| 305 |
</div>
|
| 306 |
|
| 307 |
+
<!-- Right Column - Sidebar -->
|
| 308 |
<div class="w-full lg:w-1/3">
|
| 309 |
+
<!-- Trending Now -->
|
| 310 |
+
<div class="ui-panel rounded-lg p-6 mb-6">
|
| 311 |
+
<h3 class="text-lg font-bold font-mono text-quantumBlue mb-4 tracking-wider flex items-center">
|
| 312 |
+
<i class="fas fa-bolt mr-2"></i> TRENDING NOW
|
| 313 |
+
</h3>
|
| 314 |
<div class="space-y-4" id="trending-topics">
|
| 315 |
<div class="flex justify-between items-center animate-pulse">
|
| 316 |
<div class="flex items-center">
|
| 317 |
+
<div class="w-8 h-8 bg-uiGray/30 rounded-full mr-3"></div>
|
| 318 |
+
<div class="h-4 bg-uiGray/20 rounded w-24"></div>
|
|
|
|
|
|
|
|
|
|
| 319 |
</div>
|
| 320 |
+
<div class="h-4 bg-uiGray/20 rounded w-12"></div>
|
| 321 |
</div>
|
| 322 |
<div class="flex justify-between items-center animate-pulse">
|
| 323 |
<div class="flex items-center">
|
| 324 |
+
<div class="w-8 h-8 bg-uiGray/30 rounded-full mr-3"></div>
|
| 325 |
+
<div class="h-4 bg-uiGray/20 rounded w-24"></div>
|
|
|
|
|
|
|
|
|
|
| 326 |
</div>
|
| 327 |
+
<div class="h-4 bg-uiGray/20 rounded w-12"></div>
|
| 328 |
</div>
|
| 329 |
</div>
|
| 330 |
</div>
|
| 331 |
|
| 332 |
+
<!-- Tech Brief -->
|
| 333 |
+
<div class="ui-panel rounded-lg p-6 mb-6">
|
| 334 |
+
<h3 class="text-lg font-bold font-mono text-quantumBlue mb-4 tracking-wider flex items-center">
|
| 335 |
+
<i class="fas fa-microchip mr-2"></i> TECH BRIEF
|
| 336 |
+
</h3>
|
| 337 |
+
<div class="space-y-4">
|
| 338 |
+
<div class="p-4 bg-spaceGray/50 rounded-md border-l-4 border-quantumBlue">
|
| 339 |
+
<div class="flex items-start">
|
| 340 |
+
<div class="flex-shrink-0 mt-1">
|
| 341 |
+
<div class="w-3 h-3 rounded-full bg-quantumBlue animate-pulse-slow"></div>
|
| 342 |
+
</div>
|
| 343 |
+
<div class="ml-3">
|
| 344 |
+
<p class="text-sm font-mono text-uiLight">QUANTUM COMPUTING BREAKTHROUGH AT GOOGLE</p>
|
| 345 |
+
<p class="text-xs text-uiLight/50 mt-1">12 MINUTES AGO</p>
|
| 346 |
+
</div>
|
| 347 |
+
</div>
|
| 348 |
</div>
|
| 349 |
+
<div class="p-4 bg-spaceGray/50 rounded-md border-l-4 border-neonPink">
|
| 350 |
+
<div class="flex items-start">
|
| 351 |
+
<div class="flex-shrink-0 mt-1">
|
| 352 |
+
<div class="w-3 h-3 rounded-full bg-neonPink animate-pulse-slow"></div>
|
| 353 |
+
</div>
|
| 354 |
+
<div class="ml-3">
|
| 355 |
+
<p class="text-sm font-mono text-uiLight">APPLE ANNOUNCES NEURAL INTERFACE RESEARCH</p>
|
| 356 |
+
<p class="text-xs text-uiLight/50 mt-1">38 MINUTES AGO</p>
|
| 357 |
+
</div>
|
| 358 |
+
</div>
|
| 359 |
</div>
|
| 360 |
+
<div class="p-4 bg-spaceGray/50 rounded-md border-l-4 border-matrixGreen">
|
| 361 |
+
<div class="flex items-start">
|
| 362 |
+
<div class="flex-shrink-0 mt-1">
|
| 363 |
+
<div class="w-3 h-3 rounded-full bg-matrixGreen animate-pulse-slow"></div>
|
| 364 |
+
</div>
|
| 365 |
+
<div class="ml-3">
|
| 366 |
+
<p class="text-sm font-mono text-uiLight">SPACEX LAUNCHES NEXT-GEN STARLINK SATELLITES</p>
|
| 367 |
+
<p class="text-xs text-uiLight/50 mt-1">1 HOUR AGO</p>
|
| 368 |
+
</div>
|
| 369 |
+
</div>
|
| 370 |
</div>
|
| 371 |
</div>
|
| 372 |
</div>
|
| 373 |
|
| 374 |
<!-- Newsletter -->
|
| 375 |
+
<div class="ui-panel rounded-lg p-6 bg-gradient-to-br from-spaceGray/80 to-voidBlack/80">
|
| 376 |
+
<h3 class="text-lg font-bold font-mono text-quantumBlue mb-2 tracking-wider">
|
| 377 |
+
<i class="fas fa-envelope mr-2"></i> NEXUS NEWSLETTER
|
| 378 |
+
</h3>
|
| 379 |
+
<p class="mb-4 text-uiLight/70 text-sm">Get the future delivered to your inbox</p>
|
| 380 |
<form class="space-y-3">
|
| 381 |
+
<input type="email" placeholder="YOUR@EMAIL.COM"
|
| 382 |
+
class="w-full px-4 py-2 rounded bg-spaceGray/70 text-uiLight placeholder-uiLight/50 border border-uiGray/30 focus:outline-none focus:ring-1 focus:ring-quantumBlue font-mono text-sm tracking-wider">
|
| 383 |
+
<button type="submit" class="w-full px-4 py-2 bg-gradient-to-r from-quantumBlue/90 to-cyberPurple/90 text-white rounded-md font-medium hover:opacity-90 transition font-mono text-sm tracking-wider cyber-button">
|
| 384 |
+
<i class="fas fa-paper-plane mr-2"></i> SUBSCRIBE
|
| 385 |
</button>
|
| 386 |
</form>
|
| 387 |
</div>
|
|
|
|
| 390 |
</main>
|
| 391 |
|
| 392 |
<!-- Footer -->
|
| 393 |
+
<footer class="bg-voidBlack border-t border-uiGray/20 py-12 mt-12">
|
| 394 |
+
<div class="container mx-auto px-6">
|
| 395 |
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
|
| 396 |
<div>
|
| 397 |
+
<h4 class="text-xl font-bold font-display text-uiLight mb-4 tracking-tighter">
|
| 398 |
+
<span class="gradient-text">NEXUS</span>
|
| 399 |
+
</h4>
|
| 400 |
+
<p class="text-uiLight/60 text-sm font-sans">The premier source for tomorrow's technology, today.</p>
|
| 401 |
+
<div class="flex space-x-4 mt-4">
|
| 402 |
+
<a href="#" class="text-uiLight/60 hover:text-quantumBlue transition"><i class="fab fa-twitter"></i></a>
|
| 403 |
+
<a href="#" class="text-uiLight/60 hover:text-quantumBlue transition"><i class="fab fa-linkedin"></i></a>
|
| 404 |
+
<a href="#" class="text-uiLight/60 hover:text-quantumBlue transition"><i class="fab fa-github"></i></a>
|
| 405 |
+
<a href="#" class="text-uiLight/60 hover:text-quantumBlue transition"><i class="fab fa-youtube"></i></a>
|
| 406 |
+
</div>
|
| 407 |
</div>
|
| 408 |
<div>
|
| 409 |
+
<h4 class="text-sm font-bold font-mono text-quantumBlue mb-4 tracking-wider">EXPLORE</h4>
|
| 410 |
<ul class="space-y-2">
|
| 411 |
+
<li><a href="#" class="text-uiLight/60 hover:text-uiLight transition text-sm">Technology</a></li>
|
| 412 |
+
<li><a href="#" class="text-uiLight/60 hover:text-uiLight transition text-sm">Artificial Intelligence</a></li>
|
| 413 |
+
<li><a href="#" class="text-uiLight/60 hover:text-uiLight transition text-sm">Quantum Computing</a></li>
|
| 414 |
+
<li><a href="#" class="text-uiLight/60 hover:text-uiLight transition text-sm">Cybersecurity</a></li>
|
| 415 |
</ul>
|
| 416 |
</div>
|
| 417 |
<div>
|
| 418 |
+
<h4 class="text-sm font-bold font-mono text-quantumBlue mb-4 tracking-wider">COMPANY</h4>
|
| 419 |
<ul class="space-y-2">
|
| 420 |
+
<li><a href="#" class="text-uiLight/60 hover:text-uiLight transition text-sm">About</a></li>
|
| 421 |
+
<li><a href="#" class="text-uiLight/60 hover:text-uiLight transition text-sm">Careers</a></li>
|
| 422 |
+
<li><a href="#" class="text-uiLight/60 hover:text-uiLight transition text-sm">Privacy</a></li>
|
| 423 |
+
<li><a href="#" class="text-uiLight/60 hover:text-uiLight transition text-sm">Terms</a></li>
|
| 424 |
</ul>
|
| 425 |
</div>
|
| 426 |
<div>
|
| 427 |
+
<h4 class="text-sm font-bold font-mono text-quantumBlue mb-4 tracking-wider">CONTACT</h4>
|
| 428 |
+
<ul class="space-y-2">
|
| 429 |
+
<li class="text-uiLight/60 text-sm">hello@nexus.tech</li>
|
| 430 |
+
<li class="text-uiLight/60 text-sm">+1 (555) 123-4567</li>
|
| 431 |
+
<li class="text-uiLight/60 text-sm">San Francisco, CA</li>
|
| 432 |
+
</ul>
|
| 433 |
+
</div>
|
| 434 |
+
</div>
|
| 435 |
+
<div class="border-t border-uiGray/20 mt-8 pt-8 flex flex-col md:flex-row justify-between items-center">
|
| 436 |
+
<p class="text-uiLight/50 text-xs mb-4 md:mb-0">© 2023 NEXUS TECHNOLOGIES. ALL RIGHTS RESERVED.</p>
|
| 437 |
+
<div class="flex space-x-4">
|
| 438 |
+
<a href="#" class="text-uiLight/50 hover:text-uiLight transition text-xs">Privacy Policy</a>
|
| 439 |
+
<a href="#" class="text-uiLight/50 hover:text-uiLight transition text-xs">Terms of Service</a>
|
| 440 |
+
<a href="#" class="text-uiLight/50 hover:text-uiLight transition text-xs">Cookies</a>
|
| 441 |
</div>
|
| 442 |
</div>
|
| 443 |
</div>
|
|
|
|
| 448 |
const NEWSAPI_API_KEY = 'f764fe522436442d9bdafbae241d7b63';
|
| 449 |
const MARKETAUX_API_TOKEN = 'x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq';
|
| 450 |
|
|
|
|
| 451 |
// API endpoints for each category
|
| 452 |
const API_ENDPOINTS = {
|
| 453 |
all: [
|
| 454 |
'https://api.marketaux.com/v1/news/all?industries=Technology&filter_entities=true&limit=10&api_token=' + MARKETAUX_API_TOKEN,
|
| 455 |
'https://newsapi.org/v2/everything?q=bitcoin&from=2025-04-23&sortBy=publishedAt&apiKey=' + NEWSAPI_API_KEY,
|
| 456 |
'https://newsapi.org/v2/everything?q=apple&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=' + NEWSAPI_API_KEY,
|
| 457 |
+
'https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=' + NEWSAPI_API_KEY,
|
| 458 |
+
'https://newsapi.org/v2/everything?q=energy&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=' + NEWSAPI_API_KEY,
|
| 459 |
+
'https://newsapi.org/v2/everything?q=solar&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=' + NEWSAPI_API_KEY,
|
| 460 |
+
'https://newsapi.org/v2/everything?q=wind+solar&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=' + NEWSAPI_API_KEY,
|
| 461 |
+
'https://newsapi.org/v2/everything?q=verizonORsprintORt-mobileORmetroOR5gORwireless&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=' + NEWSAPI_API_KEY
|
| 462 |
],
|
| 463 |
technology: [
|
| 464 |
'https://newsapi.org/v2/everything?q=technology&from=2025-04-23&sortBy=publishedAt&apiKey=' + NEWSAPI_API_KEY,
|
|
|
|
| 503 |
loadAllData();
|
| 504 |
|
| 505 |
// Event listeners
|
|
|
|
| 506 |
document.getElementById('load-more').addEventListener('click', loadMoreNews);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 507 |
});
|
| 508 |
|
| 509 |
async function loadAllData() {
|
| 510 |
try {
|
| 511 |
await Promise.all([
|
| 512 |
fetchNews(),
|
| 513 |
+
fetchTrendingTopics()
|
|
|
|
| 514 |
]);
|
| 515 |
} catch (error) {
|
| 516 |
console.error('Error loading data:', error);
|
| 517 |
+
showError('SYSTEM ERROR: FAILED TO LOAD DATA. PLEASE TRY AGAIN LATER.');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 518 |
}
|
| 519 |
}
|
| 520 |
|
| 521 |
async function loadMoreNews() {
|
| 522 |
const btn = document.getElementById('load-more');
|
| 523 |
const originalText = btn.innerHTML;
|
| 524 |
+
btn.innerHTML = '<i class="fas fa-spinner fa-spin mr-1"></i> LOADING...';
|
| 525 |
btn.disabled = true;
|
| 526 |
|
| 527 |
currentNewsPage++;
|
|
|
|
| 530 |
await fetchNews(false, true); // false = not refresh, true = append
|
| 531 |
} catch (error) {
|
| 532 |
console.error('Error loading more news:', error);
|
| 533 |
+
showError('NETWORK ERROR: FAILED TO LOAD MORE DATA.');
|
| 534 |
currentNewsPage--; // Revert page increment on failure
|
| 535 |
}
|
| 536 |
|
|
|
|
| 538 |
btn.disabled = false;
|
| 539 |
}
|
| 540 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 541 |
// API Fetch Functions
|
| 542 |
async function fetchNews(refresh = false, append = false) {
|
| 543 |
try {
|
|
|
|
| 586 |
|
| 587 |
if (allArticles.length > 0) {
|
| 588 |
updateNewsUI(allArticles, refresh, append);
|
|
|
|
| 589 |
}
|
| 590 |
} catch (error) {
|
| 591 |
console.error('Error fetching news:', error);
|
|
|
|
| 606 |
async function fetchTrendingTopics() {
|
| 607 |
try {
|
| 608 |
// For demo purposes, we'll use a static list
|
|
|
|
| 609 |
const trendingTopics = [
|
| 610 |
+
{ name: "AI ADVANCEMENTS", mentions: 1245 },
|
| 611 |
+
{ name: "QUANTUM COMPUTING", mentions: 876 },
|
| 612 |
+
{ name: "5G ROLLOUT", mentions: 754 },
|
| 613 |
+
{ name: "METAVERSE", mentions: 689 },
|
| 614 |
+
{ name: "CYBERSECURITY", mentions: 632 }
|
| 615 |
];
|
| 616 |
|
| 617 |
updateTrendingTopicsUI(trendingTopics);
|
|
|
|
| 621 |
}
|
| 622 |
}
|
| 623 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 624 |
// UI Update Functions
|
| 625 |
function updateTrendingTopicsUI(topics) {
|
| 626 |
const trendingContainer = document.getElementById('trending-topics');
|
|
|
|
| 632 |
|
| 633 |
topicElement.innerHTML = `
|
| 634 |
<div class="flex items-center">
|
| 635 |
+
<div class="w-8 h-8 rounded-full bg-gradient-to-br from-quantumBlue/20 to-neonPink/20 text-quantumBlue flex items-center justify-center mr-3 text-xs font-mono">
|
| 636 |
+
${Math.floor(Math.random() * 9) + 1}
|
| 637 |
</div>
|
| 638 |
+
<span class="font-mono text-sm text-uiLight">${topic.name}</span>
|
| 639 |
</div>
|
| 640 |
<div class="text-right">
|
| 641 |
+
<span class="text-xs font-mono text-uiLight/60">${topic.mentions.toLocaleString()}</span>
|
| 642 |
</div>
|
| 643 |
`;
|
| 644 |
|
|
|
|
| 646 |
});
|
| 647 |
}
|
| 648 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 649 |
function updateNewsUI(articles, refresh, append) {
|
| 650 |
const newsContainer = document.getElementById('news-container');
|
| 651 |
|
|
|
|
| 665 |
// Add articles to container
|
| 666 |
articles.forEach(article => {
|
| 667 |
const newsCard = document.createElement('div');
|
| 668 |
+
newsCard.className = 'news-card ui-panel rounded-lg p-6';
|
| 669 |
|
| 670 |
// Simple sentiment analysis based on title keywords
|
| 671 |
+
let sentimentColor = 'text-quantumBlue';
|
| 672 |
let sentimentIcon = 'fa-newspaper';
|
| 673 |
+
const title = article.title ? article.title.toUpperCase() : '';
|
| 674 |
|
| 675 |
+
if (title.includes('BREAKTHROUGH') || title.includes('INNOVATIVE') || title.includes('SUCCESS') ||
|
| 676 |
+
title.includes('GROWTH') || title.includes('LAUNCH') || title.includes('RECORD')) {
|
| 677 |
+
sentimentColor = 'text-matrixGreen';
|
| 678 |
sentimentIcon = 'fa-arrow-up';
|
| 679 |
+
} else if (title.includes('HACK') || title.includes('BREACH') || title.includes('LAYOFF') ||
|
| 680 |
+
title.includes('DECLINE') || title.includes('WARNING') || title.includes('ISSUE') ||
|
| 681 |
+
title.includes('PROBLEM') || title.includes('FAILURE')) {
|
| 682 |
+
sentimentColor = 'text-neonPink';
|
| 683 |
sentimentIcon = 'fa-arrow-down';
|
| 684 |
}
|
| 685 |
|
|
|
|
| 689 |
year: 'numeric',
|
| 690 |
month: 'short',
|
| 691 |
day: 'numeric'
|
| 692 |
+
}).toUpperCase();
|
| 693 |
|
| 694 |
// Get source name
|
| 695 |
+
const sourceName = article.source ? article.source.toUpperCase() : 'UNKNOWN SOURCE';
|
| 696 |
|
| 697 |
// Create card HTML
|
| 698 |
newsCard.innerHTML = `
|
| 699 |
+
<div class="flex flex-col md:flex-row gap-6">
|
| 700 |
+
<div class="md:w-1/3">
|
| 701 |
+
<div class="w-full h-40 bg-uiGray/30 rounded-lg overflow-hidden">
|
| 702 |
+
<img src="${article.image_url || 'https://via.placeholder.com/300x200/1a1a2e/00e1ff?text=NEXUS'}"
|
| 703 |
+
alt="${article.title || 'NEWS IMAGE'}"
|
| 704 |
+
class="w-full h-full object-cover">
|
| 705 |
+
</div>
|
| 706 |
</div>
|
| 707 |
+
<div class="md:w-2/3">
|
| 708 |
<div class="flex justify-between items-start mb-2">
|
| 709 |
+
<h3 class="text-xl font-medium font-sans text-uiLight">${article.title || 'NO TITLE AVAILABLE'}</h3>
|
| 710 |
<i class="fas ${sentimentIcon} ${sentimentColor} text-lg"></i>
|
| 711 |
</div>
|
| 712 |
+
<p class="text-uiLight/70 mb-4 text-sm">${article.description || 'NO DESCRIPTION AVAILABLE.'}</p>
|
| 713 |
+
<div class="flex justify-between items-center text-xs font-mono tracking-wider text-uiLight/50">
|
| 714 |
+
<span>${sourceName} <span class="mx-2">•</span> ${formattedDate}</span>
|
| 715 |
<a href="${article.url || '#'}" target="_blank" rel="noopener noreferrer"
|
| 716 |
+
class="text-quantumBlue hover:text-uiLight transition flex items-center">
|
| 717 |
+
READ <i class="fas fa-external-link-alt ml-1 text-xs"></i>
|
| 718 |
</a>
|
| 719 |
</div>
|
| 720 |
</div>
|
|
|
|
| 732 |
}
|
| 733 |
}
|
| 734 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 735 |
function showError(message) {
|
| 736 |
// Hide loading states
|
| 737 |
document.getElementById('loading-skeleton').classList.add('hidden');
|
| 738 |
|
| 739 |
// Show error message
|
| 740 |
const errorElement = document.createElement('div');
|
| 741 |
+
errorElement.className = 'ui-panel rounded-lg p-6';
|
| 742 |
errorElement.innerHTML = `
|
| 743 |
+
<div class="flex items-center text-quantumBlue font-mono tracking-wider">
|
| 744 |
+
<i class="fas fa-exclamation-triangle mr-2"></i>
|
| 745 |
<span>${message}</span>
|
| 746 |
</div>
|
| 747 |
`;
|
prompts.txt
CHANGED
|
@@ -2,4 +2,6 @@ make a website that automatically aggregates the material that it will post, whi
|
|
| 2 |
what the hell are you doing? i specifically asked you not to code in fake/sample/simulated articles or any data that isnt aggrigated or scraped. this site has to use APIs from other sources to get its current prices for the currencies and to get current articles and stories for its News. Do not use any simulated articles or anything that isnt gotten through API, All information on this site must be current!
|
| 3 |
make this into a Tech news automated news aggrigator instead of Crypto news. use https://api.marketaux.com/v1/news/all?industries=Technology&filter_entities=true&limit=10&published_after=2025-05-22T08:54&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq for the api.
|
| 4 |
in the Categories drop down menu, the categories should be: 1 - Energy, with API: https://api.marketaux.com/v1/news/all?industries=Energy&filter_entities=true&limit=10&published_after=2025-05-22T09:04&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 2 - Communication Services with API: https://api.marketaux.com/v1/news/all?industries=Communication Services&filter_entities=true&limit=10&published_after=2025-05-22T09:07&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 3 - Financial with API: https://api.marketaux.com/v1/news/all?industries=Financial&filter_entities=true&limit=10&published_after=2025-05-22T09:08&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 4 - Healthcare with API: https://api.marketaux.com/v1/news/all?industries=Healthcare&filter_entities=true&limit=10&published_after=2025-05-22T09:09&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 5 - Industrial with API: https://api.marketaux.com/v1/news/all?industries=Industrials&filter_entities=true&limit=10&published_after=2025-05-22T09:10&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 6 - Real Estate with API: https://api.marketaux.com/v1/news/all?industries=Real Estate&filter_entities=true&limit=10&published_after=2025-05-22T09:11&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 7 - Utilities with API: https://api.marketaux.com/v1/news/all?industries=Utilities&filter_entities=true&limit=10&published_after=2025-05-22T09:12&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq.
|
| 5 |
-
add these additional APIs to their respective categories: Technology API: https://newsapi.org/v2/everything?q=bitcoin&from=2025-04-23&sortBy=publishedAt&apiKey=f764fe522436442d9bdafbae241d7b63, https://newsapi.org/v2/everything?q=apple&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=f764fe522436442d9bdafbae241d7b63, https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=f764fe522436442d9bdafbae241d7b63. Energy API - https://newsapi.org/v2/everything?q=energy&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=f764fe522436442d9bdafbae241d7b63, https://newsapi.org/v2/everything?q=solar&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=f764fe522436442d9bdafbae241d7b63, https://newsapi.org/v2/everything?q=wind+solar&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=f764fe522436442d9bdafbae241d7b63. Communication Services API: https://newsapi.org/v2/everything?q=verizonORsprintORt-mobileORmetroOR5gORwireless&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=f764fe522436442d9bdafbae241d7b63
|
|
|
|
|
|
|
|
|
| 2 |
what the hell are you doing? i specifically asked you not to code in fake/sample/simulated articles or any data that isnt aggrigated or scraped. this site has to use APIs from other sources to get its current prices for the currencies and to get current articles and stories for its News. Do not use any simulated articles or anything that isnt gotten through API, All information on this site must be current!
|
| 3 |
make this into a Tech news automated news aggrigator instead of Crypto news. use https://api.marketaux.com/v1/news/all?industries=Technology&filter_entities=true&limit=10&published_after=2025-05-22T08:54&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq for the api.
|
| 4 |
in the Categories drop down menu, the categories should be: 1 - Energy, with API: https://api.marketaux.com/v1/news/all?industries=Energy&filter_entities=true&limit=10&published_after=2025-05-22T09:04&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 2 - Communication Services with API: https://api.marketaux.com/v1/news/all?industries=Communication Services&filter_entities=true&limit=10&published_after=2025-05-22T09:07&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 3 - Financial with API: https://api.marketaux.com/v1/news/all?industries=Financial&filter_entities=true&limit=10&published_after=2025-05-22T09:08&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 4 - Healthcare with API: https://api.marketaux.com/v1/news/all?industries=Healthcare&filter_entities=true&limit=10&published_after=2025-05-22T09:09&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 5 - Industrial with API: https://api.marketaux.com/v1/news/all?industries=Industrials&filter_entities=true&limit=10&published_after=2025-05-22T09:10&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 6 - Real Estate with API: https://api.marketaux.com/v1/news/all?industries=Real Estate&filter_entities=true&limit=10&published_after=2025-05-22T09:11&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq. 7 - Utilities with API: https://api.marketaux.com/v1/news/all?industries=Utilities&filter_entities=true&limit=10&published_after=2025-05-22T09:12&api_token=x7do5W51vWCggI5OC0qDPYYPRRRBdpsZuydOkfPq.
|
| 5 |
+
add these additional APIs to their respective categories: Technology API: https://newsapi.org/v2/everything?q=bitcoin&from=2025-04-23&sortBy=publishedAt&apiKey=f764fe522436442d9bdafbae241d7b63, https://newsapi.org/v2/everything?q=apple&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=f764fe522436442d9bdafbae241d7b63, https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=f764fe522436442d9bdafbae241d7b63. Energy API - https://newsapi.org/v2/everything?q=energy&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=f764fe522436442d9bdafbae241d7b63, https://newsapi.org/v2/everything?q=solar&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=f764fe522436442d9bdafbae241d7b63, https://newsapi.org/v2/everything?q=wind+solar&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=f764fe522436442d9bdafbae241d7b63. Communication Services API: https://newsapi.org/v2/everything?q=verizonORsprintORt-mobileORmetroOR5gORwireless&from=2025-05-22&to=2025-05-22&sortBy=popularity&apiKey=f764fe522436442d9bdafbae241d7b63
|
| 6 |
+
change the theme to something more modern, techy, sleek and vibrant, vaporwave-ish feel.
|
| 7 |
+
change the them to something more futuristic and easier on the eye look.
|