hrenpack_js 3.1.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +928 -928
- package/package.json +2 -1
package/index.js
CHANGED
|
@@ -1,928 +1,928 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
|
|
3
|
-
// ===== File: arraywork.js =====
|
|
4
|
-
"use strict";
|
|
5
|
-
function arrayIsEmpty(arr) {
|
|
6
|
-
return arr.length === 0 || !arr[0];
|
|
7
|
-
}
|
|
8
|
-
function arraysIsEqual(array1, array2, strict = true) {
|
|
9
|
-
if (array1.length !== array2.length)
|
|
10
|
-
return false;
|
|
11
|
-
if (strict)
|
|
12
|
-
return array1.every((value, index) => value === array2[index]);
|
|
13
|
-
else {
|
|
14
|
-
array1.forEach(element => {
|
|
15
|
-
if (!array2.includes(element))
|
|
16
|
-
return false;
|
|
17
|
-
});
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=arraywork.js.map
|
|
22
|
-
|
|
23
|
-
// ===== File: auto.js =====
|
|
24
|
-
"use strict";
|
|
25
|
-
const stylesRoot = getComputedStyle(document.documentElement);
|
|
26
|
-
//# sourceMappingURL=auto.js.map
|
|
27
|
-
|
|
28
|
-
// ===== File: classes.js =====
|
|
29
|
-
"use strict";
|
|
30
|
-
class ClickableLinksFactory {
|
|
31
|
-
constructor() {
|
|
32
|
-
Object.defineProperty(this, "urlRegex", {
|
|
33
|
-
enumerable: true,
|
|
34
|
-
configurable: true,
|
|
35
|
-
writable: true,
|
|
36
|
-
value: /(https?:\/\/[^\s]+)/g
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
walk(node, isClickToCopy) {
|
|
40
|
-
if (node.nodeType === Node.TEXT_NODE) {
|
|
41
|
-
const text = node.textContent || '';
|
|
42
|
-
const func = isClickToCopy ? this.get_clickToCopy : this.get_anchor;
|
|
43
|
-
if (this.urlRegex.test(text)) {
|
|
44
|
-
const parent = node.parentNode;
|
|
45
|
-
const newContent = text.replace(this.urlRegex, url => {
|
|
46
|
-
return func(url);
|
|
47
|
-
});
|
|
48
|
-
if (!parent)
|
|
49
|
-
return;
|
|
50
|
-
const tempDiv = document.createElement('div');
|
|
51
|
-
tempDiv.innerHTML = newContent;
|
|
52
|
-
while (tempDiv.firstChild) {
|
|
53
|
-
parent.insertBefore(tempDiv.firstChild, node);
|
|
54
|
-
}
|
|
55
|
-
parent.removeChild(node);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
node.childNodes.forEach(child => {
|
|
60
|
-
this.walk(child, isClickToCopy);
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
get_anchor(url) {
|
|
65
|
-
return `<a href="${url}" target="_blank" rel="noopener noreferrer" data-clf-generated>${url}</a>`;
|
|
66
|
-
}
|
|
67
|
-
get_clickToCopy(url) {
|
|
68
|
-
return `<click-to-copy data-clf-generated>${url}</click-to-copy>`;
|
|
69
|
-
}
|
|
70
|
-
clickableLinks(element) {
|
|
71
|
-
this.walk(element, false);
|
|
72
|
-
}
|
|
73
|
-
clickToCopyLinks(element) {
|
|
74
|
-
this.walk(element, true);
|
|
75
|
-
}
|
|
76
|
-
get generatedElements() {
|
|
77
|
-
return document.querySelectorAll('[data-clf-generated]');
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
class GETParamsManager {
|
|
81
|
-
constructor() {
|
|
82
|
-
Object.defineProperty(this, "params", {
|
|
83
|
-
enumerable: true,
|
|
84
|
-
configurable: true,
|
|
85
|
-
writable: true,
|
|
86
|
-
value: void 0
|
|
87
|
-
});
|
|
88
|
-
this.params = new URLSearchParams(window.location.search);
|
|
89
|
-
}
|
|
90
|
-
get(key, defaultValue) {
|
|
91
|
-
const value = this.params.get(key);
|
|
92
|
-
if (value === null)
|
|
93
|
-
return defaultValue || null;
|
|
94
|
-
if (defaultValue !== undefined) {
|
|
95
|
-
switch (typeof defaultValue) {
|
|
96
|
-
case 'number':
|
|
97
|
-
return Number(value);
|
|
98
|
-
case 'boolean':
|
|
99
|
-
return (value === 'true');
|
|
100
|
-
default:
|
|
101
|
-
return value;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
return value;
|
|
105
|
-
}
|
|
106
|
-
set(key, value) {
|
|
107
|
-
this.params.set(key, String(value));
|
|
108
|
-
this.updateURL();
|
|
109
|
-
}
|
|
110
|
-
delete(key) {
|
|
111
|
-
this.params.delete(key);
|
|
112
|
-
this.updateURL();
|
|
113
|
-
}
|
|
114
|
-
all() {
|
|
115
|
-
const result = {};
|
|
116
|
-
for (const [key, value] of this.params.entries()) {
|
|
117
|
-
result[key] = value;
|
|
118
|
-
}
|
|
119
|
-
return result;
|
|
120
|
-
}
|
|
121
|
-
clear() {
|
|
122
|
-
const keys = Array.from(this.params.keys());
|
|
123
|
-
keys.forEach(key => this.params.delete(key));
|
|
124
|
-
this.updateURL();
|
|
125
|
-
}
|
|
126
|
-
updateURL() {
|
|
127
|
-
const newUrl = `${window.location.pathname}?${this.params.toString()}`;
|
|
128
|
-
window.history.pushState({}, '', newUrl);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
//# sourceMappingURL=classes.js.map
|
|
132
|
-
|
|
133
|
-
// ===== File: compiler.js =====
|
|
134
|
-
"use strict";
|
|
135
|
-
function downloadTextAsFile(filename, text) {
|
|
136
|
-
const blob = new Blob([text], { type: 'text/plain' });
|
|
137
|
-
const url = URL.createObjectURL(blob);
|
|
138
|
-
console.log(url);
|
|
139
|
-
const a = document.createElement('a');
|
|
140
|
-
a.href = url;
|
|
141
|
-
a.download = filename;
|
|
142
|
-
a.click();
|
|
143
|
-
URL.revokeObjectURL(url);
|
|
144
|
-
}
|
|
145
|
-
//# sourceMappingURL=compiler.js.map
|
|
146
|
-
|
|
147
|
-
// ===== File: cookie.js =====
|
|
148
|
-
"use strict";
|
|
149
|
-
function getCookie(name) {
|
|
150
|
-
const nameEQ = `${name}=`;
|
|
151
|
-
const cookiesArray = document.cookie.split(';');
|
|
152
|
-
cookiesArray.forEach(cookie => {
|
|
153
|
-
cookie = cookie.trim();
|
|
154
|
-
if (cookie.indexOf(nameEQ) === 0) {
|
|
155
|
-
return cookie.substring(nameEQ.length, cookie.length);
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
return null;
|
|
159
|
-
}
|
|
160
|
-
function setCookie(name, value, days = null, path = '/') {
|
|
161
|
-
let expires;
|
|
162
|
-
if (!days) {
|
|
163
|
-
expires = '; expires=Fri, 31 Dec 9999 23:59:59 GMT';
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
const date = new Date();
|
|
167
|
-
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
|
168
|
-
expires = `; expires=${date.toUTCString()}`;
|
|
169
|
-
}
|
|
170
|
-
document.cookie = `${name}=${value || ''}${expires}; path=${path}`;
|
|
171
|
-
}
|
|
172
|
-
function hasCookie(name) {
|
|
173
|
-
return getCookie(name) != null;
|
|
174
|
-
}
|
|
175
|
-
//# sourceMappingURL=cookie.js.map
|
|
176
|
-
|
|
177
|
-
// ===== File: exceptions.js =====
|
|
178
|
-
"use strict";
|
|
179
|
-
class NotAuthorizedError extends Error {
|
|
180
|
-
constructor() {
|
|
181
|
-
super("Пользователь не авторизован");
|
|
182
|
-
this.name = 'NotAuthorizedError';
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
//# sourceMappingURL=exceptions.js.map
|
|
186
|
-
|
|
187
|
-
// ===== File: get_element_types.js =====
|
|
188
|
-
"use strict";
|
|
189
|
-
function button_submit(parent) {
|
|
190
|
-
const buttons = parent.querySelectorAll('button');
|
|
191
|
-
let submit = null;
|
|
192
|
-
buttons.forEach(button => {
|
|
193
|
-
if (button.type === 'submit')
|
|
194
|
-
submit = button;
|
|
195
|
-
});
|
|
196
|
-
return submit;
|
|
197
|
-
}
|
|
198
|
-
//# sourceMappingURL=get_element_types.js.map
|
|
199
|
-
|
|
200
|
-
// ===== File: html.js =====
|
|
201
|
-
"use strict";
|
|
202
|
-
const escapeChars = {
|
|
203
|
-
'<': '<',
|
|
204
|
-
'>': '>',
|
|
205
|
-
'&': '&',
|
|
206
|
-
'"': '"',
|
|
207
|
-
"'": '''
|
|
208
|
-
};
|
|
209
|
-
function togglePassword(passwordInput) {
|
|
210
|
-
const passwordType = passwordInput.getAttribute('type') === 'password' ? 'text' : 'password';
|
|
211
|
-
passwordInput.setAttribute('type', passwordType);
|
|
212
|
-
}
|
|
213
|
-
function isTextWrapped(element) {
|
|
214
|
-
const elementHeight = element.clientHeight;
|
|
215
|
-
const scrollHeight = element.scrollHeight;
|
|
216
|
-
return scrollHeight > elementHeight;
|
|
217
|
-
}
|
|
218
|
-
function notArrayEmpty(array) {
|
|
219
|
-
return array.length > 0;
|
|
220
|
-
}
|
|
221
|
-
function get_tagName(element) {
|
|
222
|
-
return element.tagName.toLowerCase();
|
|
223
|
-
}
|
|
224
|
-
function element_toHTMLText(element) {
|
|
225
|
-
const tag = get_tagName(element);
|
|
226
|
-
const attrs = element.attributes;
|
|
227
|
-
let text = `<${tag}`;
|
|
228
|
-
if (attrs.length > 0) {
|
|
229
|
-
for (let attr of attrs) {
|
|
230
|
-
text += ` ${attr.name}="${attr.value}"`;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
text += `>${element.innerHTML}</${tag}>`;
|
|
234
|
-
return text;
|
|
235
|
-
}
|
|
236
|
-
function element_to_div(element) {
|
|
237
|
-
const div = document.createElement('div');
|
|
238
|
-
div.innerHTML = element.outerHTML;
|
|
239
|
-
return div;
|
|
240
|
-
}
|
|
241
|
-
function password_format(shownPasswordHTML, hiddenPasswordHTML) {
|
|
242
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
243
|
-
const forms = document.querySelectorAll('form');
|
|
244
|
-
forms.forEach(form => {
|
|
245
|
-
const inputs = form.querySelectorAll('input[type="password"]');
|
|
246
|
-
inputs.forEach(input => {
|
|
247
|
-
const wrapper = document.createElement('div');
|
|
248
|
-
wrapper.style.position = 'relative';
|
|
249
|
-
wrapper.style.display = 'inline-block';
|
|
250
|
-
wrapper.style.width = '100%';
|
|
251
|
-
input.parentNode.insertBefore(wrapper, input);
|
|
252
|
-
wrapper.appendChild(input);
|
|
253
|
-
const toggleBtn = document.createElement('button');
|
|
254
|
-
toggleBtn.type = 'button';
|
|
255
|
-
toggleBtn.className = 'show-password-btn';
|
|
256
|
-
toggleBtn.innerHTML = hiddenPasswordHTML;
|
|
257
|
-
toggleBtn.style.cssText = `
|
|
258
|
-
position: absolute;
|
|
259
|
-
left: 45%;
|
|
260
|
-
top: 50%;
|
|
261
|
-
transform: translateY(-50%);
|
|
262
|
-
cursor: pointer;
|
|
263
|
-
user-select: none;
|
|
264
|
-
background: none;
|
|
265
|
-
border: none;
|
|
266
|
-
padding: 0;
|
|
267
|
-
`;
|
|
268
|
-
toggleBtn.addEventListener('click', () => {
|
|
269
|
-
const isShowing = input.type === 'text';
|
|
270
|
-
input.type = isShowing ? 'password' : 'text';
|
|
271
|
-
toggleBtn.innerHTML = isShowing ? hiddenPasswordHTML : shownPasswordHTML;
|
|
272
|
-
});
|
|
273
|
-
wrapper.appendChild(toggleBtn);
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
function escapeHTML(html) {
|
|
279
|
-
return html.replace(/[<>"']/g, function (i) {
|
|
280
|
-
return escapeChars[i] || i;
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
function strFormat(template, ...args) {
|
|
284
|
-
return template.replace(/{(\w+)}/g, (match, key) => {
|
|
285
|
-
if (args.length > 0 && typeof args[0] === 'object' && args[0][key] !== undefined) {
|
|
286
|
-
return args[0][key];
|
|
287
|
-
}
|
|
288
|
-
const index = parseInt(key);
|
|
289
|
-
if (!isNaN(index) && args[index] !== undefined) {
|
|
290
|
-
return args[index];
|
|
291
|
-
}
|
|
292
|
-
return match;
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
function elementToHyperlink(element, href, cursorPointer = true, preventDefault = false) {
|
|
296
|
-
element.addEventListener('click', function (elem) {
|
|
297
|
-
if (elem.button === 0)
|
|
298
|
-
window.location.href = href;
|
|
299
|
-
else if (elem.button === 1)
|
|
300
|
-
window.open(href, '_blank');
|
|
301
|
-
});
|
|
302
|
-
if (preventDefault) {
|
|
303
|
-
element.addEventListener('auxclick', function (elem) {
|
|
304
|
-
if (elem.button === 1)
|
|
305
|
-
elem.preventDefault();
|
|
306
|
-
});
|
|
307
|
-
}
|
|
308
|
-
if (cursorPointer)
|
|
309
|
-
element.style.cursor = 'pointer';
|
|
310
|
-
return element;
|
|
311
|
-
}
|
|
312
|
-
//# sourceMappingURL=html.js.map
|
|
313
|
-
|
|
314
|
-
// ===== File: input.js =====
|
|
315
|
-
"use strict";
|
|
316
|
-
function getInputCursorPosition(input) {
|
|
317
|
-
const start = input.selectionStart;
|
|
318
|
-
if (start == null)
|
|
319
|
-
throw new Error("Incorrect input type");
|
|
320
|
-
return start - 1;
|
|
321
|
-
}
|
|
322
|
-
function copyInputToClipboard(input) {
|
|
323
|
-
const disabled = input.hasAttribute("disabled");
|
|
324
|
-
if (disabled)
|
|
325
|
-
input.removeAttribute('disabled');
|
|
326
|
-
navigator.clipboard.writeText(input.value)
|
|
327
|
-
.then(() => { })
|
|
328
|
-
.catch(err => {
|
|
329
|
-
console.error('Не удалось скопировать текст: ', err);
|
|
330
|
-
})
|
|
331
|
-
.finally(() => {
|
|
332
|
-
if (disabled)
|
|
333
|
-
input.setAttribute('disabled', '');
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
function clearInput_and_addLastSymbol(input) {
|
|
337
|
-
input.value = input.value[getInputCursorPosition(input)] || '';
|
|
338
|
-
}
|
|
339
|
-
function getInputLabel(input) {
|
|
340
|
-
const label = document.querySelector(`label[for="${input.id}"]`);
|
|
341
|
-
if (!label)
|
|
342
|
-
throw new Error("Label не найден. Возможно, вы не использовали атрибут for в нем");
|
|
343
|
-
return label;
|
|
344
|
-
}
|
|
345
|
-
//# sourceMappingURL=input.js.map
|
|
346
|
-
|
|
347
|
-
// ===== File: link.js =====
|
|
348
|
-
"use strict";
|
|
349
|
-
function loadCSS(href) {
|
|
350
|
-
const link = document.createElement('link');
|
|
351
|
-
link.rel = 'stylesheet';
|
|
352
|
-
link.type = 'text/css';
|
|
353
|
-
link.href = href;
|
|
354
|
-
document.head.appendChild(link);
|
|
355
|
-
}
|
|
356
|
-
//# sourceMappingURL=link.js.map
|
|
357
|
-
|
|
358
|
-
// ===== File: notifications.js =====
|
|
359
|
-
"use strict";
|
|
360
|
-
function pushNotification(title = "Уведомление", body = "Текст уведомления", icon = null) {
|
|
361
|
-
if (Notification.permission !== "granted") {
|
|
362
|
-
Notification.requestPermission().then(permission => {
|
|
363
|
-
if (permission === "granted") {
|
|
364
|
-
if (icon)
|
|
365
|
-
new Notification(title, { body: body, icon: icon });
|
|
366
|
-
else
|
|
367
|
-
new Notification(title, { body: body });
|
|
368
|
-
}
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
else {
|
|
372
|
-
if (icon)
|
|
373
|
-
new Notification(title, { body: body, icon: icon });
|
|
374
|
-
else
|
|
375
|
-
new Notification(title, { body: body });
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
class HyperTextNotification {
|
|
379
|
-
constructor({ bottom = '20', right = '20', backgroundColor = '#121212', color = '#ededed', padding = '15', borderRadius = '5', timeout = 3 } = {}) {
|
|
380
|
-
Object.defineProperty(this, "bottom", {
|
|
381
|
-
enumerable: true,
|
|
382
|
-
configurable: true,
|
|
383
|
-
writable: true,
|
|
384
|
-
value: void 0
|
|
385
|
-
});
|
|
386
|
-
Object.defineProperty(this, "right", {
|
|
387
|
-
enumerable: true,
|
|
388
|
-
configurable: true,
|
|
389
|
-
writable: true,
|
|
390
|
-
value: void 0
|
|
391
|
-
});
|
|
392
|
-
Object.defineProperty(this, "backgroundColor", {
|
|
393
|
-
enumerable: true,
|
|
394
|
-
configurable: true,
|
|
395
|
-
writable: true,
|
|
396
|
-
value: void 0
|
|
397
|
-
});
|
|
398
|
-
Object.defineProperty(this, "color", {
|
|
399
|
-
enumerable: true,
|
|
400
|
-
configurable: true,
|
|
401
|
-
writable: true,
|
|
402
|
-
value: void 0
|
|
403
|
-
});
|
|
404
|
-
Object.defineProperty(this, "padding", {
|
|
405
|
-
enumerable: true,
|
|
406
|
-
configurable: true,
|
|
407
|
-
writable: true,
|
|
408
|
-
value: void 0
|
|
409
|
-
});
|
|
410
|
-
Object.defineProperty(this, "borderRadius", {
|
|
411
|
-
enumerable: true,
|
|
412
|
-
configurable: true,
|
|
413
|
-
writable: true,
|
|
414
|
-
value: void 0
|
|
415
|
-
});
|
|
416
|
-
Object.defineProperty(this, "timeout", {
|
|
417
|
-
enumerable: true,
|
|
418
|
-
configurable: true,
|
|
419
|
-
writable: true,
|
|
420
|
-
value: void 0
|
|
421
|
-
});
|
|
422
|
-
this.bottom = intToPixel(bottom);
|
|
423
|
-
this.right = intToPixel(right);
|
|
424
|
-
this.backgroundColor = backgroundColor;
|
|
425
|
-
this.color = color;
|
|
426
|
-
this.padding = intToPixel(padding);
|
|
427
|
-
this.borderRadius = intToPixel(borderRadius);
|
|
428
|
-
this.timeout = timeout;
|
|
429
|
-
}
|
|
430
|
-
show(message, timeout = 0) {
|
|
431
|
-
const notification = document.createElement("div");
|
|
432
|
-
notification.textContent = message;
|
|
433
|
-
notification.style.position = "fixed";
|
|
434
|
-
notification.style.bottom = this.bottom;
|
|
435
|
-
notification.style.right = this.right;
|
|
436
|
-
notification.style.backgroundColor = this.backgroundColor;
|
|
437
|
-
notification.style.color = this.color;
|
|
438
|
-
notification.style.padding = this.padding;
|
|
439
|
-
notification.style.borderRadius = this.borderRadius;
|
|
440
|
-
notification.style.zIndex = "1000";
|
|
441
|
-
const actualTimeout = timeout === 0 ? this.timeout : timeout;
|
|
442
|
-
document.body.appendChild(notification);
|
|
443
|
-
setTimeout(() => {
|
|
444
|
-
if (document.body.contains(notification)) {
|
|
445
|
-
document.body.removeChild(notification);
|
|
446
|
-
}
|
|
447
|
-
}, actualTimeout * 1000);
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
//# sourceMappingURL=notifications.js.map
|
|
451
|
-
|
|
452
|
-
// ===== File: styles.js =====
|
|
453
|
-
"use strict";
|
|
454
|
-
function input_type_fc(input) {
|
|
455
|
-
return input.type !== 'hidden' && input.type !== 'reset' && input.type !== 'checkbox' && input.type !== 'radio';
|
|
456
|
-
}
|
|
457
|
-
function input_form_control(form) {
|
|
458
|
-
const inputs = form.querySelectorAll('input');
|
|
459
|
-
const selects = form.querySelectorAll('select');
|
|
460
|
-
const areas = form.querySelectorAll('textarea');
|
|
461
|
-
inputs.forEach(input => {
|
|
462
|
-
if (input_type_fc(input))
|
|
463
|
-
input.classList.add('form-control');
|
|
464
|
-
});
|
|
465
|
-
selects.forEach(select => {
|
|
466
|
-
select.classList.add('form-control');
|
|
467
|
-
});
|
|
468
|
-
areas.forEach(textarea => {
|
|
469
|
-
textarea.classList.add('form-control');
|
|
470
|
-
});
|
|
471
|
-
}
|
|
472
|
-
function input_form_control_unline(form) {
|
|
473
|
-
console.log(form.id);
|
|
474
|
-
const inputs = form.querySelectorAll('input');
|
|
475
|
-
const selects = form.querySelectorAll('select');
|
|
476
|
-
const areas = form.querySelectorAll('textarea');
|
|
477
|
-
inputs.forEach(input => {
|
|
478
|
-
if (input_type_fc(input))
|
|
479
|
-
input.classList.add('form-control-unline');
|
|
480
|
-
});
|
|
481
|
-
selects.forEach(select => {
|
|
482
|
-
select.classList.add('form-control-unline');
|
|
483
|
-
});
|
|
484
|
-
areas.forEach(textarea => {
|
|
485
|
-
textarea.classList.add('form-control-unline');
|
|
486
|
-
});
|
|
487
|
-
}
|
|
488
|
-
function intToPixel(number = '0') {
|
|
489
|
-
number = number.toString();
|
|
490
|
-
if (parseInt(number) === 0)
|
|
491
|
-
return '0';
|
|
492
|
-
return !isNaN(parseInt(number)) ? number + 'px' : number;
|
|
493
|
-
}
|
|
494
|
-
//# sourceMappingURL=styles.js.map
|
|
495
|
-
|
|
496
|
-
// ===== File: system.js =====
|
|
497
|
-
"use strict";
|
|
498
|
-
function getSystemTheme() {
|
|
499
|
-
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').media !== 'not all') {
|
|
500
|
-
const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
501
|
-
return isDark ? 'dark' : 'light';
|
|
502
|
-
}
|
|
503
|
-
return null;
|
|
504
|
-
}
|
|
505
|
-
function copyTextToClipboard(text) {
|
|
506
|
-
navigator.clipboard.writeText(text)
|
|
507
|
-
.then(() => { })
|
|
508
|
-
.catch(err => {
|
|
509
|
-
console.error('Не удалось скопировать текст: ', err);
|
|
510
|
-
});
|
|
511
|
-
}
|
|
512
|
-
function redirectBackOrClose(default_url = '/') {
|
|
513
|
-
if (document.referrer && document.referrer !== window.location.href) {
|
|
514
|
-
window.history.back();
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
window.close();
|
|
518
|
-
setTimeout(() => {
|
|
519
|
-
if (!window.closed) {
|
|
520
|
-
window.location.href = default_url;
|
|
521
|
-
}
|
|
522
|
-
}, 100);
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
function getHost() {
|
|
526
|
-
return window.location.protocol + '//' + window.location.host;
|
|
527
|
-
}
|
|
528
|
-
//# sourceMappingURL=system.js.map
|
|
529
|
-
|
|
530
|
-
// ===== File: tags.js =====
|
|
531
|
-
"use strict";
|
|
532
|
-
class AbbreviatedNumber extends HTMLElement {
|
|
533
|
-
constructor() {
|
|
534
|
-
super();
|
|
535
|
-
Object.defineProperty(this, "isShortened", {
|
|
536
|
-
enumerable: true,
|
|
537
|
-
configurable: true,
|
|
538
|
-
writable: true,
|
|
539
|
-
value: void 0
|
|
540
|
-
});
|
|
541
|
-
Object.defineProperty(this, "originalNumber", {
|
|
542
|
-
enumerable: true,
|
|
543
|
-
configurable: true,
|
|
544
|
-
writable: true,
|
|
545
|
-
value: void 0
|
|
546
|
-
});
|
|
547
|
-
this.isShortened = true;
|
|
548
|
-
this.originalNumber = parseFloat(this.textContent?.trim() || '0');
|
|
549
|
-
this.render();
|
|
550
|
-
this.addEventListener('click', this.toggle.bind(this));
|
|
551
|
-
if (isNaN(this.originalNumber))
|
|
552
|
-
throw new TypeError('The value must be a number');
|
|
553
|
-
}
|
|
554
|
-
static get observedAttributes() {
|
|
555
|
-
return ['lang', 'use_comma'];
|
|
556
|
-
}
|
|
557
|
-
toggle() {
|
|
558
|
-
this.isShortened = !this.isShortened;
|
|
559
|
-
this.render();
|
|
560
|
-
}
|
|
561
|
-
getCurrentLang() {
|
|
562
|
-
return this.getAttribute('lang') || document.documentElement.getAttribute('lang') || 'en';
|
|
563
|
-
}
|
|
564
|
-
formatNumber(num, lang) {
|
|
565
|
-
num = parseFloat(num.toString().replace(/[^\d.-]/g, ''));
|
|
566
|
-
if (isNaN(num))
|
|
567
|
-
return this.originalNumber.toString();
|
|
568
|
-
const useComma = this.hasAttribute('use_comma');
|
|
569
|
-
const separator = useComma ? ',' : '.';
|
|
570
|
-
const round = (value, digits) => {
|
|
571
|
-
if (digits === 0)
|
|
572
|
-
return Math.round(value);
|
|
573
|
-
const factor = Math.pow(10, digits);
|
|
574
|
-
return Math.round(value * factor) / factor;
|
|
575
|
-
};
|
|
576
|
-
const format = (value, digits) => {
|
|
577
|
-
const rounded = round(value, digits);
|
|
578
|
-
let str = rounded.toString();
|
|
579
|
-
if (digits > 0 && str.includes('.')) {
|
|
580
|
-
str = str.replace(/\.?0+$/, '');
|
|
581
|
-
}
|
|
582
|
-
return str.replace('.', separator);
|
|
583
|
-
};
|
|
584
|
-
const getFractionDigits = (value) => {
|
|
585
|
-
if (value < 10)
|
|
586
|
-
return 2;
|
|
587
|
-
if (value < 100)
|
|
588
|
-
return 1;
|
|
589
|
-
return 0;
|
|
590
|
-
};
|
|
591
|
-
if (lang.startsWith('ru')) {
|
|
592
|
-
if (num >= 1000000000000) {
|
|
593
|
-
const value = num / 1000000000000;
|
|
594
|
-
return format(value, getFractionDigits(value)) + ' трлн.';
|
|
595
|
-
}
|
|
596
|
-
if (num >= 1000000000) {
|
|
597
|
-
const value = num / 1000000000;
|
|
598
|
-
return format(value, getFractionDigits(value)) + ' млрд.';
|
|
599
|
-
}
|
|
600
|
-
if (num >= 1000000) {
|
|
601
|
-
const value = num / 1000000;
|
|
602
|
-
return format(value, getFractionDigits(value)) + ' млн.';
|
|
603
|
-
}
|
|
604
|
-
if (num >= 1000) {
|
|
605
|
-
const value = num / 1000;
|
|
606
|
-
return format(value, getFractionDigits(value)) + ' тыс.';
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
else {
|
|
610
|
-
if (num >= 1000000000000) {
|
|
611
|
-
const value = num / 1000000000000;
|
|
612
|
-
return format(value, getFractionDigits(value)) + 'T';
|
|
613
|
-
}
|
|
614
|
-
if (num >= 1000000000) {
|
|
615
|
-
const value = num / 1000000000;
|
|
616
|
-
return format(value, getFractionDigits(value)) + 'B';
|
|
617
|
-
}
|
|
618
|
-
if (num >= 1000000) {
|
|
619
|
-
const value = num / 1000000;
|
|
620
|
-
return format(value, getFractionDigits(value)) + 'M';
|
|
621
|
-
}
|
|
622
|
-
if (num >= 1000) {
|
|
623
|
-
const value = num / 1000;
|
|
624
|
-
return format(value, getFractionDigits(value)) + 'K';
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
return format(num, 0);
|
|
628
|
-
}
|
|
629
|
-
render() {
|
|
630
|
-
const lang = this.getCurrentLang();
|
|
631
|
-
this.textContent = this.isShortened
|
|
632
|
-
? this.formatNumber(this.originalNumber, lang)
|
|
633
|
-
: this.originalNumber.toString();
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
class StepElement extends HTMLElement {
|
|
637
|
-
constructor() {
|
|
638
|
-
super();
|
|
639
|
-
if (this.textContent)
|
|
640
|
-
this.label = this.textContent;
|
|
641
|
-
this.innerHTML = `
|
|
642
|
-
<div data-sb-generated="circle"></div>
|
|
643
|
-
<div data-sb-generated="label"><slot></slot></div>
|
|
644
|
-
`;
|
|
645
|
-
}
|
|
646
|
-
static get observedAttributes() {
|
|
647
|
-
return ['active', 'completed', 'label'];
|
|
648
|
-
}
|
|
649
|
-
get index() {
|
|
650
|
-
return Array.from(this.parentNode.children).indexOf(this) + 1;
|
|
651
|
-
}
|
|
652
|
-
get active() {
|
|
653
|
-
return this.hasAttribute('active');
|
|
654
|
-
}
|
|
655
|
-
set active(force) {
|
|
656
|
-
this.toggleAttribute('active', force);
|
|
657
|
-
}
|
|
658
|
-
get completed() {
|
|
659
|
-
return this.hasAttribute('completed');
|
|
660
|
-
}
|
|
661
|
-
set completed(force) {
|
|
662
|
-
this.toggleAttribute('completed', force);
|
|
663
|
-
}
|
|
664
|
-
get label() {
|
|
665
|
-
return this.getAttribute('label') || "";
|
|
666
|
-
}
|
|
667
|
-
set label(value) {
|
|
668
|
-
this.setAttribute('label', value);
|
|
669
|
-
}
|
|
670
|
-
reset() {
|
|
671
|
-
this.active = false;
|
|
672
|
-
this.completed = false;
|
|
673
|
-
}
|
|
674
|
-
get status() {
|
|
675
|
-
if (this.active)
|
|
676
|
-
return 'active';
|
|
677
|
-
else if (this.completed)
|
|
678
|
-
return 'complete';
|
|
679
|
-
else
|
|
680
|
-
return 'uncomplete';
|
|
681
|
-
}
|
|
682
|
-
set status(value) {
|
|
683
|
-
this.reset();
|
|
684
|
-
switch (value) {
|
|
685
|
-
case 'complete':
|
|
686
|
-
this.completed = true;
|
|
687
|
-
break;
|
|
688
|
-
case 'active':
|
|
689
|
-
this.active = true;
|
|
690
|
-
break;
|
|
691
|
-
case 'uncomplete':
|
|
692
|
-
break;
|
|
693
|
-
default:
|
|
694
|
-
throw new TypeError(`Unknown status: ${value}`);
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
connectedCallback() {
|
|
698
|
-
this.querySelector('[data-sb-generated="circle"]').textContent = this.index.toString();
|
|
699
|
-
this.querySelector('[data-sb-generated="label"]').textContent = this.label;
|
|
700
|
-
const parent = this.parentElement;
|
|
701
|
-
const currentStep = parent.currentStep || 1;
|
|
702
|
-
if (this.index === currentStep)
|
|
703
|
-
this.active = true;
|
|
704
|
-
else if (this.index < currentStep)
|
|
705
|
-
this.completed = true;
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
class Stepbar extends HTMLElement {
|
|
709
|
-
constructor() {
|
|
710
|
-
super();
|
|
711
|
-
Object.defineProperty(this, "_observer", {
|
|
712
|
-
enumerable: true,
|
|
713
|
-
configurable: true,
|
|
714
|
-
writable: true,
|
|
715
|
-
value: void 0
|
|
716
|
-
});
|
|
717
|
-
this.attachShadow({ mode: 'open' });
|
|
718
|
-
this.shadowRoot.innerHTML = `
|
|
719
|
-
<slot></slot>
|
|
720
|
-
`;
|
|
721
|
-
}
|
|
722
|
-
static get observedAttributes() {
|
|
723
|
-
return ['current'];
|
|
724
|
-
}
|
|
725
|
-
attributeChangedCallback(name, oldValue, newValue) {
|
|
726
|
-
if (name === 'current') {
|
|
727
|
-
this.updateSteps();
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
connectedCallback() {
|
|
731
|
-
if (!this._observer) {
|
|
732
|
-
this._observer = new MutationObserver(() => this.updateSteps());
|
|
733
|
-
this._observer.observe(this, { childList: true });
|
|
734
|
-
}
|
|
735
|
-
this.updateSteps();
|
|
736
|
-
}
|
|
737
|
-
disconnectedCallback() {
|
|
738
|
-
if (this._observer) {
|
|
739
|
-
this._observer.disconnect();
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
updateSteps() {
|
|
743
|
-
const currentStep = parseInt(this.getAttribute('current') || '1');
|
|
744
|
-
const elements = Array.from(this.children).filter((el) => el.tagName === 'SB-ELEMENT');
|
|
745
|
-
elements.forEach((element, index) => {
|
|
746
|
-
const stepNumber = index + 1;
|
|
747
|
-
element.status = 'uncomplete';
|
|
748
|
-
if (stepNumber < currentStep) {
|
|
749
|
-
element.status = 'complete';
|
|
750
|
-
}
|
|
751
|
-
else if (stepNumber === currentStep) {
|
|
752
|
-
element.status = 'active';
|
|
753
|
-
}
|
|
754
|
-
});
|
|
755
|
-
}
|
|
756
|
-
get currentStep() {
|
|
757
|
-
return parseInt(this.getAttribute('current') || '1');
|
|
758
|
-
}
|
|
759
|
-
set currentStep(step) {
|
|
760
|
-
this.setAttribute('current', step.toString());
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
|
-
class HTMLFile extends HTMLElement {
|
|
764
|
-
constructor() {
|
|
765
|
-
super();
|
|
766
|
-
}
|
|
767
|
-
get src() {
|
|
768
|
-
return this.getAttribute('src') || '';
|
|
769
|
-
}
|
|
770
|
-
set src(value) {
|
|
771
|
-
if (value) {
|
|
772
|
-
this.setAttribute('src', value);
|
|
773
|
-
}
|
|
774
|
-
else {
|
|
775
|
-
this.removeAttribute('src');
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
static get observedAttributes() {
|
|
779
|
-
return ['src'];
|
|
780
|
-
}
|
|
781
|
-
connectedCallback() {
|
|
782
|
-
this.loadContent();
|
|
783
|
-
}
|
|
784
|
-
attributeChangedCallback(name, oldValue, newValue) {
|
|
785
|
-
if (name === 'src' && oldValue !== newValue && this.isConnected) {
|
|
786
|
-
this.loadContent();
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
async loadContent() {
|
|
790
|
-
const src = this.src;
|
|
791
|
-
if (!src)
|
|
792
|
-
return;
|
|
793
|
-
try {
|
|
794
|
-
const response = await fetch(src);
|
|
795
|
-
const content = await response.text();
|
|
796
|
-
this.innerHTML = content;
|
|
797
|
-
await this.executeScripts();
|
|
798
|
-
}
|
|
799
|
-
catch (error) {
|
|
800
|
-
this.innerHTML = `Ошибка загрузки: ${error.message}`;
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
async executeScripts() {
|
|
804
|
-
const scripts = this.querySelectorAll('script');
|
|
805
|
-
for (const script of scripts) {
|
|
806
|
-
if (script.src) {
|
|
807
|
-
await this.loadExternalScript(script.src);
|
|
808
|
-
}
|
|
809
|
-
else {
|
|
810
|
-
this.executeInlineScript(script.textContent || '');
|
|
811
|
-
}
|
|
812
|
-
script.remove();
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
loadExternalScript(src) {
|
|
816
|
-
return new Promise((resolve, reject) => {
|
|
817
|
-
const newScript = document.createElement('script');
|
|
818
|
-
newScript.src = src;
|
|
819
|
-
newScript.onload = resolve;
|
|
820
|
-
newScript.onerror = reject;
|
|
821
|
-
document.head.appendChild(newScript);
|
|
822
|
-
});
|
|
823
|
-
}
|
|
824
|
-
executeInlineScript(code) {
|
|
825
|
-
try {
|
|
826
|
-
const newScript = document.createElement('script');
|
|
827
|
-
newScript.textContent = code;
|
|
828
|
-
document.head.appendChild(newScript);
|
|
829
|
-
document.head.removeChild(newScript);
|
|
830
|
-
}
|
|
831
|
-
catch (error) {
|
|
832
|
-
console.error('Ошибка выполнения скрипта:', error);
|
|
833
|
-
}
|
|
834
|
-
}
|
|
835
|
-
get loaded() {
|
|
836
|
-
return this.hasAttribute('data-loaded');
|
|
837
|
-
}
|
|
838
|
-
reload() {
|
|
839
|
-
return this.loadContent();
|
|
840
|
-
}
|
|
841
|
-
get content() {
|
|
842
|
-
return this.innerHTML;
|
|
843
|
-
}
|
|
844
|
-
}
|
|
845
|
-
class ClickToCopy extends HTMLElement {
|
|
846
|
-
constructor() {
|
|
847
|
-
super();
|
|
848
|
-
Object.defineProperty(this, "notification", {
|
|
849
|
-
enumerable: true,
|
|
850
|
-
configurable: true,
|
|
851
|
-
writable: true,
|
|
852
|
-
value: void 0
|
|
853
|
-
});
|
|
854
|
-
this.notification = new HyperTextNotification({ backgroundColor: 'rgba(192,0,192,0.8)' });
|
|
855
|
-
}
|
|
856
|
-
get notificationText() {
|
|
857
|
-
return this.getAttribute('text') || "Скопировано";
|
|
858
|
-
}
|
|
859
|
-
set notificationText(value) {
|
|
860
|
-
if (value)
|
|
861
|
-
this.setAttribute('text', value);
|
|
862
|
-
else
|
|
863
|
-
this.removeAttribute('text');
|
|
864
|
-
}
|
|
865
|
-
get isNotified() {
|
|
866
|
-
return this.hasAttribute('notified');
|
|
867
|
-
}
|
|
868
|
-
set isNotified(value) {
|
|
869
|
-
if (value)
|
|
870
|
-
this.setAttribute('notified', '');
|
|
871
|
-
else
|
|
872
|
-
this.removeAttribute('notified');
|
|
873
|
-
}
|
|
874
|
-
connectedCallback() {
|
|
875
|
-
this.addEventListener('click', () => {
|
|
876
|
-
navigator.clipboard.writeText(this.textContent || '');
|
|
877
|
-
if (this.isNotified)
|
|
878
|
-
this.notification.show(this.notificationText);
|
|
879
|
-
});
|
|
880
|
-
}
|
|
881
|
-
}
|
|
882
|
-
customElements.define('sb-element', StepElement);
|
|
883
|
-
customElements.define('step-bar', Stepbar);
|
|
884
|
-
customElements.define('ab-num', AbbreviatedNumber);
|
|
885
|
-
customElements.define('include-html', HTMLFile);
|
|
886
|
-
customElements.define('click-to-copy', ClickToCopy);
|
|
887
|
-
//# sourceMappingURL=tags.js.map
|
|
888
|
-
|
|
889
|
-
// ===== File: url.js =====
|
|
890
|
-
"use strict";
|
|
891
|
-
function isAbsoluteUrl(url) {
|
|
892
|
-
try {
|
|
893
|
-
new URL(url);
|
|
894
|
-
return true;
|
|
895
|
-
}
|
|
896
|
-
catch (e) {
|
|
897
|
-
return url[0] === '/' || url[0] === '\\';
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
function combineUrls(baseUrl, relativeUrl) {
|
|
901
|
-
try {
|
|
902
|
-
if (!baseUrl) {
|
|
903
|
-
if (relativeUrl.startsWith('/'))
|
|
904
|
-
return relativeUrl;
|
|
905
|
-
return '/' + relativeUrl;
|
|
906
|
-
}
|
|
907
|
-
return new URL(relativeUrl, baseUrl).toString();
|
|
908
|
-
}
|
|
909
|
-
catch (error) {
|
|
910
|
-
throw new Error(`Invalid URL combination: ${baseUrl}, ${relativeUrl}`);
|
|
911
|
-
}
|
|
912
|
-
}
|
|
913
|
-
function getScriptSite(script) {
|
|
914
|
-
return new URL(script.src).origin;
|
|
915
|
-
}
|
|
916
|
-
//# sourceMappingURL=url.js.map
|
|
917
|
-
|
|
918
|
-
// ===== File: uuid.js =====
|
|
919
|
-
"use strict";
|
|
920
|
-
function generateUUIDv4() {
|
|
921
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
922
|
-
const r = Math.random() * 16 | 0;
|
|
923
|
-
const v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
924
|
-
return v.toString(16);
|
|
925
|
-
});
|
|
926
|
-
}
|
|
927
|
-
//# sourceMappingURL=uuid.js.map
|
|
928
|
-
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
|
|
3
|
+
// ===== File: arraywork.js =====
|
|
4
|
+
"use strict";
|
|
5
|
+
function arrayIsEmpty(arr) {
|
|
6
|
+
return arr.length === 0 || !arr[0];
|
|
7
|
+
}
|
|
8
|
+
function arraysIsEqual(array1, array2, strict = true) {
|
|
9
|
+
if (array1.length !== array2.length)
|
|
10
|
+
return false;
|
|
11
|
+
if (strict)
|
|
12
|
+
return array1.every((value, index) => value === array2[index]);
|
|
13
|
+
else {
|
|
14
|
+
array1.forEach(element => {
|
|
15
|
+
if (!array2.includes(element))
|
|
16
|
+
return false;
|
|
17
|
+
});
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=arraywork.js.map
|
|
22
|
+
|
|
23
|
+
// ===== File: auto.js =====
|
|
24
|
+
"use strict";
|
|
25
|
+
const stylesRoot = getComputedStyle(document.documentElement);
|
|
26
|
+
//# sourceMappingURL=auto.js.map
|
|
27
|
+
|
|
28
|
+
// ===== File: classes.js =====
|
|
29
|
+
"use strict";
|
|
30
|
+
class ClickableLinksFactory {
|
|
31
|
+
constructor() {
|
|
32
|
+
Object.defineProperty(this, "urlRegex", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
value: /(https?:\/\/[^\s]+)/g
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
walk(node, isClickToCopy) {
|
|
40
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
41
|
+
const text = node.textContent || '';
|
|
42
|
+
const func = isClickToCopy ? this.get_clickToCopy : this.get_anchor;
|
|
43
|
+
if (this.urlRegex.test(text)) {
|
|
44
|
+
const parent = node.parentNode;
|
|
45
|
+
const newContent = text.replace(this.urlRegex, url => {
|
|
46
|
+
return func(url);
|
|
47
|
+
});
|
|
48
|
+
if (!parent)
|
|
49
|
+
return;
|
|
50
|
+
const tempDiv = document.createElement('div');
|
|
51
|
+
tempDiv.innerHTML = newContent;
|
|
52
|
+
while (tempDiv.firstChild) {
|
|
53
|
+
parent.insertBefore(tempDiv.firstChild, node);
|
|
54
|
+
}
|
|
55
|
+
parent.removeChild(node);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
node.childNodes.forEach(child => {
|
|
60
|
+
this.walk(child, isClickToCopy);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
get_anchor(url) {
|
|
65
|
+
return `<a href="${url}" target="_blank" rel="noopener noreferrer" data-clf-generated>${url}</a>`;
|
|
66
|
+
}
|
|
67
|
+
get_clickToCopy(url) {
|
|
68
|
+
return `<click-to-copy data-clf-generated>${url}</click-to-copy>`;
|
|
69
|
+
}
|
|
70
|
+
clickableLinks(element) {
|
|
71
|
+
this.walk(element, false);
|
|
72
|
+
}
|
|
73
|
+
clickToCopyLinks(element) {
|
|
74
|
+
this.walk(element, true);
|
|
75
|
+
}
|
|
76
|
+
get generatedElements() {
|
|
77
|
+
return document.querySelectorAll('[data-clf-generated]');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
class GETParamsManager {
|
|
81
|
+
constructor() {
|
|
82
|
+
Object.defineProperty(this, "params", {
|
|
83
|
+
enumerable: true,
|
|
84
|
+
configurable: true,
|
|
85
|
+
writable: true,
|
|
86
|
+
value: void 0
|
|
87
|
+
});
|
|
88
|
+
this.params = new URLSearchParams(window.location.search);
|
|
89
|
+
}
|
|
90
|
+
get(key, defaultValue) {
|
|
91
|
+
const value = this.params.get(key);
|
|
92
|
+
if (value === null)
|
|
93
|
+
return defaultValue || null;
|
|
94
|
+
if (defaultValue !== undefined) {
|
|
95
|
+
switch (typeof defaultValue) {
|
|
96
|
+
case 'number':
|
|
97
|
+
return Number(value);
|
|
98
|
+
case 'boolean':
|
|
99
|
+
return (value === 'true');
|
|
100
|
+
default:
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
set(key, value) {
|
|
107
|
+
this.params.set(key, String(value));
|
|
108
|
+
this.updateURL();
|
|
109
|
+
}
|
|
110
|
+
delete(key) {
|
|
111
|
+
this.params.delete(key);
|
|
112
|
+
this.updateURL();
|
|
113
|
+
}
|
|
114
|
+
all() {
|
|
115
|
+
const result = {};
|
|
116
|
+
for (const [key, value] of this.params.entries()) {
|
|
117
|
+
result[key] = value;
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
clear() {
|
|
122
|
+
const keys = Array.from(this.params.keys());
|
|
123
|
+
keys.forEach(key => this.params.delete(key));
|
|
124
|
+
this.updateURL();
|
|
125
|
+
}
|
|
126
|
+
updateURL() {
|
|
127
|
+
const newUrl = `${window.location.pathname}?${this.params.toString()}`;
|
|
128
|
+
window.history.pushState({}, '', newUrl);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=classes.js.map
|
|
132
|
+
|
|
133
|
+
// ===== File: compiler.js =====
|
|
134
|
+
"use strict";
|
|
135
|
+
function downloadTextAsFile(filename, text) {
|
|
136
|
+
const blob = new Blob([text], { type: 'text/plain' });
|
|
137
|
+
const url = URL.createObjectURL(blob);
|
|
138
|
+
console.log(url);
|
|
139
|
+
const a = document.createElement('a');
|
|
140
|
+
a.href = url;
|
|
141
|
+
a.download = filename;
|
|
142
|
+
a.click();
|
|
143
|
+
URL.revokeObjectURL(url);
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=compiler.js.map
|
|
146
|
+
|
|
147
|
+
// ===== File: cookie.js =====
|
|
148
|
+
"use strict";
|
|
149
|
+
function getCookie(name) {
|
|
150
|
+
const nameEQ = `${name}=`;
|
|
151
|
+
const cookiesArray = document.cookie.split(';');
|
|
152
|
+
cookiesArray.forEach(cookie => {
|
|
153
|
+
cookie = cookie.trim();
|
|
154
|
+
if (cookie.indexOf(nameEQ) === 0) {
|
|
155
|
+
return cookie.substring(nameEQ.length, cookie.length);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
function setCookie(name, value, days = null, path = '/') {
|
|
161
|
+
let expires;
|
|
162
|
+
if (!days) {
|
|
163
|
+
expires = '; expires=Fri, 31 Dec 9999 23:59:59 GMT';
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
const date = new Date();
|
|
167
|
+
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
|
168
|
+
expires = `; expires=${date.toUTCString()}`;
|
|
169
|
+
}
|
|
170
|
+
document.cookie = `${name}=${value || ''}${expires}; path=${path}`;
|
|
171
|
+
}
|
|
172
|
+
function hasCookie(name) {
|
|
173
|
+
return getCookie(name) != null;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=cookie.js.map
|
|
176
|
+
|
|
177
|
+
// ===== File: exceptions.js =====
|
|
178
|
+
"use strict";
|
|
179
|
+
class NotAuthorizedError extends Error {
|
|
180
|
+
constructor() {
|
|
181
|
+
super("Пользователь не авторизован");
|
|
182
|
+
this.name = 'NotAuthorizedError';
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=exceptions.js.map
|
|
186
|
+
|
|
187
|
+
// ===== File: get_element_types.js =====
|
|
188
|
+
"use strict";
|
|
189
|
+
function button_submit(parent) {
|
|
190
|
+
const buttons = parent.querySelectorAll('button');
|
|
191
|
+
let submit = null;
|
|
192
|
+
buttons.forEach(button => {
|
|
193
|
+
if (button.type === 'submit')
|
|
194
|
+
submit = button;
|
|
195
|
+
});
|
|
196
|
+
return submit;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=get_element_types.js.map
|
|
199
|
+
|
|
200
|
+
// ===== File: html.js =====
|
|
201
|
+
"use strict";
|
|
202
|
+
const escapeChars = {
|
|
203
|
+
'<': '<',
|
|
204
|
+
'>': '>',
|
|
205
|
+
'&': '&',
|
|
206
|
+
'"': '"',
|
|
207
|
+
"'": '''
|
|
208
|
+
};
|
|
209
|
+
function togglePassword(passwordInput) {
|
|
210
|
+
const passwordType = passwordInput.getAttribute('type') === 'password' ? 'text' : 'password';
|
|
211
|
+
passwordInput.setAttribute('type', passwordType);
|
|
212
|
+
}
|
|
213
|
+
function isTextWrapped(element) {
|
|
214
|
+
const elementHeight = element.clientHeight;
|
|
215
|
+
const scrollHeight = element.scrollHeight;
|
|
216
|
+
return scrollHeight > elementHeight;
|
|
217
|
+
}
|
|
218
|
+
function notArrayEmpty(array) {
|
|
219
|
+
return array.length > 0;
|
|
220
|
+
}
|
|
221
|
+
function get_tagName(element) {
|
|
222
|
+
return element.tagName.toLowerCase();
|
|
223
|
+
}
|
|
224
|
+
function element_toHTMLText(element) {
|
|
225
|
+
const tag = get_tagName(element);
|
|
226
|
+
const attrs = element.attributes;
|
|
227
|
+
let text = `<${tag}`;
|
|
228
|
+
if (attrs.length > 0) {
|
|
229
|
+
for (let attr of attrs) {
|
|
230
|
+
text += ` ${attr.name}="${attr.value}"`;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
text += `>${element.innerHTML}</${tag}>`;
|
|
234
|
+
return text;
|
|
235
|
+
}
|
|
236
|
+
function element_to_div(element) {
|
|
237
|
+
const div = document.createElement('div');
|
|
238
|
+
div.innerHTML = element.outerHTML;
|
|
239
|
+
return div;
|
|
240
|
+
}
|
|
241
|
+
function password_format(shownPasswordHTML, hiddenPasswordHTML) {
|
|
242
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
243
|
+
const forms = document.querySelectorAll('form');
|
|
244
|
+
forms.forEach(form => {
|
|
245
|
+
const inputs = form.querySelectorAll('input[type="password"]');
|
|
246
|
+
inputs.forEach(input => {
|
|
247
|
+
const wrapper = document.createElement('div');
|
|
248
|
+
wrapper.style.position = 'relative';
|
|
249
|
+
wrapper.style.display = 'inline-block';
|
|
250
|
+
wrapper.style.width = '100%';
|
|
251
|
+
input.parentNode.insertBefore(wrapper, input);
|
|
252
|
+
wrapper.appendChild(input);
|
|
253
|
+
const toggleBtn = document.createElement('button');
|
|
254
|
+
toggleBtn.type = 'button';
|
|
255
|
+
toggleBtn.className = 'show-password-btn';
|
|
256
|
+
toggleBtn.innerHTML = hiddenPasswordHTML;
|
|
257
|
+
toggleBtn.style.cssText = `
|
|
258
|
+
position: absolute;
|
|
259
|
+
left: 45%;
|
|
260
|
+
top: 50%;
|
|
261
|
+
transform: translateY(-50%);
|
|
262
|
+
cursor: pointer;
|
|
263
|
+
user-select: none;
|
|
264
|
+
background: none;
|
|
265
|
+
border: none;
|
|
266
|
+
padding: 0;
|
|
267
|
+
`;
|
|
268
|
+
toggleBtn.addEventListener('click', () => {
|
|
269
|
+
const isShowing = input.type === 'text';
|
|
270
|
+
input.type = isShowing ? 'password' : 'text';
|
|
271
|
+
toggleBtn.innerHTML = isShowing ? hiddenPasswordHTML : shownPasswordHTML;
|
|
272
|
+
});
|
|
273
|
+
wrapper.appendChild(toggleBtn);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
function escapeHTML(html) {
|
|
279
|
+
return html.replace(/[<>"']/g, function (i) {
|
|
280
|
+
return escapeChars[i] || i;
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
function strFormat(template, ...args) {
|
|
284
|
+
return template.replace(/{(\w+)}/g, (match, key) => {
|
|
285
|
+
if (args.length > 0 && typeof args[0] === 'object' && args[0][key] !== undefined) {
|
|
286
|
+
return args[0][key];
|
|
287
|
+
}
|
|
288
|
+
const index = parseInt(key);
|
|
289
|
+
if (!isNaN(index) && args[index] !== undefined) {
|
|
290
|
+
return args[index];
|
|
291
|
+
}
|
|
292
|
+
return match;
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
function elementToHyperlink(element, href, cursorPointer = true, preventDefault = false) {
|
|
296
|
+
element.addEventListener('click', function (elem) {
|
|
297
|
+
if (elem.button === 0)
|
|
298
|
+
window.location.href = href;
|
|
299
|
+
else if (elem.button === 1)
|
|
300
|
+
window.open(href, '_blank');
|
|
301
|
+
});
|
|
302
|
+
if (preventDefault) {
|
|
303
|
+
element.addEventListener('auxclick', function (elem) {
|
|
304
|
+
if (elem.button === 1)
|
|
305
|
+
elem.preventDefault();
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
if (cursorPointer)
|
|
309
|
+
element.style.cursor = 'pointer';
|
|
310
|
+
return element;
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=html.js.map
|
|
313
|
+
|
|
314
|
+
// ===== File: input.js =====
|
|
315
|
+
"use strict";
|
|
316
|
+
function getInputCursorPosition(input) {
|
|
317
|
+
const start = input.selectionStart;
|
|
318
|
+
if (start == null)
|
|
319
|
+
throw new Error("Incorrect input type");
|
|
320
|
+
return start - 1;
|
|
321
|
+
}
|
|
322
|
+
function copyInputToClipboard(input) {
|
|
323
|
+
const disabled = input.hasAttribute("disabled");
|
|
324
|
+
if (disabled)
|
|
325
|
+
input.removeAttribute('disabled');
|
|
326
|
+
navigator.clipboard.writeText(input.value)
|
|
327
|
+
.then(() => { })
|
|
328
|
+
.catch(err => {
|
|
329
|
+
console.error('Не удалось скопировать текст: ', err);
|
|
330
|
+
})
|
|
331
|
+
.finally(() => {
|
|
332
|
+
if (disabled)
|
|
333
|
+
input.setAttribute('disabled', '');
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
function clearInput_and_addLastSymbol(input) {
|
|
337
|
+
input.value = input.value[getInputCursorPosition(input)] || '';
|
|
338
|
+
}
|
|
339
|
+
function getInputLabel(input) {
|
|
340
|
+
const label = document.querySelector(`label[for="${input.id}"]`);
|
|
341
|
+
if (!label)
|
|
342
|
+
throw new Error("Label не найден. Возможно, вы не использовали атрибут for в нем");
|
|
343
|
+
return label;
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=input.js.map
|
|
346
|
+
|
|
347
|
+
// ===== File: link.js =====
|
|
348
|
+
"use strict";
|
|
349
|
+
function loadCSS(href) {
|
|
350
|
+
const link = document.createElement('link');
|
|
351
|
+
link.rel = 'stylesheet';
|
|
352
|
+
link.type = 'text/css';
|
|
353
|
+
link.href = href;
|
|
354
|
+
document.head.appendChild(link);
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=link.js.map
|
|
357
|
+
|
|
358
|
+
// ===== File: notifications.js =====
|
|
359
|
+
"use strict";
|
|
360
|
+
function pushNotification(title = "Уведомление", body = "Текст уведомления", icon = null) {
|
|
361
|
+
if (Notification.permission !== "granted") {
|
|
362
|
+
Notification.requestPermission().then(permission => {
|
|
363
|
+
if (permission === "granted") {
|
|
364
|
+
if (icon)
|
|
365
|
+
new Notification(title, { body: body, icon: icon });
|
|
366
|
+
else
|
|
367
|
+
new Notification(title, { body: body });
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
if (icon)
|
|
373
|
+
new Notification(title, { body: body, icon: icon });
|
|
374
|
+
else
|
|
375
|
+
new Notification(title, { body: body });
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
class HyperTextNotification {
|
|
379
|
+
constructor({ bottom = '20', right = '20', backgroundColor = '#121212', color = '#ededed', padding = '15', borderRadius = '5', timeout = 3 } = {}) {
|
|
380
|
+
Object.defineProperty(this, "bottom", {
|
|
381
|
+
enumerable: true,
|
|
382
|
+
configurable: true,
|
|
383
|
+
writable: true,
|
|
384
|
+
value: void 0
|
|
385
|
+
});
|
|
386
|
+
Object.defineProperty(this, "right", {
|
|
387
|
+
enumerable: true,
|
|
388
|
+
configurable: true,
|
|
389
|
+
writable: true,
|
|
390
|
+
value: void 0
|
|
391
|
+
});
|
|
392
|
+
Object.defineProperty(this, "backgroundColor", {
|
|
393
|
+
enumerable: true,
|
|
394
|
+
configurable: true,
|
|
395
|
+
writable: true,
|
|
396
|
+
value: void 0
|
|
397
|
+
});
|
|
398
|
+
Object.defineProperty(this, "color", {
|
|
399
|
+
enumerable: true,
|
|
400
|
+
configurable: true,
|
|
401
|
+
writable: true,
|
|
402
|
+
value: void 0
|
|
403
|
+
});
|
|
404
|
+
Object.defineProperty(this, "padding", {
|
|
405
|
+
enumerable: true,
|
|
406
|
+
configurable: true,
|
|
407
|
+
writable: true,
|
|
408
|
+
value: void 0
|
|
409
|
+
});
|
|
410
|
+
Object.defineProperty(this, "borderRadius", {
|
|
411
|
+
enumerable: true,
|
|
412
|
+
configurable: true,
|
|
413
|
+
writable: true,
|
|
414
|
+
value: void 0
|
|
415
|
+
});
|
|
416
|
+
Object.defineProperty(this, "timeout", {
|
|
417
|
+
enumerable: true,
|
|
418
|
+
configurable: true,
|
|
419
|
+
writable: true,
|
|
420
|
+
value: void 0
|
|
421
|
+
});
|
|
422
|
+
this.bottom = intToPixel(bottom);
|
|
423
|
+
this.right = intToPixel(right);
|
|
424
|
+
this.backgroundColor = backgroundColor;
|
|
425
|
+
this.color = color;
|
|
426
|
+
this.padding = intToPixel(padding);
|
|
427
|
+
this.borderRadius = intToPixel(borderRadius);
|
|
428
|
+
this.timeout = timeout;
|
|
429
|
+
}
|
|
430
|
+
show(message, timeout = 0) {
|
|
431
|
+
const notification = document.createElement("div");
|
|
432
|
+
notification.textContent = message;
|
|
433
|
+
notification.style.position = "fixed";
|
|
434
|
+
notification.style.bottom = this.bottom;
|
|
435
|
+
notification.style.right = this.right;
|
|
436
|
+
notification.style.backgroundColor = this.backgroundColor;
|
|
437
|
+
notification.style.color = this.color;
|
|
438
|
+
notification.style.padding = this.padding;
|
|
439
|
+
notification.style.borderRadius = this.borderRadius;
|
|
440
|
+
notification.style.zIndex = "1000";
|
|
441
|
+
const actualTimeout = timeout === 0 ? this.timeout : timeout;
|
|
442
|
+
document.body.appendChild(notification);
|
|
443
|
+
setTimeout(() => {
|
|
444
|
+
if (document.body.contains(notification)) {
|
|
445
|
+
document.body.removeChild(notification);
|
|
446
|
+
}
|
|
447
|
+
}, actualTimeout * 1000);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=notifications.js.map
|
|
451
|
+
|
|
452
|
+
// ===== File: styles.js =====
|
|
453
|
+
"use strict";
|
|
454
|
+
function input_type_fc(input) {
|
|
455
|
+
return input.type !== 'hidden' && input.type !== 'reset' && input.type !== 'checkbox' && input.type !== 'radio';
|
|
456
|
+
}
|
|
457
|
+
function input_form_control(form) {
|
|
458
|
+
const inputs = form.querySelectorAll('input');
|
|
459
|
+
const selects = form.querySelectorAll('select');
|
|
460
|
+
const areas = form.querySelectorAll('textarea');
|
|
461
|
+
inputs.forEach(input => {
|
|
462
|
+
if (input_type_fc(input))
|
|
463
|
+
input.classList.add('form-control');
|
|
464
|
+
});
|
|
465
|
+
selects.forEach(select => {
|
|
466
|
+
select.classList.add('form-control');
|
|
467
|
+
});
|
|
468
|
+
areas.forEach(textarea => {
|
|
469
|
+
textarea.classList.add('form-control');
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
function input_form_control_unline(form) {
|
|
473
|
+
console.log(form.id);
|
|
474
|
+
const inputs = form.querySelectorAll('input');
|
|
475
|
+
const selects = form.querySelectorAll('select');
|
|
476
|
+
const areas = form.querySelectorAll('textarea');
|
|
477
|
+
inputs.forEach(input => {
|
|
478
|
+
if (input_type_fc(input))
|
|
479
|
+
input.classList.add('form-control-unline');
|
|
480
|
+
});
|
|
481
|
+
selects.forEach(select => {
|
|
482
|
+
select.classList.add('form-control-unline');
|
|
483
|
+
});
|
|
484
|
+
areas.forEach(textarea => {
|
|
485
|
+
textarea.classList.add('form-control-unline');
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
function intToPixel(number = '0') {
|
|
489
|
+
number = number.toString();
|
|
490
|
+
if (parseInt(number) === 0)
|
|
491
|
+
return '0';
|
|
492
|
+
return !isNaN(parseInt(number)) ? number + 'px' : number;
|
|
493
|
+
}
|
|
494
|
+
//# sourceMappingURL=styles.js.map
|
|
495
|
+
|
|
496
|
+
// ===== File: system.js =====
|
|
497
|
+
"use strict";
|
|
498
|
+
function getSystemTheme() {
|
|
499
|
+
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').media !== 'not all') {
|
|
500
|
+
const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
501
|
+
return isDark ? 'dark' : 'light';
|
|
502
|
+
}
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
505
|
+
function copyTextToClipboard(text) {
|
|
506
|
+
navigator.clipboard.writeText(text)
|
|
507
|
+
.then(() => { })
|
|
508
|
+
.catch(err => {
|
|
509
|
+
console.error('Не удалось скопировать текст: ', err);
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
function redirectBackOrClose(default_url = '/') {
|
|
513
|
+
if (document.referrer && document.referrer !== window.location.href) {
|
|
514
|
+
window.history.back();
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
window.close();
|
|
518
|
+
setTimeout(() => {
|
|
519
|
+
if (!window.closed) {
|
|
520
|
+
window.location.href = default_url;
|
|
521
|
+
}
|
|
522
|
+
}, 100);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
function getHost() {
|
|
526
|
+
return window.location.protocol + '//' + window.location.host;
|
|
527
|
+
}
|
|
528
|
+
//# sourceMappingURL=system.js.map
|
|
529
|
+
|
|
530
|
+
// ===== File: tags.js =====
|
|
531
|
+
"use strict";
|
|
532
|
+
class AbbreviatedNumber extends HTMLElement {
|
|
533
|
+
constructor() {
|
|
534
|
+
super();
|
|
535
|
+
Object.defineProperty(this, "isShortened", {
|
|
536
|
+
enumerable: true,
|
|
537
|
+
configurable: true,
|
|
538
|
+
writable: true,
|
|
539
|
+
value: void 0
|
|
540
|
+
});
|
|
541
|
+
Object.defineProperty(this, "originalNumber", {
|
|
542
|
+
enumerable: true,
|
|
543
|
+
configurable: true,
|
|
544
|
+
writable: true,
|
|
545
|
+
value: void 0
|
|
546
|
+
});
|
|
547
|
+
this.isShortened = true;
|
|
548
|
+
this.originalNumber = parseFloat(this.textContent?.trim() || '0');
|
|
549
|
+
this.render();
|
|
550
|
+
this.addEventListener('click', this.toggle.bind(this));
|
|
551
|
+
if (isNaN(this.originalNumber))
|
|
552
|
+
throw new TypeError('The value must be a number');
|
|
553
|
+
}
|
|
554
|
+
static get observedAttributes() {
|
|
555
|
+
return ['lang', 'use_comma'];
|
|
556
|
+
}
|
|
557
|
+
toggle() {
|
|
558
|
+
this.isShortened = !this.isShortened;
|
|
559
|
+
this.render();
|
|
560
|
+
}
|
|
561
|
+
getCurrentLang() {
|
|
562
|
+
return this.getAttribute('lang') || document.documentElement.getAttribute('lang') || 'en';
|
|
563
|
+
}
|
|
564
|
+
formatNumber(num, lang) {
|
|
565
|
+
num = parseFloat(num.toString().replace(/[^\d.-]/g, ''));
|
|
566
|
+
if (isNaN(num))
|
|
567
|
+
return this.originalNumber.toString();
|
|
568
|
+
const useComma = this.hasAttribute('use_comma');
|
|
569
|
+
const separator = useComma ? ',' : '.';
|
|
570
|
+
const round = (value, digits) => {
|
|
571
|
+
if (digits === 0)
|
|
572
|
+
return Math.round(value);
|
|
573
|
+
const factor = Math.pow(10, digits);
|
|
574
|
+
return Math.round(value * factor) / factor;
|
|
575
|
+
};
|
|
576
|
+
const format = (value, digits) => {
|
|
577
|
+
const rounded = round(value, digits);
|
|
578
|
+
let str = rounded.toString();
|
|
579
|
+
if (digits > 0 && str.includes('.')) {
|
|
580
|
+
str = str.replace(/\.?0+$/, '');
|
|
581
|
+
}
|
|
582
|
+
return str.replace('.', separator);
|
|
583
|
+
};
|
|
584
|
+
const getFractionDigits = (value) => {
|
|
585
|
+
if (value < 10)
|
|
586
|
+
return 2;
|
|
587
|
+
if (value < 100)
|
|
588
|
+
return 1;
|
|
589
|
+
return 0;
|
|
590
|
+
};
|
|
591
|
+
if (lang.startsWith('ru')) {
|
|
592
|
+
if (num >= 1000000000000) {
|
|
593
|
+
const value = num / 1000000000000;
|
|
594
|
+
return format(value, getFractionDigits(value)) + ' трлн.';
|
|
595
|
+
}
|
|
596
|
+
if (num >= 1000000000) {
|
|
597
|
+
const value = num / 1000000000;
|
|
598
|
+
return format(value, getFractionDigits(value)) + ' млрд.';
|
|
599
|
+
}
|
|
600
|
+
if (num >= 1000000) {
|
|
601
|
+
const value = num / 1000000;
|
|
602
|
+
return format(value, getFractionDigits(value)) + ' млн.';
|
|
603
|
+
}
|
|
604
|
+
if (num >= 1000) {
|
|
605
|
+
const value = num / 1000;
|
|
606
|
+
return format(value, getFractionDigits(value)) + ' тыс.';
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
if (num >= 1000000000000) {
|
|
611
|
+
const value = num / 1000000000000;
|
|
612
|
+
return format(value, getFractionDigits(value)) + 'T';
|
|
613
|
+
}
|
|
614
|
+
if (num >= 1000000000) {
|
|
615
|
+
const value = num / 1000000000;
|
|
616
|
+
return format(value, getFractionDigits(value)) + 'B';
|
|
617
|
+
}
|
|
618
|
+
if (num >= 1000000) {
|
|
619
|
+
const value = num / 1000000;
|
|
620
|
+
return format(value, getFractionDigits(value)) + 'M';
|
|
621
|
+
}
|
|
622
|
+
if (num >= 1000) {
|
|
623
|
+
const value = num / 1000;
|
|
624
|
+
return format(value, getFractionDigits(value)) + 'K';
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
return format(num, 0);
|
|
628
|
+
}
|
|
629
|
+
render() {
|
|
630
|
+
const lang = this.getCurrentLang();
|
|
631
|
+
this.textContent = this.isShortened
|
|
632
|
+
? this.formatNumber(this.originalNumber, lang)
|
|
633
|
+
: this.originalNumber.toString();
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
class StepElement extends HTMLElement {
|
|
637
|
+
constructor() {
|
|
638
|
+
super();
|
|
639
|
+
if (this.textContent)
|
|
640
|
+
this.label = this.textContent;
|
|
641
|
+
this.innerHTML = `
|
|
642
|
+
<div data-sb-generated="circle"></div>
|
|
643
|
+
<div data-sb-generated="label"><slot></slot></div>
|
|
644
|
+
`;
|
|
645
|
+
}
|
|
646
|
+
static get observedAttributes() {
|
|
647
|
+
return ['active', 'completed', 'label'];
|
|
648
|
+
}
|
|
649
|
+
get index() {
|
|
650
|
+
return Array.from(this.parentNode.children).indexOf(this) + 1;
|
|
651
|
+
}
|
|
652
|
+
get active() {
|
|
653
|
+
return this.hasAttribute('active');
|
|
654
|
+
}
|
|
655
|
+
set active(force) {
|
|
656
|
+
this.toggleAttribute('active', force);
|
|
657
|
+
}
|
|
658
|
+
get completed() {
|
|
659
|
+
return this.hasAttribute('completed');
|
|
660
|
+
}
|
|
661
|
+
set completed(force) {
|
|
662
|
+
this.toggleAttribute('completed', force);
|
|
663
|
+
}
|
|
664
|
+
get label() {
|
|
665
|
+
return this.getAttribute('label') || "";
|
|
666
|
+
}
|
|
667
|
+
set label(value) {
|
|
668
|
+
this.setAttribute('label', value);
|
|
669
|
+
}
|
|
670
|
+
reset() {
|
|
671
|
+
this.active = false;
|
|
672
|
+
this.completed = false;
|
|
673
|
+
}
|
|
674
|
+
get status() {
|
|
675
|
+
if (this.active)
|
|
676
|
+
return 'active';
|
|
677
|
+
else if (this.completed)
|
|
678
|
+
return 'complete';
|
|
679
|
+
else
|
|
680
|
+
return 'uncomplete';
|
|
681
|
+
}
|
|
682
|
+
set status(value) {
|
|
683
|
+
this.reset();
|
|
684
|
+
switch (value) {
|
|
685
|
+
case 'complete':
|
|
686
|
+
this.completed = true;
|
|
687
|
+
break;
|
|
688
|
+
case 'active':
|
|
689
|
+
this.active = true;
|
|
690
|
+
break;
|
|
691
|
+
case 'uncomplete':
|
|
692
|
+
break;
|
|
693
|
+
default:
|
|
694
|
+
throw new TypeError(`Unknown status: ${value}`);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
connectedCallback() {
|
|
698
|
+
this.querySelector('[data-sb-generated="circle"]').textContent = this.index.toString();
|
|
699
|
+
this.querySelector('[data-sb-generated="label"]').textContent = this.label;
|
|
700
|
+
const parent = this.parentElement;
|
|
701
|
+
const currentStep = parent.currentStep || 1;
|
|
702
|
+
if (this.index === currentStep)
|
|
703
|
+
this.active = true;
|
|
704
|
+
else if (this.index < currentStep)
|
|
705
|
+
this.completed = true;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
class Stepbar extends HTMLElement {
|
|
709
|
+
constructor() {
|
|
710
|
+
super();
|
|
711
|
+
Object.defineProperty(this, "_observer", {
|
|
712
|
+
enumerable: true,
|
|
713
|
+
configurable: true,
|
|
714
|
+
writable: true,
|
|
715
|
+
value: void 0
|
|
716
|
+
});
|
|
717
|
+
this.attachShadow({ mode: 'open' });
|
|
718
|
+
this.shadowRoot.innerHTML = `
|
|
719
|
+
<slot></slot>
|
|
720
|
+
`;
|
|
721
|
+
}
|
|
722
|
+
static get observedAttributes() {
|
|
723
|
+
return ['current'];
|
|
724
|
+
}
|
|
725
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
726
|
+
if (name === 'current') {
|
|
727
|
+
this.updateSteps();
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
connectedCallback() {
|
|
731
|
+
if (!this._observer) {
|
|
732
|
+
this._observer = new MutationObserver(() => this.updateSteps());
|
|
733
|
+
this._observer.observe(this, { childList: true });
|
|
734
|
+
}
|
|
735
|
+
this.updateSteps();
|
|
736
|
+
}
|
|
737
|
+
disconnectedCallback() {
|
|
738
|
+
if (this._observer) {
|
|
739
|
+
this._observer.disconnect();
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
updateSteps() {
|
|
743
|
+
const currentStep = parseInt(this.getAttribute('current') || '1');
|
|
744
|
+
const elements = Array.from(this.children).filter((el) => el.tagName === 'SB-ELEMENT');
|
|
745
|
+
elements.forEach((element, index) => {
|
|
746
|
+
const stepNumber = index + 1;
|
|
747
|
+
element.status = 'uncomplete';
|
|
748
|
+
if (stepNumber < currentStep) {
|
|
749
|
+
element.status = 'complete';
|
|
750
|
+
}
|
|
751
|
+
else if (stepNumber === currentStep) {
|
|
752
|
+
element.status = 'active';
|
|
753
|
+
}
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
get currentStep() {
|
|
757
|
+
return parseInt(this.getAttribute('current') || '1');
|
|
758
|
+
}
|
|
759
|
+
set currentStep(step) {
|
|
760
|
+
this.setAttribute('current', step.toString());
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
class HTMLFile extends HTMLElement {
|
|
764
|
+
constructor() {
|
|
765
|
+
super();
|
|
766
|
+
}
|
|
767
|
+
get src() {
|
|
768
|
+
return this.getAttribute('src') || '';
|
|
769
|
+
}
|
|
770
|
+
set src(value) {
|
|
771
|
+
if (value) {
|
|
772
|
+
this.setAttribute('src', value);
|
|
773
|
+
}
|
|
774
|
+
else {
|
|
775
|
+
this.removeAttribute('src');
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
static get observedAttributes() {
|
|
779
|
+
return ['src'];
|
|
780
|
+
}
|
|
781
|
+
connectedCallback() {
|
|
782
|
+
this.loadContent();
|
|
783
|
+
}
|
|
784
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
785
|
+
if (name === 'src' && oldValue !== newValue && this.isConnected) {
|
|
786
|
+
this.loadContent();
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
async loadContent() {
|
|
790
|
+
const src = this.src;
|
|
791
|
+
if (!src)
|
|
792
|
+
return;
|
|
793
|
+
try {
|
|
794
|
+
const response = await fetch(src);
|
|
795
|
+
const content = await response.text();
|
|
796
|
+
this.innerHTML = content;
|
|
797
|
+
await this.executeScripts();
|
|
798
|
+
}
|
|
799
|
+
catch (error) {
|
|
800
|
+
this.innerHTML = `Ошибка загрузки: ${error.message}`;
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
async executeScripts() {
|
|
804
|
+
const scripts = this.querySelectorAll('script');
|
|
805
|
+
for (const script of scripts) {
|
|
806
|
+
if (script.src) {
|
|
807
|
+
await this.loadExternalScript(script.src);
|
|
808
|
+
}
|
|
809
|
+
else {
|
|
810
|
+
this.executeInlineScript(script.textContent || '');
|
|
811
|
+
}
|
|
812
|
+
script.remove();
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
loadExternalScript(src) {
|
|
816
|
+
return new Promise((resolve, reject) => {
|
|
817
|
+
const newScript = document.createElement('script');
|
|
818
|
+
newScript.src = src;
|
|
819
|
+
newScript.onload = resolve;
|
|
820
|
+
newScript.onerror = reject;
|
|
821
|
+
document.head.appendChild(newScript);
|
|
822
|
+
});
|
|
823
|
+
}
|
|
824
|
+
executeInlineScript(code) {
|
|
825
|
+
try {
|
|
826
|
+
const newScript = document.createElement('script');
|
|
827
|
+
newScript.textContent = code;
|
|
828
|
+
document.head.appendChild(newScript);
|
|
829
|
+
document.head.removeChild(newScript);
|
|
830
|
+
}
|
|
831
|
+
catch (error) {
|
|
832
|
+
console.error('Ошибка выполнения скрипта:', error);
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
get loaded() {
|
|
836
|
+
return this.hasAttribute('data-loaded');
|
|
837
|
+
}
|
|
838
|
+
reload() {
|
|
839
|
+
return this.loadContent();
|
|
840
|
+
}
|
|
841
|
+
get content() {
|
|
842
|
+
return this.innerHTML;
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
class ClickToCopy extends HTMLElement {
|
|
846
|
+
constructor() {
|
|
847
|
+
super();
|
|
848
|
+
Object.defineProperty(this, "notification", {
|
|
849
|
+
enumerable: true,
|
|
850
|
+
configurable: true,
|
|
851
|
+
writable: true,
|
|
852
|
+
value: void 0
|
|
853
|
+
});
|
|
854
|
+
this.notification = new HyperTextNotification({ backgroundColor: 'rgba(192,0,192,0.8)' });
|
|
855
|
+
}
|
|
856
|
+
get notificationText() {
|
|
857
|
+
return this.getAttribute('text') || "Скопировано";
|
|
858
|
+
}
|
|
859
|
+
set notificationText(value) {
|
|
860
|
+
if (value)
|
|
861
|
+
this.setAttribute('text', value);
|
|
862
|
+
else
|
|
863
|
+
this.removeAttribute('text');
|
|
864
|
+
}
|
|
865
|
+
get isNotified() {
|
|
866
|
+
return this.hasAttribute('notified');
|
|
867
|
+
}
|
|
868
|
+
set isNotified(value) {
|
|
869
|
+
if (value)
|
|
870
|
+
this.setAttribute('notified', '');
|
|
871
|
+
else
|
|
872
|
+
this.removeAttribute('notified');
|
|
873
|
+
}
|
|
874
|
+
connectedCallback() {
|
|
875
|
+
this.addEventListener('click', () => {
|
|
876
|
+
navigator.clipboard.writeText(this.textContent || '');
|
|
877
|
+
if (this.isNotified)
|
|
878
|
+
this.notification.show(this.notificationText);
|
|
879
|
+
});
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
customElements.define('sb-element', StepElement);
|
|
883
|
+
customElements.define('step-bar', Stepbar);
|
|
884
|
+
customElements.define('ab-num', AbbreviatedNumber);
|
|
885
|
+
customElements.define('include-html', HTMLFile);
|
|
886
|
+
customElements.define('click-to-copy', ClickToCopy);
|
|
887
|
+
//# sourceMappingURL=tags.js.map
|
|
888
|
+
|
|
889
|
+
// ===== File: url.js =====
|
|
890
|
+
"use strict";
|
|
891
|
+
function isAbsoluteUrl(url) {
|
|
892
|
+
try {
|
|
893
|
+
new URL(url);
|
|
894
|
+
return true;
|
|
895
|
+
}
|
|
896
|
+
catch (e) {
|
|
897
|
+
return url[0] === '/' || url[0] === '\\';
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
function combineUrls(baseUrl, relativeUrl) {
|
|
901
|
+
try {
|
|
902
|
+
if (!baseUrl) {
|
|
903
|
+
if (relativeUrl.startsWith('/'))
|
|
904
|
+
return relativeUrl;
|
|
905
|
+
return '/' + relativeUrl;
|
|
906
|
+
}
|
|
907
|
+
return new URL(relativeUrl, baseUrl).toString();
|
|
908
|
+
}
|
|
909
|
+
catch (error) {
|
|
910
|
+
throw new Error(`Invalid URL combination: ${baseUrl}, ${relativeUrl}`);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
function getScriptSite(script) {
|
|
914
|
+
return new URL(script.src).origin;
|
|
915
|
+
}
|
|
916
|
+
//# sourceMappingURL=url.js.map
|
|
917
|
+
|
|
918
|
+
// ===== File: uuid.js =====
|
|
919
|
+
"use strict";
|
|
920
|
+
function generateUUIDv4() {
|
|
921
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
922
|
+
const r = Math.random() * 16 | 0;
|
|
923
|
+
const v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
924
|
+
return v.toString(16);
|
|
925
|
+
});
|
|
926
|
+
}
|
|
927
|
+
//# sourceMappingURL=uuid.js.map
|
|
928
|
+
|