diff --git "a/index.html" "b/index.html" --- "a/index.html" +++ "b/index.html" @@ -45,20 +45,6 @@ margin: 0 0 20px; font-size: clamp(0.8rem, 2vw, 1rem); line-height: 1.4; - min-height: 1.4em; - position: relative; - } - - .subtitle-text { - position: absolute; - left: 0; - right: 0; - opacity: 0; - transition: opacity 0.3s ease-in-out; - } - - .subtitle-text.active { - opacity: 1; } .search-container { @@ -87,7 +73,6 @@ gap: 10px; justify-content: center; flex-wrap: wrap; - align-items: center; } .pill-button { @@ -129,116 +114,6 @@ border-color: var(--border); } - /* Filter dropdown */ - .filter-container { - position: relative; - display: inline-block; - } - - .filter-dropdown { - position: absolute; - top: calc(100% + 8px); - right: 0; - background: var(--card); - border: 1px solid var(--border); - border-radius: 12px; - padding: 16px; - min-width: 280px; - max-width: 90vw; - max-height: 400px; - overflow-y: auto; - z-index: 1000; - box-shadow: 0 8px 24px rgba(0,0,0,0.6); - display: none; - } - - .filter-dropdown.active { - display: block; - animation: slideDown 0.2s ease-out; - } - - @keyframes slideDown { - from { - opacity: 0; - transform: translateY(-10px); - } - to { - opacity: 1; - transform: translateY(0); - } - } - - .filter-header { - font-weight: 600; - margin-bottom: 12px; - padding-bottom: 8px; - border-bottom: 1px solid var(--border); - font-size: 0.95rem; - display: flex; - justify-content: space-between; - align-items: center; - } - - .filter-actions { - display: flex; - gap: 8px; - font-size: 0.8rem; - font-weight: normal; - } - - .filter-action { - color: #58a6ff; - cursor: pointer; - text-decoration: underline; - } - - .filter-action:hover { - color: #79c0ff; - } - - .filter-options { - display: flex; - flex-direction: column; - gap: 10px; - } - - .filter-option { - display: flex; - align-items: center; - gap: 10px; - padding: 8px; - border-radius: 6px; - transition: background 0.2s; - cursor: pointer; - } - - .filter-option:hover { - background: var(--hover); - } - - .filter-option input[type="checkbox"] { - width: 18px; - height: 18px; - cursor: pointer; - accent-color: #58a6ff; - } - - .filter-option label { - cursor: pointer; - flex: 1; - font-size: 0.9rem; - user-select: none; - } - - .filter-count { - color: #888; - font-size: 0.85rem; - } - - .directory-excluded { - display: none !important; - } - .stats { text-align: center; font-size: clamp(0.9rem, 2vw, 1.1rem); @@ -505,12 +380,6 @@ min-height: 36px; } - .filter-dropdown { - right: auto; - left: 0; - min-width: 260px; - } - table { min-width: 100%; } @@ -585,5154 +454,47 @@ order: -1; } - .search-hidden { - display: none !important; - } - - #content { - display: flex; - flex-direction: column; - } - - /* Print styles */ - @media print { - body { background: white; color: black; } - .directory, .year { page-break-inside: avoid; } - .collapsed .content { display: block !important; } - input, .arrow { display: none; } - } - - - - -
-
-

Snowden Archive

-

- - Snowden Index • Library Index Interface - Offline PDF Index • Fully Local • No Internet - Searchable Document Archive • Privacy Focused - Classified Documents • Whistleblower Files - - Now Featuring Every Keyword That Auto-Flags Your NSA File - CIA-Proof* • *Terms and Black Sites Apply - Your Router Is Snitching, But This Index Isn’t - PRISM-Resistant Since Breakfast - Because “Upstream Collection” Sounds Like a Bad Prog Rock Band - Stellarwind Called – It Wants Its Metadata Back - Runs Entirely on DUCTAPE (Definitely Un-Cracked by Three-Letter Agencies Probably Ever) - MYSTICally Buffering All Your Phone Calls Since 2009 - XKEYSCORE Walked So This Index Could Run - Vault 7 Leaks Included Free of Charge - Heartbleed Was Just Foreplay - Yes, the Microwave Really Is Watching. No, This Isn’t In It. - ThinThread Approved • TRAILBLAZER Laughs in Obsolete - Boundless Informant Reported 0 Views (Nice Try, Keith) - COINTELPRO Reboot Loading… 47% Complete - Brought to You by the Same Agency That Can’t Secure Its Own Hacking Tools - Echelon’s Retirement Party Starts Here - Now With 100% More Plausible Deniability - If You’re Reading This, Your Smart Fridge Already Reported You - Three Hops From Kevin Bacon? Cute. We’re Zero Hops From Reality. - - Because Trusting Cloud Storage Worked Out So Well Last Time - Your Personal Offline Stash of Things Governments Wish You’d Forget - 100% Air-Gapped • 0% Faith in Humanity - Now With All the Documents They Swore Didn’t Exist - Localhost: The Last Server You Can Still Trust - Ctrl+F Through History’s Most Expensive Cover-Ups - No Telemetry • No Backdoors • No Coping Mechanism - For When “Nothing to Hide” Stops Being Convincing - Runs Beautifully on the Laptop You’ll Eventually Wipe With a Magnet - Because Someone Has to Archive the Receipts - Proudly Hosted Nowhere Near Virginia - The Index They’ll Subpoena in Their Nightmares - Privacy Respecting • Authority Disrespecting - Bringing Classified to the Masses, One Encrypted Drive at a Time - Yes, It’s Still Illegal in Some Countries. No, We Don’t Care. -

-
- -
- -
- - -
- -
-
- Select Directories -
- All - None -
-
-
- -
-
-
-
-
- -
- Total: 6420 PDFs - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - @@ -12161,76 +7188,12 @@ const searchStatsEl = document.getElementById('search-stats'); const matchCountEl = document.getElementById('match-count'); const expandAllBtn = document.getElementById('expand-all-btn'); const collapseAllBtn = document.getElementById('collapse-all-btn'); -const filterBtn = document.getElementById('filter-btn'); -const filterDropdown = document.getElementById('filter-dropdown'); -const filterOptions = document.getElementById('filter-options'); -const selectAllBtn = document.getElementById('select-all'); -const selectNoneBtn = document.getElementById('select-none'); let searchTimeout; let originalOrder = []; -let excludedDirectories = new Set(); - -// Toggle filter dropdown -filterBtn.addEventListener('click', (e) => { - e.stopPropagation(); - filterDropdown.classList.toggle('active'); -}); - -// Close dropdown when clicking outside -document.addEventListener('click', (e) => { - if (!filterDropdown.contains(e.target) && e.target !== filterBtn) { - filterDropdown.classList.remove('active'); - } -}); - -// Select all directories -selectAllBtn.addEventListener('click', () => { - document.querySelectorAll('.filter-option input[type="checkbox"]').forEach(cb => { - cb.checked = true; - }); - excludedDirectories.clear(); - applyDirectoryFilter(); - updateButtonStates(); -}); - -// Deselect all directories -selectNoneBtn.addEventListener('click', () => { - document.querySelectorAll('.filter-option input[type="checkbox"]').forEach(cb => { - cb.checked = false; - }); - document.querySelectorAll('.directory').forEach(dir => { - const dirName = dir.querySelector('.dir-header').textContent.replace(/▼|▶/, '').trim(); - excludedDirectories.add(dirName); - }); - applyDirectoryFilter(); - updateButtonStates(); -}); - -// Apply directory exclusion filter (without triggering search) -function applyDirectoryFilterOnly() { - document.querySelectorAll('.directory').forEach(dir => { - const dirName = dir.querySelector('.dir-header').textContent.replace(/▼|▶/, '').trim(); - if (excludedDirectories.has(dirName)) { - dir.classList.add('directory-excluded'); - } else { - dir.classList.remove('directory-excluded'); - } - }); -} - -// Apply directory exclusion filter -function applyDirectoryFilter() { - applyDirectoryFilterOnly(); - - // Re-run search to update counts if search is active - if (searchInput.value.trim() !== '') { - searchInput.dispatchEvent(new Event('input')); - } -} // Get all visible (non-hidden) directories and years function getVisibleItems() { - const dirs = Array.from(document.querySelectorAll('.directory:not(.search-hidden):not(.directory-excluded)')); + const dirs = Array.from(document.querySelectorAll('.directory:not(.search-hidden)')); const years = Array.from(document.querySelectorAll('.year:not(.search-hidden)')); return { dirs, years }; } @@ -12302,9 +7265,6 @@ searchInput.addEventListener('input', function() { } }); }); - - // Reapply directory filter after clearing search - applyDirectoryFilterOnly(); } else { // Search: move matching to top, hide non-matching, count matches let totalMatches = 0; @@ -12313,15 +7273,6 @@ searchInput.addEventListener('input', function() { let dirScore = 0; let dirHasMatch = false; - // Skip excluded directories - const dirName = dir.querySelector('.dir-header').textContent.replace(/▼|▶/, '').trim(); - const isExcluded = excludedDirectories.has(dirName); - - if (isExcluded) { - dir.classList.add('directory-excluded'); - return { dir, index, score: 0, hasMatch: false }; - } - dir.querySelectorAll('.year').forEach(year => { let yearHasMatch = false; let yearMatchCount = 0; @@ -12368,7 +7319,7 @@ searchInput.addEventListener('input', function() { // Show/hide and expand directory based on matches if (dirHasMatch) { - dir.classList.remove('collapsed', 'search-hidden', 'directory-excluded'); + dir.classList.remove('collapsed', 'search-hidden'); dir.classList.add('search-active'); } else { dir.classList.add('search-hidden'); @@ -12378,7 +7329,7 @@ searchInput.addEventListener('input', function() { return { dir, index, score: dirScore, hasMatch: dirHasMatch }; }); - // Update search stats (only count non-excluded directories) + // Update search stats matchCountEl.textContent = totalMatches; searchStatsEl.style.display = 'inline'; @@ -12428,67 +7379,10 @@ document.addEventListener('keydown', e => { // Initial setup document.addEventListener('DOMContentLoaded', () => { - // Rotating subtitle animation - const subtitleTexts = document.querySelectorAll('.subtitle-text'); - let currentIndex = 0; - - function rotateSubtitle() { - // Fade out current - subtitleTexts[currentIndex].classList.remove('active'); - - // Move to next - currentIndex = (currentIndex + 1) % subtitleTexts.length; - - // Fade in next after 300ms - setTimeout(() => { - subtitleTexts[currentIndex].classList.add('active'); - }, 300); - } - - // Show first subtitle - if (subtitleTexts.length > 0) { - subtitleTexts[0].classList.add('active'); - - // Start rotation if there are multiple subtitles - if (subtitleTexts.length > 1) { - setInterval(rotateSubtitle, 2300); // 2s display + 0.3s fade - } - } - // Store original order const directories = document.querySelectorAll('.directory'); originalOrder = Array.from(directories).map((_, index) => index); - // Build filter options - directories.forEach((dir, index) => { - const dirHeader = dir.querySelector('.dir-header'); - const dirName = dirHeader.textContent.trim(); - - // Count total PDFs in this directory - const pdfCount = dir.querySelectorAll('tbody tr').length; - - const option = document.createElement('div'); - option.className = 'filter-option'; - option.innerHTML = ` - - - (${pdfCount}) - `; - - const checkbox = option.querySelector('input[type="checkbox"]'); - checkbox.addEventListener('change', (e) => { - if (e.target.checked) { - excludedDirectories.delete(dirName); - } else { - excludedDirectories.add(dirName); - } - applyDirectoryFilter(); - updateButtonStates(); - }); - - filterOptions.appendChild(option); - }); - // Collapse all initially directories.forEach((dir, index) => { dir.classList.add('collapsed');