@empoleon/solid-measure
Version:
Compute measurements of SolidJS components
2 lines (1 loc) • 1.01 kB
JavaScript
import{splitProps as e,createSignal as n,onMount as t,onCleanup as o,createMemo as r}from"solid-js";import{createResizeObserver as i}from"@solid-primitives/resize-observer";import s from"./get-types.js";import f from"./get-content-rect.js";import c from"./get-window-of.js";function l(l){return function(m){return u=>{const[a,R]=e(u,["innerRef","onResize"]),[p,d]=n({entry:{},client:{},offset:{},scroll:{},bounds:{},margin:{}});let g=null,y=null,z=null;const b=e=>{if(!y)return;const n=f(y,l||s(u)),t={entry:e||{},client:n.client||{},offset:n.offset||{},scroll:n.scroll||{},bounds:n.bounds||{},margin:n.margin||{}};z?g=z.requestAnimationFrame(()=>{d(t),"function"==typeof a.onResize&&a.onResize(n)}):(d(t),"function"==typeof a.onResize&&a.onResize(n))},j=e=>{y=e,z=c(y),a.innerRef&&("function"==typeof a.innerRef?a.innerRef(y):a.innerRef.current=y)};t(()=>{y&&i(y,b)}),o(()=>{z&&g&&z.cancelAnimationFrame(g)});const v=r(()=>({...R,measureRef:j,measure:b,contentRect:p()}));return m(v())}}}export{l as default};