window.initSidebar = function() {
const searchInput = document.getElementById('sidebar-search');
const categoryGroups = document.querySelectorAll('.category-group');
const navLinks = document.querySelectorAll('.nav-link');
loadSidebarState();
categoryGroups.forEach(group => {
const header = group.querySelector('.category-header');
header.addEventListener('click', () => {
const isExpanded = group.classList.toggle('expanded');
const categoryId = group.getAttribute('data-category');
saveSidebarState(categoryId, isExpanded);
});
});
if (searchInput) {
searchInput.addEventListener('input', (e) => {
const query = e.target.value.toLowerCase().trim();
filterSidebar(query);
});
window.addEventListener('keydown', (e) => {
if (e.key === '/' && document.activeElement !== searchInput) {
e.preventDefault();
searchInput.focus();
}
});
}
function loadSidebarState() {
const savedState = JSON.parse(localStorage.getItem('bit-twiddler-sidebar-state') || '{}');
categoryGroups.forEach(group => {
const categoryId = group.getAttribute('data-category');
const shouldExpand = savedState[categoryId] !== false;
if (shouldExpand) {
group.classList.add('expanded');
} else {
group.classList.remove('expanded');
}
});
}
function saveSidebarState(categoryId, isExpanded) {
const savedState = JSON.parse(localStorage.getItem('bit-twiddler-sidebar-state') || '{}');
savedState[categoryId] = isExpanded;
localStorage.setItem('bit-twiddler-sidebar-state', JSON.stringify(savedState));
}
function filterSidebar(query) {
if (!query) {
categoryGroups.forEach(group => {
group.classList.remove('hidden');
loadSidebarState();
});
navLinks.forEach(link => {
link.closest('li').classList.remove('hidden');
});
return;
}
categoryGroups.forEach(group => {
const linksInGroup = group.querySelectorAll('.nav-link');
let groupHasMatch = false;
linksInGroup.forEach(link => {
const text = link.innerText.toLowerCase();
const li = link.closest('li');
if (text.includes(query)) {
li.classList.remove('hidden');
groupHasMatch = true;
} else {
li.classList.add('hidden');
}
});
if (groupHasMatch) {
group.classList.remove('hidden');
group.classList.add('expanded'); } else {
group.classList.add('hidden');
}
});
}
}