html-form-scroll
Version:
HTML Form Scroll Extension
2 lines (1 loc) • 880 B
JavaScript
(()=>{let i="hf-scroll-",v=`${i}to`,y=`${i}target`,b="hf-focus-ignore",w=`${i}ignore`,a=t=>document.querySelector(t),o=window,r=document;r.addEventListener("hf:swap",T),r.addEventListener("hf:swapped",L);let g=null;o.addEventListener("click",t=>{g=t.target});let{attr:h,hasAttr:m}=o.htmf,s;function T(t){let{submitter:f,form:u}=t.detail,c=r.activeElement,l=c===r.body?g:c,e=[f,u].map(d=>h(d,v)).find(d=>d),n=h(l,y);n&&(l=a(n)),s={y:o.scrollY,to:e,a:{t:{y:p(l),q:l}}}}function L(){let t=a("[autofocus]");if(t)return t.focus(),t.scrollIntoView({behavior:"auto",block:"center",inline:"center"});if(!s)return;let{y:f,to:u,a:{t:c}}=s,l=a(u);if(l)return l.scrollIntoView({behavior:"smooth"});let e,n=(e=c.q)?c.y:0;m(b)(e)||(e?.focus?.(),e?.select?.()),m(w)(r.body)||(e&&n?o.scrollTo({top:o.scrollY+p(e)-n}):o.scrollTo({top:f}))}function p(t){return t?.getBoundingClientRect().top}})();