@carbon/utilities
Version:
Utilities and helpers to drive consistency across software products using the Carbon Design System
2 lines (1 loc) • 2.21 kB
JavaScript
;var g=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var O=(e,t)=>{for(var i in t)g(e,i,{get:t[i],enumerable:!0})},z=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of T(t))!b.call(e,o)&&o!==i&&g(e,o,{get:()=>t[o],enumerable:!(r=M(t,o))||r.enumerable});return e};var y=e=>z(g({},"__esModule",{value:!0}),e);var A={};O(A,{createOverflowHandler:()=>S,getSize:()=>E,updateOverflowHandler:()=>L});module.exports=y(A);function E(e,t){if(!e)return 0;const i=e.style.display;!e.offsetParent&&getComputedStyle(e).display==="none"&&(e.style.display="inline-block");const r=e.getBoundingClientRect()[t];return e.style.display=i,r}function L({container:e,items:t,offset:i,sizes:r,fixedSizes:o,offsetSize:c,maxVisibleItems:d,dimension:m,onChange:v,previousHiddenItems:u=[]}){const H=m==="width"?e.clientWidth:e.clientHeight;let a=[],l=[];const p=r.reduce((s,f)=>s+f,0),n=o.reduce((s,f)=>s+f,0);if(p+n<=H)a=d?t.slice(0,d):[...t],l=d?t.slice(d):[];else{const s=H-c;let f=0;for(let h=0;h<t.length;h++){const w=r[h];f+w+n<=s&&(!d||a.length<d)?(a.push(t[h]),f+=w):l.push(t[h])}}return u.length===l.length&&u.every((s,f)=>s===l[f])?u:(a.forEach(s=>s.removeAttribute("data-hidden")),l.forEach(s=>s.setAttribute("data-hidden","")),i&&i.toggleAttribute("data-hidden",l.length===0),v(a,l),l)}function S({container:e,maxVisibleItems:t,onChange:i,dimension:r="width"}){if(!(e instanceof HTMLElement))throw new Error("container must be an HTMLElement");if(typeof i!="function")throw new Error("onChange must be a function");if(t!==void 0&&(!Number.isInteger(t)||t<=0))throw new Error("maxVisibleItems must be a positive integer");const o=Array.from(e.children),c=o.find(n=>n.hasAttribute("data-offset")),d=o.filter(n=>n.hasAttribute("data-fixed")),m=o.filter(n=>n!==c&&!d.includes(n)),v=d.map(n=>E(n,r)),u=m.map(n=>E(n,r)),H=E(c,r);let a=[];function l(){a=L({container:e,items:m,offset:c,sizes:u,fixedSizes:v,offsetSize:H,maxVisibleItems:t,dimension:r,onChange:i,previousHiddenItems:a})}const p=new ResizeObserver(()=>requestAnimationFrame(l));return p.observe(e),requestAnimationFrame(l),{disconnect(){p.disconnect()}}}