(() => {
'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');
}
})();