truthpulse-scanner / index.html
adamqab's picture
You are a creative UX/UI designer. I want you to design the user interface and visual style for a fact-checking platform where people paste links or text, and the system verifies whether the claim is true, false, uncertain, or unsupported.
d92a6e7 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TruthPulse Scanner | AI-Powered Fact Checking</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/feather-icons"></script>
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/animejs@3.2.1/lib/anime.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
body {
font-family: 'Inter', sans-serif;
background-color: #f8fafc;
}
.verdict-true {
box-shadow: 0 0 0 4px rgba(74, 222, 128, 0.3);
animation: pulseGreen 1.5s infinite;
}
.verdict-false {
box-shadow: 0 0 0 4px rgba(248, 113, 113, 0.3);
animation: pulseRed 1.5s infinite;
}
.verdict-uncertain {
box-shadow: 0 0 0 4px rgba(253, 230, 138, 0.3);
animation: pulseYellow 1.5s infinite;
}
.verdict-unsupported {
box-shadow: 0 0 0 4px rgba(156, 163, 175, 0.3);
animation: pulseGray 1.5s infinite;
}
@keyframes pulseGreen {
0% { box-shadow: 0 0 0 0 rgba(74, 222, 128, 0.4); }
70% { box-shadow: 0 0 0 10px rgba(74, 222, 128, 0); }
100% { box-shadow: 0 0 0 0 rgba(74, 222, 128, 0); }
}
@keyframes pulseRed {
0% { box-shadow: 0 0 0 0 rgba(248, 113, 113, 0.4); }
70% { box-shadow: 0 0 0 10px rgba(248, 113, 113, 0); }
100% { box-shadow: 0 0 0 0 rgba(248, 113, 113, 0); }
}
@keyframes pulseYellow {
0% { box-shadow: 0 0 0 0 rgba(253, 230, 138, 0.4); }
70% { box-shadow: 0 0 0 10px rgba(253, 230, 138, 0); }
100% { box-shadow: 0 0 0 0 rgba(253, 230, 138, 0); }
}
@keyframes pulseGray {
0% { box-shadow: 0 0 0 0 rgba(156, 163, 175, 0.4); }
70% { box-shadow: 0 0 0 10px rgba(156, 163, 175, 0); }
100% { box-shadow: 0 0 0 0 rgba(156, 163, 175, 0); }
}
.scan-animation {
animation: scan 2s linear infinite;
}
@keyframes scan {
0% { transform: translateY(-100%); opacity: 0; }
10% { opacity: 1; }
90% { opacity: 1; }
100% { transform: translateY(100%); opacity: 0; }
}
</style>
</head>
<body class="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50">
<!-- Vanta.js Background -->
<div id="vanta-bg" class="fixed inset-0 z-0"></div>
<div class="relative z-10 min-h-screen flex flex-col">
<!-- Header -->
<header class="py-6 px-4 sm:px-6 lg:px-8 bg-white/80 backdrop-blur-md border-b border-gray-200">
<div class="container mx-auto flex justify-between items-center">
<div class="flex items-center space-x-2">
<i data-feather="search" class="text-indigo-600 w-6 h-6"></i>
<h1 class="text-2xl font-bold text-gray-800">TruthPulse <span class="text-indigo-600">Scanner</span></h1>
</div>
<nav>
<ul class="flex space-x-6">
<li><a href="#" class="text-gray-600 hover:text-indigo-600 transition">How It Works</a></li>
<li><a href="#" class="text-gray-600 hover:text-indigo-600 transition">About</a></li>
<li><a href="#" class="text-gray-600 hover:text-indigo-600 transition">FAQ</a></li>
</ul>
</nav>
</div>
</header>
<!-- Main Content -->
<main class="flex-grow container mx-auto px-4 sm:px-6 lg:px-8 py-12 flex flex-col items-center">
<div class="max-w-3xl w-full bg-white/90 backdrop-blur-sm rounded-xl shadow-xl p-8">
<h2 class="text-3xl font-bold text-center text-gray-800 mb-2">Verify Any Claim in Seconds</h2>
<p class="text-gray-600 text-center mb-8">Paste a link or text below to check its accuracy</p>
<div class="relative">
<div class="flex space-x-4 mb-4">
<button class="flex-1 py-3 px-4 bg-indigo-600 text-white rounded-lg font-medium hover:bg-indigo-700 transition flex items-center justify-center">
<i data-feather="link" class="mr-2"></i> Paste URL
</button>
<button class="flex-1 py-3 px-4 bg-indigo-100 text-indigo-700 rounded-lg font-medium hover:bg-indigo-200 transition flex items-center justify-center">
<i data-feather="edit" class="mr-2"></i> Enter Text
</button>
</div>
<textarea class="w-full h-40 p-4 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 resize-none" placeholder="Paste the text or URL you want to verify here..."></textarea>
<div class="mt-4 flex justify-between items-center">
<div class="flex items-center space-x-2 text-gray-500">
<i data-feather="shield"></i>
<span class="text-sm">Your data is never stored</span>
</div>
<button id="verify-btn" class="py-3 px-6 bg-indigo-600 text-white rounded-lg font-medium hover:bg-indigo-700 transition flex items-center">
<i data-feather="search" class="mr-2"></i> Verify Now
</button>
</div>
</div>
</div>
<!-- Result Placeholder (Hidden by default) -->
<div id="result-container" class="hidden max-w-3xl w-full mt-8">
<div id="loading-state" class="bg-white rounded-xl shadow-lg p-8 text-center">
<div class="relative h-32 w-32 mx-auto mb-6">
<div class="absolute inset-0 rounded-full border-4 border-indigo-200"></div>
<div class="absolute inset-4 rounded-full border-4 border-indigo-300 animate-spin"></div>
<div class="absolute inset-8 rounded-full border-4 border-indigo-400"></div>
<div class="absolute inset-0 flex items-center justify-center">
<div class="h-16 w-16 bg-indigo-100 rounded-full flex items-center justify-center">
<i data-feather="search" class="text-indigo-600 w-8 h-8 animate-pulse"></i>
</div>
</div>
<div class="absolute left-0 right-0 top-1/2 h-1 bg-indigo-100 overflow-hidden">
<div class="scan-animation h-full w-full bg-gradient-to-b from-indigo-400 to-transparent"></div>
</div>
</div>
<h3 class="text-xl font-semibold text-gray-800 mb-2">Analyzing Your Claim</h3>
<p class="text-gray-600">Our AI is scanning multiple sources to determine accuracy...</p>
</div>
<div id="verdict-card" class="hidden bg-white rounded-xl shadow-lg overflow-hidden">
<div class="p-6">
<div class="flex justify-between items-start mb-4">
<div>
<h3 class="text-xl font-bold">Claim Analysis</h3>
<p class="text-gray-600" id="verdict-date">Verified just now</p>
</div>
<div id="verdict-badge" class="px-4 py-2 rounded-full font-semibold flex items-center">
<!-- Dynamic content -->
</div>
</div>
<div class="bg-gray-50 p-4 rounded-lg mb-6">
<p id="claim-text" class="text-gray-800"></p>
</div>
<div id="verdict-content" class="mb-6">
<!-- Dynamic content -->
</div>
<div class="border-t border-gray-200 pt-6">
<h4 class="font-semibold mb-3">Sources & Evidence</h4>
<div id="sources-list" class="space-y-3">
<!-- Dynamic content -->
</div>
</div>
</div>
</div>
</div>
</main>
<!-- Footer -->
<footer class="py-8 px-4 sm:px-6 lg:px-8 bg-white/80 backdrop-blur-md border-t border-gray-200">
<div class="container mx-auto">
<div class="flex flex-col md:flex-row justify-between items-center">
<div class="flex items-center space-x-2 mb-4 md:mb-0">
<i data-feather="search" class="text-indigo-600 w-5 h-5"></i>
<span class="text-lg font-semibold text-gray-800">TruthPulse Scanner</span>
</div>
<div class="flex space-x-6">
<a href="#" class="text-gray-600 hover:text-indigo-600 transition">Privacy Policy</a>
<a href="#" class="text-gray-600 hover:text-indigo-600 transition">Terms of Service</a>
<a href="#" class="text-gray-600 hover:text-indigo-600 transition">Contact</a>
</div>
</div>
<p class="text-center text-gray-500 text-sm mt-6">Β© 2023 TruthPulse Scanner. All rights reserved.</p>
</div>
</footer>
</div>
<script>
// Initialize Vanta.js background
VANTA.GLOBE({
el: "#vanta-bg",
mouseControls: true,
touchControls: true,
gyroControls: false,
minHeight: 200.00,
minWidth: 200.00,
scale: 1.00,
scaleMobile: 1.00,
color: 0x4f46e5,
backgroundColor: 0xf8fafc,
size: 0.8
});
// Initialize feather icons
feather.replace();
// Mock verification process
document.getElementById('verify-btn').addEventListener('click', function() {
const textarea = document.querySelector('textarea');
if (textarea.value.trim() === '') {
alert('Please enter some text or a URL to verify');
return;
}
// Show loading state
document.getElementById('result-container').classList.remove('hidden');
document.getElementById('loading-state').classList.remove('hidden');
document.getElementById('verdict-card').classList.add('hidden');
// Set the claim text
document.getElementById('claim-text').textContent = textarea.value;
// Simulate API call with timeout
setTimeout(() => {
document.getElementById('loading-state').classList.add('hidden');
// Randomly select a verdict for demo purposes
const verdicts = ['true', 'false', 'uncertain', 'unsupported'];
const randomVerdict = verdicts[Math.floor(Math.random() * verdicts.length)];
showVerdict(randomVerdict);
document.getElementById('verdict-card').classList.remove('hidden');
}, 3000);
});
function showVerdict(verdict) {
const badge = document.getElementById('verdict-badge');
const content = document.getElementById('verdict-content');
const sources = document.getElementById('sources-list');
// Reset classes
badge.className = 'px-4 py-2 rounded-full font-semibold flex items-center';
content.innerHTML = '';
sources.innerHTML = '';
// Add verdict-specific content
switch(verdict) {
case 'true':
badge.classList.add('bg-green-100', 'text-green-800');
badge.innerHTML = '<i data-feather="check-circle" class="mr-2 text-green-600"></i> Verified True';
content.innerHTML = `
<div class="flex items-start">
<div class="flex-shrink-0 mr-4">
<div class="h-12 w-12 bg-green-100 rounded-full flex items-center justify-center">
<i data-feather="check" class="text-green-600 w-6 h-6"></i>
</div>
</div>
<div>
<h4 class="font-semibold text-green-800 mb-1">This claim is accurate</h4>
<p class="text-gray-700">Our analysis of multiple reliable sources confirms this information to be true. The evidence strongly supports this claim.</p>
</div>
</div>
`;
sources.innerHTML = `
<div class="flex items-start">
<div class="flex-shrink-0 mr-3">
<div class="h-8 w-8 bg-green-100 rounded-full flex items-center justify-center">
<i data-feather="link" class="text-green-600 w-4 h-4"></i>
</div>
</div>
<div>
<a href="#" class="text-indigo-600 hover:underline">Scientific Study on Topic (2022)</a>
<p class="text-sm text-gray-500">Published in Journal of Science</p>
</div>
</div>
<div class="flex items-start">
<div class="flex-shrink-0 mr-3">
<div class="h-8 w-8 bg-green-100 rounded-full flex items-center justify-center">
<i data-feather="link" class="text-green-600 w-4 h-4"></i>
</div>
</div>
<div>
<a href="#" class="text-indigo-600 hover:underline">Government Report</a>
<p class="text-sm text-gray-500">Official statistics from National Bureau</p>
</div>
</div>
`;
badge.parentElement.parentElement.classList.add('verdict-true');
break;
case 'false':
badge.classList.add('bg-red-100', 'text-red-800');
badge.innerHTML = '<i data-feather="x-circle" class="mr-2 text-red-600"></i> Verified False';
content.innerHTML = `
<div class="flex items-start">
<div class="flex-shrink-0 mr-4">
<div class="h-12 w-12 bg-red-100 rounded-full flex items-center justify-center">
<i data-feather="x" class="text-red-600 w-6 h-6"></i>
</div>
</div>
<div>
<h4 class="font-semibold text-red-800 mb-1">This claim is incorrect</h4>
<p class="text-gray-700">Our research found multiple credible sources that contradict this information. The evidence does not support this claim.</p>
</div>
</div>
`;
sources.innerHTML = `
<div class="flex items-start">
<div class="flex-shrink-0 mr-3">
<div class="h-8 w-8 bg-red-100 rounded-full flex items-center justify-center">
<i data-feather="link" class="text-red-600 w-4 h-4"></i>
</div>
</div>
<div>
<a href="#" class="text-indigo-600 hover:underline">Fact-check from Reuters</a>
<p class="text-sm text-gray-500">Published on verified fact-checking site</p>
</div>
</div>
<div class="flex items-start">
<div class="flex-shrink-0 mr-3">
<div class="h-8 w-8 bg-red-100 rounded-full flex items-center justify-center">
<i data-feather="link" class="text-red-600 w-4 h-4"></i>
</div>
</div>
<div>
<a href="#" class="text-indigo-600 hover:underline">Expert Analysis</a>
<p class="text-sm text-gray-500">Statement from subject matter experts</p>
</div>
</div>
`;
badge.parentElement.parentElement.classList.add('verdict-false');
break;
case 'uncertain':
badge.classList.add('bg-yellow-100', 'text-yellow-800');
badge.innerHTML = '<i data-feather="alert-circle" class="mr-2 text-yellow-600"></i> Uncertain';
content.innerHTML = `
<div class="flex items-start">
<div class="flex-shrink-0 mr-4">
<div class="h-12 w-12 bg-yellow-100 rounded-full flex items-center justify-center">
<i data-feather="help-circle" class="text-yellow-600 w-6 h-6"></i>
</div>
</div>
<div>
<h4 class="font-semibold text-yellow-800 mb-1">Evidence is inconclusive</h4>
<p class="text-gray-700">We couldn't find enough reliable evidence to confirm or deny this claim. The available information is conflicting or incomplete.</p>
</div>
</div>
<div class="mt-4 bg-yellow-50 p-4 rounded-lg">
<div class="flex items-center mb-2">
<span class="font-medium text-yellow-800 mr-2">Confidence Level:</span>
<div class="flex-1 bg-gray-200 rounded-full h-2.5">
<div class="bg-yellow-500 h-2.5 rounded-full" style="width: 45%"></div>
</div>
<span class="text-sm text-yellow-800 ml-2">45%</span>
</div>
<p class="text-sm text-gray-700">Based on analysis of available sources</p>
</div>
`;
sources.innerHTML = `
<div class="flex items-start">
<div class="flex-shrink-0 mr-3">
<div class="h-8 w-8 bg-yellow-100 rounded-full flex items-center justify-center">
<i data-feather="link" class="text-yellow-600 w-4 h-4"></i>
</div>
</div>
<div>
<a href="#" class="text-indigo-600 hover:underline">Conflicting Study A</a>
<p class="text-sm text-gray-500">Supports the claim with limitations</p>
</div>
</div>
<div class="flex items-start">
<div class="flex-shrink-0 mr-3">
<div class="h-8 w-8 bg-yellow-100 rounded-full flex items-center justify-center">
<i data-feather="link" class="text-yellow-600 w-4 h-4"></i>
</div>
</div>
<div>
<a href="#" class="text-indigo-600 hover:underline">Conflicting Study B</a>
<p class="text-sm text-gray-500">Contradicts the claim with caveats</p>
</div>
</div>
`;
badge.parentElement.parentElement.classList.add('verdict-uncertain');
break;
case 'unsupported':
badge.classList.add('bg-gray-100', 'text-gray-800');
badge.innerHTML = '<i data-feather="search" class="mr-2 text-gray-600"></i> No Evidence Found';
content.innerHTML = `
<div class="flex items-start">
<div class="flex-shrink-0 mr-4">
<div class="h-12 w-12 bg-gray-100 rounded-full flex items-center justify-center">
<i data-feather="search" class="text-gray-600 w-6 h-6"></i>
</div>
</div>
<div>
<h4 class="font-semibold text-gray-800 mb-1">No supporting evidence found</h4>
<p class="text-gray-700">We couldn't find any credible sources that verify or refute this claim. More research is needed to determine its accuracy.</p>
</div>
</div>
`;
sources.innerHTML = `
<div class="text-gray-500 italic">
No verifiable sources were found related to this claim
</div>
`;
badge.parentElement.parentElement.classList.add('verdict-unsupported');
break;
}
// Update icons
feather.replace();
// Add animation to verdict card
const card = document.getElementById('verdict-card');
card.style.opacity = '0';
card.style.transform = 'translateY(20px)';
setTimeout(() => {
card.style.transition = 'all 0.3s ease-out';
card.style.opacity = '1';
card.style.transform = 'translateY(0)';
}, 100);
}
</script>
</body>
</html>