wj-elements 0.7.6 → 0.8.0

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.
Files changed (234) hide show
  1. package/dist/animations.js +28 -51
  2. package/dist/animations.js.map +1 -1
  3. package/dist/base-path.js +19 -31
  4. package/dist/base-path.js.map +1 -1
  5. package/dist/custom-elements.json +9053 -9048
  6. package/dist/dark.css +1 -302
  7. package/dist/date.js +16 -36
  8. package/dist/date.js.map +1 -1
  9. package/dist/element-utils.js +20 -81
  10. package/dist/element-utils.js.map +1 -1
  11. package/dist/event.js +49 -165
  12. package/dist/event.js.map +1 -1
  13. package/dist/form-associated-element-BjeJn7j8.js +101 -0
  14. package/dist/{form-associated-element-DEQ4y-jn.js.map → form-associated-element-BjeJn7j8.js.map} +1 -1
  15. package/dist/icon-DmsqtDpL.js +102 -0
  16. package/dist/{icon-CReYMzAK.js.map → icon-DmsqtDpL.js.map} +1 -1
  17. package/dist/light.css +1 -731
  18. package/dist/localize.js +36 -111
  19. package/dist/localize.js.map +1 -1
  20. package/dist/packages/wje-accordion-item/accordion-item.element.d.ts +3 -2
  21. package/dist/packages/wje-img/img.element.d.ts +4 -4
  22. package/dist/permissions.js +14 -41
  23. package/dist/permissions.js.map +1 -1
  24. package/dist/popup.element-CbkhthPP.js +806 -0
  25. package/dist/{popup.element-CwXvVFK7.js.map → popup.element-CbkhthPP.js.map} +1 -1
  26. package/dist/router-links-CNsJ-elb.js +105 -0
  27. package/dist/{router-links-wjqCnncc.js.map → router-links-CNsJ-elb.js.map} +1 -1
  28. package/dist/skeleton.css +1 -197
  29. package/dist/styles.css +1 -866
  30. package/dist/universal-service.js +48 -109
  31. package/dist/universal-service.js.map +1 -1
  32. package/dist/utils.js +11 -18
  33. package/dist/utils.js.map +1 -1
  34. package/dist/web-types.json +698 -698
  35. package/dist/wje-accordion-item.js +33 -106
  36. package/dist/wje-accordion-item.js.map +1 -1
  37. package/dist/wje-accordion.js +19 -84
  38. package/dist/wje-accordion.js.map +1 -1
  39. package/dist/wje-animation.js +37 -4258
  40. package/dist/wje-animation.js.map +1 -1
  41. package/dist/wje-aside.js +9 -34
  42. package/dist/wje-aside.js.map +1 -1
  43. package/dist/wje-avatar.js +36 -126
  44. package/dist/wje-avatar.js.map +1 -1
  45. package/dist/wje-badge.js +10 -52
  46. package/dist/wje-badge.js.map +1 -1
  47. package/dist/wje-breadcrumb.js +205 -668
  48. package/dist/wje-breadcrumb.js.map +1 -1
  49. package/dist/wje-breadcrumbs.js +177 -633
  50. package/dist/wje-breadcrumbs.js.map +1 -1
  51. package/dist/wje-button-group.js +48 -153
  52. package/dist/wje-button-group.js.map +1 -1
  53. package/dist/wje-button.js +92 -413
  54. package/dist/wje-button.js.map +1 -1
  55. package/dist/wje-card-content.js +7 -30
  56. package/dist/wje-card-content.js.map +1 -1
  57. package/dist/wje-card-controls.js +7 -30
  58. package/dist/wje-card-controls.js.map +1 -1
  59. package/dist/wje-card-header.js +7 -30
  60. package/dist/wje-card-header.js.map +1 -1
  61. package/dist/wje-card-subtitle.js +7 -34
  62. package/dist/wje-card-subtitle.js.map +1 -1
  63. package/dist/wje-card-title.js +7 -34
  64. package/dist/wje-card-title.js.map +1 -1
  65. package/dist/wje-card.js +15 -71
  66. package/dist/wje-card.js.map +1 -1
  67. package/dist/wje-carousel-item.js +12 -56
  68. package/dist/wje-carousel-item.js.map +1 -1
  69. package/dist/wje-carousel.js +154 -509
  70. package/dist/wje-carousel.js.map +1 -1
  71. package/dist/wje-checkbox.js +50 -227
  72. package/dist/wje-checkbox.js.map +1 -1
  73. package/dist/wje-chip.js +43 -160
  74. package/dist/wje-chip.js.map +1 -1
  75. package/dist/wje-col.js +7 -20
  76. package/dist/wje-col.js.map +1 -1
  77. package/dist/wje-color-picker.js +445 -1464
  78. package/dist/wje-color-picker.js.map +1 -1
  79. package/dist/wje-container.js +9 -35
  80. package/dist/wje-container.js.map +1 -1
  81. package/dist/wje-copy-button.js +64 -204
  82. package/dist/wje-copy-button.js.map +1 -1
  83. package/dist/wje-dialog.js +85 -553
  84. package/dist/wje-dialog.js.map +1 -1
  85. package/dist/wje-divider.js +7 -34
  86. package/dist/wje-divider.js.map +1 -1
  87. package/dist/wje-dropdown.js +78 -305
  88. package/dist/wje-dropdown.js.map +1 -1
  89. package/dist/wje-element.js +191 -700
  90. package/dist/wje-element.js.map +1 -1
  91. package/dist/wje-file-upload-item.js +51 -156
  92. package/dist/wje-file-upload-item.js.map +1 -1
  93. package/dist/wje-file-upload.js +181 -619
  94. package/dist/wje-file-upload.js.map +1 -1
  95. package/dist/wje-footer.js +7 -31
  96. package/dist/wje-footer.js.map +1 -1
  97. package/dist/wje-form.js +7 -32
  98. package/dist/wje-form.js.map +1 -1
  99. package/dist/wje-format-digital.js +26 -118
  100. package/dist/wje-format-digital.js.map +1 -1
  101. package/dist/wje-grid.js +7 -33
  102. package/dist/wje-grid.js.map +1 -1
  103. package/dist/wje-header.js +9 -35
  104. package/dist/wje-header.js.map +1 -1
  105. package/dist/wje-icon-library.js +12 -18
  106. package/dist/wje-icon-library.js.map +1 -1
  107. package/dist/wje-icon-picker.js +65 -320
  108. package/dist/wje-icon-picker.js.map +1 -1
  109. package/dist/wje-icon.js +1 -1
  110. package/dist/wje-img-comparer.js +37 -114
  111. package/dist/wje-img-comparer.js.map +1 -1
  112. package/dist/wje-img.js +50 -197
  113. package/dist/wje-img.js.map +1 -1
  114. package/dist/wje-infinite-scroll.js +94 -346
  115. package/dist/wje-infinite-scroll.js.map +1 -1
  116. package/dist/wje-input-file.js +23 -84
  117. package/dist/wje-input-file.js.map +1 -1
  118. package/dist/wje-input.js +78 -392
  119. package/dist/wje-input.js.map +1 -1
  120. package/dist/wje-item.js +11 -64
  121. package/dist/wje-item.js.map +1 -1
  122. package/dist/wje-kanban.js +124 -401
  123. package/dist/wje-kanban.js.map +1 -1
  124. package/dist/wje-label.js +9 -32
  125. package/dist/wje-label.js.map +1 -1
  126. package/dist/wje-level-indicator.js +38 -157
  127. package/dist/wje-level-indicator.js.map +1 -1
  128. package/dist/wje-list.js +10 -40
  129. package/dist/wje-list.js.map +1 -1
  130. package/dist/wje-main.js +7 -31
  131. package/dist/wje-main.js.map +1 -1
  132. package/dist/wje-masonry.js +66 -211
  133. package/dist/wje-masonry.js.map +1 -1
  134. package/dist/wje-master.js +45 -161
  135. package/dist/wje-master.js.map +1 -1
  136. package/dist/wje-menu-button.js +10 -38
  137. package/dist/wje-menu-button.js.map +1 -1
  138. package/dist/wje-menu-item.js +127 -577
  139. package/dist/wje-menu-item.js.map +1 -1
  140. package/dist/wje-menu-label.js +9 -35
  141. package/dist/wje-menu-label.js.map +1 -1
  142. package/dist/wje-menu.js +14 -49
  143. package/dist/wje-menu.js.map +1 -1
  144. package/dist/wje-option.js +48 -279
  145. package/dist/wje-option.js.map +1 -1
  146. package/dist/wje-options.js +130 -384
  147. package/dist/wje-options.js.map +1 -1
  148. package/dist/wje-orgchart-group.js +16 -52
  149. package/dist/wje-orgchart-group.js.map +1 -1
  150. package/dist/wje-orgchart-item.js +24 -93
  151. package/dist/wje-orgchart-item.js.map +1 -1
  152. package/dist/wje-orgchart.js +18 -68
  153. package/dist/wje-orgchart.js.map +1 -1
  154. package/dist/wje-pagination.js +113 -397
  155. package/dist/wje-pagination.js.map +1 -1
  156. package/dist/wje-popup.js +3 -3
  157. package/dist/wje-popup.js.map +1 -1
  158. package/dist/wje-progress-bar.js +53 -205
  159. package/dist/wje-progress-bar.js.map +1 -1
  160. package/dist/wje-qr-code.js +398 -2980
  161. package/dist/wje-qr-code.js.map +1 -1
  162. package/dist/wje-radio-group.js +52 -190
  163. package/dist/wje-radio-group.js.map +1 -1
  164. package/dist/wje-radio.js +24 -118
  165. package/dist/wje-radio.js.map +1 -1
  166. package/dist/wje-rate.js +62 -266
  167. package/dist/wje-rate.js.map +1 -1
  168. package/dist/wje-relative-time.js +24 -99
  169. package/dist/wje-relative-time.js.map +1 -1
  170. package/dist/wje-reorder-dropzone.js +9 -31
  171. package/dist/wje-reorder-dropzone.js.map +1 -1
  172. package/dist/wje-reorder-handle.js +67 -204
  173. package/dist/wje-reorder-handle.js.map +1 -1
  174. package/dist/wje-reorder-item.js +14 -44
  175. package/dist/wje-reorder-item.js.map +1 -1
  176. package/dist/wje-reorder.js +61 -246
  177. package/dist/wje-reorder.js.map +1 -1
  178. package/dist/wje-route.js +6 -24
  179. package/dist/wje-route.js.map +1 -1
  180. package/dist/wje-router-link.js +11 -39
  181. package/dist/wje-router-link.js.map +1 -1
  182. package/dist/wje-router-outlet.js +76 -172
  183. package/dist/wje-router-outlet.js.map +1 -1
  184. package/dist/wje-routerx.js +537 -1331
  185. package/dist/wje-routerx.js.map +1 -1
  186. package/dist/wje-row.js +9 -31
  187. package/dist/wje-row.js.map +1 -1
  188. package/dist/wje-select.js +326 -1152
  189. package/dist/wje-select.js.map +1 -1
  190. package/dist/wje-slider.js +44 -225
  191. package/dist/wje-slider.js.map +1 -1
  192. package/dist/wje-sliding-container.js +295 -1319
  193. package/dist/wje-sliding-container.js.map +1 -1
  194. package/dist/wje-split-view.js +35 -121
  195. package/dist/wje-split-view.js.map +1 -1
  196. package/dist/wje-status.js +14 -45
  197. package/dist/wje-status.js.map +1 -1
  198. package/dist/wje-step.js +9 -32
  199. package/dist/wje-step.js.map +1 -1
  200. package/dist/wje-stepper.js +109 -357
  201. package/dist/wje-stepper.js.map +1 -1
  202. package/dist/wje-store.js +67 -360
  203. package/dist/wje-store.js.map +1 -1
  204. package/dist/wje-tab-group.js +85 -314
  205. package/dist/wje-tab-group.js.map +1 -1
  206. package/dist/wje-tab-panel.js +7 -28
  207. package/dist/wje-tab-panel.js.map +1 -1
  208. package/dist/wje-tab.js +21 -198
  209. package/dist/wje-tab.js.map +1 -1
  210. package/dist/wje-textarea.js +64 -264
  211. package/dist/wje-textarea.js.map +1 -1
  212. package/dist/wje-thumbnail.js +10 -51
  213. package/dist/wje-thumbnail.js.map +1 -1
  214. package/dist/wje-toast.js +127 -632
  215. package/dist/wje-toast.js.map +1 -1
  216. package/dist/wje-toggle.js +52 -177
  217. package/dist/wje-toggle.js.map +1 -1
  218. package/dist/wje-toolbar-action.js +128 -456
  219. package/dist/wje-toolbar-action.js.map +1 -1
  220. package/dist/wje-toolbar.js +75 -270
  221. package/dist/wje-toolbar.js.map +1 -1
  222. package/dist/wje-tooltip.js +50 -161
  223. package/dist/wje-tooltip.js.map +1 -1
  224. package/dist/wje-tree-item.js +70 -301
  225. package/dist/wje-tree-item.js.map +1 -1
  226. package/dist/wje-tree.js +145 -489
  227. package/dist/wje-tree.js.map +1 -1
  228. package/dist/wje-visually-hidden.js +7 -34
  229. package/dist/wje-visually-hidden.js.map +1 -1
  230. package/package.json +4 -2
  231. package/dist/form-associated-element-DEQ4y-jn.js +0 -245
  232. package/dist/icon-CReYMzAK.js +0 -245
  233. package/dist/popup.element-CwXvVFK7.js +0 -2133
  234. package/dist/router-links-wjqCnncc.js +0 -156
@@ -8,411 +8,159 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
8
8
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
9
9
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10
10
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
11
- var _drawnItems, _loadedItems, _response, _infiniteScrollTemplate, _abortController, _signal, _loading;
12
- import WJElement from "./wje-element.js";
13
- import { WjElementUtils } from "./element-utils.js";
14
- import { event } from "./event.js";
15
- const styles = "/*\n[ Wj infinite Scroll ]\n*/\n\n:host {\n overflow-x: auto;\n width: var(--wje-infinite-scroll-width);\n height: var(--wje-infinite-scroll-height);\n display: block;\n position: relative;\n\n .loading {\n position: sticky;\n inset: 0;\n display: none;\n align-items: center;\n justify-content: center;\n z-index: 1;\n background-color: var(--wje-infinite-scroll-loading-background);\n width: 100%;\n height: 100%;\n &.show {\n display: flex;\n }\n }\n}\n\n[name='ending'] {\n display: none;\n margin-top: 1rem;\n text-align: center;\n}\n\n[name='ending'].show {\n display: block;\n}\n";
16
- class InfiniteScroll extends WJElement {
17
- /**
18
- * Creates an instance of InfiniteScroll.
19
- */
11
+ var _t, _e, _i, _s, _r, _n, _a;
12
+ import t from "./wje-element.js";
13
+ import { WjElementUtils as e } from "./element-utils.js";
14
+ import { event as i } from "./event.js";
15
+ class s extends t {
20
16
  constructor() {
21
17
  super();
22
- __privateAdd(this, _drawnItems);
23
- __privateAdd(this, _loadedItems);
24
- __privateAdd(this, _response);
25
- __privateAdd(this, _infiniteScrollTemplate);
26
- __privateAdd(this, _abortController);
27
- __privateAdd(this, _signal);
28
- __privateAdd(this, _loading);
18
+ __privateAdd(this, _t);
19
+ __privateAdd(this, _e);
20
+ __privateAdd(this, _i);
21
+ __privateAdd(this, _s);
22
+ __privateAdd(this, _r);
23
+ __privateAdd(this, _n);
24
+ __privateAdd(this, _a);
29
25
  __publicField(this, "className", "InfiniteScroll");
30
- /**
31
- * Attaches a scroll event listener to the current object.
32
- * The `scrollEvent` function binds the `onScroll` method to the 'scroll' event
33
- * of the current object. This enables handling of scroll events for
34
- * specific functionality such as updating UI elements, loading content dynamically,
35
- * or tracking user interaction with scrollable content.
36
- */
37
26
  __publicField(this, "scrollEvent", () => {
38
27
  this.addEventListener("scroll", this.onScroll);
39
28
  });
40
- /**
41
- * A function that removes the scroll event listener from the current context.
42
- * This function is used to unbind the `onScroll` event listener
43
- * from the `scroll` event of the current object. It ensures that
44
- * the scroll event no longer triggers the `onScroll` handler.
45
- * @function
46
- */
47
29
  __publicField(this, "unScrollEvent", () => {
48
30
  this.removeEventListener("scroll", this.onScroll);
49
31
  });
50
- /**
51
- * A scroll event handler function that checks the scroll position and triggers loading additional content
52
- * when the user scrolls near the bottom of the page.
53
- * Properties accessed:
54
- * - `scrollTop`: The number of pixels that the content of an element is scrolled vertically.
55
- * - `scrollHeight`: The total height of the element's content.
56
- * - `clientHeight`: The inner height of the element in pixels, including padding but excluding borders and scrollbars.
57
- * Conditions:
58
- * - Determines if the scroll position is within 300 pixels of the bottom of the element.
59
- * - Verifies that the current page number is less than or equal to the total number of pages.
60
- * - Checks if the current page is already in the loading state.
61
- * Actions:
62
- * - Increments the current page number when the conditions are met.
63
- * - Initiates loading for the next page by calling the `loadPages` function.
64
- * @param {Event} e The scroll event object.
65
- */
66
- __publicField(this, "onScroll", (e) => {
67
- const { scrollTop, scrollHeight, clientHeight } = e.target;
68
- if (scrollTop + clientHeight >= scrollHeight - 300 && this.currentPage <= this.totalPages && this.isLoading.includes(this.currentPage)) {
69
- this.currentPage++;
70
- __privateSet(this, _loading, this.loadPages(this.currentPage));
71
- }
32
+ __publicField(this, "onScroll", (t2) => {
33
+ const { scrollTop: e2, scrollHeight: i2, clientHeight: s2 } = t2.target;
34
+ e2 + s2 >= i2 - 300 && this.currentPage <= this.totalPages && this.isLoading.includes(this.currentPage) && (this.currentPage++, __privateSet(this, _a, this.loadPages(this.currentPage)));
72
35
  });
73
- __publicField(this, "compareFunction", (i, item) => i.id === item.id);
74
- /**
75
- * Converts a data item into an HTML element based on a template.
76
- * This function takes a data item, interpolates it into a predefined template,
77
- * parses the resulting HTML string, and returns the first child element of the parsed HTML content.
78
- * @param {object} item The data object to interpolate into the HTML template.
79
- * @returns {Element} The first child element generated from the interpolated HTML string.
80
- */
81
- __publicField(this, "dataToHtml", (item) => {
82
- let interpolateItem = this.interpolate(this.infiniteScrollTemplate, item);
83
- let doc = this.parser.parseFromString(interpolateItem, "text/html");
84
- let element = doc.activeElement.firstElementChild;
85
- return element;
36
+ __publicField(this, "compareFunction", (t2, e2) => t2.id === e2.id);
37
+ __publicField(this, "dataToHtml", (t2) => {
38
+ let e2 = this.interpolate(this.infiniteScrollTemplate, t2);
39
+ return this.parser.parseFromString(e2, "text/html").activeElement.firstElementChild;
86
40
  });
87
- /**
88
- * A custom implementation of the forEach method designed to iterate over an array of data,
89
- * transform each item into an HTML element, and append the element to a specified placement object.
90
- * Additionally, it adds an event listener to each generated element for handling click events.
91
- * @param {Array} data An array of items to process. Each item is transformed into an HTML element
92
- * and appended to the placement object specified in the context of `this`.
93
- */
94
- __publicField(this, "customForeach", (data) => {
95
- data.forEach((item) => {
96
- let element = this.dataToHtml(item);
97
- let symbol = Symbol("infinite-scroll-item");
98
- element[symbol] = item;
99
- item[symbol] = element;
100
- event.addListener(element, "click", "wje-infinite-scroll:click-item", null);
101
- this.placementObj.insertAdjacentElement("beforeend", element);
41
+ __publicField(this, "customForeach", (t2) => {
42
+ t2.forEach((t3) => {
43
+ let e2 = this.dataToHtml(t3), s2 = /* @__PURE__ */ Symbol("infinite-scroll-item");
44
+ e2[s2] = t3, t3[s2] = e2, i.addListener(e2, "click", "wje-infinite-scroll:click-item", null), this.placementObj.insertAdjacentElement("beforeend", e2);
102
45
  });
103
46
  });
104
- /**
105
- * Interpolates a string template with values from the provided parameters object.
106
- * The template contains placeholders in the format `{{key}}` or `{{key.subkey}}`,
107
- * which are replaced with the corresponding values from the `params` object.
108
- * Placeholders support dot notation for accessing nested properties within the `params` object.
109
- * @param {string} template The string template containing placeholders to be replaced.
110
- * @param {object} params The object containing key-value pairs used for substitution in the template.
111
- * @returns {string} A string with all placeholders replaced by their respective values from the `params` object.
112
- */
113
- __publicField(this, "interpolate", (template, params) => {
114
- let keys = template.match(/\{{.*?\}}/g);
115
- if (keys) {
116
- for (let key of keys) {
117
- let cleanKey = key.replace("{{", "").replace("}}", "");
118
- let val = "";
119
- cleanKey.split(".").forEach((k) => {
120
- val = val === "" ? params[k] : val[k];
121
- });
122
- template = template.replace(key, val);
123
- }
47
+ __publicField(this, "interpolate", (t2, e2) => {
48
+ let i2 = t2.match(/\{{.*?\}}/g);
49
+ if (i2) for (let s2 of i2) {
50
+ let i3 = s2.replace("{{", "").replace("}}", ""), r = "";
51
+ i3.split(".").forEach((t3) => {
52
+ r = "" === r ? e2[t3] : r[t3];
53
+ }), t2 = t2.replace(s2, r);
124
54
  }
125
- return template;
55
+ return t2;
126
56
  });
127
- this.totalPages = 0;
128
- this.isLoading = [];
129
- __privateSet(this, _response, {});
130
- this.iterate = null;
131
- __privateSet(this, _infiniteScrollTemplate, null);
132
- __privateSet(this, _abortController, new AbortController());
133
- __privateSet(this, _signal, __privateGet(this, _abortController).signal);
134
- __privateSet(this, _drawnItems, []);
135
- __privateSet(this, _loadedItems, []);
136
- this.placementObj = this;
57
+ this.totalPages = 0, this.isLoading = [], __privateSet(this, _i, {}), this.iterate = null, __privateSet(this, _s, null), __privateSet(this, _r, new AbortController()), __privateSet(this, _n, __privateGet(this, _r).signal), __privateSet(this, _t, []), __privateSet(this, _e, []), this.placementObj = this;
137
58
  }
138
- /**
139
- * Dependencies of the InfiniteScroll component.
140
- * @param value
141
- */
142
- set infiniteScrollTemplate(value) {
143
- __privateSet(this, _infiniteScrollTemplate, value);
59
+ set infiniteScrollTemplate(t2) {
60
+ __privateSet(this, _s, t2);
144
61
  }
145
- /**
146
- * Getter for the infiniteScrollTemplate property.
147
- * @returns {null}
148
- */
149
62
  get infiniteScrollTemplate() {
150
- return __privateGet(this, _infiniteScrollTemplate);
63
+ return __privateGet(this, _s);
151
64
  }
152
- /**
153
- * Dependencies of the InfiniteScroll component.
154
- * @param value
155
- */
156
- set response(value) {
157
- __privateSet(this, _response, value);
65
+ set response(t2) {
66
+ __privateSet(this, _i, t2);
158
67
  }
159
- /**
160
- * Getter for the response property.
161
- * @returns {*|{}}
162
- */
163
68
  get response() {
164
- return __privateGet(this, _response);
69
+ return __privateGet(this, _i);
165
70
  }
166
- /**
167
- * Dependencies of the InfiniteScroll component.
168
- * @param value
169
- */
170
- set objectName(value) {
171
- this.setAttribute("object-name", value);
71
+ set objectName(t2) {
72
+ this.setAttribute("object-name", t2);
172
73
  }
173
74
  get objectName() {
174
75
  return this.getAttribute("object-name") ?? "data";
175
76
  }
176
- /**
177
- * Returns the CSS styles for the component.
178
- * @static
179
- * @returns {CSSStyleSheet}
180
- */
181
77
  static get cssStyleSheet() {
182
- return styles;
78
+ return ":host{overflow-x:auto;width:var(--wje-infinite-scroll-width);height:var(--wje-infinite-scroll-height);display:block;position:relative}:host .loading{position:sticky;top:0;right:0;bottom:0;left:0;display:none;align-items:center;justify-content:center;z-index:1;background-color:var(--wje-infinite-scroll-loading-background);width:100%;height:100%}:host .loading.show{display:flex}[name=ending]{display:none;margin-top:1rem;text-align:center}[name=ending].show{display:block}";
183
79
  }
184
- /**
185
- * Returns the list of attributes to observe for changes.
186
- * @static
187
- * @returns {Array<string>}
188
- */
189
80
  static get observedAttributes() {
190
81
  return [];
191
82
  }
192
- /**
193
- * Sets up the attributes for the component.
194
- */
195
83
  setupAttributes() {
196
- this.isShadowRoot = "open";
197
- this.syncAria();
84
+ this.isShadowRoot = "open", this.syncAria();
198
85
  }
199
- /**
200
- * Prepares the component for updates before it is drawn.
201
- * This method handles the removal of templates for iteration, adjusts the height styling of the component,
202
- * and manages abort signals for loading operations.
203
- * @returns {void} No return value.
204
- */
205
86
  beforeDraw() {
206
- var _a, _b, _c;
207
- __privateSet(this, _loadedItems, []);
208
- __privateSet(this, _drawnItems, []);
209
- this.iterate = this.querySelector("[iterate]");
210
- if (this.iterate) {
211
- if (this.iterate.nodeName !== "TEMPLATE") {
212
- console.error("The iterate attribute must be a template element");
213
- this.infiniteScrollTemplate = (_a = this.iterate) == null ? void 0 : _a.outerHTML;
214
- } else {
215
- this.infiniteScrollTemplate = (_b = this.iterate) == null ? void 0 : _b.innerHTML;
216
- }
217
- (_c = this.iterate) == null ? void 0 : _c.remove();
218
- }
219
- this.setAttribute("style", "height: " + this.height);
220
- if (__privateGet(this, _signal)) {
221
- __privateGet(this, _abortController).abort();
222
- __privateSet(this, _abortController, new AbortController());
223
- __privateSet(this, _signal, __privateGet(this, _abortController).signal);
224
- }
87
+ var _a2, _b, _c;
88
+ __privateSet(this, _e, []), __privateSet(this, _t, []), this.iterate = this.querySelector("[iterate]"), this.iterate && ("TEMPLATE" !== this.iterate.nodeName ? (console.error("The iterate attribute must be a template element"), this.infiniteScrollTemplate = (_a2 = this.iterate) == null ? void 0 : _a2.outerHTML) : this.infiniteScrollTemplate = (_b = this.iterate) == null ? void 0 : _b.innerHTML, (_c = this.iterate) == null ? void 0 : _c.remove()), this.setAttribute("style", "height: " + this.height), __privateGet(this, _n) && (__privateGet(this, _r).abort(), __privateSet(this, _r, new AbortController()), __privateSet(this, _n, __privateGet(this, _r).signal));
225
89
  }
226
- /**
227
- * Creates and returns a document fragment containing the structure for an infinite scroll component.
228
- * The structure includes native elements, slots for customization, and optional loading content.
229
- * @returns {DocumentFragment} The document fragment containing the component's DOM structure.
230
- */
231
90
  draw() {
232
- let fragment = document.createDocumentFragment();
233
- let native = document.createElement("div");
234
- native.classList.add("native-infinite-scroll");
235
- native.setAttribute("part", "native-infinite-scroll");
236
- let slot = document.createElement("slot");
237
- let ending = document.createElement("slot");
238
- ending.setAttribute("name", "ending");
239
- if (WjElementUtils.hasSlot(this, "loader")) {
240
- let loading = document.createElement("div");
241
- loading.classList.add("loading");
242
- let loader = document.createElement("slot");
243
- loader.setAttribute("name", "loader");
244
- loading.appendChild(loader);
245
- this.loadingEl = loading;
246
- fragment.appendChild(loading);
91
+ let t2 = document.createDocumentFragment(), i2 = document.createElement("div");
92
+ i2.classList.add("native-infinite-scroll"), i2.setAttribute("part", "native-infinite-scroll");
93
+ let s2 = document.createElement("slot"), r = document.createElement("slot");
94
+ if (r.setAttribute("name", "ending"), e.hasSlot(this, "loader")) {
95
+ let e2 = document.createElement("div");
96
+ e2.classList.add("loading");
97
+ let i3 = document.createElement("slot");
98
+ i3.setAttribute("name", "loader"), e2.appendChild(i3), this.loadingEl = e2, t2.appendChild(e2);
247
99
  }
248
- native.appendChild(slot);
249
- native.appendChild(ending);
250
- fragment.appendChild(native);
251
- this.endingEl = ending;
252
- return fragment;
100
+ return i2.appendChild(s2), i2.appendChild(r), t2.appendChild(i2), this.endingEl = r, t2;
253
101
  }
254
- /**
255
- * Called after the component has been drawn.
256
- */
257
102
  async afterDraw() {
258
- this.syncAria();
259
- this.queryParams = this.queryParams || "";
260
- this.size = +this.size || 10;
261
- this.currentPage = 0;
262
- this.scrollEvent();
263
- __privateSet(this, _loading, this.loadPages(this.currentPage));
264
- await __privateGet(this, _loading);
103
+ this.syncAria(), this.queryParams = this.queryParams || "", this.size = +this.size || 10, this.currentPage = 0, this.scrollEvent(), __privateSet(this, _a, this.loadPages(this.currentPage)), await __privateGet(this, _a);
265
104
  }
266
- /**
267
- * Sync ARIA attributes on host.
268
- */
269
105
  syncAria() {
270
- if (!this.hasAttribute("role")) {
271
- this.setAriaState({ role: "list" });
272
- }
106
+ this.hasAttribute("role") || this.setAriaState({ role: "list" });
273
107
  }
274
- /**
275
- * Fetches the pages from the server.
276
- * @param {number} page The page number.
277
- * @returns {Promise<object>} The response from the server.
278
- */
279
- async getPages(page) {
280
- var _a;
281
- let hasParams = (_a = this.url) == null ? void 0 : _a.includes("?");
282
- const response = await fetch(
283
- `${this.url}${hasParams ? "&" : "?"}page=${page}&size=${this.size}${this == null ? void 0 : this.queryParams}`,
284
- {
285
- signal: __privateGet(this, _signal)
286
- }
287
- );
288
- if (!response.ok) {
289
- throw new Error(`An error occurred: ${response.status}`);
290
- }
291
- return await response.json();
108
+ async getPages(t2) {
109
+ var _a2;
110
+ let e2 = (_a2 = this.url) == null ? void 0 : _a2.includes("?");
111
+ const i2 = await fetch(`${this.url}${e2 ? "&" : "?"}page=${t2}&size=${this.size}${this == null ? void 0 : this.queryParams}`, { signal: __privateGet(this, _n) });
112
+ if (!i2.ok) throw new Error(`An error occurred: ${i2.status}`);
113
+ return await i2.json();
292
114
  }
293
- /**
294
- * Hides the loader.
295
- */
296
115
  hideLoader() {
297
- var _a;
298
- (_a = this == null ? void 0 : this.loadingEl) == null ? void 0 : _a.classList.remove("show");
116
+ var _a2;
117
+ (_a2 = this == null ? void 0 : this.loadingEl) == null ? void 0 : _a2.classList.remove("show");
299
118
  }
300
- /**
301
- * Displays the loader element by adding the 'show' class to its class list.
302
- * This method is useful for indicating a loading or processing state in the UI.
303
- * @returns {void} No return value.
304
- */
305
119
  showLoader() {
306
- var _a;
307
- (_a = this == null ? void 0 : this.loadingEl) == null ? void 0 : _a.classList.add("show");
120
+ var _a2;
121
+ (_a2 = this == null ? void 0 : this.loadingEl) == null ? void 0 : _a2.classList.add("show");
308
122
  }
309
- /**
310
- * Checks if there are more pages to load.
311
- * @param {number} page The page number.
312
- * @returns {boolean} Whether there are more pages to load.
313
- */
314
- hasMorePages(page) {
315
- return this.totalPages === 0 || page < this.totalPages;
123
+ hasMorePages(t2) {
124
+ return 0 === this.totalPages || t2 < this.totalPages;
316
125
  }
317
- /**
318
- * Loads the pages.
319
- * @param {number} page The page number.
320
- */
321
- async loadPages(page) {
126
+ async loadPages(t2) {
322
127
  this.showLoader();
323
128
  try {
324
- event.dispatchCustomEvent(this, "wje-infinite-scroll:start");
325
- if (this.hasMorePages(page)) {
326
- let response;
327
- this.parser = new DOMParser();
328
- if (typeof this.setCustomData === "function") {
329
- response = await this.setCustomData(page, __privateGet(this, _signal));
330
- } else {
331
- response = await this.getPages(page);
332
- }
333
- this.totalPages = Number((response == null ? void 0 : response.totalPages) ?? 0);
334
- this.currentPage = page;
335
- this.placementObj = this;
336
- if (this.hasAttribute("placement")) this.placementObj = this.querySelector(this.placement);
337
- event.dispatchCustomEvent(this, "wje-infinite-scroll:load", response);
338
- this.response = response;
339
- let items;
340
- if (Array.isArray(response)) {
341
- items = response;
342
- } else if (this.objectName && Array.isArray(response == null ? void 0 : response[this.objectName])) {
343
- items = response[this.objectName];
344
- } else if (Array.isArray(response == null ? void 0 : response.content)) {
345
- items = response.content;
346
- } else {
347
- items = [];
348
- }
349
- __privateSet(this, _loadedItems, items);
350
- const notDrawnItems = __privateGet(this, _loadedItems).filter(
351
- (item) => !__privateGet(this, _drawnItems).some(this.compareFunction.bind(this, item))
352
- );
353
- this.customForeach(notDrawnItems);
354
- __privateGet(this, _drawnItems).push(...notDrawnItems);
355
- this.isLoading.push(page);
356
- event.dispatchCustomEvent(this, "wje-infinite-scroll:finish", response);
357
- } else {
358
- event.dispatchCustomEvent(this, "wje-infinite-scroll:complete");
359
- this.endingEl.classList.add("show");
360
- }
361
- } catch (error) {
362
- console.error(error);
129
+ if (i.dispatchCustomEvent(this, "wje-infinite-scroll:start"), this.hasMorePages(t2)) {
130
+ let e2, s2;
131
+ this.parser = new DOMParser(), e2 = "function" == typeof this.setCustomData ? await this.setCustomData(t2, __privateGet(this, _n)) : await this.getPages(t2), this.totalPages = Number((e2 == null ? void 0 : e2.totalPages) ?? 0), this.currentPage = t2, this.placementObj = this, this.hasAttribute("placement") && (this.placementObj = this.querySelector(this.placement)), i.dispatchCustomEvent(this, "wje-infinite-scroll:load", e2), this.response = e2, s2 = Array.isArray(e2) ? e2 : this.objectName && Array.isArray(e2 == null ? void 0 : e2[this.objectName]) ? e2[this.objectName] : Array.isArray(e2 == null ? void 0 : e2.content) ? e2.content : [], __privateSet(this, _e, s2);
132
+ const r = __privateGet(this, _e).filter((t3) => !__privateGet(this, _t).some(this.compareFunction.bind(this, t3)));
133
+ this.customForeach(r), __privateGet(this, _t).push(...r), this.isLoading.push(t2), i.dispatchCustomEvent(this, "wje-infinite-scroll:finish", e2);
134
+ } else i.dispatchCustomEvent(this, "wje-infinite-scroll:complete"), this.endingEl.classList.add("show");
135
+ } catch (t3) {
136
+ console.error(t3);
363
137
  } finally {
364
138
  this.hideLoader();
365
139
  }
366
140
  }
367
- addItem(item, place = "beforeend") {
368
- let element = this.dataToHtml(item);
369
- let symbol = Symbol("infinite-scroll-item");
370
- element[symbol] = item;
371
- item[symbol] = element;
372
- this.placementObj.insertAdjacentElement(place, element);
373
- __privateGet(this, _drawnItems).push(item);
374
- if (__privateGet(this, _drawnItems).length > this.size * this.currentPage) {
375
- this.totalPages += 1;
376
- }
141
+ addItem(t2, e2 = "beforeend") {
142
+ let i2 = this.dataToHtml(t2), s2 = /* @__PURE__ */ Symbol("infinite-scroll-item");
143
+ i2[s2] = t2, t2[s2] = i2, this.placementObj.insertAdjacentElement(e2, i2), __privateGet(this, _t).push(t2), __privateGet(this, _t).length > this.size * this.currentPage && (this.totalPages += 1);
377
144
  }
378
- removeItem(item) {
379
- let drawnItem = __privateGet(this, _drawnItems).find(this.compareFunction.bind(this, item));
380
- if (!drawnItem) {
381
- console.error("Item not found");
382
- return;
383
- }
384
- let symbol = Object.getOwnPropertySymbols(drawnItem).at(0);
385
- let element = drawnItem[symbol];
386
- if (!element) {
387
- console.error("Element not found");
388
- return;
389
- }
390
- element == null ? void 0 : element.remove();
391
- __privateSet(this, _drawnItems, __privateGet(this, _drawnItems).filter((i) => i !== item));
392
- if (__privateGet(this, _drawnItems).length < this.size * this.currentPage) {
393
- this.isLoading = this.isLoading.filter((i) => i !== this.currentPage);
394
- this.currentPage--;
395
- }
145
+ removeItem(t2) {
146
+ let e2 = __privateGet(this, _t).find(this.compareFunction.bind(this, t2));
147
+ if (!e2) return void console.error("Item not found");
148
+ let i2 = e2[Object.getOwnPropertySymbols(e2).at(0)];
149
+ i2 ? (i2 == null ? void 0 : i2.remove(), __privateSet(this, _t, __privateGet(this, _t).filter((e3) => e3 !== t2)), __privateGet(this, _t).length < this.size * this.currentPage && (this.isLoading = this.isLoading.filter((t3) => t3 !== this.currentPage), this.currentPage--)) : console.error("Element not found");
396
150
  }
397
151
  reset() {
398
- this.isLoading = [];
399
- this.currentPage = 0;
400
- this.totalPages = 0;
401
- this.response = {};
402
- __privateSet(this, _drawnItems, []);
403
- __privateSet(this, _loadedItems, []);
404
- this.placementObj.innerHTML = "";
152
+ this.isLoading = [], this.currentPage = 0, this.totalPages = 0, this.response = {}, __privateSet(this, _t, []), __privateSet(this, _e, []), this.placementObj.innerHTML = "";
405
153
  }
406
154
  }
407
- _drawnItems = new WeakMap();
408
- _loadedItems = new WeakMap();
409
- _response = new WeakMap();
410
- _infiniteScrollTemplate = new WeakMap();
411
- _abortController = new WeakMap();
412
- _signal = new WeakMap();
413
- _loading = new WeakMap();
414
- InfiniteScroll.define("wje-infinite-scroll", InfiniteScroll);
155
+ _t = new WeakMap();
156
+ _e = new WeakMap();
157
+ _i = new WeakMap();
158
+ _s = new WeakMap();
159
+ _r = new WeakMap();
160
+ _n = new WeakMap();
161
+ _a = new WeakMap();
162
+ s.define("wje-infinite-scroll", s);
415
163
  export {
416
- InfiniteScroll as default
164
+ s as default
417
165
  };
418
166
  //# sourceMappingURL=wje-infinite-scroll.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wje-infinite-scroll.js","sources":["../packages/wje-infinite-scroll/infinite-scroll.element.js","../packages/wje-infinite-scroll/infinite-scroll.js"],"sourcesContent":["import { default as WJElement, event, WjElementUtils } from '../wje-element/element.js';\nimport styles from './styles/styles.css?inline';\n\n/**\n * `InfiniteScroll` is a custom web component that represents an infinite scroll.\n * It extends from `WJElement`.\n * @summary This element allows users to scroll through a potentially infinite amount of content.\n * @documentation https://elements.webjet.sk/components/infinite-scroll\n * @status stable\n * @augments {WJElement}\n * @csspart loader - The loader part of the infinite scroll.\n * @slot - The default slot for the infinite scroll.\n * @cssproperty [--wje-infinite-scroll-width=100%] - Sets the width of the infinite scroll container. his property determines how wide the infinite scroll area will be relative to its parent element. Accepts any valid CSS width value, such as percentages (`%`), pixels (`px`), or viewport units (`vw`). The default value is `100%`, which makes it span the full width of its container.\n * @cssproperty [--wje-infinite-scroll-height=300px] - Defines the height of the infinite scroll container. This property specifies how tall the infinite scroll area should be. Accepts any valid CSS height value, such as pixels (`px`), percentages (`%`), or viewport units (`vh`). The default value is `300px`, providing a fixed height suitable for most use cases.\n * //@fires wje-infinite-scroll:click-item - Event fired when an item is clicked.\n * @tag wje-infinite-scroll\n */\n\nexport default class InfiniteScroll extends WJElement {\n #drawnItems;\n #loadedItems;\n #response;\n #infiniteScrollTemplate;\n #abortController;\n #signal;\n #loading;\n /**\n * Creates an instance of InfiniteScroll.\n */\n constructor() {\n super();\n\n this.totalPages = 0;\n this.isLoading = [];\n this.#response = {};\n this.iterate = null;\n this.#infiniteScrollTemplate = null;\n this.#abortController = new AbortController();\n this.#signal = this.#abortController.signal;\n this.#drawnItems = [];\n this.#loadedItems = [];\n this.placementObj = this;\n }\n\n /**\n * Dependencies of the InfiniteScroll component.\n * @param value\n */\n set infiniteScrollTemplate(value) {\n this.#infiniteScrollTemplate = value;\n }\n\n /**\n * Getter for the infiniteScrollTemplate property.\n * @returns {null}\n */\n get infiniteScrollTemplate() {\n return this.#infiniteScrollTemplate;\n }\n\n /**\n * Dependencies of the InfiniteScroll component.\n * @param value\n */\n set response(value) {\n this.#response = value;\n }\n\n /**\n * Getter for the response property.\n * @returns {*|{}}\n */\n get response() {\n return this.#response;\n }\n\n /**\n * Dependencies of the InfiniteScroll component.\n * @param value\n */\n set objectName(value) {\n this.setAttribute('object-name', value);\n }\n\n get objectName() {\n return this.getAttribute('object-name') ?? 'data';\n }\n\n className = 'InfiniteScroll';\n\n /**\n * Returns the CSS styles for the component.\n * @static\n * @returns {CSSStyleSheet}\n */\n static get cssStyleSheet() {\n return styles;\n }\n\n /**\n * Returns the list of attributes to observe for changes.\n * @static\n * @returns {Array<string>}\n */\n static get observedAttributes() {\n return [];\n }\n\n /**\n * Sets up the attributes for the component.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n this.syncAria();\n }\n\n /**\n * Prepares the component for updates before it is drawn.\n * This method handles the removal of templates for iteration, adjusts the height styling of the component,\n * and manages abort signals for loading operations.\n * @returns {void} No return value.\n */\n beforeDraw() {\n this.#loadedItems = [];\n this.#drawnItems = [];\n\n this.iterate = this.querySelector('[iterate]');\n\n if (this.iterate) {\n if (this.iterate.nodeName !== 'TEMPLATE') {\n console.error('The iterate attribute must be a template element');\n this.infiniteScrollTemplate = this.iterate?.outerHTML;\n } else {\n this.infiniteScrollTemplate = this.iterate?.innerHTML;\n }\n\n this.iterate?.remove(); // remove template\n }\n\n this.setAttribute('style', 'height: ' + this.height);\n\n // if this.#loading is not fulfilled then cancel the promise\n if (this.#signal) {\n this.#abortController.abort();\n this.#abortController = new AbortController();\n this.#signal = this.#abortController.signal;\n }\n }\n\n /**\n * Creates and returns a document fragment containing the structure for an infinite scroll component.\n * The structure includes native elements, slots for customization, and optional loading content.\n * @returns {DocumentFragment} The document fragment containing the component's DOM structure.\n */\n draw() {\n let fragment = document.createDocumentFragment();\n\n let native = document.createElement('div');\n native.classList.add('native-infinite-scroll');\n native.setAttribute('part', 'native-infinite-scroll');\n\n let slot = document.createElement('slot');\n\n let ending = document.createElement('slot');\n ending.setAttribute('name', 'ending');\n\n if (WjElementUtils.hasSlot(this, 'loader')) {\n let loading = document.createElement('div');\n loading.classList.add('loading');\n\n let loader = document.createElement('slot');\n loader.setAttribute('name', 'loader');\n\n loading.appendChild(loader);\n\n this.loadingEl = loading;\n\n fragment.appendChild(loading);\n }\n\n native.appendChild(slot);\n native.appendChild(ending);\n\n fragment.appendChild(native);\n\n this.endingEl = ending;\n\n return fragment;\n }\n\n /**\n * Called after the component has been drawn.\n */\n async afterDraw() {\n this.syncAria();\n this.queryParams = this.queryParams || '';\n this.size = +this.size || 10;\n this.currentPage = 0;\n\n this.scrollEvent();\n this.#loading = this.loadPages(this.currentPage);\n await this.#loading;\n }\n\n /**\n * Sync ARIA attributes on host.\n */\n syncAria() {\n if (!this.hasAttribute('role')) {\n this.setAriaState({ role: 'list' });\n }\n }\n\n /**\n * Attaches a scroll event listener to the current object.\n * The `scrollEvent` function binds the `onScroll` method to the 'scroll' event\n * of the current object. This enables handling of scroll events for\n * specific functionality such as updating UI elements, loading content dynamically,\n * or tracking user interaction with scrollable content.\n */\n scrollEvent = () => {\n this.addEventListener('scroll', this.onScroll);\n };\n\n /**\n * A function that removes the scroll event listener from the current context.\n * This function is used to unbind the `onScroll` event listener\n * from the `scroll` event of the current object. It ensures that\n * the scroll event no longer triggers the `onScroll` handler.\n * @function\n */\n unScrollEvent = () => {\n this.removeEventListener('scroll', this.onScroll);\n };\n\n /**\n * A scroll event handler function that checks the scroll position and triggers loading additional content\n * when the user scrolls near the bottom of the page.\n * Properties accessed:\n * - `scrollTop`: The number of pixels that the content of an element is scrolled vertically.\n * - `scrollHeight`: The total height of the element's content.\n * - `clientHeight`: The inner height of the element in pixels, including padding but excluding borders and scrollbars.\n * Conditions:\n * - Determines if the scroll position is within 300 pixels of the bottom of the element.\n * - Verifies that the current page number is less than or equal to the total number of pages.\n * - Checks if the current page is already in the loading state.\n * Actions:\n * - Increments the current page number when the conditions are met.\n * - Initiates loading for the next page by calling the `loadPages` function.\n * @param {Event} e The scroll event object.\n */\n onScroll = (e) => {\n const { scrollTop, scrollHeight, clientHeight } = e.target;\n\n if (\n scrollTop + clientHeight >= scrollHeight - 300 &&\n this.currentPage <= this.totalPages &&\n this.isLoading.includes(this.currentPage)\n ) {\n this.currentPage++;\n this.#loading = this.loadPages(this.currentPage);\n }\n };\n\n /**\n * Fetches the pages from the server.\n * @param {number} page The page number.\n * @returns {Promise<object>} The response from the server.\n */\n async getPages(page) {\n let hasParams = this.url?.includes('?');\n const response = await fetch(\n `${this.url}${hasParams ? '&' : '?'}page=${page}&size=${this.size}${this?.queryParams}`,\n {\n signal: this.#signal,\n }\n );\n\n if (!response.ok) {\n throw new Error(`An error occurred: ${response.status}`);\n }\n return await response.json();\n }\n\n /**\n * Hides the loader.\n */\n hideLoader() {\n this?.loadingEl?.classList.remove('show');\n }\n\n /**\n * Displays the loader element by adding the 'show' class to its class list.\n * This method is useful for indicating a loading or processing state in the UI.\n * @returns {void} No return value.\n */\n showLoader() {\n this?.loadingEl?.classList.add('show');\n }\n\n /**\n * Checks if there are more pages to load.\n * @param {number} page The page number.\n * @returns {boolean} Whether there are more pages to load.\n */\n hasMorePages(page) {\n return this.totalPages === 0 || page < this.totalPages;\n }\n\n /**\n * Loads the pages.\n * @param {number} page The page number.\n */\n async loadPages(page) {\n this.showLoader();\n try {\n event.dispatchCustomEvent(this, 'wje-infinite-scroll:start');\n if (this.hasMorePages(page)) {\n let response;\n this.parser = new DOMParser();\n\n if (typeof this.setCustomData === 'function') {\n response = await this.setCustomData(page, this.#signal);\n } else {\n response = await this.getPages(page);\n }\n\n this.totalPages = Number(response?.totalPages ?? 0);\n this.currentPage = page;\n\n this.placementObj = this;\n\n // if there is a \"container\" attribute, find the element\n if (this.hasAttribute('placement')) this.placementObj = this.querySelector(this.placement);\n\n event.dispatchCustomEvent(this, 'wje-infinite-scroll:load', response);\n\n this.response = response;\n\n // Normalize items: support array responses and common paged formats.\n let items;\n if (Array.isArray(response)) {\n items = response;\n } else if (this.objectName && Array.isArray(response?.[this.objectName])) {\n items = response[this.objectName];\n } else if (Array.isArray(response?.content)) {\n // common Spring pageable style\n items = response.content;\n } else {\n items = [];\n }\n\n this.#loadedItems = items;\n\n const notDrawnItems = this.#loadedItems.filter(\n (item) => !this.#drawnItems.some(this.compareFunction.bind(this, item))\n );\n this.customForeach(notDrawnItems);\n this.#drawnItems.push(...notDrawnItems);\n\n this.isLoading.push(page);\n event.dispatchCustomEvent(this, 'wje-infinite-scroll:finish', response);\n } else {\n event.dispatchCustomEvent(this, 'wje-infinite-scroll:complete');\n this.endingEl.classList.add('show');\n }\n } catch (error) {\n console.error(error);\n } finally {\n this.hideLoader();\n }\n }\n\n compareFunction = (i, item) => i.id === item.id;\n\n /**\n * Converts a data item into an HTML element based on a template.\n * This function takes a data item, interpolates it into a predefined template,\n * parses the resulting HTML string, and returns the first child element of the parsed HTML content.\n * @param {object} item The data object to interpolate into the HTML template.\n * @returns {Element} The first child element generated from the interpolated HTML string.\n */\n dataToHtml = (item) => {\n let interpolateItem = this.interpolate(this.infiniteScrollTemplate, item);\n let doc = this.parser.parseFromString(interpolateItem, 'text/html');\n let element = doc.activeElement.firstElementChild;\n\n return element;\n };\n\n /**\n * A custom implementation of the forEach method designed to iterate over an array of data,\n * transform each item into an HTML element, and append the element to a specified placement object.\n * Additionally, it adds an event listener to each generated element for handling click events.\n * @param {Array} data An array of items to process. Each item is transformed into an HTML element\n * and appended to the placement object specified in the context of `this`.\n */\n customForeach = (data) => {\n data.forEach((item) => {\n let element = this.dataToHtml(item);\n\n let symbol = Symbol(\"infinite-scroll-item\");\n element[symbol] = item;\n item[symbol] = element;\n\n event.addListener(element, 'click', 'wje-infinite-scroll:click-item', null);\n\n this.placementObj.insertAdjacentElement('beforeend', element);\n });\n };\n\n /**\n * Interpolates a string template with values from the provided parameters object.\n * The template contains placeholders in the format `{{key}}` or `{{key.subkey}}`,\n * which are replaced with the corresponding values from the `params` object.\n * Placeholders support dot notation for accessing nested properties within the `params` object.\n * @param {string} template The string template containing placeholders to be replaced.\n * @param {object} params The object containing key-value pairs used for substitution in the template.\n * @returns {string} A string with all placeholders replaced by their respective values from the `params` object.\n */\n interpolate = (template, params) => {\n let keys = template.match(/\\{{.*?\\}}/g);\n\n if (keys) {\n for (let key of keys) {\n let cleanKey = key.replace('{{', '').replace('}}', '');\n let val = '';\n cleanKey.split('.').forEach((k) => {\n val = val === '' ? params[k] : val[k];\n });\n\n template = template.replace(key, val);\n }\n }\n return template;\n };\n\n addItem(item, place = 'beforeend') {\n let element = this.dataToHtml(item);\n\n let symbol = Symbol(\"infinite-scroll-item\");\n element[symbol] = item;\n item[symbol] = element;\n\n this.placementObj.insertAdjacentElement(place, element);\n\n this.#drawnItems.push(item);\n\n // if drawnItems are more than page * size then add the page to isLoading\n if (this.#drawnItems.length > this.size * this.currentPage) {\n this.totalPages += 1;\n }\n }\n\n removeItem(item) {\n let drawnItem = this.#drawnItems.find(this.compareFunction.bind(this, item));\n if (!drawnItem) {\n console.error('Item not found');\n return;\n }\n let symbol = Object.getOwnPropertySymbols(drawnItem).at(0);\n let element = drawnItem[symbol];\n if (!element) {\n console.error('Element not found');\n return;\n }\n\n element?.remove();\n\n this.#drawnItems = this.#drawnItems.filter((i) => i !== item);\n // if drawnItems are less than page * size then remove the page from isLoading\n if (this.#drawnItems.length < this.size * this.currentPage) {\n this.isLoading = this.isLoading.filter((i) => i !== this.currentPage);\n this.currentPage--;\n }\n }\n\n reset() {\n this.isLoading = [];\n this.currentPage = 0;\n this.totalPages = 0;\n this.response = {};\n this.#drawnItems = [];\n this.#loadedItems = [];\n this.placementObj.innerHTML = '';\n }\n}\n","import InfiniteScroll from './infinite-scroll.element.js';\n\nexport default InfiniteScroll;\n\nInfiniteScroll.define('wje-infinite-scroll', InfiniteScroll);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wje-infinite-scroll.js","sources":["../packages/wje-infinite-scroll/infinite-scroll.element.js","../packages/wje-infinite-scroll/infinite-scroll.js"],"sourcesContent":["import { default as WJElement, event, WjElementUtils } from '../wje-element/element.js';\nimport styles from './styles/styles.css?inline';\n\n/**\n * `InfiniteScroll` is a custom web component that represents an infinite scroll.\n * It extends from `WJElement`.\n * @summary This element allows users to scroll through a potentially infinite amount of content.\n * @documentation https://elements.webjet.sk/components/infinite-scroll\n * @status stable\n * @augments {WJElement}\n * @csspart loader - The loader part of the infinite scroll.\n * @slot - The default slot for the infinite scroll.\n * @cssproperty [--wje-infinite-scroll-width=100%] - Sets the width of the infinite scroll container. his property determines how wide the infinite scroll area will be relative to its parent element. Accepts any valid CSS width value, such as percentages (`%`), pixels (`px`), or viewport units (`vw`). The default value is `100%`, which makes it span the full width of its container.\n * @cssproperty [--wje-infinite-scroll-height=300px] - Defines the height of the infinite scroll container. This property specifies how tall the infinite scroll area should be. Accepts any valid CSS height value, such as pixels (`px`), percentages (`%`), or viewport units (`vh`). The default value is `300px`, providing a fixed height suitable for most use cases.\n * //@fires wje-infinite-scroll:click-item - Event fired when an item is clicked.\n * @tag wje-infinite-scroll\n */\n\nexport default class InfiniteScroll extends WJElement {\n #drawnItems;\n #loadedItems;\n #response;\n #infiniteScrollTemplate;\n #abortController;\n #signal;\n #loading;\n /**\n * Creates an instance of InfiniteScroll.\n */\n constructor() {\n super();\n\n this.totalPages = 0;\n this.isLoading = [];\n this.#response = {};\n this.iterate = null;\n this.#infiniteScrollTemplate = null;\n this.#abortController = new AbortController();\n this.#signal = this.#abortController.signal;\n this.#drawnItems = [];\n this.#loadedItems = [];\n this.placementObj = this;\n }\n\n /**\n * Dependencies of the InfiniteScroll component.\n * @param value\n */\n set infiniteScrollTemplate(value) {\n this.#infiniteScrollTemplate = value;\n }\n\n /**\n * Getter for the infiniteScrollTemplate property.\n * @returns {null}\n */\n get infiniteScrollTemplate() {\n return this.#infiniteScrollTemplate;\n }\n\n /**\n * Dependencies of the InfiniteScroll component.\n * @param value\n */\n set response(value) {\n this.#response = value;\n }\n\n /**\n * Getter for the response property.\n * @returns {*|{}}\n */\n get response() {\n return this.#response;\n }\n\n /**\n * Dependencies of the InfiniteScroll component.\n * @param value\n */\n set objectName(value) {\n this.setAttribute('object-name', value);\n }\n\n get objectName() {\n return this.getAttribute('object-name') ?? 'data';\n }\n\n className = 'InfiniteScroll';\n\n /**\n * Returns the CSS styles for the component.\n * @static\n * @returns {CSSStyleSheet}\n */\n static get cssStyleSheet() {\n return styles;\n }\n\n /**\n * Returns the list of attributes to observe for changes.\n * @static\n * @returns {Array<string>}\n */\n static get observedAttributes() {\n return [];\n }\n\n /**\n * Sets up the attributes for the component.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n this.syncAria();\n }\n\n /**\n * Prepares the component for updates before it is drawn.\n * This method handles the removal of templates for iteration, adjusts the height styling of the component,\n * and manages abort signals for loading operations.\n * @returns {void} No return value.\n */\n beforeDraw() {\n this.#loadedItems = [];\n this.#drawnItems = [];\n\n this.iterate = this.querySelector('[iterate]');\n\n if (this.iterate) {\n if (this.iterate.nodeName !== 'TEMPLATE') {\n console.error('The iterate attribute must be a template element');\n this.infiniteScrollTemplate = this.iterate?.outerHTML;\n } else {\n this.infiniteScrollTemplate = this.iterate?.innerHTML;\n }\n\n this.iterate?.remove(); // remove template\n }\n\n this.setAttribute('style', 'height: ' + this.height);\n\n // if this.#loading is not fulfilled then cancel the promise\n if (this.#signal) {\n this.#abortController.abort();\n this.#abortController = new AbortController();\n this.#signal = this.#abortController.signal;\n }\n }\n\n /**\n * Creates and returns a document fragment containing the structure for an infinite scroll component.\n * The structure includes native elements, slots for customization, and optional loading content.\n * @returns {DocumentFragment} The document fragment containing the component's DOM structure.\n */\n draw() {\n let fragment = document.createDocumentFragment();\n\n let native = document.createElement('div');\n native.classList.add('native-infinite-scroll');\n native.setAttribute('part', 'native-infinite-scroll');\n\n let slot = document.createElement('slot');\n\n let ending = document.createElement('slot');\n ending.setAttribute('name', 'ending');\n\n if (WjElementUtils.hasSlot(this, 'loader')) {\n let loading = document.createElement('div');\n loading.classList.add('loading');\n\n let loader = document.createElement('slot');\n loader.setAttribute('name', 'loader');\n\n loading.appendChild(loader);\n\n this.loadingEl = loading;\n\n fragment.appendChild(loading);\n }\n\n native.appendChild(slot);\n native.appendChild(ending);\n\n fragment.appendChild(native);\n\n this.endingEl = ending;\n\n return fragment;\n }\n\n /**\n * Called after the component has been drawn.\n */\n async afterDraw() {\n this.syncAria();\n this.queryParams = this.queryParams || '';\n this.size = +this.size || 10;\n this.currentPage = 0;\n\n this.scrollEvent();\n this.#loading = this.loadPages(this.currentPage);\n await this.#loading;\n }\n\n /**\n * Sync ARIA attributes on host.\n */\n syncAria() {\n if (!this.hasAttribute('role')) {\n this.setAriaState({ role: 'list' });\n }\n }\n\n /**\n * Attaches a scroll event listener to the current object.\n * The `scrollEvent` function binds the `onScroll` method to the 'scroll' event\n * of the current object. This enables handling of scroll events for\n * specific functionality such as updating UI elements, loading content dynamically,\n * or tracking user interaction with scrollable content.\n */\n scrollEvent = () => {\n this.addEventListener('scroll', this.onScroll);\n };\n\n /**\n * A function that removes the scroll event listener from the current context.\n * This function is used to unbind the `onScroll` event listener\n * from the `scroll` event of the current object. It ensures that\n * the scroll event no longer triggers the `onScroll` handler.\n * @function\n */\n unScrollEvent = () => {\n this.removeEventListener('scroll', this.onScroll);\n };\n\n /**\n * A scroll event handler function that checks the scroll position and triggers loading additional content\n * when the user scrolls near the bottom of the page.\n * Properties accessed:\n * - `scrollTop`: The number of pixels that the content of an element is scrolled vertically.\n * - `scrollHeight`: The total height of the element's content.\n * - `clientHeight`: The inner height of the element in pixels, including padding but excluding borders and scrollbars.\n * Conditions:\n * - Determines if the scroll position is within 300 pixels of the bottom of the element.\n * - Verifies that the current page number is less than or equal to the total number of pages.\n * - Checks if the current page is already in the loading state.\n * Actions:\n * - Increments the current page number when the conditions are met.\n * - Initiates loading for the next page by calling the `loadPages` function.\n * @param {Event} e The scroll event object.\n */\n onScroll = (e) => {\n const { scrollTop, scrollHeight, clientHeight } = e.target;\n\n if (\n scrollTop + clientHeight >= scrollHeight - 300 &&\n this.currentPage <= this.totalPages &&\n this.isLoading.includes(this.currentPage)\n ) {\n this.currentPage++;\n this.#loading = this.loadPages(this.currentPage);\n }\n };\n\n /**\n * Fetches the pages from the server.\n * @param {number} page The page number.\n * @returns {Promise<object>} The response from the server.\n */\n async getPages(page) {\n let hasParams = this.url?.includes('?');\n const response = await fetch(\n `${this.url}${hasParams ? '&' : '?'}page=${page}&size=${this.size}${this?.queryParams}`,\n {\n signal: this.#signal,\n }\n );\n\n if (!response.ok) {\n throw new Error(`An error occurred: ${response.status}`);\n }\n return await response.json();\n }\n\n /**\n * Hides the loader.\n */\n hideLoader() {\n this?.loadingEl?.classList.remove('show');\n }\n\n /**\n * Displays the loader element by adding the 'show' class to its class list.\n * This method is useful for indicating a loading or processing state in the UI.\n * @returns {void} No return value.\n */\n showLoader() {\n this?.loadingEl?.classList.add('show');\n }\n\n /**\n * Checks if there are more pages to load.\n * @param {number} page The page number.\n * @returns {boolean} Whether there are more pages to load.\n */\n hasMorePages(page) {\n return this.totalPages === 0 || page < this.totalPages;\n }\n\n /**\n * Loads the pages.\n * @param {number} page The page number.\n */\n async loadPages(page) {\n this.showLoader();\n try {\n event.dispatchCustomEvent(this, 'wje-infinite-scroll:start');\n if (this.hasMorePages(page)) {\n let response;\n this.parser = new DOMParser();\n\n if (typeof this.setCustomData === 'function') {\n response = await this.setCustomData(page, this.#signal);\n } else {\n response = await this.getPages(page);\n }\n\n this.totalPages = Number(response?.totalPages ?? 0);\n this.currentPage = page;\n\n this.placementObj = this;\n\n // if there is a \"container\" attribute, find the element\n if (this.hasAttribute('placement')) this.placementObj = this.querySelector(this.placement);\n\n event.dispatchCustomEvent(this, 'wje-infinite-scroll:load', response);\n\n this.response = response;\n\n // Normalize items: support array responses and common paged formats.\n let items;\n if (Array.isArray(response)) {\n items = response;\n } else if (this.objectName && Array.isArray(response?.[this.objectName])) {\n items = response[this.objectName];\n } else if (Array.isArray(response?.content)) {\n // common Spring pageable style\n items = response.content;\n } else {\n items = [];\n }\n\n this.#loadedItems = items;\n\n const notDrawnItems = this.#loadedItems.filter(\n (item) => !this.#drawnItems.some(this.compareFunction.bind(this, item))\n );\n this.customForeach(notDrawnItems);\n this.#drawnItems.push(...notDrawnItems);\n\n this.isLoading.push(page);\n event.dispatchCustomEvent(this, 'wje-infinite-scroll:finish', response);\n } else {\n event.dispatchCustomEvent(this, 'wje-infinite-scroll:complete');\n this.endingEl.classList.add('show');\n }\n } catch (error) {\n console.error(error);\n } finally {\n this.hideLoader();\n }\n }\n\n compareFunction = (i, item) => i.id === item.id;\n\n /**\n * Converts a data item into an HTML element based on a template.\n * This function takes a data item, interpolates it into a predefined template,\n * parses the resulting HTML string, and returns the first child element of the parsed HTML content.\n * @param {object} item The data object to interpolate into the HTML template.\n * @returns {Element} The first child element generated from the interpolated HTML string.\n */\n dataToHtml = (item) => {\n let interpolateItem = this.interpolate(this.infiniteScrollTemplate, item);\n let doc = this.parser.parseFromString(interpolateItem, 'text/html');\n let element = doc.activeElement.firstElementChild;\n\n return element;\n };\n\n /**\n * A custom implementation of the forEach method designed to iterate over an array of data,\n * transform each item into an HTML element, and append the element to a specified placement object.\n * Additionally, it adds an event listener to each generated element for handling click events.\n * @param {Array} data An array of items to process. Each item is transformed into an HTML element\n * and appended to the placement object specified in the context of `this`.\n */\n customForeach = (data) => {\n data.forEach((item) => {\n let element = this.dataToHtml(item);\n\n let symbol = Symbol(\"infinite-scroll-item\");\n element[symbol] = item;\n item[symbol] = element;\n\n event.addListener(element, 'click', 'wje-infinite-scroll:click-item', null);\n\n this.placementObj.insertAdjacentElement('beforeend', element);\n });\n };\n\n /**\n * Interpolates a string template with values from the provided parameters object.\n * The template contains placeholders in the format `{{key}}` or `{{key.subkey}}`,\n * which are replaced with the corresponding values from the `params` object.\n * Placeholders support dot notation for accessing nested properties within the `params` object.\n * @param {string} template The string template containing placeholders to be replaced.\n * @param {object} params The object containing key-value pairs used for substitution in the template.\n * @returns {string} A string with all placeholders replaced by their respective values from the `params` object.\n */\n interpolate = (template, params) => {\n let keys = template.match(/\\{{.*?\\}}/g);\n\n if (keys) {\n for (let key of keys) {\n let cleanKey = key.replace('{{', '').replace('}}', '');\n let val = '';\n cleanKey.split('.').forEach((k) => {\n val = val === '' ? params[k] : val[k];\n });\n\n template = template.replace(key, val);\n }\n }\n return template;\n };\n\n addItem(item, place = 'beforeend') {\n let element = this.dataToHtml(item);\n\n let symbol = Symbol(\"infinite-scroll-item\");\n element[symbol] = item;\n item[symbol] = element;\n\n this.placementObj.insertAdjacentElement(place, element);\n\n this.#drawnItems.push(item);\n\n // if drawnItems are more than page * size then add the page to isLoading\n if (this.#drawnItems.length > this.size * this.currentPage) {\n this.totalPages += 1;\n }\n }\n\n removeItem(item) {\n let drawnItem = this.#drawnItems.find(this.compareFunction.bind(this, item));\n if (!drawnItem) {\n console.error('Item not found');\n return;\n }\n let symbol = Object.getOwnPropertySymbols(drawnItem).at(0);\n let element = drawnItem[symbol];\n if (!element) {\n console.error('Element not found');\n return;\n }\n\n element?.remove();\n\n this.#drawnItems = this.#drawnItems.filter((i) => i !== item);\n // if drawnItems are less than page * size then remove the page from isLoading\n if (this.#drawnItems.length < this.size * this.currentPage) {\n this.isLoading = this.isLoading.filter((i) => i !== this.currentPage);\n this.currentPage--;\n }\n }\n\n reset() {\n this.isLoading = [];\n this.currentPage = 0;\n this.totalPages = 0;\n this.response = {};\n this.#drawnItems = [];\n this.#loadedItems = [];\n this.placementObj.innerHTML = '';\n }\n}\n","import InfiniteScroll from './infinite-scroll.element.js';\n\nexport default InfiniteScroll;\n\nInfiniteScroll.define('wje-infinite-scroll', InfiniteScroll);\n"],"names":["InfiniteScroll","WJElement","super","drawnItems","loadedItems","response","infiniteScrollTemplate","abortController","signal","loading","className","scrollEvent","this","addEventListener","onScroll","unScrollEvent","removeEventListener","e","scrollTop","scrollHeight","clientHeight","target","currentPage","totalPages","isLoading","includes","loadPages","compareFunction","i","item","id","dataToHtml","interpolateItem","interpolate","parser","parseFromString","activeElement","firstElementChild","customForeach","data","forEach","element","symbol","Symbol","event","addListener","placementObj","insertAdjacentElement","template","params","keys","match","key","cleanKey","replace","val","split","k","iterate","AbortController","value","setAttribute","getAttribute","observedAttributes","setupAttributes","isShadowRoot","syncAria","querySelector","nodeName","console","error","outerHTML","innerHTML","remove","height","abort","draw","fragment","document","createDocumentFragment","native","createElement","classList","add","slot","ending","WjElementUtils","hasSlot","loader","appendChild","loadingEl","endingEl","queryParams","size","hasAttribute","setAriaState","role","page","hasParams","url","fetch","ok","Error","status","json","hideLoader","showLoader","dispatchCustomEvent","hasMorePages","items","DOMParser","setCustomData","getPages","Number","placement","Array","isArray","objectName","content","notDrawnItems","filter","some","bind","push","place","length","drawnItem","find","Object","getOwnPropertySymbols","at","reset","define"],"mappings":";;;;;;;;;;;;;;AAkBe,MAAMA,UAAuBC;EAWxC;AACIC,UAAAA;AAXJC;AACAC;AACAC;AACAC;AACAC;AACAC;AACAC;AA+DAC,qCAAY;AAoIZC,uCAAc,MAAA;AACVC,WAAKC,iBAAiB,UAAUD,KAAKE,QAAAA;AAAAA,IAAAA;AAUzCC,yCAAgB;AACZH,WAAKI,oBAAoB,UAAUJ,KAAKE,QAAAA;AAAAA,IAAAA;AAmB5CA,oCAAYG,CAAAA,OAAAA;AACR,YAAA,EAAMC,WAAEA,IAASC,cAAEA,IAAYC,cAAEA,GAAAA,IAAiBH,GAAEI;AAGhDH,MAAAA,KAAYE,MAAgBD,KAAe,OAC3CP,KAAKU,eAAeV,KAAKW,cACzBX,KAAKY,UAAUC,SAASb,KAAKU,WAAAA,MAE7BV,KAAKU,eACLV,mBAAAA,IAAgBA,KAAKc,UAAUd,KAAKU,WAAAA;AAAAA,IAAAA;AAiH5CK,2CAAkB,CAACC,IAAGC,OAASD,GAAEE,OAAOD,GAAKC;AAS7CC,sCAAcF,CAAAA;AACV,UAAIG,KAAkBpB,KAAKqB,YAAYrB,KAAKN,wBAAwBuB,EAAAA;AAIpE,aAHUjB,KAAKsB,OAAOC,gBAAgBH,IAAiB,WAAA,EACrCI,cAAcC;AAAAA;AAYpCC,yCAAiBC,CAAAA,OAAAA;AACbA,MAAAA,GAAKC,QAASX,CAAAA,OAAAA;AACV,YAAIY,KAAU7B,KAAKmB,WAAWF,EAAAA,GAE1Ba,KAASC,uBAAO;AACpBF,QAAAA,GAAQC,EAAAA,IAAUb,IAClBA,GAAKa,EAAAA,IAAUD,IAEfG,EAAMC,YAAYJ,IAAS,SAAS,kCAAkC,OAEtE7B,KAAKkC,aAAaC,sBAAsB,aAAaN,EAAAA;AAAAA,MAAAA,CAAAA;AAAAA,IAAAA;AAa7DR,uCAAc,CAACe,IAAUC;AACrB,UAAIC,KAAOF,GAASG,MAAM,YAAA;AAE1B,UAAID,GACA,UAASE,MAAOF,IAAM;AAClB,YAAIG,KAAWD,GAAIE,QAAQ,MAAM,IAAIA,QAAQ,MAAM,KAC/CC,IAAM;AACVF,QAAAA,GAASG,MAAM,GAAA,EAAKhB,QAASiB,CAAAA,OAAAA;AACzBF,cAAc,OAARA,IAAaN,GAAOQ,MAAKF,EAAIE,EAAAA;AAAAA,QAAAA,CAAAA,GAGvCT,KAAWA,GAASM,QAAQF,IAAKG,CAAAA;AAAAA,MACrC;AAEJ,aAAOP;AAAAA,IAAAA;AAlZPpC,SAAKW,aAAa,GAClBX,KAAKY,YAAY,CAAA,GACjBZ,mBAAAA,IAAiB,CAAA,IACjBA,KAAK8C,UAAU,MACf9C,uBAA+B,OAC/BA,uBAAwB,IAAI+C,oBAC5B/C,mBAAAA,IAAeA,uBAAsBJ,SACrCI,uBAAmB,CAAA,IACnBA,uBAAoB,CAAA,IACpBA,KAAKkC,eAAelC;AAAAA,EACxB;AAAA,EAMA,IAAA,uBAA2BgD;AACvBhD,uBAAAA,IAA+BgD;AAAAA,EACnC;AAAA,EAMA,IAAA;AACI,WAAOhD,mBAAAA;AAAAA,EACX;AAAA,EAMA,IAAA,SAAagD,IAAAA;AACThD,uBAAAA,IAAiBgD;AAAAA,EACrB;AAAA,EAMA,eAAIvD;AACA,WAAOO;EACX;AAAA,EAMA,eAAegD,IAAAA;AACXhD,SAAKiD,aAAa,eAAeD;EACrC;AAAA,EAEA,IAAA;AACI,WAAOhD,KAAKkD,aAAa,aAAA,KAAkB;AAAA,EAC/C;AAAA,EASA,WAAA;AACI;EACJ;AAAA,EAOA,WAAA,qBAAWC;AACP,WAAO,CAAA;AAAA,EACX;AAAA,EAKA,kBAAAC;AACIpD,SAAKqD,eAAe,QACpBrD,KAAKsD;EACT;AAAA,EAQA;;AACItD,uBAAAA,IAAoB,KACpBA,mBAAAA,IAAmB,KAEnBA,KAAK8C,UAAU9C,KAAKuD,cAAc,WAAA,GAE9BvD,KAAK8C,YACyB,eAA1B9C,KAAK8C,QAAQU,YACbC,QAAQC,MAAM,kDAAA,GACd1D,KAAKN,0BAAyBM,MAAAA,KAAK8C,YAAL9C,gBAAAA,IAAc2D,aAE5C3D,KAAKN,0BAAyBM,UAAK8C,YAAL9C,mBAAc4D,YAGhD5D,UAAK8C,YAAL9C,mBAAc6D,WAGlB7D,KAAKiD,aAAa,SAAS,aAAajD,KAAK8D,SAGzC9D,mBAAAA,QACAA,uBAAsB+D,MAAAA,GACtB/D,uBAAwB,IAAI+C,oBAC5B/C,mBAAAA,IAAeA,uBAAsBJ;AAAAA,EAE7C;AAAA,EAOA,OAAAoE;AACI,QAAIC,KAAWC,SAASC,0BAEpBC,KAASF,SAASG,cAAc,KAAA;AACpCD,IAAAA,GAAOE,UAAUC,IAAI,wBAAA,GACrBH,GAAOnB,aAAa,QAAQ,wBAAA;AAE5B,QAAIuB,KAAON,SAASG,cAAc,MAAA,GAE9BI,IAASP,SAASG,cAAc,MAAA;AAGpC,QAFAI,EAAOxB,aAAa,QAAQ,QAAA,GAExByB,EAAeC,QAAQ3E,MAAM,QAAA,GAAW;AACxC,UAAIH,KAAUqE,SAASG,cAAc,KAAA;AACrCxE,MAAAA,GAAQyE,UAAUC,IAAI;AAEtB,UAAIK,KAASV,SAASG,cAAc,MAAA;AACpCO,MAAAA,GAAO3B,aAAa,QAAQ,WAE5BpD,GAAQgF,YAAYD,KAEpB5E,KAAK8E,YAAYjF,IAEjBoE,GAASY,YAAYhF;IACzB;AASA,WAPAuE,GAAOS,YAAYL,EAAAA,GACnBJ,GAAOS,YAAYJ,CAAAA,GAEnBR,GAASY,YAAYT,EAAAA,GAErBpE,KAAK+E,WAAWN,GAETR;AAAAA,EACX;AAAA,EAKA,MAAA;AACIjE,SAAKsD,SAAAA,GACLtD,KAAKgF,cAAchF,KAAKgF,eAAe,IACvChF,KAAKiF,QAAQjF,KAAKiF,QAAQ,IAC1BjF,KAAKU,cAAc,GAEnBV,KAAKD,YAAAA,GACLC,uBAAgBA,KAAKc,UAAUd,KAAKU,WAAAA,IAAAA,MAC9BV;EACV;AAAA,EAKA,WAAAsD;AACStD,SAAKkF,aAAa,MAAA,KACnBlF,KAAKmF,aAAa,EAAEC,MAAM,OAAA,CAAA;AAAA,EAElC;AAAA,EA0DA,MAAA,SAAeC,IAAAA;;AACX,QAAIC,MAAYtF,MAAAA,KAAKuF,QAALvF,gBAAAA,IAAUa,SAAS;AACnC,UAAMpB,WAAiB+F,MACnB,GAAGxF,KAAKuF,GAAAA,GAAMD,KAAY,MAAM,GAAA,QAAWD,EAAAA,SAAarF,KAAKiF,IAAAA,GAAOjF,6BAAMgF,eAC1E,EACIpF,QAAQI,uBAAKJ,CAAAA;AAIrB,QAAA,CAAKH,GAASgG,GACV,OAAM,IAAIC,MAAM,sBAAsBjG,GAASkG,MAAAA,EAAAA;AAEnD,WAAA,MAAalG,GAASmG,KAAAA;AAAAA,EAC1B;AAAA,EAKA,aAAAC;;AACI7F,KAAAA,MAAAA,6BAAM8E,cAAN9E,gBAAAA,IAAiBsE,UAAUT,OAAO;AAAA,EACtC;AAAA,EAOA,aAAAiC;;AACI9F,KAAAA,MAAAA,6BAAM8E,cAAN9E,gBAAAA,IAAiBsE,UAAUC,IAAI;AAAA,EACnC;AAAA,EAOA,aAAac,IAAAA;AACT,WAA2B,MAApBrF,KAAKW,cAAoB0E,KAAOrF,KAAKW;AAAAA,EAChD;AAAA,EAMA,MAAA,UAAgB0E,IAAAA;AACZrF,SAAK8F;AACL,QAAA;AAEI,UADA9D,EAAM+D,oBAAoB/F,MAAM,8BAC5BA,KAAKgG,aAAaX,KAAO;AACzB,YAAI5F,IAsBAwG;AArBJjG,aAAKsB,SAAS,IAAI4E,aAGdzG,KAD8B,cAAA,OAAvBO,KAAKmG,sBACKnG,KAAKmG,cAAcd,IAAMrF,mBAAAA,GAAKJ,IAAAA,MAE9BI,KAAKoG,SAASf,EAAAA,GAGnCrF,KAAKW,aAAa0F,QAAO5G,MAAAA,gBAAAA,GAAUkB,eAAc,CAAA,GACjDX,KAAKU,cAAc2E,IAEnBrF,KAAKkC,eAAelC,MAGhBA,KAAKkF,aAAa,WAAA,MAAclF,KAAKkC,eAAelC,KAAKuD,cAAcvD,KAAKsG,SAAAA,IAEhFtE,EAAM+D,oBAAoB/F,MAAM,4BAA4BP,EAAAA,GAE5DO,KAAKP,WAAWA,IAKZwG,KADAM,MAAMC,QAAQ/G,EAAAA,IACNA,KACDO,KAAKyG,cAAcF,MAAMC,QAAQ/G,MAAAA,gBAAAA,GAAWO,KAAKyG,WAAAA,IAChDhH,GAASO,KAAKyG,UAAAA,IACfF,MAAMC,QAAQ/G,MAAAA,gBAAAA,GAAUiH,OAAAA,IAEvBjH,GAASiH,UAET,CAAA,GAGZ1G,mBAAAA,IAAoBiG;AAEpB,cAAMU,IAAgB3G,mBAAAA,IAAkB4G,OACnC3F,CAAAA,OAAAA,CAAUjB,mBAAAA,IAAiB6G,KAAK7G,KAAKe,gBAAgB+F,KAAK9G,MAAMiB;AAErEjB,aAAK0B,cAAciF,IACnB3G,mBAAAA,IAAiB+G,QAAQJ,CAAAA,GAEzB3G,KAAKY,UAAUmG,KAAK1B,EAAAA,GACpBrD,EAAM+D,oBAAoB/F,MAAM,8BAA8BP,EAAAA;AAAAA,MAClE,MACIuC,GAAM+D,oBAAoB/F,MAAM,iCAChCA,KAAK+E,SAAST,UAAUC,IAAI,MAAA;AAAA,IAEpC,SAASb,IAAAA;AACLD,cAAQC,MAAMA,EAAAA;AAAAA,IAClB,UAAC;AACG1D,WAAK6F;IACT;AAAA,EACJ;AAAA,EAkEA,QAAQ5E,IAAM+F,KAAQ;AAClB,QAAInF,KAAU7B,KAAKmB,WAAWF,EAAAA,GAE1Ba,KAASC,uBAAO,sBAAA;AACpBF,IAAAA,GAAQC,EAAAA,IAAUb,IAClBA,GAAKa,EAAAA,IAAUD,IAEf7B,KAAKkC,aAAaC,sBAAsB6E,IAAOnF,EAAAA,GAE/C7B,mBAAAA,IAAiB+G,KAAK9F,EAAAA,GAGlBjB,mBAAAA,IAAiBiH,SAASjH,KAAKiF,OAAOjF,KAAKU,gBAC3CV,KAAKW,cAAc;AAAA,EAE3B;AAAA,EAEA,WAAWM;AACP,QAAIiG,KAAYlH,uBAAiBmH,KAAKnH,KAAKe,gBAAgB+F,KAAK9G,MAAMiB,EAAAA,CAAAA;AACtE,QAAA,CAAKiG,GAED,QAAA,KADAzD,QAAQC,MAAM,gBAAA;AAGlB,QACI7B,KAAUqF,GADDE,OAAOC,sBAAsBH,EAAAA,EAAWI,GAAG;AAEnDzF,IAAAA,MAKLA,MAAAA,gBAAAA,GAASgC,UAET7D,mBAAAA,IAAmBA,uBAAiB4G,OAAQ5F,CAAAA,OAAMA,OAAMC,EAAAA,IAEpDjB,mBAAAA,IAAiBiH,SAASjH,KAAKiF,OAAOjF,KAAKU,gBAC3CV,KAAKY,YAAYZ,KAAKY,UAAUgG,OAAQ5F,CAAAA,OAAMA,OAAMhB,KAAKU,WAAAA,GACzDV,KAAKU,kBAVL+C,QAAQC,MAAM,mBAAA;AAAA,EAYtB;AAAA,EAEA,QAAA6D;AACIvH,SAAKY,YAAY,CAAA,GACjBZ,KAAKU,cAAc,GACnBV,KAAKW,aAAa,GAClBX,KAAKP,WAAW,CAAA,GAChBO,uBAAmB,CAAA,IACnBA,uBAAoB,CAAA,IACpBA,KAAKkC,aAAa0B,YAAY;AAAA,EAClC;AAAA;AAldArE;AACAC;AACAC;AACAC;AACAC;AACAC;AACAC;ACrBJT,EAAeoI,OAAO,uBAAuBpI,CAAAA;"}