@appnest/masonry-layout
Advanced tools
Comparing version 2.0.6 to 2.0.7
@@ -38,3 +38,3 @@ declare type ResizeObserverEntries = { | ||
*/ | ||
set cols(v: string | number); | ||
set cols(v: number | "auto"); | ||
get cols(): number | "auto"; | ||
@@ -41,0 +41,0 @@ /** |
{ | ||
"name": "@appnest/masonry-layout", | ||
"version": "2.0.6", | ||
"version": "2.0.7", | ||
"license": "MIT", | ||
@@ -50,4 +50,4 @@ "module": "index.js", | ||
"@appnest/readme": "^1.2.5", | ||
"@appnest/web-config": "0.4.34" | ||
"@appnest/web-config": "0.4.39" | ||
} | ||
} |
@@ -1,2 +0,2 @@ | ||
declare type ResizeObserverEntries = { | ||
type ResizeObserverEntries = { | ||
contentRect: { | ||
@@ -7,3 +7,18 @@ width: number; | ||
}[]; | ||
declare global { | ||
interface Window { | ||
ShadyCSS?: any; | ||
ShadyDOM?: any; | ||
} | ||
} /** | ||
* Template for the masonry layout. | ||
* Max width of each column is computed as the width in percentage of | ||
* the column minus the total with of the gaps divided between each column. | ||
*/ | ||
/** | ||
* Template for the masonry layout. | ||
* Max width of each column is computed as the width in percentage of | ||
* the column minus the total with of the gaps divided between each column. | ||
*/ | ||
/** | ||
* Masonry layout web component. It places the slotted elements in the optimal position based | ||
@@ -17,2 +32,4 @@ * on the available vertical space, just like mason fitting stones in a wall. | ||
declare class MasonryLayout extends HTMLElement { | ||
// The observed attributes. | ||
// Whenever one of these changes we need to update the layout. | ||
static get observedAttributes(): string[]; | ||
@@ -31,3 +48,3 @@ /** | ||
*/ | ||
set cols(v: string | number); | ||
set cols(v: number | "auto"); | ||
get cols(): number | "auto"; | ||
@@ -52,5 +69,9 @@ /** | ||
private get $columns(); | ||
// Unique debounce ID so different masonry layouts on one page won't affect eachother | ||
private debounceId; | ||
// Reference to the default slot element | ||
private $unsetElementsSlot; | ||
// Resize observer that layouts when necessary | ||
private ro; | ||
// The current request animation frame callback | ||
private currentRequestAnimationFrameCallback; | ||
@@ -98,2 +119,7 @@ /** | ||
} | ||
declare global { | ||
interface HTMLElementTagNameMap { | ||
"masonry-layout": MasonryLayout; | ||
} | ||
} | ||
export { MasonryLayout }; |
@@ -1,1 +0,1 @@ | ||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self)["masonry-layout"]={})}(this,(function(t){"use strict";const e=500,n="auto",o=300,s=24,i="--_masonry-layout-col-count",l="--_masonry-layout-gap",r=1,a=new Map;function h(t,e,n){const o=parseFloat(t.getAttribute(e)||"");return isNaN(o)?n:o}function c(t,e,n){return isNaN(e)?Math.max(1,Math.ceil(t/n)):e}function d(t){let e=0,n=1/0;return t.forEach((t,o)=>{t<n&&(n=t,e=o)}),e}const u=document.createElement("template");u.innerHTML=`\n <style>\n :host {\n display: flex;\n align-items: flex-start;\n justify-content: stretch;\n }\n\n .column {\n\t max-width: calc((100% / var(${i}, 1) - ((var(${l}, ${s}px) * (var(${i}, 1) - 1) / var(${i}, 1)))));\n\t width: 100%;\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n .column:not(:last-child) {\n margin-right: var(${l}, ${s}px);\n }\n\n .column ::slotted(*) {\n margin-bottom: var(${l}, ${s}px);\n box-sizing: border-box;\n width: 100%;\n }\n\n /* Hide the items that has not yet found the correct slot */\n #unset-items {\n opacity: 0;\n position: absolute;\n pointer-events: none;\n }\n </style>\n <div id="unset-items">\n <slot></slot>\n </div>\n`,window.ShadyCSS&&window.ShadyCSS.prepareTemplateStyles(u,"masonry-layout");class m extends HTMLElement{constructor(){super(),this.debounceId=`layout_${Math.random()}`,this.ro=void 0,this.currentRequestAnimationFrameCallback=void 0,this.attachShadow({mode:"open"}).appendChild(u.content.cloneNode(!0)),this.onSlotChange=this.onSlotChange.bind(this),this.onResize=this.onResize.bind(this),this.layout=this.layout.bind(this),this.$unsetElementsSlot=this.shadowRoot.querySelector("#unset-items > slot")}static get observedAttributes(){return["maxcolwidth","gap","cols"]}set maxColWidth(t){this.setAttribute("maxcolwidth",t.toString())}get maxColWidth(){return h(this,"maxcolwidth",e)}set cols(t){this.setAttribute("cols",t.toString())}get cols(){return h(this,"cols",n)}set gap(t){this.setAttribute("gap",t.toString())}get gap(){return h(this,"gap",s)}set debounce(t){this.setAttribute("debounce",t.toString())}get debounce(){return h(this,"debounce",o)}get $columns(){return Array.from(this.shadowRoot.querySelectorAll(".column"))}connectedCallback(){this.$unsetElementsSlot.addEventListener("slotchange",this.onSlotChange),"ResizeObserver"in window?(this.ro=new ResizeObserver(this.onResize),this.ro.observe(this)):window.addEventListener("resize",this.onResize)}disconnectedCallback(){this.$unsetElementsSlot.removeEventListener("slotchange",this.onSlotChange),window.removeEventListener("resize",this.onResize),null!=this.ro&&this.ro.unobserve(this)}attributeChangedCallback(t){switch(t){case"gap":this.style.setProperty(l,`${this.gap}px`)}this.scheduleLayout()}onSlotChange(){(this.$unsetElementsSlot.assignedNodes()||[]).filter(t=>t.nodeType===r).length>0&&this.layout()}onResize(t){const{width:e}=null!=t&&Array.isArray(t)&&t.length>0?t[0].contentRect:{width:this.offsetWidth};c(e,this.cols,this.maxColWidth)!==this.$columns.length&&this.scheduleLayout()}renderCols(t){const e=this.$columns;if(e.length!==t){for(const t of e)t.parentNode&&t.parentNode.removeChild(t);for(let e=0;e<t;e++){const t=document.createElement("div");t.classList.add("column"),t.setAttribute("part",`column column-${e}`);const n=document.createElement("slot");n.setAttribute("name",e.toString()),t.appendChild(n),this.shadowRoot.appendChild(t)}this.style.setProperty(i,t.toString()),window.ShadyCSS&&window.ShadyCSS.styleElement(this)}}scheduleLayout(t=this.debounce){!function(t,e,n){const o=a.get(n);null!=o&&window.clearTimeout(o),a.set(n,window.setTimeout(t,e))}(this.layout,t,this.debounceId)}layout(){null!=this.currentRequestAnimationFrameCallback&&window.cancelAnimationFrame(this.currentRequestAnimationFrameCallback),this.currentRequestAnimationFrameCallback=requestAnimationFrame(()=>{const t=this.gap,e=Array.from(this.children).filter(t=>t.nodeType===r),n=c(this.offsetWidth,this.cols,this.maxColWidth),o=Array(n).fill(0),s=[];for(const n of e){const e=n.getBoundingClientRect().height;let i=d(o);o[i]+=e+t;const l=i.toString();n.slot!==l&&s.push(()=>n.slot=l)}for(const t of s)t();this.renderCols(n),window.ShadyCSS&&window.ShadyCSS.styleElement(this)})}}customElements.define("masonry-layout",m),t.MasonryLayout=m,Object.defineProperty(t,"__esModule",{value:!0})})); | ||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self)["masonry-layout"]={})}(this,(function(t){"use strict";const e=new Map;function n(t,e,n){const o=parseFloat(t.getAttribute(e)||"");return isNaN(o)?n:o}function o(t,e,n){return isNaN(e)?Math.max(1,Math.ceil(t/n)):e}function s(t){let e=0,n=1/0;return t.forEach((t,o)=>{t<n&&(n=t,e=o)}),e}const i=document.createElement("template");i.innerHTML='\n <style>\n :host {\n display: flex;\n align-items: flex-start;\n justify-content: stretch;\n }\n\n .column {\n\t max-width: calc((100% / var(--_masonry-layout-col-count, 1) - ((var(--_masonry-layout-gap, 24px) * (var(--_masonry-layout-col-count, 1) - 1) / var(--_masonry-layout-col-count, 1)))));\n\t width: 100%;\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n .column:not(:last-child) {\n margin-right: var(--_masonry-layout-gap, 24px);\n }\n\n .column ::slotted(*) {\n margin-bottom: var(--_masonry-layout-gap, 24px);\n box-sizing: border-box;\n width: 100%;\n }\n\n /* Hide the items that has not yet found the correct slot */\n #unset-items {\n opacity: 0;\n position: absolute;\n pointer-events: none;\n }\n </style>\n <div id="unset-items">\n <slot></slot>\n </div>\n',window.ShadyCSS&&window.ShadyCSS.prepareTemplateStyles(i,"masonry-layout");class a extends HTMLElement{constructor(){super(),this.debounceId=`layout_${Math.random()}`,this.ro=void 0,this.currentRequestAnimationFrameCallback=void 0,this.attachShadow({mode:"open"}).appendChild(i.content.cloneNode(!0)),this.onSlotChange=this.onSlotChange.bind(this),this.onResize=this.onResize.bind(this),this.layout=this.layout.bind(this),this.$unsetElementsSlot=this.shadowRoot.querySelector("#unset-items > slot")}static get observedAttributes(){return["maxcolwidth","gap","cols"]}set maxColWidth(t){this.setAttribute("maxcolwidth",t.toString())}get maxColWidth(){return n(this,"maxcolwidth",500)}set cols(t){this.setAttribute("cols",t.toString())}get cols(){return n(this,"cols","auto")}set gap(t){this.setAttribute("gap",t.toString())}get gap(){return n(this,"gap",24)}set debounce(t){this.setAttribute("debounce",t.toString())}get debounce(){return n(this,"debounce",300)}get $columns(){return Array.from(this.shadowRoot.querySelectorAll(".column"))}connectedCallback(){this.$unsetElementsSlot.addEventListener("slotchange",this.onSlotChange),"ResizeObserver"in window?(this.ro=new ResizeObserver(this.onResize),this.ro.observe(this)):window.addEventListener("resize",this.onResize)}disconnectedCallback(){this.$unsetElementsSlot.removeEventListener("slotchange",this.onSlotChange),window.removeEventListener("resize",this.onResize),null!=this.ro&&this.ro.unobserve(this)}attributeChangedCallback(t){switch(t){case"gap":this.style.setProperty("--_masonry-layout-gap",`${this.gap}px`)}this.scheduleLayout()}onSlotChange(){(this.$unsetElementsSlot.assignedNodes()||[]).filter(t=>1===t.nodeType).length>0&&this.layout()}onResize(t){const{width:e}=null!=t&&Array.isArray(t)&&t.length>0?t[0].contentRect:{width:this.offsetWidth};o(e,this.cols,this.maxColWidth)!==this.$columns.length&&this.scheduleLayout()}renderCols(t){const e=this.$columns;if(e.length!==t){for(const t of e)t.parentNode&&t.parentNode.removeChild(t);for(let e=0;e<t;e++){const t=document.createElement("div");t.classList.add("column"),t.setAttribute("part",`column column-${e}`);const n=document.createElement("slot");n.setAttribute("name",e.toString()),t.appendChild(n),this.shadowRoot.appendChild(t)}this.style.setProperty("--_masonry-layout-col-count",t.toString()),window.ShadyCSS&&window.ShadyCSS.styleElement(this)}}scheduleLayout(t=this.debounce){!function(t,n,o){const s=e.get(o);null!=s&&window.clearTimeout(s),e.set(o,window.setTimeout(t,n))}(this.layout,t,this.debounceId)}layout(){null!=this.currentRequestAnimationFrameCallback&&window.cancelAnimationFrame(this.currentRequestAnimationFrameCallback),this.currentRequestAnimationFrameCallback=requestAnimationFrame(()=>{const t=this.gap,e=Array.from(this.children).filter(t=>1===t.nodeType),n=o(this.offsetWidth,this.cols,this.maxColWidth),i=Array(n).fill(0),a=[];for(const n of e){const e=n.getBoundingClientRect().height;let o=s(i);i[o]+=e+t;const l=o.toString();n.slot!==l&&a.push(()=>n.slot=l)}for(const t of a)t();this.renderCols(n),window.ShadyCSS&&window.ShadyCSS.styleElement(this)})}}customElements.define("masonry-layout",a),t.MasonryLayout=a,Object.defineProperty(t,"__esModule",{value:!0})})); |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
45696
701