(() => { 'use strict'; const STYLE_ID = 'kvx-sidebar-collapsible-v2'; const PIN_ID = 'kvx-sidebar-pin'; const LS_KEY = 'kvx.sidebar.pinned'; const COLLAPSED_W = 64; const EXPANDED_W = 200; const HOVER_DELAY = 120; const COLORS = { bg: '#1a1424', bgHover: '#221a31', border: 'rgba(124,77,255,.25)', accent: '#7C4DFF', accentSoft: 'rgba(124,77,255,.16)', text: '#EAE7F5', textDim: '#B7AFD3', activeA: 'rgba(124,77,255,.18)', activeB: 'rgba(124,77,255,0)', pinBg: '#2b2240', pinFg: '#D8CCFF' }; const isPinned = () => { const pinned = localStorage.getItem(LS_KEY) === '1'; console.log('[Sidebar] isPinned:', pinned); return pinned; }; const setPinned = v => { console.log('[Sidebar] setPinned:', v ? '1' : '0'); v ? localStorage.setItem(LS_KEY, '1') : localStorage.removeItem(LS_KEY); }; const qs = (s, r = document) => r.querySelector(s); function injectCSS() { try { if (qs(`#${STYLE_ID}`)) { console.log('[Sidebar] CSS já injetado'); return; } const st = document.createElement('style'); st.id = STYLE_ID; st.textContent = ` aside.kvx-cb { /* ... mantenha o conteúdo CSS ... */ } /* demais regras... (não mostro tudo para brevidade) */ `; document.head.appendChild(st); console.log('[Sidebar] CSS injetado'); } catch (e) { console.error('[Sidebar] Erro ao injetar CSS:', e); } } function forceSize(aside, px) { try { console.log('[Sidebar] forceSize:', px); aside.style.setProperty('width', px + 'px', 'important'); aside.style.setProperty('min-width', px + 'px', 'important'); aside.style.setProperty('flex-basis', px + 'px', 'important'); } catch (e) { console.error('[Sidebar] Erro em forceSize:', e); } } function mountPin(aside) { try { if (qs(`#${PIN_ID}`, aside)) { console.log('[Sidebar] Pin já existe'); return; } const btn = document.createElement('button'); btn.id = PIN_ID; aside.appendChild(btn); const sync = () => { btn.setAttribute('data-state', isPinned() ? 'pinned' : 'unpinned'); console.log('[Sidebar] Pin sync:', btn.getAttribute('data-state')); }; btn.onclick = () => { setPinned(!isPinned()); sync(); applyState(aside); console.log('[Sidebar] Pin clicado'); }; sync(); console.log('[Sidebar] Pin montado'); } catch (e) { console.error('[Sidebar] Erro em mountPin:', e); } } function collapse(aside) { try { aside.classList.add('kvx-collapsed'); forceSize(aside, COLLAPSED_W); console.log('[Sidebar] Estado: colapsado'); } catch (e) { console.error('[Sidebar] Erro em collapse:', e); } } function expand(aside) { try { aside.classList.remove('kvx-collapsed'); forceSize(aside, EXPANDED_W); console.log('[Sidebar] Estado: expandido'); } catch (e) { console.error('[Sidebar] Erro em expand:', e); } } function applyState(aside) { try { if (isPinned()) expand(aside); else collapse(aside); console.log('[Sidebar] applyState executado'); } catch (e) { console.error('[Sidebar] Erro em applyState:', e); } } function bindHover(aside) { let timeout; aside.addEventListener('mouseenter', () => { try { if (isPinned()) return; clearTimeout(timeout); timeout = setTimeout(() => { expand(aside); console.log('[Sidebar] Hover: expandido'); }, HOVER_DELAY); } catch (e) { console.error('[Sidebar] Erro em hover-enter:', e); } }); aside.addEventListener('mouseleave', () => { try { if (isPinned()) return; clearTimeout(timeout); timeout = setTimeout(() => { collapse(aside); console.log('[Sidebar] Hover: colapsado'); }, HOVER_DELAY); } catch (e) { console.error('[Sidebar] Erro em hover-leave:', e); } }); console.log('[Sidebar] bindHover aplicado'); } function boot() { const start = performance.now(); (function waitAside() { try { const aside = document.querySelector('aside.bg-n-solid-2, aside[class*="bg-n-solid-2"]'); if (!aside) { if (performance.now() - start < 12000) { requestAnimationFrame(waitAside); return; } console.warn('[Sidebar] Aside não encontrado em 12s.'); return; } if (aside.dataset.kvxCollapsible) { console.log('[Sidebar] Aside já inicializado'); return; } aside.dataset.kvxCollapsible = '1'; aside.classList.add('kvx-cb'); injectCSS(); mountPin(aside); applyState(aside); bindHover(aside); new MutationObserver(() => { injectCSS(); mountPin(aside); applyState(aside); }).observe(aside, { childList: true, subtree: true }); console.log('[Sidebar] Inicialização completa'); } catch (e) { console.error('[Sidebar] Erro em waitAside/boot:', e); } })(); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', boot); console.log('[Sidebar] Aguardando DOMContentLoaded'); } else { boot(); console.log('[Sidebar] Boot chamado imediatamente'); } })();