bibliovista-explorer / index.html
gillis2020's picture
Create me a cool visualisation page for this data:
a2fdebe verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bibliovista Explorer</title>
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/feather-icons"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lib/anime.min.js"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: {
500: '#5F6F94',
700: '#374259',
},
secondary: {
300: '#B9C0DA',
200: '#E8E8E8',
}
}
}
}
}
</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;
transition: all 0.3s ease;
}
.tooltip {
position: relative;
display: inline-block;
}
.tooltip .tooltiptext {
visibility: hidden;
width: 200px;
background-color: #374259;
color: #fff;
text-align: center;
border-radius: 6px;
padding: 8px;
position: absolute;
z-index: 1;
bottom: 125%;
left: 50%;
transform: translateX(-50%);
opacity: 0;
transition: opacity 0.3s;
}
.tooltip:hover .tooltiptext {
visibility: visible;
opacity: 1;
}
.dark .bg-primary-500 {
background-color: #374259;
}
.dark .text-primary-700 {
color: #B9C0DA;
}
.dark .bg-secondary-300 {
background-color: #5F6F94;
}
#vanta-bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
opacity: 0.2;
}
</style>
</head>
<body class="bg-gray-50 dark:bg-gray-900 transition-colors duration-300">
<div id="vanta-bg"></div>
<!-- Navigation -->
<nav class="bg-primary-500 text-white shadow-lg">
<div class="container mx-auto px-4 py-3 flex justify-between items-center">
<div class="flex items-center space-x-2">
<i data-feather="book-open" class="w-6 h-6"></i>
<span class="text-xl font-bold">Bibliovista</span>
</div>
<div class="flex items-center space-x-4">
<button id="theme-toggle" class="p-2 rounded-full hover:bg-secondary-300">
<i data-feather="moon" class="w-5 h-5 hidden dark:block"></i>
<i data-feather="sun" class="w-5 h-5 block dark:hidden"></i>
</button>
<button class="bg-secondary-300 hover:bg-secondary-400 text-primary-700 px-4 py-2 rounded-lg font-medium transition">
<i data-feather="download" class="w-4 h-4 inline mr-1"></i>
Export
</button>
</div>
</div>
</nav>
<!-- Main Content -->
<div class="container mx-auto px-4 py-8">
<!-- Header -->
<div class="text-center mb-12">
<h1 class="text-4xl font-bold text-primary-700 dark:text-white mb-4">Book Collection Explorer</h1>
<p class="text-lg text-gray-600 dark:text-gray-300 max-w-2xl mx-auto">
Visualize, filter, and explore an extensive collection of books from around the world.
</p>
</div>
<!-- Filters -->
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-md p-6 mb-8">
<h2 class="text-xl font-semibold text-primary-700 dark:text-white mb-4 flex items-center">
<i data-feather="filter" class="w-5 h-5 mr-2"></i>
Filters
</h2>
<div class="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">Author</label>
<select class="w-full rounded-lg border-secondary-200 focus:ring-primary-500 focus:border-primary-500">
<option>All Authors</option>
<option>Jane Austen</option>
<option>George Orwell</option>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">Year</label>
<select class="w-full rounded-lg border-secondary-200 focus:ring-primary-500 focus:border-primary-500">
<option>All Years</option>
<option>1800-1850</option>
<option>1851-1900</option>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">Language</label>
<select class="w-full rounded-lg border-secondary-200 focus:ring-primary-500 focus:border-primary-500">
<option>All Languages</option>
<option>English</option>
<option>French</option>
<option>Dutch</option>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">Page Count</label>
<input type="range" min="0" max="1000" class="w-full">
</div>
</div>
</div>
<!-- Visualization Dashboard -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-8">
<!-- Pie Chart -->
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-md p-6">
<h2 class="text-xl font-semibold text-primary-700 dark:text-white mb-4 flex items-center">
<i data-feather="pie-chart" class="w-5 h-5 mr-2"></i>
Genre Distribution
</h2>
<div class="h-64">
<canvas id="genreChart"></canvas>
</div>
</div>
<!-- Bar Chart -->
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-md p-6">
<h2 class="text-xl font-semibold text-primary-700 dark:text-white mb-4 flex items-center">
<i data-feather="bar-chart-2" class="w-5 h-5 mr-2"></i>
Country Distribution
</h2>
<div class="h-64">
<canvas id="countryChart"></canvas>
</div>
</div>
<!-- Timeline -->
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-md p-6">
<h2 class="text-xl font-semibold text-primary-700 dark:text-white mb-4 flex items-center">
<i data-feather="calendar" class="w-5 h-5 mr-2"></i>
Publication Timeline
</h2>
<div class="h-64">
<canvas id="timelineChart"></canvas>
</div>
</div>
</div>
<!-- Data Table -->
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-md overflow-hidden">
<div class="px-6 py-4 border-b border-secondary-200 flex justify-between items-center">
<h2 class="text-xl font-semibold text-primary-700 dark:text-white flex items-center">
<i data-feather="list" class="w-5 h-5 mr-2"></i>
Book Collection
</h2>
<div class="flex items-center space-x-2">
<span class="text-sm text-gray-500 dark:text-gray-400">Showing 1-10 of 250</span>
<button class="p-2 rounded-lg hover:bg-secondary-300">
<i data-feather="chevron-left" class="w-4 h-4"></i>
</button>
<button class="p-2 rounded-lg hover:bg-secondary-300">
<i data-feather="chevron-right" class="w-4 h-4"></i>
</button>
</div>
</div>
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-secondary-200">
<thead class="bg-secondary-300">
<tr>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-primary-700 uppercase tracking-wider">Title</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-primary-700 uppercase tracking-wider">Author</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-primary-700 uppercase tracking-wider">Year</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-primary-700 uppercase tracking-wider">Country</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-primary-700 uppercase tracking-wider">Pages</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-primary-700 uppercase tracking-wider">Language</th>
</tr>
</thead>
<tbody class="bg-white dark:bg-gray-800 divide-y divide-secondary-200">
<tr class="hover:bg-secondary-300 transition">
<td class="px-6 py-4 whitespace-nowrap">
<div class="flex items-center">
<div class="flex-shrink-0 h-10 w-10 bg-primary-500 rounded-lg flex items-center justify-center text-white">
<i data-feather="book" class="w-5 h-5"></i>
</div>
<div class="ml-4">
<div class="text-sm font-medium text-primary-700 dark:text-white">Pride and Prejudice</div>
<div class="text-sm text-gray-500 dark:text-gray-400">Romance</div>
</div>
</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm text-primary-700 dark:text-white">Jane Austen</div>
<div class="text-sm text-gray-500 dark:text-gray-400">Female</div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-primary-700 dark:text-white">1813</td>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">
UK
</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-primary-700 dark:text-white">279</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="flex items-center">
<span class="mr-2">πŸ‡¬πŸ‡§</span>
<span class="text-sm text-primary-700 dark:text-white">English</span>
</div>
</td>
</tr>
<!-- More rows would go here -->
</tbody>
</table>
</div>
</div>
</div>
<script>
// Initialize Vanta.js globe
VANTA.GLOBE({
el: "#vanta-bg",
mouseControls: true,
touchControls: true,
gyroControls: false,
minHeight: 200.00,
minWidth: 200.00,
scale: 1.00,
scaleMobile: 1.00,
color: '#5F6F94',
backgroundColor: '#f8fafc',
size: 0.80
});
// Theme toggle
const themeToggle = document.getElementById('theme-toggle');
themeToggle.addEventListener('click', () => {
document.documentElement.classList.toggle('dark');
localStorage.setItem('darkMode', document.documentElement.classList.contains('dark'));
});
// Check for saved theme preference
if (localStorage.getItem('darkMode') === 'true') {
document.documentElement.classList.add('dark');
}
// Initialize charts
document.addEventListener('DOMContentLoaded', function() {
// Genre Pie Chart
const genreCtx = document.getElementById('genreChart').getContext('2d');
const genreChart = new Chart(genreCtx, {
type: 'pie',
data: {
labels: ['Fiction', 'Non-Fiction', 'Biography', 'Science', 'History'],
datasets: [{
data: [30, 20, 15, 20, 15],
backgroundColor: [
'#5F6F94',
'#B9C0DA',
'#374259',
'#E8E8E8',
'#A7B3C9'
],
borderWidth: 0
}]
},
options: {
responsive: true,
maintainAspectRatio: false
}
});
// Country Bar Chart
const countryCtx = document.getElementById('countryChart').getContext('2d');
const countryChart = new Chart(countryCtx, {
type: 'bar',
data: {
labels: ['UK', 'USA', 'France', 'Germany', 'Netherlands'],
datasets: [{
label: 'Books by Country',
data: [45, 30, 20, 15, 10],
backgroundColor: '#5F6F94',
borderWidth: 0
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
beginAtZero: true
}
}
}
});
// Timeline Chart
const timelineCtx = document.getElementById('timelineChart').getContext('2d');
const timelineChart = new Chart(timelineCtx, {
type: 'line',
data: {
labels: ['1800', '1850', '1900', '1950', '2000'],
datasets: [{
label: 'Publications per Year',
data: [5, 15, 30, 40, 60],
borderColor: '#5F6F94',
backgroundColor: 'rgba(95, 111, 148, 0.1)',
fill: true,
tension: 0.4
}]
},
options: {
responsive: true,
maintainAspectRatio: false
}
});
// Initialize feather icons
feather.replace();
});
</script>
</body>
</html>