function setFocus(el) { if (!el) return; const od = $('#ddl.open'); if (od && !el.closest('.dd')) od.classList.remove('open'); cur && cur.classList.remove('on'); cur = el; el.classList.add('on'); const inSide = !!el.closest('#side'), inOv = !!el.closest('#ov'); side.classList.toggle('open', inSide && !ov.classList.contains('show')); if (!inSide && !inOv && !el.closest('#pl')) lastMain = el; const row = el.closest('.row'); if (row) row.scrollTo({ left: Math.max(0, el.offsetLeft - parseInt(getComputedStyle(row).paddingLeft)), behavior: fast ? 'auto' : 'smooth' }); const menu = el.closest('#pm'); if (menu) { el.scrollIntoView({ block: 'nearest', behavior: fast ? 'auto' : 'smooth' }); return; } const scr = el.closest('#ov,#sr,#lib'); if (scr && el.closest('#kb,#chips,#tabs')) scr.scrollTo({ top: 0, behavior: fast ? 'auto' : 'smooth' }); else if (scr) { const r = el.getBoundingClientRect(); if (r.bottom > innerHeight - 50) scr.scrollBy({ top: r.bottom - innerHeight + 110, behavior: fast ? 'auto' : 'smooth' }); else if (r.top < 50) scr.scrollBy({ top: r.top - 110, behavior: fast ? 'auto' : 'smooth' }); } else if (!inSide && !el.closest('#pl')) { const sec = el.closest('.sec'); main.scrollTo({ top: sec ? Math.max(0, sec.offsetTop - innerHeight * .52) : 0, behavior: fast ? 'auto' : 'smooth' }); } if (el._it) hero(el._it); if (el._bg) sbgf(el._bg); } function nav(d) { const sc = pl.classList.contains('show') ? (pl.classList.contains('eps') ? '#pep .f' : '#pl .f') : ov.classList.contains('show') ? '#ov .f' : sr.classList.contains('show') ? '#sr .f,#side .f' : lib.classList.contains('show') ? '#lib .f,#side .f' : '#side .f,#main .f'; const c = cur.getBoundingClientRect(), cx = c.left + c.width / 2, cy = c.top + c.height / 2; const inSide = !!cur.closest('#side'); if (inSide && d === 'r' && lastMain && getComputedStyle(lastMain).visibility !== 'hidden') { setFocus(lastMain); return } if ((d === 'l' || d === 'r') && !inSide) { const g = cur.closest('.row,#kb,#tabs'); if (g) { const L = [...g.children].filter(e => e.classList.contains('f') && e.getBoundingClientRect().width), i = L.indexOf(cur), n = L[i + (d === 'r' ? 1 : -1)]; if (i >= 0) { if (n) setFocus(n); else if (d === 'l' && !cur.closest('#ov,#pl')) setFocus(navAct); return } } } let best = null, bs = 1e9; document.querySelectorAll(sc).forEach(e => { if (e === cur) return; const r = e.getBoundingClientRect(); if (!r.width) return; const x = r.left + r.width / 2, y = r.top + r.height / 2, dx = x - cx, dy = y - cy; let p, s; if (d === 'r') { if (dx < 8) return; p = dx; s = Math.abs(dy) * 2.5 } else if (d === 'l') { if (dx > -8) return; p = -dx; s = Math.abs(dy) * 2.5 } else if (d === 'd') { if (dy < 8) return; p = dy; s = Math.abs(dx) * 2 } else { if (dy > -8) return; p = -dy; s = Math.abs(dx) * 2 } if (p + s < bs) { bs = p + s; best = e } }); if (!best) return; if (best.closest('#side') && !inSide) best = navAct; setFocus(best) } function act(el) { el && el._a && el._a() }