/** * Binary Ninja Dark Mode - System Preference with Cookie Persistence * Follows system color scheme automatically via CSS * Provides console toggle for testing with cookie-based persistence */ (function() { 'use strict'; const COOKIE_NAME = 'bn-docs-theme'; const COOKIE_DAYS = 365; /** * Get cookie value by name */ function getCookie(name) { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) return parts.pop().split(';').shift(); return null; } /** * Set cookie value */ function setCookie(name, value, days) { const date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); const expires = `expires=${date.toUTCString()}`; document.cookie = `${name}=${value};${expires};path=/`; } /** * Delete cookie */ function deleteCookie(name) { document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/`; } /** * Apply theme mode */ function applyTheme(mode) { const html = document.documentElement; if (mode === 'dark') { html.classList.remove('light-mode'); html.classList.add('dark-mode'); } else if (mode === 'light') { html.classList.remove('dark-mode'); html.classList.add('light-mode'); } else { // Auto mode - remove both classes to follow system preference html.classList.remove('dark-mode'); html.classList.remove('light-mode'); } } /** * Console-accessible toggle function with cookie persistence * Usage: bnToggleDarkMode('dark'), bnToggleDarkMode('light'), or bnToggleDarkMode('auto') */ window.bnToggleDarkMode = function(mode) { if (mode === 'dark') { applyTheme('dark'); setCookie(COOKIE_NAME, 'dark', COOKIE_DAYS); console.log('Dark mode: FORCED ON (saved to cookie, will persist across reloads)'); } else if (mode === 'light') { applyTheme('light'); setCookie(COOKIE_NAME, 'light', COOKIE_DAYS); console.log('Dark mode: FORCED OFF (saved to cookie, will persist across reloads)'); } else if (mode === 'auto') { applyTheme('auto'); deleteCookie(COOKIE_NAME); console.log('Dark mode: AUTO (following system preference, cookie cleared)'); } else { console.log('Usage: bnToggleDarkMode("dark"), bnToggleDarkMode("light"), or bnToggleDarkMode("auto")'); console.log('Current setting:', getCookie(COOKIE_NAME) || 'auto (system preference)'); } }; /** * Initialize theme on page load */ function init() { const savedTheme = getCookie(COOKIE_NAME); if (savedTheme) { applyTheme(savedTheme); console.log(`Binary Ninja Docs: Theme loaded from cookie: ${savedTheme}`); } else { console.log('Binary Ninja Docs: Following system preference (no cookie set)'); } console.log('Use bnToggleDarkMode("dark"), bnToggleDarkMode("light"), or bnToggleDarkMode("auto") to change theme'); } // Initialize on page load init(); })(); /** * Sidebar Collapse Functionality */ (function() { 'use strict'; const COOKIE_NAME = 'bn-docs-sidebar-collapsed'; const COOKIE_DAYS = 365; function getCookie(name) { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) return parts.pop().split(';').shift(); return null; } function setCookie(name, value, days) { const date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); const expires = `expires=${date.toUTCString()}`; document.cookie = `${name}=${value};${expires};path=/`; } function toggleSidebar() { const sideNav = document.getElementById('side-nav'); const docContent = document.getElementById('doc-content'); const container = document.getElementById('container'); const button = document.getElementById('sidebar-toggle'); const top = document.getElementById('top'); const titlearea = document.getElementById('titlearea'); if (!sideNav) return; const isCollapsed = sideNav.classList.toggle('collapsed'); if (docContent) docContent.classList.toggle('sidebar-collapsed', isCollapsed); if (container) container.classList.toggle('sidebar-collapsed', isCollapsed); if (top) top.classList.toggle('collapsed', isCollapsed); if (titlearea) titlearea.classList.toggle('collapsed', isCollapsed); if (button) button.textContent = isCollapsed ? '→' : '←'; setCookie(COOKIE_NAME, isCollapsed ? '1' : '0', COOKIE_DAYS); } function init() { // Wait for DOM to be ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); return; } const sideNav = document.getElementById('side-nav'); if (!sideNav) return; // Create collapse button const button = document.createElement('button'); button.id = 'sidebar-toggle'; button.className = 'sidebar-toggle'; button.textContent = '←'; button.title = 'Toggle sidebar'; button.addEventListener('click', toggleSidebar); // Insert button at the beginning of side-nav sideNav.insertBefore(button, sideNav.firstChild); // Restore collapsed state from cookie const isCollapsed = getCookie(COOKIE_NAME) === '1'; if (isCollapsed) { sideNav.classList.add('collapsed'); const docContent = document.getElementById('doc-content'); const container = document.getElementById('container'); const top = document.getElementById('top'); const titlearea = document.getElementById('titlearea'); if (docContent) docContent.classList.add('sidebar-collapsed'); if (container) container.classList.add('sidebar-collapsed'); if (top) top.classList.add('collapsed'); if (titlearea) titlearea.classList.add('collapsed'); button.textContent = '→'; } } window.bnToggleSidebar = toggleSidebar; init(); })();