wj-elements 0.1.136 → 0.1.137
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dark.css +223 -0
- package/dist/infinite-scroll.element-XVJukzjy.js +272 -0
- package/dist/infinite-scroll.element-XVJukzjy.js.map +1 -0
- package/dist/light.css +534 -0
- package/dist/list.element-Ce1vIm1O.js +50 -0
- package/dist/list.element-Ce1vIm1O.js.map +1 -0
- package/dist/localize.js +70 -0
- package/dist/localize.js.map +1 -0
- package/dist/popup.element-tyYxow0p.js +1623 -0
- package/dist/popup.element-tyYxow0p.js.map +1 -0
- package/dist/router-links-CJnOdbas.js +150 -0
- package/dist/router-links-CJnOdbas.js.map +1 -0
- package/dist/styles.css +849 -0
- package/dist/wje-accordion-item.js +113 -0
- package/dist/wje-accordion-item.js.map +1 -0
- package/dist/wje-accordion.js +122 -0
- package/dist/wje-accordion.js.map +1 -0
- package/dist/wje-animation.js +4326 -0
- package/dist/wje-animation.js.map +1 -0
- package/dist/wje-aside.js +55 -0
- package/dist/wje-aside.js.map +1 -0
- package/dist/wje-avatar.js +90 -0
- package/dist/wje-avatar.js.map +1 -0
- package/dist/wje-badge.js +71 -0
- package/dist/wje-badge.js.map +1 -0
- package/dist/wje-breadcrumb.js +195 -0
- package/dist/wje-breadcrumb.js.map +1 -0
- package/dist/wje-breadcrumbs.js +140 -0
- package/dist/wje-breadcrumbs.js.map +1 -0
- package/dist/wje-button-group.js +85 -0
- package/dist/wje-button-group.js.map +1 -0
- package/dist/wje-button.js +352 -0
- package/dist/wje-button.js.map +1 -0
- package/dist/wje-card-content.js +48 -0
- package/dist/wje-card-content.js.map +1 -0
- package/dist/wje-card-controls.js +48 -0
- package/dist/wje-card-controls.js.map +1 -0
- package/dist/wje-card-header.js +48 -0
- package/dist/wje-card-header.js.map +1 -0
- package/dist/wje-card-subtitle.js +55 -0
- package/dist/wje-card-subtitle.js.map +1 -0
- package/dist/wje-card-title.js +55 -0
- package/dist/wje-card-title.js.map +1 -0
- package/dist/wje-card.js +56 -0
- package/dist/wje-card.js.map +1 -0
- package/dist/wje-carousel-item.js +63 -0
- package/dist/wje-carousel-item.js.map +1 -0
- package/dist/wje-carousel.js +380 -0
- package/dist/wje-carousel.js.map +1 -0
- package/dist/wje-checkbox.js +540 -0
- package/dist/wje-checkbox.js.map +1 -0
- package/dist/wje-chip.js +76 -0
- package/dist/wje-chip.js.map +1 -0
- package/dist/wje-col.js +38 -0
- package/dist/wje-col.js.map +1 -0
- package/dist/wje-color-picker.js +1339 -0
- package/dist/wje-color-picker.js.map +1 -0
- package/dist/wje-container.js +56 -0
- package/dist/wje-container.js.map +1 -0
- package/dist/wje-copy-button.js +218 -0
- package/dist/wje-copy-button.js.map +1 -0
- package/dist/wje-dialog.js +249 -0
- package/dist/wje-dialog.js.map +1 -0
- package/dist/wje-divider.js +55 -0
- package/dist/wje-divider.js.map +1 -0
- package/dist/wje-dropdown.js +194 -0
- package/dist/wje-dropdown.js.map +1 -0
- package/dist/wje-element.js +967 -0
- package/dist/wje-element.js.map +1 -0
- package/dist/wje-fetchAndParseCSS.js +60 -0
- package/dist/wje-fetchAndParseCSS.js.map +1 -0
- package/dist/wje-file-upload-item.js +140 -0
- package/dist/wje-file-upload-item.js.map +1 -0
- package/dist/wje-file-upload.js +552 -0
- package/dist/wje-file-upload.js.map +1 -0
- package/dist/wje-footer.js +52 -0
- package/dist/wje-footer.js.map +1 -0
- package/dist/wje-form.js +53 -0
- package/dist/wje-form.js.map +1 -0
- package/dist/wje-format-digital.js +146 -0
- package/dist/wje-format-digital.js.map +1 -0
- package/dist/wje-grid.js +54 -0
- package/dist/wje-grid.js.map +1 -0
- package/dist/wje-header.js +56 -0
- package/dist/wje-header.js.map +1 -0
- package/dist/wje-icon-picker.js +349 -0
- package/dist/wje-icon-picker.js.map +1 -0
- package/dist/wje-icon.js +191 -0
- package/dist/wje-icon.js.map +1 -0
- package/dist/wje-img-comparer.js +131 -0
- package/dist/wje-img-comparer.js.map +1 -0
- package/dist/wje-img.js +80 -0
- package/dist/wje-img.js.map +1 -0
- package/dist/wje-infinite-scroll.js +6 -0
- package/dist/wje-infinite-scroll.js.map +1 -0
- package/dist/wje-input-file.js +111 -0
- package/dist/wje-input-file.js.map +1 -0
- package/dist/wje-input.js +452 -0
- package/dist/wje-input.js.map +1 -0
- package/dist/wje-item.js +88 -0
- package/dist/wje-item.js.map +1 -0
- package/dist/wje-kanban.js +462 -0
- package/dist/wje-kanban.js.map +1 -0
- package/dist/wje-label.js +53 -0
- package/dist/wje-label.js.map +1 -0
- package/dist/wje-list.js +6 -0
- package/dist/wje-list.js.map +1 -0
- package/dist/wje-main.js +52 -0
- package/dist/wje-main.js.map +1 -0
- package/dist/wje-masonry.js +267 -0
- package/dist/wje-masonry.js.map +1 -0
- package/dist/wje-master.js +687 -0
- package/dist/wje-master.js.map +1 -0
- package/dist/wje-menu-button.js +60 -0
- package/dist/wje-menu-button.js.map +1 -0
- package/dist/wje-menu-item.js +545 -0
- package/dist/wje-menu-item.js.map +1 -0
- package/dist/wje-menu-label.js +55 -0
- package/dist/wje-menu-label.js.map +1 -0
- package/dist/wje-menu.js +72 -0
- package/dist/wje-menu.js.map +1 -0
- package/dist/wje-option.js +112 -0
- package/dist/wje-option.js.map +1 -0
- package/dist/wje-options.js +355 -0
- package/dist/wje-options.js.map +1 -0
- package/dist/wje-orgchart-group.js +72 -0
- package/dist/wje-orgchart-group.js.map +1 -0
- package/dist/wje-orgchart-item.js +98 -0
- package/dist/wje-orgchart-item.js.map +1 -0
- package/dist/wje-orgchart.js +49 -0
- package/dist/wje-orgchart.js.map +1 -0
- package/dist/wje-popup.js +6 -0
- package/dist/wje-popup.js.map +1 -0
- package/dist/wje-progress-bar.js +213 -0
- package/dist/wje-progress-bar.js.map +1 -0
- package/dist/wje-qr-code.js +2892 -0
- package/dist/wje-qr-code.js.map +1 -0
- package/dist/wje-radio-group.js +228 -0
- package/dist/wje-radio-group.js.map +1 -0
- package/dist/wje-radio.js +106 -0
- package/dist/wje-radio.js.map +1 -0
- package/dist/wje-rate.js +300 -0
- package/dist/wje-rate.js.map +1 -0
- package/dist/wje-relative-time.js +115 -0
- package/dist/wje-relative-time.js.map +1 -0
- package/dist/wje-reorder-dropzone.js +49 -0
- package/dist/wje-reorder-dropzone.js.map +1 -0
- package/dist/wje-reorder-handle.js +218 -0
- package/dist/wje-reorder-handle.js.map +1 -0
- package/dist/wje-reorder-item.js +61 -0
- package/dist/wje-reorder-item.js.map +1 -0
- package/dist/wje-reorder.js +281 -0
- package/dist/wje-reorder.js.map +1 -0
- package/dist/wje-route.js +43 -0
- package/dist/wje-route.js.map +1 -0
- package/dist/wje-router-link.js +64 -0
- package/dist/wje-router-link.js.map +1 -0
- package/dist/wje-router-outlet.js +192 -0
- package/dist/wje-router-outlet.js.map +1 -0
- package/dist/wje-routerx.js +1437 -0
- package/dist/wje-routerx.js.map +1 -0
- package/dist/wje-row.js +49 -0
- package/dist/wje-row.js.map +1 -0
- package/dist/wje-select.js +630 -0
- package/dist/wje-select.js.map +1 -0
- package/dist/wje-slider.js +221 -0
- package/dist/wje-slider.js.map +1 -0
- package/dist/wje-sliding-container.js +474 -0
- package/dist/wje-sliding-container.js.map +1 -0
- package/dist/wje-split-view.js +153 -0
- package/dist/wje-split-view.js.map +1 -0
- package/dist/wje-status.js +61 -0
- package/dist/wje-status.js.map +1 -0
- package/dist/wje-step.js +50 -0
- package/dist/wje-step.js.map +1 -0
- package/dist/wje-stepper.js +231 -0
- package/dist/wje-stepper.js.map +1 -0
- package/dist/wje-store.js +401 -0
- package/dist/wje-store.js.map +1 -0
- package/dist/wje-tab-group.js +137 -0
- package/dist/wje-tab-group.js.map +1 -0
- package/dist/wje-tab-panel.js +46 -0
- package/dist/wje-tab-panel.js.map +1 -0
- package/dist/wje-tab.js +59 -0
- package/dist/wje-tab.js.map +1 -0
- package/dist/wje-textarea.js +373 -0
- package/dist/wje-textarea.js.map +1 -0
- package/dist/wje-thumbnail.js +54 -0
- package/dist/wje-thumbnail.js.map +1 -0
- package/dist/wje-toast.js +334 -0
- package/dist/wje-toast.js.map +1 -0
- package/dist/wje-toggle.js +125 -0
- package/dist/wje-toggle.js.map +1 -0
- package/dist/wje-toolbar-action.js +72 -0
- package/dist/wje-toolbar-action.js.map +1 -0
- package/dist/wje-toolbar.js +63 -0
- package/dist/wje-toolbar.js.map +1 -0
- package/dist/wje-tooltip.js +166 -0
- package/dist/wje-tooltip.js.map +1 -0
- package/dist/wje-visually-hidden.js +55 -0
- package/dist/wje-visually-hidden.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
+
import WJElement from "./wje-element.js";
|
|
5
|
+
const DEFAULT_DEBOUNCE_MS = 300;
|
|
6
|
+
const COL_COUNT_CSS_VAR_NAME = `--wje-masonry-layout-col-count`;
|
|
7
|
+
const GAP_CSS_VAR_NAME = `--wje-masonry-layout-gap`;
|
|
8
|
+
const ELEMENT_NODE_TYPE = 1;
|
|
9
|
+
const DEBOUNCE_MAP = /* @__PURE__ */ new Map();
|
|
10
|
+
function getNumberAttribute($elem, name, defaultValue) {
|
|
11
|
+
const value = parseFloat($elem.getAttribute(name) || "");
|
|
12
|
+
return isNaN(value) ? defaultValue : value;
|
|
13
|
+
}
|
|
14
|
+
function getColCount(totalWidth, cols, maxColWidth) {
|
|
15
|
+
return isNaN(cols) ? Math.max(1, Math.ceil(totalWidth / maxColWidth)) : cols;
|
|
16
|
+
}
|
|
17
|
+
function debounce(cb, ms, id) {
|
|
18
|
+
const existingTimeout = DEBOUNCE_MAP.get(id);
|
|
19
|
+
if (existingTimeout !== null && existingTimeout !== void 0) window.clearTimeout(existingTimeout);
|
|
20
|
+
DEBOUNCE_MAP.set(id, window.setTimeout(cb, ms));
|
|
21
|
+
}
|
|
22
|
+
function findSmallestColIndex(colHeights) {
|
|
23
|
+
let smallestIndex = 0;
|
|
24
|
+
let smallestHeight = Infinity;
|
|
25
|
+
colHeights.forEach((height, i) => {
|
|
26
|
+
if (height < smallestHeight) {
|
|
27
|
+
smallestHeight = height;
|
|
28
|
+
smallestIndex = i;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return smallestIndex;
|
|
32
|
+
}
|
|
33
|
+
const styles = "/*\n[ WJ Masonry ]\n*/\n\n:host {\n display: flex;\n align-items: flex-start;\n justify-content: stretch;\n width: 100%;\n}\n\n.column {\n max-width: calc(\n (\n 100% / var(--wje-masonry-layout-col-count, 1) -\n (\n (\n var(--wje-masonry-layout-gap, 1rem) * (var(--wje-masonry-layout-col-count, 1) - 1) /\n var(--wje-masonry-layout-col-count, 1)\n )\n )\n )\n );\n width: 100%;\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.column:not(:last-child) {\n margin-inline-end: var(--wje-masonry-layout-gap, 1rem);\n}\n\n.column ::slotted(*) {\n margin-block-end: var(--wje-masonry-layout-gap, 1rem);\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";
|
|
34
|
+
class Masonry extends WJElement {
|
|
35
|
+
/**
|
|
36
|
+
* Constructor for the Masonry class.
|
|
37
|
+
*/
|
|
38
|
+
constructor() {
|
|
39
|
+
super();
|
|
40
|
+
__publicField(this, "debounceId", `layout_${Math.random()}`);
|
|
41
|
+
__publicField(this, "ro");
|
|
42
|
+
__publicField(this, "className", "Masonry");
|
|
43
|
+
/**
|
|
44
|
+
* Called when the slot changes.
|
|
45
|
+
*/
|
|
46
|
+
__publicField(this, "onSlotChange", () => {
|
|
47
|
+
const $unsetElements = (this.unsetSlot.assignedNodes() || []).filter(
|
|
48
|
+
(node) => node.nodeType === ELEMENT_NODE_TYPE
|
|
49
|
+
);
|
|
50
|
+
if ($unsetElements.length > 0) {
|
|
51
|
+
this.layout();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* Called when the window resizes.
|
|
56
|
+
* @param {Array} entries The entries to use.
|
|
57
|
+
*/
|
|
58
|
+
__publicField(this, "onResize", (entries) => {
|
|
59
|
+
const { width } = entries !== null && entries !== void 0 && Array.isArray(entries) && entries.length > 0 ? entries[0].contentRect : { width: this.offsetWidth };
|
|
60
|
+
const colCount = getColCount(width, this.cols, this.maxColWidth);
|
|
61
|
+
if (colCount !== this.columns.length) {
|
|
62
|
+
this.scheduleLayout();
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* Lays out the element.
|
|
67
|
+
*/
|
|
68
|
+
__publicField(this, "layout", () => {
|
|
69
|
+
if (this.currentRequestAnimationFrameCallback !== null && this.currentRequestAnimationFrameCallback !== void 0) {
|
|
70
|
+
window.cancelAnimationFrame(this.currentRequestAnimationFrameCallback);
|
|
71
|
+
}
|
|
72
|
+
this.currentRequestAnimationFrameCallback = requestAnimationFrame(() => {
|
|
73
|
+
const gap = this.gap;
|
|
74
|
+
const $elements = Array.from(this.children).filter((node) => node.nodeType === ELEMENT_NODE_TYPE);
|
|
75
|
+
const colCount = getColCount(this.offsetWidth, this.cols, this.maxColWidth);
|
|
76
|
+
const colHeights = Array(colCount).fill(0);
|
|
77
|
+
const writes = [];
|
|
78
|
+
for (const elem of $elements) {
|
|
79
|
+
const height = elem.getBoundingClientRect().height;
|
|
80
|
+
let smallestColIndex = findSmallestColIndex(colHeights);
|
|
81
|
+
colHeights[smallestColIndex] += height + +gap;
|
|
82
|
+
const newSlot = smallestColIndex;
|
|
83
|
+
if (elem.slot !== newSlot) {
|
|
84
|
+
writes.push(() => elem.slot = newSlot);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
for (const write of writes) {
|
|
88
|
+
write();
|
|
89
|
+
}
|
|
90
|
+
this.renderCols(colCount);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
this.debounceId = `layout_${Math.random()}`;
|
|
94
|
+
this.ro = void 0;
|
|
95
|
+
this.currentRequestAnimationFrameCallback = void 0;
|
|
96
|
+
this.unsetSlot = void 0;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Setter for the maxColWidth property.
|
|
100
|
+
* @param {number} value The maximum column width.
|
|
101
|
+
*/
|
|
102
|
+
set maxColWidth(value) {
|
|
103
|
+
this.setAttribute("max-col-width", value);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Getter for the maxColWidth property.
|
|
107
|
+
* @returns {number} The maximum column width.
|
|
108
|
+
*/
|
|
109
|
+
get maxColWidth() {
|
|
110
|
+
return this.hasAttribute("max-col-width") ? +this.getAttribute("max-col-width") : 500;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Setter for the cols property.
|
|
114
|
+
* @param {number} value The number of columns.
|
|
115
|
+
*/
|
|
116
|
+
set cols(value) {
|
|
117
|
+
if (this.hasAttribute("cols")) this.setAttribute("cols", value);
|
|
118
|
+
else this.setAttribute("cols", "auto");
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Getter for the cols property.
|
|
122
|
+
* @returns {number} The number of columns.
|
|
123
|
+
*/
|
|
124
|
+
get cols() {
|
|
125
|
+
return getNumberAttribute(this, "cols", "auto");
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Setter for the gap property.
|
|
129
|
+
* @param {number} value The gap between columns.
|
|
130
|
+
*/
|
|
131
|
+
set gap(value) {
|
|
132
|
+
this.setAttribute("gap", value);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Getter for the gap property.
|
|
136
|
+
* @returns {number} The gap between columns.
|
|
137
|
+
*/
|
|
138
|
+
get gap() {
|
|
139
|
+
return getNumberAttribute(this, "gap", "24");
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Setter for the debounce property.
|
|
143
|
+
* @param {number} value The debounce time.
|
|
144
|
+
*/
|
|
145
|
+
set debounce(value) {
|
|
146
|
+
this.setAttribute("debounce", value);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Getter for the debounce property.
|
|
150
|
+
* @returns {number} The debounce time.
|
|
151
|
+
*/
|
|
152
|
+
get debounce() {
|
|
153
|
+
return getNumberAttribute(this, "debounce", DEFAULT_DEBOUNCE_MS);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Getter for the columns property.
|
|
157
|
+
* @returns {Array} An array of all the columns.
|
|
158
|
+
*/
|
|
159
|
+
get columns() {
|
|
160
|
+
return Array.from(this.shadowRoot.querySelectorAll(`.column`));
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Getter for the cssStyleSheet property.
|
|
164
|
+
* @static
|
|
165
|
+
* @returns {CSSStyleSheet} The CSS style sheet for the masonry layout.
|
|
166
|
+
*/
|
|
167
|
+
static get cssStyleSheet() {
|
|
168
|
+
return styles;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Getter for the observedAttributes property.
|
|
172
|
+
* @returns {Array} An array of the observed attributes.
|
|
173
|
+
*/
|
|
174
|
+
static get observedAttributes() {
|
|
175
|
+
return ["max-col-width", "gap", "cols"];
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Callback for when an attribute changes.
|
|
179
|
+
*/
|
|
180
|
+
attributeChangedCallback(name, old, newName) {
|
|
181
|
+
switch (name) {
|
|
182
|
+
case "gap":
|
|
183
|
+
this.style.setProperty(GAP_CSS_VAR_NAME, `${this.gap}px`);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
this.scheduleLayout();
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Callback for when the element is disconnected.
|
|
190
|
+
*/
|
|
191
|
+
beforeDisconnect() {
|
|
192
|
+
this.unsetSlot.removeEventListener("slotchange", this.onSlotChange);
|
|
193
|
+
window.removeEventListener("resize", this.onResize);
|
|
194
|
+
if (this.ro !== null && this.ro !== void 0) {
|
|
195
|
+
this.ro.unobserve(this);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Sets up the attributes for the element.
|
|
200
|
+
*/
|
|
201
|
+
setupAttributes() {
|
|
202
|
+
this.isShadowRoot = "open";
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Draws the element for the masonry layout.
|
|
206
|
+
* @returns {DocumentFragment} The drawn element.
|
|
207
|
+
*/
|
|
208
|
+
draw() {
|
|
209
|
+
let fragment = document.createDocumentFragment();
|
|
210
|
+
let native = document.createElement("div");
|
|
211
|
+
native.setAttribute("id", "unset-items");
|
|
212
|
+
native.setAttribute("part", "native");
|
|
213
|
+
let unsetSlot = document.createElement("slot");
|
|
214
|
+
native.appendChild(unsetSlot);
|
|
215
|
+
this.unsetSlot = unsetSlot;
|
|
216
|
+
this.native = native;
|
|
217
|
+
fragment.appendChild(native);
|
|
218
|
+
return fragment;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Called after the element is drawn.
|
|
222
|
+
*/
|
|
223
|
+
afterDraw() {
|
|
224
|
+
this.onSlotChange();
|
|
225
|
+
this.onResize();
|
|
226
|
+
this.layout();
|
|
227
|
+
this.unsetSlot.addEventListener("slotchange", this.onSlotChange);
|
|
228
|
+
if ("ResizeObserver" in window) {
|
|
229
|
+
this.ro = new ResizeObserver(this.onResize);
|
|
230
|
+
this.ro.observe(this);
|
|
231
|
+
} else {
|
|
232
|
+
window.addEventListener("resize", this.onResize);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Renders the columns.
|
|
237
|
+
* @param {number} colCount The number of columns to render.
|
|
238
|
+
*/
|
|
239
|
+
renderCols(colCount) {
|
|
240
|
+
const columns = this.columns;
|
|
241
|
+
if (columns.length === colCount) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
for (let i = 0; i < colCount; i++) {
|
|
245
|
+
const column = document.createElement("div");
|
|
246
|
+
column.classList.add("column");
|
|
247
|
+
column.setAttribute("part", `column column-${i}`);
|
|
248
|
+
const slot = document.createElement("slot");
|
|
249
|
+
slot.setAttribute("name", i);
|
|
250
|
+
column.appendChild(slot);
|
|
251
|
+
this.context.appendChild(column);
|
|
252
|
+
}
|
|
253
|
+
this.style.setProperty(COL_COUNT_CSS_VAR_NAME, colCount);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Schedules a layout.
|
|
257
|
+
* @param {number} ms The number of milliseconds to wait before laying out.
|
|
258
|
+
*/
|
|
259
|
+
scheduleLayout(ms = this.debounce) {
|
|
260
|
+
debounce(this.layout, ms, this.debounceId);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
Masonry.define("wje-masonry", Masonry);
|
|
264
|
+
export {
|
|
265
|
+
Masonry as default
|
|
266
|
+
};
|
|
267
|
+
//# sourceMappingURL=wje-masonry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wje-masonry.js","sources":["../packages/wje-masonry/service/service.js","../packages/wje-masonry/masonry.element.js","../packages/wje-masonry/masonry.js"],"sourcesContent":["export const DEFAULT_MAX_COL_WIDTH = 500;\nexport const DEFAULT_DEBOUNCE_MS = 300;\n\nexport const COL_COUNT_CSS_VAR_NAME = `--wje-masonry-layout-col-count`;\nexport const GAP_CSS_VAR_NAME = `--wje-masonry-layout-gap`;\n\nexport const ELEMENT_NODE_TYPE = 1;\n\nconst DEBOUNCE_MAP = new Map();\n\n/**\n * Returns a number attribute from an element.\n * @param $elem\n * @param name\n * @param defaultValue\n * @returns {string|number}\n */\nexport function getNumberAttribute($elem, name, defaultValue) {\n const value = parseFloat($elem.getAttribute(name) || '');\n return isNaN(value) ? defaultValue : value;\n}\n\n/**\n * Returns the amount of cols that the masonry grid should have.\n * @param totalWidth\n * @param cols\n * @param maxColWidth\n */\nexport function getColCount(totalWidth, cols, maxColWidth) {\n return isNaN(cols) ? Math.max(1, Math.ceil(totalWidth / maxColWidth)) : cols;\n}\n\n/**\n * Debounces a function.\n * @param cb\n * @param ms\n * @param id\n */\nexport function debounce(cb, ms, id) {\n const existingTimeout = DEBOUNCE_MAP.get(id);\n if (existingTimeout !== null && existingTimeout !== undefined) window.clearTimeout(existingTimeout);\n DEBOUNCE_MAP.set(id, window.setTimeout(cb, ms));\n}\n\n/**\n * Returns the index of the column with the smallest height.\n * @param colHeights\n */\nexport function findSmallestColIndex(colHeights) {\n let smallestIndex = 0;\n let smallestHeight = Infinity;\n\n colHeights.forEach((height, i) => {\n if (height < smallestHeight) {\n smallestHeight = height;\n smallestIndex = i;\n }\n });\n\n return smallestIndex;\n}\n","import { default as WJElement } from '../wje-element/element.js';\nimport {\n COL_COUNT_CSS_VAR_NAME,\n debounce,\n DEFAULT_DEBOUNCE_MS,\n DEFAULT_MAX_COL_WIDTH,\n ELEMENT_NODE_TYPE,\n findSmallestColIndex,\n GAP_CSS_VAR_NAME,\n getColCount,\n getNumberAttribute,\n} from './service/service.js';\nimport styles from './styles/styles.css?inline';\n\n/**\n * `Masonry` is a custom web component that represents a masonry layout.\n * It extends from `WJElement`.\n * @summary This element represents a masonry layout.\n * @documentation https://elements.webjet.sk/components/masonry\n * @status stable\n * @augments {WJElement}\n * @csspart native - The native part of the masonry layout.\n * @csspart column - The individual columns in the masonry layout.\n * @slot - The default slot for the masonry layout.\n * @cssproperty [--wje-masonry-gap=1rem] - The gap between items in the masonry layout. Accepts any valid CSS length. Default is 1rem.\n * @cssproperty [--wje-masonry-layout-col-count=1] - The count column in the masonry layout. Accepts any valid CSS length.\n * @tag wje-masonry\n */\nexport default class Masonry extends WJElement {\n /**\n * Constructor for the Masonry class.\n */\n constructor() {\n super();\n\n this.debounceId = `layout_${Math.random()}`;\n this.ro = undefined;\n this.currentRequestAnimationFrameCallback = undefined;\n this.unsetSlot = undefined;\n }\n\n /**\n * Setter for the maxColWidth property.\n * @param {number} value The maximum column width.\n */\n set maxColWidth(value) {\n this.setAttribute('max-col-width', value);\n }\n\n /**\n * Getter for the maxColWidth property.\n * @returns {number} The maximum column width.\n */\n get maxColWidth() {\n return this.hasAttribute('max-col-width') ? +this.getAttribute('max-col-width') : +DEFAULT_MAX_COL_WIDTH;\n }\n\n /**\n * Setter for the cols property.\n * @param {number} value The number of columns.\n */\n set cols(value) {\n if (this.hasAttribute('cols')) this.setAttribute('cols', value);\n else this.setAttribute('cols', 'auto');\n }\n\n /**\n * Getter for the cols property.\n * @returns {number} The number of columns.\n */\n get cols() {\n return getNumberAttribute(this, 'cols', 'auto');\n }\n\n /**\n * Setter for the gap property.\n * @param {number} value The gap between columns.\n */\n set gap(value) {\n this.setAttribute('gap', value);\n }\n\n /**\n * Getter for the gap property.\n * @returns {number} The gap between columns.\n */\n get gap() {\n return getNumberAttribute(this, 'gap', '24');\n }\n\n /**\n * Setter for the debounce property.\n * @param {number} value The debounce time.\n */\n set debounce(value) {\n this.setAttribute('debounce', value);\n }\n\n /**\n * Getter for the debounce property.\n * @returns {number} The debounce time.\n */\n get debounce() {\n return getNumberAttribute(this, 'debounce', DEFAULT_DEBOUNCE_MS);\n }\n\n /**\n * Getter for the columns property.\n * @returns {Array} An array of all the columns.\n */\n get columns() {\n return Array.from(this.shadowRoot.querySelectorAll(`.column`));\n }\n\n debounceId = `layout_${Math.random()}`;\n\n ro = undefined;\n\n className = 'Masonry';\n\n /**\n * Getter for the cssStyleSheet property.\n * @static\n * @returns {CSSStyleSheet} The CSS style sheet for the masonry layout.\n */\n static get cssStyleSheet() {\n return styles;\n }\n\n /**\n * Getter for the observedAttributes property.\n * @returns {Array} An array of the observed attributes.\n */\n static get observedAttributes() {\n return ['max-col-width', 'gap', 'cols'];\n }\n\n /**\n * Callback for when an attribute changes.\n */\n attributeChangedCallback(name, old, newName) {\n switch (name) {\n case 'gap':\n this.style.setProperty(GAP_CSS_VAR_NAME, `${this.gap}px`);\n break;\n }\n\n this.scheduleLayout();\n }\n\n /**\n * Callback for when the element is disconnected.\n */\n beforeDisconnect() {\n this.unsetSlot.removeEventListener('slotchange', this.onSlotChange);\n window.removeEventListener('resize', this.onResize);\n if (this.ro !== null && this.ro !== undefined) {\n this.ro.unobserve(this);\n }\n }\n\n /**\n * Sets up the attributes for the element.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n }\n\n /**\n * Draws the element for the masonry layout.\n * @returns {DocumentFragment} The drawn element.\n */\n draw() {\n let fragment = document.createDocumentFragment();\n\n let native = document.createElement('div');\n native.setAttribute('id', 'unset-items');\n native.setAttribute('part', 'native');\n\n let unsetSlot = document.createElement('slot');\n\n native.appendChild(unsetSlot);\n\n this.unsetSlot = unsetSlot;\n this.native = native;\n\n fragment.appendChild(native);\n\n return fragment;\n }\n\n /**\n * Called after the element is drawn.\n */\n afterDraw() {\n this.onSlotChange();\n this.onResize();\n this.layout();\n\n this.unsetSlot.addEventListener('slotchange', this.onSlotChange);\n\n if ('ResizeObserver' in window) {\n this.ro = new ResizeObserver(this.onResize);\n this.ro.observe(this);\n } else {\n window.addEventListener('resize', this.onResize);\n }\n }\n\n /**\n * Called when the slot changes.\n */\n onSlotChange = () => {\n const $unsetElements = (this.unsetSlot.assignedNodes() || []).filter(\n (node) => node.nodeType === ELEMENT_NODE_TYPE\n );\n if ($unsetElements.length > 0) {\n this.layout();\n }\n };\n\n /**\n * Called when the window resizes.\n * @param {Array} entries The entries to use.\n */\n onResize = (entries) => {\n const { width } =\n entries !== null && entries !== undefined && Array.isArray(entries) && entries.length > 0\n ? entries[0].contentRect\n : { width: this.offsetWidth };\n const colCount = getColCount(width, this.cols, this.maxColWidth);\n if (colCount !== this.columns.length) {\n this.scheduleLayout();\n }\n };\n\n /**\n * Renders the columns.\n * @param {number} colCount The number of columns to render.\n */\n renderCols(colCount) {\n const columns = this.columns;\n\n if (columns.length === colCount) {\n return;\n }\n\n for (let i = 0; i < colCount; i++) {\n const column = document.createElement('div');\n column.classList.add('column');\n column.setAttribute('part', `column column-${i}`);\n\n const slot = document.createElement('slot');\n slot.setAttribute('name', i);\n\n column.appendChild(slot);\n\n this.context.appendChild(column);\n }\n\n this.style.setProperty(COL_COUNT_CSS_VAR_NAME, colCount);\n }\n\n /**\n * Schedules a layout.\n * @param {number} ms The number of milliseconds to wait before laying out.\n */\n scheduleLayout(ms = this.debounce) {\n debounce(this.layout, ms, this.debounceId);\n }\n\n /**\n * Lays out the element.\n */\n layout = () => {\n if (\n this.currentRequestAnimationFrameCallback !== null &&\n this.currentRequestAnimationFrameCallback !== undefined\n ) {\n window.cancelAnimationFrame(this.currentRequestAnimationFrameCallback);\n }\n\n this.currentRequestAnimationFrameCallback = requestAnimationFrame(() => {\n const gap = this.gap;\n const $elements = Array.from(this.children).filter((node) => node.nodeType === ELEMENT_NODE_TYPE);\n const colCount = getColCount(this.offsetWidth, this.cols, this.maxColWidth);\n const colHeights = Array(colCount).fill(0);\n const writes = [];\n\n for (const elem of $elements) {\n const height = elem.getBoundingClientRect().height;\n let smallestColIndex = findSmallestColIndex(colHeights);\n\n colHeights[smallestColIndex] += height + +gap;\n\n const newSlot = smallestColIndex;\n\n if (elem.slot !== newSlot) {\n writes.push(() => (elem.slot = newSlot));\n }\n }\n\n for (const write of writes) {\n write();\n }\n\n this.renderCols(colCount);\n });\n };\n}\n","import Masonry from './masonry.element.js';\n\nexport default Masonry;\n\nMasonry.define('wje-masonry', Masonry);\n"],"names":[],"mappings":"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"}
|