@rivtn/noseur 1.0.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 (138) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/dist/esm/Template.d.ts +7 -0
  4. package/dist/esm/Template.js +13 -0
  5. package/dist/esm/compose/Composed.css +437 -0
  6. package/dist/esm/compose/exotic/ColorPicker.d.ts +41 -0
  7. package/dist/esm/compose/exotic/ColorPicker.js +85 -0
  8. package/dist/esm/compose/exotic/ColorSlider.d.ts +30 -0
  9. package/dist/esm/compose/exotic/ColorSlider.js +99 -0
  10. package/dist/esm/compose/form/ComposedPassword.d.ts +25 -0
  11. package/dist/esm/compose/form/ComposedPassword.js +103 -0
  12. package/dist/esm/compose/form/DateTimeInput.d.ts +28 -0
  13. package/dist/esm/compose/form/DateTimeInput.js +154 -0
  14. package/dist/esm/compose/form/DateTimePicker.d.ts +341 -0
  15. package/dist/esm/compose/form/DateTimePicker.js +1265 -0
  16. package/dist/esm/compose/form/FormControl.d.ts +33 -0
  17. package/dist/esm/compose/form/FormControl.js +163 -0
  18. package/dist/esm/compose/form/FormGroup.d.ts +14 -0
  19. package/dist/esm/compose/form/FormGroup.js +58 -0
  20. package/dist/esm/compose/overlay/Alert.d.ts +56 -0
  21. package/dist/esm/compose/overlay/Alert.js +267 -0
  22. package/dist/esm/constants/Alignment.d.ts +17 -0
  23. package/dist/esm/constants/Alignment.js +18 -0
  24. package/dist/esm/constants/Direction.d.ts +26 -0
  25. package/dist/esm/constants/Direction.js +22 -0
  26. package/dist/esm/constants/Orientation.d.ts +8 -0
  27. package/dist/esm/constants/Orientation.js +9 -0
  28. package/dist/esm/constants/Scheme.d.ts +39 -0
  29. package/dist/esm/constants/Scheme.js +43 -0
  30. package/dist/esm/constants/Transition.d.ts +81 -0
  31. package/dist/esm/constants/Transition.js +85 -0
  32. package/dist/esm/constants/Types.d.ts +74 -0
  33. package/dist/esm/constants/Types.js +14 -0
  34. package/dist/esm/core/ComponentBaseProps.d.ts +53 -0
  35. package/dist/esm/core/ComponentBaseProps.js +33 -0
  36. package/dist/esm/core/noseur.css +2390 -0
  37. package/dist/esm/data/Column.d.ts +235 -0
  38. package/dist/esm/data/Column.js +98 -0
  39. package/dist/esm/data/Data.css +213 -0
  40. package/dist/esm/data/Data.d.ts +98 -0
  41. package/dist/esm/data/Data.js +142 -0
  42. package/dist/esm/data/List.d.ts +14 -0
  43. package/dist/esm/data/List.js +117 -0
  44. package/dist/esm/data/Table.d.ts +22 -0
  45. package/dist/esm/data/Table.js +236 -0
  46. package/dist/esm/form/Button.d.ts +35 -0
  47. package/dist/esm/form/Button.js +131 -0
  48. package/dist/esm/form/Calendar.d.ts +20 -0
  49. package/dist/esm/form/Calendar.js +46 -0
  50. package/dist/esm/form/Checkbox.d.ts +20 -0
  51. package/dist/esm/form/Checkbox.js +155 -0
  52. package/dist/esm/form/ColorMap.d.ts +22 -0
  53. package/dist/esm/form/ColorMap.js +43 -0
  54. package/dist/esm/form/ColorPalette.d.ts +28 -0
  55. package/dist/esm/form/ColorPalette.js +87 -0
  56. package/dist/esm/form/Dropdown.d.ts +78 -0
  57. package/dist/esm/form/Dropdown.js +360 -0
  58. package/dist/esm/form/FileInput.d.ts +134 -0
  59. package/dist/esm/form/FileInput.js +523 -0
  60. package/dist/esm/form/Form.css +467 -0
  61. package/dist/esm/form/Input.d.ts +45 -0
  62. package/dist/esm/form/Input.js +186 -0
  63. package/dist/esm/form/RadioButton.d.ts +21 -0
  64. package/dist/esm/form/RadioButton.js +178 -0
  65. package/dist/esm/form/Slider.d.ts +21 -0
  66. package/dist/esm/form/Slider.js +163 -0
  67. package/dist/esm/hooks/useSearchParams.d.ts +15 -0
  68. package/dist/esm/hooks/useSearchParams.js +50 -0
  69. package/dist/esm/hooks/useSubscription.d.ts +9 -0
  70. package/dist/esm/hooks/useSubscription.js +26 -0
  71. package/dist/esm/index.d.ts +60 -0
  72. package/dist/esm/index.js +73 -0
  73. package/dist/esm/layout/GridView.d.ts +23 -0
  74. package/dist/esm/layout/GridView.js +34 -0
  75. package/dist/esm/layout/Layout.css +5 -0
  76. package/dist/esm/misc/Misc.css +164 -0
  77. package/dist/esm/misc/ProgressBar.d.ts +22 -0
  78. package/dist/esm/misc/ProgressBar.js +86 -0
  79. package/dist/esm/overlay/Dialog.d.ts +46 -0
  80. package/dist/esm/overlay/Dialog.js +290 -0
  81. package/dist/esm/overlay/Message.d.ts +35 -0
  82. package/dist/esm/overlay/Message.js +187 -0
  83. package/dist/esm/overlay/Overlay.css +382 -0
  84. package/dist/esm/overlay/Popover.d.ts +30 -0
  85. package/dist/esm/overlay/Popover.js +245 -0
  86. package/dist/esm/overlay/Portal.d.ts +11 -0
  87. package/dist/esm/overlay/Portal.js +29 -0
  88. package/dist/esm/overlay/Toast.d.ts +49 -0
  89. package/dist/esm/overlay/Toast.js +341 -0
  90. package/dist/esm/panel/Accordion.d.ts +26 -0
  91. package/dist/esm/panel/Accordion.js +127 -0
  92. package/dist/esm/panel/Panel.css +317 -0
  93. package/dist/esm/panel/Panel.d.ts +43 -0
  94. package/dist/esm/panel/Panel.js +125 -0
  95. package/dist/esm/panel/ScrollPanel.d.ts +27 -0
  96. package/dist/esm/panel/ScrollPanel.js +43 -0
  97. package/dist/esm/panel/TabPane.d.ts +82 -0
  98. package/dist/esm/panel/TabPane.js +237 -0
  99. package/dist/esm/presentation/Chart.d.ts +49 -0
  100. package/dist/esm/presentation/Chart.js +62 -0
  101. package/dist/esm/presentation/Paginator.d.ts +90 -0
  102. package/dist/esm/presentation/Paginator.js +331 -0
  103. package/dist/esm/presentation/Presentation.css +23 -0
  104. package/dist/esm/sensor/DragSensor.d.ts +50 -0
  105. package/dist/esm/sensor/DragSensor.js +156 -0
  106. package/dist/esm/sensor/ViewportSensor.d.ts +18 -0
  107. package/dist/esm/sensor/ViewportSensor.js +85 -0
  108. package/dist/esm/utils/BoolHelper.d.ts +13 -0
  109. package/dist/esm/utils/BoolHelper.js +105 -0
  110. package/dist/esm/utils/Classname.d.ts +9 -0
  111. package/dist/esm/utils/Classname.js +20 -0
  112. package/dist/esm/utils/ColorHelper.d.ts +127 -0
  113. package/dist/esm/utils/ColorHelper.js +198 -0
  114. package/dist/esm/utils/DOMUtils.d.ts +142 -0
  115. package/dist/esm/utils/DOMUtils.js +759 -0
  116. package/dist/esm/utils/DateHelper.d.ts +115 -0
  117. package/dist/esm/utils/DateHelper.js +338 -0
  118. package/dist/esm/utils/Debugger.d.ts +12 -0
  119. package/dist/esm/utils/Debugger.js +30 -0
  120. package/dist/esm/utils/FileHelper.d.ts +8 -0
  121. package/dist/esm/utils/FileHelper.js +65 -0
  122. package/dist/esm/utils/FunctionStackManager.d.ts +13 -0
  123. package/dist/esm/utils/FunctionStackManager.js +59 -0
  124. package/dist/esm/utils/InputHelper.d.ts +37 -0
  125. package/dist/esm/utils/InputHelper.js +70 -0
  126. package/dist/esm/utils/MicroBuilder.d.ts +24 -0
  127. package/dist/esm/utils/MicroBuilder.js +61 -0
  128. package/dist/esm/utils/ObjectHelper.d.ts +51 -0
  129. package/dist/esm/utils/ObjectHelper.js +334 -0
  130. package/dist/esm/utils/StringHelper.d.ts +10 -0
  131. package/dist/esm/utils/StringHelper.js +54 -0
  132. package/dist/esm/utils/Subscriber.d.ts +14 -0
  133. package/dist/esm/utils/Subscriber.js +27 -0
  134. package/dist/esm/utils/Timer.d.ts +32 -0
  135. package/dist/esm/utils/Timer.js +68 -0
  136. package/dist/esm/utils/TypeChecker.d.ts +12 -0
  137. package/dist/esm/utils/TypeChecker.js +38 -0
  138. package/package.json +63 -0
@@ -0,0 +1,759 @@
1
+ import { BoolHelper } from "./BoolHelper";
2
+ import { Alignment } from "../constants/Alignment";
3
+ import { Orientation } from "../constants/Orientation";
4
+ import { Bound, Direction } from "../constants/Direction";
5
+ let __noseurGlobal__Browser;
6
+ let uniqueElementIdsCounter = {};
7
+ let cachedCanvas = null;
8
+ export const DOMHelper = {
9
+ uniqueElementId(prefix = 'noseur-auto-id-') {
10
+ if (!(prefix in uniqueElementIdsCounter)) {
11
+ uniqueElementIdsCounter[prefix] = 1;
12
+ }
13
+ return prefix + (uniqueElementIdsCounter[prefix]++);
14
+ },
15
+ isElement(element) {
16
+ return element instanceof Element || element instanceof HTMLDocument;
17
+ },
18
+ getBrowser() {
19
+ if (!__noseurGlobal__Browser) {
20
+ let matched = this.resolveUserAgent();
21
+ __noseurGlobal__Browser = {};
22
+ if (matched.browser) {
23
+ __noseurGlobal__Browser[matched.browser] = true;
24
+ __noseurGlobal__Browser['version'] = matched.version;
25
+ }
26
+ if (__noseurGlobal__Browser['chrome']) {
27
+ __noseurGlobal__Browser['webkit'] = true;
28
+ }
29
+ else if (__noseurGlobal__Browser['webkit']) {
30
+ __noseurGlobal__Browser['safari'] = true;
31
+ }
32
+ }
33
+ return __noseurGlobal__Browser;
34
+ },
35
+ resolveUserAgent() {
36
+ let ua = navigator.userAgent.toLowerCase();
37
+ let match = /(chrome)[ ]([\w.]+)/.exec(ua) ||
38
+ /(webkit)[ ]([\w.]+)/.exec(ua) ||
39
+ /(opera)(?:.*version|)[ ]([\w.]+)/.exec(ua) ||
40
+ /(msie) ([\w.]+)/.exec(ua) ||
41
+ (ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua)) ||
42
+ [];
43
+ return {
44
+ browser: match[1] || "",
45
+ version: match[2] || "0"
46
+ };
47
+ },
48
+ hasClass(element, className) {
49
+ if (!element || !className)
50
+ return false;
51
+ if (element.classList) {
52
+ return element.classList.contains(className);
53
+ }
54
+ else {
55
+ return new RegExp('(^| )' + className + '( |$)', 'gi').test(element.className);
56
+ }
57
+ },
58
+ addClass(element, className) {
59
+ if (!element || !className)
60
+ return;
61
+ if (element.classList) {
62
+ element.classList.add(className);
63
+ }
64
+ else {
65
+ element.className += ' ' + className;
66
+ }
67
+ },
68
+ removeClass(element, className) {
69
+ if (!element || !className)
70
+ return;
71
+ if (element.classList) {
72
+ element.classList.remove(className);
73
+ }
74
+ else {
75
+ element.className = element.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
76
+ }
77
+ },
78
+ addClassToElementById(id, className) {
79
+ DOMHelper.addClass(document.getElementById(id), className);
80
+ },
81
+ removeClassFromElementById(id, className) {
82
+ DOMHelper.removeClass(document.getElementById(id), className);
83
+ },
84
+ removeClassFromElementsByClassname(clazzName, className) {
85
+ const elements = document.getElementsByClassName(clazzName);
86
+ for (let i = 0; i < elements.length; i++) {
87
+ DOMHelper.removeClass(elements[i], className);
88
+ }
89
+ },
90
+ getTarget: (event) => event.target || event.currentTarget,
91
+ getElementOffset(element, defaultValue) {
92
+ if (!element) {
93
+ return defaultValue || {
94
+ top: 'auto',
95
+ left: 'auto'
96
+ };
97
+ }
98
+ let rect = element.getBoundingClientRect();
99
+ return {
100
+ top: rect.top + (window.scrollY || document.documentElement.scrollTop || document.body.scrollTop || 0),
101
+ left: rect.left + (window.scrollX || document.documentElement.scrollLeft || document.body.scrollLeft || 0),
102
+ };
103
+ },
104
+ getElementRectWithOffset(element) {
105
+ const rect = element.getBoundingClientRect();
106
+ return {
107
+ x: rect.x,
108
+ y: rect.y,
109
+ width: rect.width,
110
+ height: rect.height,
111
+ top: rect.top + (window.scrollY ?? document.documentElement.scrollTop ?? document.body.scrollTop ?? 0),
112
+ left: rect.left + (window.scrollX ?? document.documentElement.scrollLeft ?? document.body.scrollLeft ?? 0),
113
+ };
114
+ },
115
+ getDocumentScrollTop() {
116
+ let doc = document.documentElement;
117
+ return (window.scrollY || doc.scrollTop) - (doc.clientTop || 0);
118
+ },
119
+ getDocumentScrollLeft() {
120
+ let doc = document.documentElement;
121
+ return (window.scrollX || doc.scrollLeft) - (doc.clientLeft || 0);
122
+ },
123
+ getViewport() {
124
+ let win = window, d = document, e = d.documentElement, g = d.getElementsByTagName('body')[0], w = win.innerWidth || e.clientWidth || g.clientWidth, h = win.innerHeight || e.clientHeight || g.clientHeight;
125
+ return { width: w, height: h };
126
+ },
127
+ getHiddenElementDimensions(_) {
128
+ return { width: 100, height: 100 };
129
+ },
130
+ sanitizeStyleValue(dirtyValue) {
131
+ return parseInt((dirtyValue || "0")
132
+ .replace(/%/g, "")
133
+ .replace(/px/g, "")
134
+ .replace(/sp/g, "")
135
+ .replace(/rem/g, ""));
136
+ },
137
+ getElementStyle(element) {
138
+ return element.currentStyle ?? (window.getComputedStyle ? window.getComputedStyle(element) : element.style);
139
+ },
140
+ getElementWidth(element, excludeMargin = false) {
141
+ const elementRect = element.getBoundingClientRect();
142
+ const style = element.currentStyle ?? window.getComputedStyle(element);
143
+ return elementRect.width + (excludeMargin ? 0 : (parseInt(style.marginLeft) + parseInt(style.marginRight))) + parseInt(style.paddingLeft) + parseInt(style.paddingRight);
144
+ },
145
+ getElementHeight(element, excludeMargin = false) {
146
+ const elementRect = element.getBoundingClientRect();
147
+ const style = element.currentStyle ?? window.getComputedStyle(element);
148
+ return elementRect.height + (excludeMargin ? 0 : (parseInt(style.marginTop) + parseInt(style.marginBottom))) + parseInt(style.paddingTop) + parseInt(style.paddingBottom);
149
+ },
150
+ getElementSuperfluousWidth(element, withPadding) {
151
+ const style = element.currentStyle ?? window.getComputedStyle(element);
152
+ let width = parseInt(style.marginLeft) + parseInt(style.marginRight);
153
+ if (withPadding)
154
+ width += (parseInt(style.paddingLeft) + parseInt(style.paddingRight));
155
+ return width;
156
+ },
157
+ getElementSuperfluousHeight(element, withPadding) {
158
+ const style = element.currentStyle ?? window.getComputedStyle(element);
159
+ let height = parseInt(style.marginTop) + parseInt(style.marginBottom);
160
+ if (withPadding)
161
+ height += (parseInt(style.paddingTop) + parseInt(style.paddingBottom));
162
+ return height;
163
+ },
164
+ absolutePositionRelatively(element, target, horizontal = "right") {
165
+ if (!element || !target || !target.getBoundingClientRect)
166
+ return;
167
+ let elementDimensions = element.offsetParent ? { width: element.offsetWidth, height: element.offsetHeight } : this.getHiddenElementDimensions(element);
168
+ let targetOuterWidth = target.offsetWidth;
169
+ let targetOuterHeight = target.offsetHeight;
170
+ let elementOuterWidth = elementDimensions.width;
171
+ let elementOuterHeight = elementDimensions.height;
172
+ let targetOffset = target.getBoundingClientRect();
173
+ let windowScrollTop = this.getDocumentScrollTop();
174
+ let windowScrollLeft = this.getDocumentScrollLeft();
175
+ let viewport = this.getViewport();
176
+ let top, left, operator;
177
+ let elementStyle = element.currentStyle || window.getComputedStyle(element);
178
+ const elementMarginTop = this.sanitizeStyleValue(elementStyle.marginTop);
179
+ const elementMarginLeft = this.sanitizeStyleValue(elementStyle.marginLeft);
180
+ if (targetOffset.top + targetOuterHeight + elementOuterHeight > viewport.height) {
181
+ top = targetOffset.top + windowScrollTop - elementOuterHeight;
182
+ if (top < 0)
183
+ top = windowScrollTop;
184
+ element.style.transformOrigin = 'bottom';
185
+ operator = "-";
186
+ }
187
+ else {
188
+ top = targetOuterHeight + targetOffset.top + windowScrollTop;
189
+ element.style.transformOrigin = 'top';
190
+ operator = "+";
191
+ }
192
+ if (targetOffset.left + targetOuterWidth + elementOuterWidth > viewport.width) {
193
+ //left = targetOffset.left;
194
+ left = Math.max(0, targetOffset.left + windowScrollLeft + targetOuterWidth - elementOuterWidth);
195
+ }
196
+ else {
197
+ left = targetOffset.left + windowScrollLeft;
198
+ }
199
+ if (horizontal === "right") {
200
+ element.style.left = (left - elementMarginLeft) + 'px';
201
+ }
202
+ else {
203
+ element.style.left = (elementMarginLeft) + 'px';
204
+ }
205
+ element.style.top = `calc(${(top - elementMarginTop) + 'px'} ${operator} var(--componentMarginTopOrBottom, 0px))`;
206
+ },
207
+ appendChild(element, target) {
208
+ if (this.isElement(target)) {
209
+ target.appendChild(element);
210
+ }
211
+ else if (target && target.el && target.el.nativeElement) {
212
+ target.el.nativeElement.appendChild(element);
213
+ }
214
+ else {
215
+ throw new Error('AppendChild: Cannot append ' + target + ' to ' + element);
216
+ }
217
+ },
218
+ convertToCamelCase(styleKey) {
219
+ if (styleKey.indexOf("-") < 0)
220
+ return styleKey;
221
+ let newStyleKey = "";
222
+ for (let index = 0; index < styleKey.length; index++) {
223
+ let ch = styleKey[index];
224
+ if (ch === '-') {
225
+ if (index + 1 < styleKey.length) {
226
+ newStyleKey += styleKey[++index].toUpperCase();
227
+ }
228
+ continue;
229
+ }
230
+ newStyleKey += ch;
231
+ }
232
+ return newStyleKey;
233
+ },
234
+ matchStyles(sourceElement, targetElements, styleKeys, cb) {
235
+ if (!sourceElement || !targetElements || !styleKeys ||
236
+ !targetElements.length || !styleKeys.length ||
237
+ targetElements.length < 1 || styleKeys.length < 1)
238
+ return;
239
+ styleKeys.forEach((styleKey) => {
240
+ const sourceComputedStyle = window.getComputedStyle(sourceElement, null);
241
+ const styleProp = sourceComputedStyle.getPropertyValue(styleKey);
242
+ targetElements.forEach((targetElement) => {
243
+ if (!targetElement.style)
244
+ targetElement.style = {};
245
+ const targetComputedStyle = window.getComputedStyle(targetElement, null);
246
+ targetElement.style[this.convertToCamelCase(styleKey)] = (cb ? cb(styleKey, styleProp, sourceComputedStyle, targetComputedStyle) : styleProp);
247
+ });
248
+ });
249
+ },
250
+ remToPx: (value) => value * 16,
251
+ pxToRem: (value) => value / 16,
252
+ calculateContentHeight(el, scanAmount) {
253
+ let origHeight = el.style.height, height = el.offsetHeight, scrollHeight = el.scrollHeight, overflow = el.style.overflow;
254
+ if (height >= scrollHeight) {
255
+ el.style.height = (height + scanAmount) + 'px';
256
+ el.style.overflow = 'hidden';
257
+ if (scrollHeight < el.scrollHeight) {
258
+ while (el.offsetHeight >= el.scrollHeight) {
259
+ el.style.height = (height -= scanAmount) + 'px';
260
+ }
261
+ while (el.offsetHeight < el.scrollHeight) {
262
+ el.style.height = (height++) + 'px';
263
+ }
264
+ el.style.height = origHeight;
265
+ el.style.overflow = overflow;
266
+ return height;
267
+ }
268
+ }
269
+ else {
270
+ return scrollHeight;
271
+ }
272
+ },
273
+ calculateLines(el) {
274
+ let style = (window.getComputedStyle) ? window.getComputedStyle(el) : el.currentStyle;
275
+ let lineHeight = style.lineHeight;
276
+ if (lineHeight === "normal")
277
+ lineHeight = 1.2;
278
+ lineHeight = parseInt(lineHeight, 10);
279
+ let taHeight = DOMHelper.calculateContentHeight(el, lineHeight);
280
+ return Math.ceil(taHeight / lineHeight);
281
+ },
282
+ calculateHeight(el) {
283
+ let style = (window.getComputedStyle) ? window.getComputedStyle(el) : el.currentStyle;
284
+ let lineHeight = style.lineHeight;
285
+ if (lineHeight === "normal")
286
+ lineHeight = 1.2;
287
+ lineHeight = parseInt(lineHeight, 10);
288
+ const lineCount = DOMHelper.calculateLines(el);
289
+ if (Number.isNaN(lineCount))
290
+ return parseInt(style.height, 10) - lineHeight;
291
+ return Math.ceil(DOMHelper.calculateLines(el) * lineHeight);
292
+ },
293
+ inViewport(el, con, orientation = Orientation.HORIZONTAL_VERTICAL) {
294
+ if (!con)
295
+ con = document.documentElement;
296
+ let elRect = el.getBoundingClientRect();
297
+ let conRect = con.getBoundingClientRect();
298
+ let elReactVerticalOffsetTop = elRect.y - elRect.height;
299
+ let elReactVerticalOffsetBottom = (elRect.y - conRect.y) + elRect.height;
300
+ let elReactHorizontalOffsetLeft = elRect.x - elRect.width;
301
+ let elReactHorizontalOffsetRight = (elRect.x - conRect.x) + elRect.width;
302
+ const inViewportVerticallyTop = elReactVerticalOffsetTop >= 0 && elReactVerticalOffsetTop <= conRect.height;
303
+ const inViewportVerticallyBottom = elReactVerticalOffsetBottom >= 0 && elReactVerticalOffsetBottom <= conRect.height;
304
+ const inViewportVerticallyLeft = elReactHorizontalOffsetLeft >= 0 && elReactHorizontalOffsetLeft <= conRect.width;
305
+ const inViewportVerticallyRight = elReactHorizontalOffsetRight >= 0 && elReactHorizontalOffsetRight <= conRect.width;
306
+ const inViewportVertically = inViewportVerticallyTop || inViewportVerticallyBottom;
307
+ const inViewportHorizontally = inViewportVerticallyLeft || inViewportVerticallyRight;
308
+ if (orientation === Orientation.VERTICAL)
309
+ return inViewportVertically;
310
+ if (orientation === Orientation.HORIZONTAL)
311
+ return inViewportHorizontally;
312
+ if (orientation === Orientation.HORIZONTAL_OR_VERTICAL)
313
+ return inViewportVertically || inViewportHorizontally;
314
+ return inViewportVertically && inViewportHorizontally;
315
+ },
316
+ getElementParents(element, parents = []) {
317
+ return (element.parentNode) ? this.getElementParents(element.parentNode, parents.concat([element.parentNode])) : parents;
318
+ },
319
+ findParentElement(child, cond) {
320
+ const elementParent = child.parentNode;
321
+ if (cond(elementParent) || elementParent.tagName === "BODY" || elementParent.nodeType === 9)
322
+ return elementParent;
323
+ return DOMHelper.findParentElement(elementParent, cond);
324
+ },
325
+ alignChildToParent(parent, child, alignment) {
326
+ let left, top;
327
+ const labelRect = child.getBoundingClientRect();
328
+ const compoundRect = DOMHelper.getElementRectWithOffset(parent);
329
+ const labelSuperfluousWidth = DOMHelper.getElementSuperfluousWidth(child);
330
+ const labelSuperfluousHeight = DOMHelper.getElementSuperfluousHeight(child);
331
+ const compoundParentElement = DOMHelper.findParentElement(parent, (el) => {
332
+ let style = (window.getComputedStyle) ? window.getComputedStyle(el) : el.currentStyle;
333
+ return style.position === "relative";
334
+ });
335
+ const compoundParentRect = DOMHelper.getElementRectWithOffset(compoundParentElement);
336
+ switch (alignment) {
337
+ case Alignment.TOP:
338
+ case Alignment.TOP_CENTER:
339
+ left = ((compoundRect.width / 2) - labelSuperfluousWidth);
340
+ break;
341
+ case Alignment.TOP_RIGHT:
342
+ left = ((compoundRect.width - labelRect.width) + compoundRect.x - labelSuperfluousWidth);
343
+ break;
344
+ case Alignment.BOTTOM:
345
+ case Alignment.BOTTOM_CENTER:
346
+ left = ((compoundRect.width / 2) - labelSuperfluousWidth);
347
+ top = ((compoundRect.top + compoundRect.height) - labelRect.height - labelSuperfluousHeight);
348
+ break;
349
+ case Alignment.BOTTOM_LEFT:
350
+ top = ((compoundRect.top + compoundRect.height) - labelRect.height - labelSuperfluousHeight);
351
+ break;
352
+ case Alignment.BOTTOM_RIGHT:
353
+ left = ((compoundRect.width - labelRect.width) + compoundRect.x - labelSuperfluousWidth);
354
+ top = ((compoundRect.top + compoundRect.height) - labelRect.height - labelSuperfluousHeight);
355
+ break;
356
+ case Alignment.CENTER:
357
+ left = ((compoundRect.width / 2) - labelSuperfluousWidth);
358
+ top = ((compoundRect.top + (compoundRect.width / 2)) - labelRect.height + labelSuperfluousHeight);
359
+ break;
360
+ case Alignment.CENTER_LEFT:
361
+ top = ((compoundRect.top + (compoundRect.width / 2)) - labelRect.height - labelSuperfluousHeight);
362
+ break;
363
+ case Alignment.CENTER_RIGHT:
364
+ left = ((compoundRect.width - labelRect.width) + compoundRect.x - labelSuperfluousWidth);
365
+ top = ((compoundRect.top + (compoundRect.width / 2)) - labelRect.height - labelSuperfluousHeight);
366
+ break;
367
+ }
368
+ if (top && compoundParentElement.tagName !== "BODY")
369
+ top -= compoundParentRect.top;
370
+ if (left && compoundParentElement.tagName !== "BODY")
371
+ left -= compoundParentRect.left;
372
+ child.style.top = top ? `${top}px` : "inherit";
373
+ child.style.left = left ? `${left}px` : "inherit";
374
+ },
375
+ elementParent(el) {
376
+ return el.parentNode;
377
+ },
378
+ elementRelativeAndAbsolutePositions(el, evt, boundToParent, allowedOverflow = 0, direction = Direction.ALL, ceiling) {
379
+ const parent = DOMHelper.elementParent(el);
380
+ const rect = DOMHelper.getElementRectWithOffset(el);
381
+ const parentRect = DOMHelper.getElementRectWithOffset(parent);
382
+ const scrollY = window.scrollY ?? document.documentElement.scrollTop ?? document.body.scrollTop ?? 0;
383
+ const scrollX = window.scrollX ?? document.documentElement.scrollLeft ?? document.body.scrollLeft ?? 0;
384
+ let x = (evt.clientX + scrollX) - parentRect.x;
385
+ let y = (evt.clientY + scrollY) - parentRect.y;
386
+ let clientTop = (evt.clientY + scrollY) - (rect.height / 2);
387
+ let clientLeft = (evt.clientX + scrollX) - (rect.width / 2);
388
+ let top = clientTop;
389
+ let left = clientLeft;
390
+ if (boundToParent) {
391
+ const bound = boundToParent === true || boundToParent === Bound.ALL;
392
+ if ((bound || boundToParent === Bound.LEFT) && x < 0)
393
+ x = 0;
394
+ if ((bound || boundToParent === Bound.TOP) && y < 0)
395
+ y = 0;
396
+ if ((bound || boundToParent === Bound.TOP) && top < 0)
397
+ top = 0;
398
+ if ((bound || boundToParent === Bound.LEFT) && left < 0)
399
+ left = 0;
400
+ if ((bound || boundToParent === Bound.RIGHT) && x > parentRect.width)
401
+ x = parentRect.width;
402
+ if ((bound || boundToParent === Bound.BOTTOM) && y > parentRect.height)
403
+ y = parentRect.height;
404
+ if ((bound || boundToParent === Bound.TOP) && top < (parentRect.top - allowedOverflow))
405
+ top = (parentRect.top - allowedOverflow);
406
+ if ((bound || boundToParent === Bound.LEFT) && left < (parentRect.left - allowedOverflow))
407
+ left = (parentRect.left - allowedOverflow);
408
+ if ((bound || boundToParent === Bound.BOTTOM) && top > (parentRect.height + parentRect.top - (rect.height - allowedOverflow)))
409
+ top = ((parentRect.height + parentRect.top) - (rect.height - allowedOverflow));
410
+ if ((bound || boundToParent === Bound.RIGHT) && left > (parentRect.width + parentRect.left - (rect.width - allowedOverflow)))
411
+ left = ((parentRect.width + parentRect.left) - (rect.width - allowedOverflow));
412
+ }
413
+ if (ceiling) {
414
+ if (ceiling.top && top < ceiling.top)
415
+ top = ceiling.top;
416
+ if (ceiling.left && left < ceiling.left)
417
+ left = ceiling.left;
418
+ if (ceiling.right && left > ceiling.right)
419
+ left = ceiling.right;
420
+ if (ceiling.bottom && top > ceiling.bottom)
421
+ top = ceiling.bottom;
422
+ }
423
+ if (BoolHelper.equalsAny(direction, [Direction.NORTH, Direction.SOUTH, Direction.NORTH_SOUTH])) {
424
+ x = rect.x;
425
+ left = rect.left;
426
+ if ((direction === Direction.NORTH && top > rect.top) || (direction === Direction.SOUTH && top < rect.top)) {
427
+ y = rect.y;
428
+ top = rect.top;
429
+ }
430
+ }
431
+ if (BoolHelper.equalsAny(direction, [Direction.EAST, Direction.WEST, Direction.EAST_WEST])) {
432
+ y = rect.y;
433
+ top = rect.top;
434
+ if ((direction === Direction.EAST && left < rect.left) || (direction === Direction.WEST && left > rect.left)) {
435
+ x = rect.x;
436
+ left = rect.left;
437
+ }
438
+ }
439
+ // Handle other cardinal point NW, SW, NE, SE - overkill?
440
+ return {
441
+ x,
442
+ y,
443
+ top,
444
+ left,
445
+ scrollY,
446
+ scrollX,
447
+ parentRect,
448
+ clientTop,
449
+ clientLeft,
450
+ clientX: evt.clientX,
451
+ clientY: evt.clientY,
452
+ };
453
+ },
454
+ positionElement(el, position) {
455
+ el.style.position = "absolute";
456
+ el.style.left = position.x + 'px';
457
+ el.style.top = position.y + 'px';
458
+ },
459
+ copyToClipboard(text, cb) {
460
+ if (navigator.clipboard) {
461
+ navigator.clipboard.writeText(text).then(() => cb?.(), (err) => cb?.(err));
462
+ return;
463
+ }
464
+ if (window.clipboardData && window.clipboardData.setData) {
465
+ return window.clipboardData.setData("Text", text);
466
+ }
467
+ else if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
468
+ var textarea = document.createElement("textarea");
469
+ textarea.textContent = text;
470
+ textarea.style.position = "fixed";
471
+ document.body.appendChild(textarea);
472
+ textarea.select();
473
+ try {
474
+ document.execCommand("copy");
475
+ cb?.();
476
+ }
477
+ catch (ex) {
478
+ cb?.(ex);
479
+ return prompt("Copy to clipboard: Ctrl+C, Enter", text);
480
+ }
481
+ finally {
482
+ document.body.removeChild(textarea);
483
+ }
484
+ }
485
+ },
486
+ getImageAspectRatio(image) {
487
+ const w = image.naturalWidth;
488
+ const h = image.naturalHeight;
489
+ return (w > h ? w / h : h / w);
490
+ },
491
+ getSizeRelativeToImageAspectRatio(image, size, mutate) {
492
+ const w = image.naturalWidth;
493
+ const h = image.naturalHeight;
494
+ const newSize = {
495
+ width: size.width ?? w,
496
+ height: size.height ?? h,
497
+ };
498
+ const widthGreater = w > h;
499
+ const aspectRation = (widthGreater ? w / h : h / w);
500
+ if (!size.height || (mutate === "HEIGHT" || mutate === "WIDTH_HEIGHT")) {
501
+ if (widthGreater) {
502
+ newSize.height = (newSize.width / aspectRation);
503
+ }
504
+ else {
505
+ newSize.height = (newSize.width * aspectRation);
506
+ }
507
+ }
508
+ if (!size.width || (mutate === "WIDTH" || mutate === "WIDTH_HEIGHT")) {
509
+ if (widthGreater) {
510
+ newSize.width = ((newSize.height) * aspectRation);
511
+ }
512
+ else {
513
+ newSize.width = (newSize.height / aspectRation);
514
+ }
515
+ }
516
+ return newSize;
517
+ },
518
+ getCanvasFont(el) {
519
+ const elementStyle = DOMHelper.getElementStyle(el);
520
+ const fontWeight = elementStyle.fontWeight;
521
+ const fontSize = elementStyle.fontSize ?? "16px";
522
+ const fontFamily = elementStyle.fontFamily ?? 'Times New Roman';
523
+ return `${fontWeight} ${fontSize} ${fontFamily}`;
524
+ },
525
+ // https://stackoverflow.com/a/21015393/6626422
526
+ getTextWidth(text, el) {
527
+ if (!cachedCanvas) {
528
+ cachedCanvas = document.createElement("canvas");
529
+ }
530
+ const context = cachedCanvas.getContext("2d");
531
+ context.font = DOMHelper.getCanvasFont(el);
532
+ const metrics = context.measureText(text);
533
+ return metrics.width;
534
+ },
535
+ async imageDataFromFileBlock(fileBlob) {
536
+ const bitmap = await createImageBitmap(fileBlob);
537
+ const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);
538
+ const context = canvas.getContext('2d');
539
+ context.drawImage(bitmap, 0, 0);
540
+ return {
541
+ width: bitmap.width,
542
+ height: bitmap.height,
543
+ imageData: context.getImageData(0, 0, bitmap.width, bitmap.height),
544
+ };
545
+ },
546
+ removeAllChildren(el) {
547
+ while (el.firstChild) {
548
+ el.removeChild(el.firstChild);
549
+ }
550
+ },
551
+ openInNewTab(url, target = '_blank', features = 'noopener,noreferrer') {
552
+ const newWindow = window.open(url, target, features);
553
+ if (newWindow)
554
+ newWindow.opener = null;
555
+ },
556
+ updateSearchParam(setSearchParams, key, value, cb) {
557
+ const fun = (prev) => {
558
+ if (value === undefined || value === null) {
559
+ prev.delete(key);
560
+ }
561
+ else if (Array.isArray(value)) {
562
+ prev.delete(key);
563
+ for (const v of value)
564
+ prev.append(key, `${v}`);
565
+ }
566
+ else {
567
+ prev.set(key, `${value}`);
568
+ }
569
+ return prev;
570
+ };
571
+ if (setSearchParams instanceof URLSearchParams)
572
+ fun(setSearchParams);
573
+ else
574
+ setSearchParams(fun);
575
+ cb?.();
576
+ },
577
+ updateSearchParams(setSearchParams, values, cb) {
578
+ const entries = Object.entries(values);
579
+ const fun = (prev) => {
580
+ for (const [key, value] of entries) {
581
+ if (value === undefined || value === null) {
582
+ prev.delete(key);
583
+ }
584
+ else if (Array.isArray(value)) {
585
+ prev.delete(key);
586
+ for (const v of value)
587
+ prev.append(key, `${v}`);
588
+ }
589
+ else {
590
+ prev.set(key, `${value}`);
591
+ }
592
+ }
593
+ ;
594
+ return prev;
595
+ };
596
+ if (setSearchParams instanceof URLSearchParams)
597
+ fun(setSearchParams);
598
+ else
599
+ setSearchParams(fun);
600
+ cb?.();
601
+ },
602
+ };
603
+ export const ScrollHandler = {
604
+ querySelector(element, selector) {
605
+ if (!element)
606
+ return null;
607
+ return element.querySelector(selector);
608
+ },
609
+ getScrollableParents(element, nuclearParentOnly = false) {
610
+ let scrollableParents = [];
611
+ if (!element)
612
+ return scrollableParents;
613
+ let elementParents = DOMHelper.getElementParents(element);
614
+ const scrollRegex = /(auto|scroll|visible)/;
615
+ const checkIfScrollable = (node) => {
616
+ let cssStyleDeclaration = window['getComputedStyle'](node, null);
617
+ return scrollRegex.test(cssStyleDeclaration.getPropertyValue('overflow')) ||
618
+ scrollRegex.test(cssStyleDeclaration.getPropertyValue('overflowX')) ||
619
+ scrollRegex.test(cssStyleDeclaration.getPropertyValue('overflowY'));
620
+ };
621
+ for (let elementParent of elementParents) {
622
+ let scrollSelectors = elementParent.nodeType === 1 && elementParent.dataset['scrollselectors'];
623
+ if (scrollSelectors) {
624
+ let selectors = scrollSelectors.split(',');
625
+ for (let selector of selectors) {
626
+ let el = this.querySelector(elementParent, selector);
627
+ if (el && checkIfScrollable(el))
628
+ scrollableParents.push(el);
629
+ }
630
+ }
631
+ if (elementParent.nodeType !== 9 && checkIfScrollable(elementParent)) {
632
+ scrollableParents.push(elementParent);
633
+ }
634
+ else if (elementParent.nodeType === 9) {
635
+ scrollableParents.push(window);
636
+ }
637
+ if (nuclearParentOnly && scrollableParents.length)
638
+ break;
639
+ }
640
+ return scrollableParents;
641
+ },
642
+ attachScrollListener(scrollableParents, listener) {
643
+ if (!scrollableParents || scrollableParents.length === 0)
644
+ return;
645
+ for (let index = 0; index < scrollableParents.length; index++) {
646
+ scrollableParents[index].addEventListener('scroll', listener);
647
+ }
648
+ },
649
+ detachScrollListener(scrollableParents, listener) {
650
+ if (!scrollableParents || scrollableParents.length === 0)
651
+ return;
652
+ for (let index = 0; index < scrollableParents.length; index++) {
653
+ scrollableParents[index].removeEventListener('scroll', listener);
654
+ }
655
+ },
656
+ handle(element, listener, nuclearParentOnly = false) {
657
+ const scrollableParents = !element ? [] : (Array.isArray(element) ? element : this.getScrollableParents(element, nuclearParentOnly));
658
+ return {
659
+ attach: () => this.attachScrollListener(scrollableParents, listener),
660
+ detach: () => this.detachScrollListener(scrollableParents, listener),
661
+ };
662
+ },
663
+ };
664
+ export var BaseZIndex;
665
+ (function (BaseZIndex) {
666
+ BaseZIndex[BaseZIndex["MENU"] = 1000] = "MENU";
667
+ BaseZIndex[BaseZIndex["MODAL"] = 1001] = "MODAL";
668
+ BaseZIndex[BaseZIndex["TOAST"] = 1002] = "TOAST";
669
+ BaseZIndex[BaseZIndex["OVERLAY"] = 1003] = "OVERLAY";
670
+ BaseZIndex[BaseZIndex["TOOLTIP"] = 1004] = "TOOLTIP";
671
+ })(BaseZIndex || (BaseZIndex = {}));
672
+ ;
673
+ export const ZIndexHandler = {
674
+ ZINDEXES: [],
675
+ generateZIndex(zindex) {
676
+ const lastZIndex = (this.ZINDEXES.length > 0) ? this.ZINDEXES[this.ZINDEXES.length - 1] : 999;
677
+ const newZIndex = lastZIndex >= zindex ? lastZIndex + 1 : zindex;
678
+ this.ZINDEXES.push(newZIndex);
679
+ return newZIndex;
680
+ },
681
+ getCurrentZIndex() {
682
+ return this.ZINDEXES.length > 0 ? this.ZINDEXES[this.ZINDEXES.length - 1] : 0;
683
+ },
684
+ setElementZIndex(element, zIndex) {
685
+ if (!element || !element.style)
686
+ return;
687
+ element.style.zIndex = String(this.generateZIndex(zIndex));
688
+ },
689
+ getElementZIndex(element) {
690
+ if (!element || !element.style)
691
+ return 0;
692
+ return parseInt(element.style.zIndex) || 0;
693
+ },
694
+ removeElementZIndex(element) {
695
+ if (!element || !element.style)
696
+ return;
697
+ const zindex = this.getElementZIndex(element);
698
+ element.style.zIndex = undefined;
699
+ const index = this.ZINDEXES.indexOf(zindex);
700
+ if (index > -1)
701
+ this.ZINDEXES.splice(index, 1);
702
+ },
703
+ };
704
+ export class ObserverHandler {
705
+ static __OBSERVERS = {};
706
+ static __OBSERVERS_EVENT_HANDLERS = {};
707
+ static observe(type, eventHandler, target = document.body, options) {
708
+ ObserverHandler.registerObserver(type, target, options);
709
+ if (ObserverHandler.__OBSERVERS_EVENT_HANDLERS?.[type]?.[target]?.includes(eventHandler))
710
+ return;
711
+ if (!(type in ObserverHandler.__OBSERVERS_EVENT_HANDLERS))
712
+ ObserverHandler.__OBSERVERS_EVENT_HANDLERS[type] = {};
713
+ if (!(target in ObserverHandler.__OBSERVERS_EVENT_HANDLERS?.[type])) {
714
+ ObserverHandler.__OBSERVERS_EVENT_HANDLERS[type][target] = [];
715
+ }
716
+ ObserverHandler.__OBSERVERS_EVENT_HANDLERS[type][target].push(eventHandler);
717
+ }
718
+ static unobserve(type, eventHandler, target = document.body) {
719
+ const targetObserver = ObserverHandler.__OBSERVERS?.[type]?.[target];
720
+ const eventHandlerIndex = ObserverHandler.__OBSERVERS_EVENT_HANDLERS?.[type]?.[target]?.indexOf(eventHandler);
721
+ if (eventHandlerIndex < 0)
722
+ return;
723
+ ObserverHandler.__OBSERVERS_EVENT_HANDLERS?.[type]?.[target]?.splice(eventHandlerIndex, 1);
724
+ if (!ObserverHandler.__OBSERVERS_EVENT_HANDLERS?.[type]?.[target]?.length) {
725
+ delete ObserverHandler.__OBSERVERS_EVENT_HANDLERS?.[type]?.[target];
726
+ if (!Object.keys(ObserverHandler.__OBSERVERS_EVENT_HANDLERS?.[type]).length) {
727
+ delete ObserverHandler.__OBSERVERS_EVENT_HANDLERS?.[type];
728
+ if (targetObserver) {
729
+ targetObserver.unobserve(target);
730
+ delete ObserverHandler.__OBSERVERS?.[type]?.[target];
731
+ if (!Object.keys(ObserverHandler.__OBSERVERS?.[type]).length) {
732
+ delete ObserverHandler.__OBSERVERS?.[type];
733
+ }
734
+ }
735
+ }
736
+ }
737
+ }
738
+ static registerObserver(type, target, options) {
739
+ if ((type in ObserverHandler.__OBSERVERS) && (target in ObserverHandler.__OBSERVERS?.[type])) {
740
+ return;
741
+ }
742
+ let observer;
743
+ if (type === "resize") {
744
+ observer = new ResizeObserver((entries) => {
745
+ if (!(type in ObserverHandler.__OBSERVERS_EVENT_HANDLERS))
746
+ return;
747
+ ObserverHandler.__OBSERVERS_EVENT_HANDLERS[type][target].forEach((e) => e(entries));
748
+ });
749
+ }
750
+ if (!observer)
751
+ throw new Error("NoseurError: observer not initialized, likely an invalid observation type");
752
+ observer.observe(target, options);
753
+ if (!(type in ObserverHandler.__OBSERVERS))
754
+ ObserverHandler.__OBSERVERS[type] = {};
755
+ if (!(target in ObserverHandler.__OBSERVERS[type])) {
756
+ ObserverHandler.__OBSERVERS[type][target] = observer;
757
+ }
758
+ }
759
+ }