| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>TimeCapsule Search | Internet Archive</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| <style> |
| @import url('https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&display=swap'); |
| |
| body { |
| font-family: 'Space Mono', monospace; |
| background-color: #f0f4f8; |
| background-image: radial-gradient(#cbd5e1 1px, transparent 1px); |
| background-size: 20px 20px; |
| } |
| |
| .vintage-card { |
| border: 1px solid rgba(0,0,0,0.1); |
| box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), |
| 0 2px 4px -1px rgba(0, 0, 0, 0.06), |
| inset 0 0 10px rgba(0,0,0,0.05); |
| transition: all 0.3s ease; |
| } |
| |
| .vintage-card:hover { |
| transform: translateY(-2px); |
| box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), |
| 0 4px 6px -2px rgba(0, 0, 0, 0.05), |
| inset 0 0 10px rgba(0,0,0,0.05); |
| } |
| |
| .search-box { |
| box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), |
| 0 1px 2px 0 rgba(0, 0, 0, 0.06), |
| inset 0 0 10px rgba(0,0,0,0.05); |
| } |
| |
| .typewriter { |
| border-right: 3px solid; |
| animation: typing 3.5s steps(40, end), blink-caret .75s step-end infinite; |
| overflow: hidden; |
| white-space: nowrap; |
| } |
| |
| @keyframes typing { |
| from { width: 0 } |
| to { width: 100% } |
| } |
| |
| @keyframes blink-caret { |
| from, to { border-color: transparent } |
| 50% { border-color: #3b82f6; } |
| } |
| |
| .fade-in { |
| animation: fadeIn 1s; |
| } |
| |
| @keyframes fadeIn { |
| 0% { opacity: 0; } |
| 100% { opacity: 1; } |
| } |
| </style> |
| </head> |
| <body class="min-h-screen py-12 px-4 sm:px-6 lg:px-8"> |
| <div class="max-w-7xl mx-auto"> |
| |
| <header class="text-center mb-12"> |
| <div class="flex justify-center items-center mb-4"> |
| <i class="fas fa-book text-yellow-600 text-4xl mr-3"></i> |
| <h1 class="text-4xl font-bold text-gray-800">TimeCapsule Search</h1> |
| </div> |
| <p class="text-gray-600 max-w-2xl mx-auto"> |
| Dive into the digital archives of the past. Search through millions of web pages, books, videos, audio files, and software preserved for future generations. |
| </p> |
| </header> |
| |
| |
| <div class="max-w-2xl mx-auto mb-16 relative"> |
| <div class="relative flex items-center"> |
| <input |
| type="text" |
| id="search-input" |
| placeholder="Search the archive..." |
| class="search-box w-full pl-12 pr-4 py-3 rounded-lg border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" |
| > |
| <i class="fas fa-search absolute left-4 text-gray-400"></i> |
| <button |
| id="search-button" |
| class="absolute right-2 bg-blue-600 text-white px-4 py-1.5 rounded-md hover:bg-blue-700 transition-colors" |
| > |
| Explore |
| </button> |
| </div> |
| |
| |
| <div class="flex flex-wrap justify-center mt-4 gap-2"> |
| <button class="filter-btn bg-gray-100 hover:bg-gray-200 px-3 py-1 rounded-full text-sm text-gray-700 transition-colors" data-type="web"> |
| <i class="fas fa-globe mr-1"></i> Web |
| </button> |
| <button class="filter-btn bg-gray-100 hover:bg-gray-200 px-3 py-1 rounded-full text-sm text-gray-700 transition-colors" data-type="texts"> |
| <i class="fas fa-book mr-1"></i> Texts |
| </button> |
| <button class="filter-btn bg-gray-100 hover:bg-gray-200 px-3 py-1 rounded-full text-sm text-gray-700 transition-colors" data-type="video"> |
| <i class="fas fa-film mr-1"></i> Video |
| </button> |
| <button class="filter-btn bg-gray-100 hover:bg-gray-200 px-3 py-1 rounded-full text-sm text-gray-700 transition-colors" data-type="audio"> |
| <i class="fas fa-music mr-1"></i> Audio |
| </button> |
| <button class="filter-btn bg-gray-100 hover:bg-gray-200 px-3 py-1 rounded-full text-sm text-gray-700 transition-colors" data-type="software"> |
| <i class="fas fa-file-code mr-1"></i> Software |
| </button> |
| </div> |
| </div> |
| |
| |
| <div class="max-w-2xl mx-auto mb-12 px-4"> |
| <div class="flex items-center justify-between mb-2"> |
| <span class="text-sm text-gray-600">Time Travel:</span> |
| <span id="year-display" class="font-bold text-blue-600">2000</span> |
| </div> |
| <input |
| type="range" |
| id="year-slider" |
| min="1996" |
| max="2023" |
| value="2000" |
| class="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer" |
| > |
| </div> |
| |
| |
| <div class="mb-12"> |
| <h2 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">Featured Collections</h2> |
| <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6"> |
| <div class="vintage-card bg-white p-6 rounded-lg flex flex-col hover:bg-yellow-50"> |
| <i class="fas fa-laptop-code text-3xl text-yellow-600 mb-3"></i> |
| <h3 class="text-xl font-semibold mb-2">Software Library</h3> |
| <p class="text-gray-600 mb-4 flex-grow">Explore thousands of historical software programs from the early days of computing.</p> |
| <button class="collection-btn mt-auto self-start text-blue-600 hover:text-blue-800 text-sm font-medium" data-collection="software">Browse →</button> |
| </div> |
| |
| <div class="vintage-card bg-white p-6 rounded-lg flex flex-col hover:bg-blue-50"> |
| <i class="fas fa-newspaper text-3xl text-blue-600 mb-3"></i> |
| <h3 class="text-xl font-semibold mb-2">News & Magazines</h3> |
| <p class="text-gray-600 mb-4 flex-grow">Historical periodicals, newspapers, and magazines from around the world.</p> |
| <button class="collection-btn mt-auto self-start text-blue-600 hover:text-blue-800 text-sm font-medium" data-collection="news">Browse →</button> |
| </div> |
| |
| <div class="vintage-card bg-white p-6 rounded-lg flex flex-col hover:bg-green-50"> |
| <i class="fas fa-music text-3xl text-green-600 mb-3"></i> |
| <h3 class="text-xl font-semibold mb-2">Live Music Archive</h3> |
| <p class="text-gray-600 mb-4 flex-grow">Thousands of concert recordings from independent artists and iconic performances.</p> |
| <button class="collection-btn mt-auto self-start text-blue-600 hover:text-blue-800 text-sm font-medium" data-collection="music">Browse →</button> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div id="results-container" class="hidden"> |
| <div class="flex justify-between items-center mb-6"> |
| <h2 id="results-title" class="text-2xl font-semibold text-gray-800">Search Results</h2> |
| <div class="flex items-center"> |
| <span class="text-sm text-gray-600 mr-2">Sort by:</span> |
| <select id="sort-by" class="border rounded px-2 py-1 text-sm bg-white"> |
| <option value="relevance">Relevance</option> |
| <option value="newest">Newest First</option> |
| <option value="oldest">Oldest First</option> |
| </select> |
| </div> |
| </div> |
| |
| <div id="results-list" class="space-y-6"> |
| |
| </div> |
| |
| <div class="flex justify-center mt-8"> |
| <button id="load-more" class="bg-gray-100 hover:bg-gray-200 px-4 py-2 rounded text-gray-700"> |
| Load More Results |
| </button> |
| </div> |
| </div> |
| |
| |
| <div id="recent-searches" class="bg-white bg-opacity-70 backdrop-filter backdrop-blur-sm p-6 rounded-lg shadow-sm mt-12"> |
| <h2 class="text-xl font-semibold mb-4 text-gray-800">Recent Searches</h2> |
| <div class="flex flex-wrap gap-2"> |
| |
| <span class="text-gray-600">No recent searches yet</span> |
| </div> |
| </div> |
| </div> |
| |
| <script> |
| document.addEventListener('DOMContentLoaded', function() { |
| const searchInput = document.getElementById('search-input'); |
| const searchButton = document.getElementById('search-button'); |
| const yearSlider = document.getElementById('year-slider'); |
| const yearDisplay = document.getElementById('year-display'); |
| const filterButtons = document.querySelectorAll('.filter-btn'); |
| const collectionButtons = document.querySelectorAll('.collection-btn'); |
| const resultsContainer = document.getElementById('results-container'); |
| const resultsList = document.getElementById('results-list'); |
| const resultsTitle = document.getElementById('results-title'); |
| const sortBy = document.getElementById('sort-by'); |
| const loadMore = document.getElementById('load-more'); |
| |
| |
| const placeholderTexts = [ |
| "Search for '90s websites...", |
| "Look up classic software...", |
| "Find historical newspapers...", |
| "Explore concert recordings...", |
| "Discover vintage computer manuals..." |
| ]; |
| |
| let currentPlaceholder = 0; |
| |
| function cyclePlaceholder() { |
| searchInput.placeholder = ''; |
| const text = placeholderTexts[currentPlaceholder]; |
| let i = 0; |
| |
| const typeWriter = setInterval(() => { |
| if (i < text.length) { |
| searchInput.placeholder += text.charAt(i); |
| i++; |
| } else { |
| clearInterval(typeWriter); |
| setTimeout(() => { |
| currentPlaceholder = (currentPlaceholder + 1) % placeholderTexts.length; |
| cyclePlaceholder(); |
| }, 3000); |
| } |
| }, 100); |
| } |
| |
| |
| setTimeout(cyclePlaceholder, 1000); |
| |
| |
| yearSlider.addEventListener('input', function() { |
| yearDisplay.textContent = this.value; |
| }); |
| |
| |
| filterButtons.forEach(button => { |
| button.addEventListener('click', function() { |
| const type = this.getAttribute('data-type'); |
| searchInput.placeholder = `Search ${type} collections...`; |
| searchInput.focus(); |
| |
| |
| filterButtons.forEach(btn => btn.classList.remove('bg-blue-100', 'text-blue-700')); |
| this.classList.add('bg-blue-100', 'text-blue-700'); |
| }); |
| }); |
| |
| |
| collectionButtons.forEach(button => { |
| button.addEventListener('click', function() { |
| const collection = this.getAttribute('data-collection'); |
| performSearch('', collection); |
| }); |
| }); |
| |
| |
| function performSearch(query, collection = '') { |
| if (!query && !collection) return; |
| |
| |
| resultsList.innerHTML = '<div class="text-center py-12"><i class="fas fa-spinner fa-spin text-4xl text-blue-500 mb-4"></i><p>Searching the archives...</p></div>'; |
| resultsContainer.classList.remove('hidden'); |
| |
| |
| let title = 'Search Results'; |
| if (collection === 'software') title = 'Software Library'; |
| else if (collection === 'news') title = 'News & Magazines'; |
| else if (collection === 'music') title = 'Live Music Archive'; |
| resultsTitle.textContent = title; |
| |
| |
| if (query) { |
| storeRecentSearch(query); |
| } |
| |
| |
| setTimeout(() => { |
| |
| const mockResults = generateMockResults(query, collection); |
| displayResults(mockResults); |
| }, 1500); |
| } |
| |
| |
| function generateMockResults(query, collection) { |
| const collections = { |
| 'software': ['Windows 95', 'Mac OS 7', 'MS-DOS 6.22', 'Linux 0.01', 'Netscape Navigator'], |
| 'news': ['Time Magazine 1999', 'Newsweek 2001', 'Wired 1995', 'National Geographic 1985', 'PC Magazine 1990'], |
| 'music': ['Grateful Dead 1977', 'Nirvana 1993', 'Radiohead 2001', 'Pink Floyd 1980', 'The Beatles 1966'], |
| '': ['Wayback Machine', 'Classic Websites', 'Vintage Computers', 'Historical Documents', 'Old Books Collection'] |
| }; |
| |
| const results = collections[collection] || [ |
| `Results for "${query}" from ${yearDisplay.textContent}`, |
| 'Internet history archive', |
| 'Digital preservation project', |
| 'Historical web pages collection', |
| 'Public domain media library' |
| ]; |
| |
| return results.map((title, index) => ({ |
| id: Date.now() + index, |
| title: collection ? title : `${title} (${2000 + index})`, |
| description: `This is a sample description of ${title.toLowerCase()}. The Internet Archive is a non-profit library of millions of free books, movies, software, music, websites, and more.`, |
| type: collection || ['web', 'text', 'video', 'audio', 'software'][index % 5], |
| url: `https://archive.org/details/${title.toLowerCase().replace(/\s+/g, '-')}`, |
| date: new Date(2000 + index, index % 12, (index % 28) + 1).toLocaleDateString() |
| })); |
| } |
| |
| |
| function displayResults(results) { |
| resultsList.innerHTML = ''; |
| |
| if (results.length === 0) { |
| resultsList.innerHTML = '<div class="text-center py-12 text-gray-500">No results found. Try a different search.</div>'; |
| return; |
| } |
| |
| results.forEach(result => { |
| const typeIcons = { |
| 'web': 'fas fa-globe', |
| 'text': 'fas fa-book', |
| 'video': 'fas fa-film', |
| 'audio': 'fas fa-headphones', |
| 'software': 'fas fa-file-code' |
| }; |
| |
| const resultItem = document.createElement('div'); |
| resultItem.className = 'vintage-card bg-white p-6 rounded-lg hover:shadow-md transition-shadow fade-in'; |
| resultItem.innerHTML = ` |
| <div class="flex items-start"> |
| <div class="flex-shrink-0"> |
| <i class="${typeIcons[result.type] || 'fas fa-archive'} text-xl text-yellow-600 mr-4 mt-1"></i> |
| </div> |
| <div> |
| <h3 class="text-lg font-semibold text-blue-700 mb-1"> |
| <a href="${result.url}" target="_blank" class="hover:underline">${result.title}</a> |
| </h3> |
| <p class="text-gray-600 text-sm mb-2">${result.description}</p> |
| <div class="flex items-center text-xs text-gray-500"> |
| <span class="inline-block px-2 py-1 bg-gray-100 rounded-full mr-2">${result.type}</span> |
| <span>${result.date}</span> |
| </div> |
| </div> |
| </div> |
| `; |
| resultsList.appendChild(resultItem); |
| }); |
| } |
| |
| |
| function storeRecentSearch(query) { |
| let recentSearches = JSON.parse(localStorage.getItem('recentSearches')) || []; |
| recentSearches = recentSearches.filter(item => item !== query); |
| recentSearches.unshift(query); |
| recentSearches = recentSearches.slice(0, 5); |
| localStorage.setItem('recentSearches', JSON.stringify(recentSearches)); |
| |
| updateRecentSearchesDisplay(); |
| } |
| |
| |
| function updateRecentSearchesDisplay() { |
| const recentSearches = JSON.parse(localStorage.getItem('recentSearches')) || []; |
| const recentSearchesContainer = document.querySelector('#recent-searches > div'); |
| |
| if (recentSearches.length === 0) { |
| recentSearchesContainer.innerHTML = '<span class="text-gray-600">No recent searches yet</span>'; |
| return; |
| } |
| |
| recentSearchesContainer.innerHTML = ''; |
| recentSearches.forEach(search => { |
| const searchPill = document.createElement('span'); |
| searchPill.className = 'inline-block px-3 py-1 bg-gray-100 hover:bg-gray-200 rounded-full text-gray-700 cursor-pointer transition-colors'; |
| searchPill.textContent = search; |
| searchPill.addEventListener('click', () => { |
| searchInput.value = search; |
| searchInput.focus(); |
| }); |
| recentSearchesContainer.appendChild(searchPill); |
| }); |
| } |
| |
| |
| loadMore.addEventListener('click', function() { |
| const currentQuery = searchInput.value; |
| const mockResults = generateMockResults(currentQuery, ''); |
| displayResults(mockResults); |
| }); |
| |
| |
| searchButton.addEventListener('click', () => { |
| const query = searchInput.value.trim(); |
| if (query) { |
| performSearch(query); |
| } |
| }); |
| |
| searchInput.addEventListener('keypress', (e) => { |
| if (e.key === 'Enter') { |
| const query = searchInput.value.trim(); |
| if (query) { |
| performSearch(query); |
| } |
| } |
| }); |
| |
| |
| sortBy.addEventListener('change', function() { |
| |
| console.log('Sorting by:', this.value); |
| }); |
| |
| |
| updateRecentSearchesDisplay(); |
| |
| |
| searchInput.focus(); |
| }); |
| </script> |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=silos559/webs" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
| </html> |