-
Notifications
You must be signed in to change notification settings - Fork 0
/
keyboardnav.min.js
1 lines (1 loc) · 2.32 KB
/
keyboardnav.min.js
1
let offset;function fakeScroll(){window.scrollBy(0,2),window.scrollBy(0,-2)}function scrollByOffset(){document.children[0].getBoundingClientRect().height-(window.scrollY+window.innerHeight)>1&&(window.scrollBy(0,-1*offset),fakeScroll())}function keyboardNav(e){let l=Object.assign({postSelector:".post",postContainerSelector:"#posts",postOffset:0,nextPageSelector:"#next",prevPageSelector:"#prev",searchSelector:"#q",reblogSelector:".customreblog",paletteToggleSelector:"#palette"},e),t=document.querySelectorAll(l.postSelector),o=l.postContainerSelector===document?document:document.querySelector(l.postContainerSelector),r=document.querySelector(l.nextPageSelector),c=document.querySelector(l.prevPageSelector),s=document.querySelector(l.searchSelector),n,i,a;offset=null===l.postOffset?0:l.postOffset;let f=new IntersectionObserver(e=>{for(let l of e)l.isIntersecting&&(n=l.target)},{rootMargin:`-${offset}px 0px -${window.innerHeight-offset}px`});t.forEach((e,l)=>{f.observe(e),e.setAttribute("tabindex","-1")}),document.addEventListener("keydown",e=>{let f=e.key.toUpperCase();"INPUT"!==document.activeElement.tagName&&("J"===f?(null==n?((n=t[0]).scrollIntoView(),scrollByOffset(),n.focus()):(a=n.getBoundingClientRect().y)>offset+2?(n.scrollIntoView(),scrollByOffset(),n.focus()):null!=n.nextElementSibling?(i=n,n.nextElementSibling.scrollIntoView(),n==i&&(n=n.nextElementSibling),scrollByOffset(),n.focus()):(o.scrollIntoView(!1),window.scrollBy(0,20)),l.scrollCallback&&l.scrollCallback()):"K"===f?(null==n?((n=t[0]).scrollIntoView(),scrollByOffset()):-2-offset>(a=n.getBoundingClientRect().y)?(n.scrollIntoView(),scrollByOffset()):null!=n.previousElementSibling&&(i=n,n.previousElementSibling.scrollIntoView(),n==i&&(n=n.previousElementSibling),scrollByOffset()),n.focus(),l.scrollCallback&&l.scrollCallback()):"."===f?(window.scrollTo({top:0,behavior:"smooth"}),n=t[0],l.scrollCallback&&l.scrollCallback()):null!=l.reblogSelector&&e.shiftKey&&"R"===f?n.querySelector(l.reblogSelector)?.click():null!=s&&"?"===f?(l.searchCallback&&l.searchCallback(),s.focus(),e.preventDefault()):null==r||document.body.classList.contains("lightboxed")||"ArrowRight"!==e.key?null==c||document.body.classList.contains("lightboxed")||"ArrowLeft"!==e.key?null!=l.paletteToggleSelector&&e.shiftKey&&"P"===f&&document.querySelector(l.paletteToggleSelector).click():c.click():r.click())})}