mirror of
https://github.com/PR0M3TH3AN/Archivox.git
synced 2025-09-07 14:48:40 +00:00
88 lines
2.7 KiB
JavaScript
88 lines
2.7 KiB
JavaScript
document.addEventListener('DOMContentLoaded', () => {
|
|
const sidebarToggle = document.getElementById('sidebar-toggle');
|
|
const themeToggle = document.getElementById('theme-toggle');
|
|
const searchInput = document.getElementById('search-input');
|
|
const searchResults = document.getElementById('search-results');
|
|
const root = document.documentElement;
|
|
|
|
function setTheme(theme) {
|
|
root.dataset.theme = theme;
|
|
localStorage.setItem('theme', theme);
|
|
}
|
|
const stored = localStorage.getItem('theme');
|
|
if (stored) setTheme(stored);
|
|
|
|
sidebarToggle?.addEventListener('click', () => {
|
|
document.body.classList.toggle('sidebar-open');
|
|
});
|
|
|
|
themeToggle?.addEventListener('click', () => {
|
|
const next = root.dataset.theme === 'dark' ? 'light' : 'dark';
|
|
setTheme(next);
|
|
});
|
|
|
|
// search
|
|
let lunrIndex;
|
|
let docs = [];
|
|
async function loadIndex() {
|
|
if (lunrIndex) return;
|
|
try {
|
|
const res = await fetch('/search-index.json');
|
|
const data = await res.json();
|
|
lunrIndex = lunr.Index.load(data.index);
|
|
docs = data.docs;
|
|
} catch (e) {
|
|
console.error('Search index failed to load', e);
|
|
}
|
|
}
|
|
|
|
function highlight(text, q) {
|
|
const re = new RegExp('(' + q.replace(/[.*+?^${}()|[\\]\\]/g, '\\$&') + ')', 'gi');
|
|
return text.replace(re, '<mark>$1</mark>');
|
|
}
|
|
|
|
searchInput?.addEventListener('input', async e => {
|
|
const q = e.target.value.trim();
|
|
await loadIndex();
|
|
if (!lunrIndex || !q) {
|
|
searchResults.style.display = 'none';
|
|
searchResults.innerHTML = '';
|
|
return;
|
|
}
|
|
const matches = lunrIndex.search(q);
|
|
searchResults.innerHTML = '';
|
|
if (!matches.length) {
|
|
searchResults.innerHTML = '<div class="no-results">No matches found</div>';
|
|
searchResults.style.display = 'block';
|
|
return;
|
|
}
|
|
matches.forEach(m => {
|
|
const doc = docs.find(d => d.id === m.ref);
|
|
if (!doc) return;
|
|
const a = document.createElement('a');
|
|
a.href = doc.url;
|
|
a.innerHTML = '<strong>' + highlight(doc.title, q) + '</strong><br><small>' + highlight(doc.headings, q) + '</small>';
|
|
searchResults.appendChild(a);
|
|
});
|
|
searchResults.style.display = 'block';
|
|
});
|
|
|
|
document.addEventListener('click', e => {
|
|
if (!searchResults.contains(e.target) && e.target !== searchInput) {
|
|
searchResults.style.display = 'none';
|
|
}
|
|
});
|
|
|
|
// breadcrumbs
|
|
const bc = document.getElementById('breadcrumbs');
|
|
if (bc) {
|
|
const parts = location.pathname.split('/').filter(Boolean);
|
|
let path = '';
|
|
bc.innerHTML = '<a href="/">Home</a>';
|
|
parts.forEach((p) => {
|
|
path += '/' + p;
|
|
bc.innerHTML += ' / <a href="' + path + '">' + p.replace(/-/g, ' ') + '</a>';
|
|
});
|
|
}
|
|
});
|