@shival99/z-ui 1.0.1 → 1.0.2
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/assets/css/animations.css +207 -0
- package/assets/css/base.css +76 -0
- package/assets/css/tailwind.css +53 -0
- package/assets/css/themes/gray.css +73 -0
- package/assets/css/themes/green.css +75 -0
- package/assets/css/themes/hospital.css +79 -0
- package/assets/css/themes/neutral.css +73 -0
- package/assets/css/themes/orange.css +73 -0
- package/assets/css/themes/slate.css +73 -0
- package/assets/css/themes/stone.css +73 -0
- package/assets/css/themes/violet.css +73 -0
- package/assets/css/themes/zinc.css +73 -0
- package/assets/images/avatar.svg +6 -0
- package/assets/images/logo.svg +6 -0
- package/fesm2022/shival99-z-ui-components-z-accordion.mjs +148 -0
- package/fesm2022/shival99-z-ui-components-z-accordion.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-breadcrumb.mjs +74 -0
- package/fesm2022/shival99-z-ui-components-z-breadcrumb.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-button.mjs +155 -0
- package/fesm2022/shival99-z-ui-components-z-button.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-calendar.mjs +2335 -0
- package/fesm2022/shival99-z-ui-components-z-calendar.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-checkbox.mjs +240 -0
- package/fesm2022/shival99-z-ui-components-z-checkbox.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-code.mjs +139 -0
- package/fesm2022/shival99-z-ui-components-z-code.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-drawer.mjs +664 -0
- package/fesm2022/shival99-z-ui-components-z-drawer.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-dropdown-menu.mjs +55 -0
- package/fesm2022/shival99-z-ui-components-z-dropdown-menu.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-editor.mjs +411 -0
- package/fesm2022/shival99-z-ui-components-z-editor.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-filter.mjs +794 -0
- package/fesm2022/shival99-z-ui-components-z-filter.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-icon.mjs +451 -0
- package/fesm2022/shival99-z-ui-components-z-icon.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-input.mjs +804 -0
- package/fesm2022/shival99-z-ui-components-z-input.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-loading.mjs +105 -0
- package/fesm2022/shival99-z-ui-components-z-loading.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-menu.mjs +351 -0
- package/fesm2022/shival99-z-ui-components-z-menu.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-modal.mjs +722 -0
- package/fesm2022/shival99-z-ui-components-z-modal.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-pagination.mjs +131 -0
- package/fesm2022/shival99-z-ui-components-z-pagination.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-popover.mjs +917 -0
- package/fesm2022/shival99-z-ui-components-z-popover.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-radio.mjs +154 -0
- package/fesm2022/shival99-z-ui-components-z-radio.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-select.mjs +998 -0
- package/fesm2022/shival99-z-ui-components-z-select.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-skeleton.mjs +139 -0
- package/fesm2022/shival99-z-ui-components-z-skeleton.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-switch.mjs +127 -0
- package/fesm2022/shival99-z-ui-components-z-switch.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-table.mjs +2628 -0
- package/fesm2022/shival99-z-ui-components-z-table.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-tabs.mjs +259 -0
- package/fesm2022/shival99-z-ui-components-z-tabs.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-timeline.mjs +335 -0
- package/fesm2022/shival99-z-ui-components-z-timeline.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-toast.mjs +93 -0
- package/fesm2022/shival99-z-ui-components-z-toast.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-tooltip.mjs +660 -0
- package/fesm2022/shival99-z-ui-components-z-tooltip.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-upload.mjs +504 -0
- package/fesm2022/shival99-z-ui-components-z-upload.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-i18n.mjs +258 -0
- package/fesm2022/shival99-z-ui-i18n.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-pipes.mjs +116 -0
- package/fesm2022/shival99-z-ui-pipes.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-providers.mjs +203 -0
- package/fesm2022/shival99-z-ui-providers.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-services.mjs +919 -0
- package/fesm2022/shival99-z-ui-services.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-utils.mjs +591 -0
- package/fesm2022/shival99-z-ui-utils.mjs.map +1 -0
- package/fesm2022/z-ui.mjs +3 -19924
- package/fesm2022/z-ui.mjs.map +1 -1
- package/package.json +129 -1
- package/types/shival99-z-ui-components-z-accordion.d.ts +55 -0
- package/types/shival99-z-ui-components-z-breadcrumb.d.ts +36 -0
- package/types/shival99-z-ui-components-z-button.d.ts +41 -0
- package/types/shival99-z-ui-components-z-calendar.d.ts +300 -0
- package/types/shival99-z-ui-components-z-checkbox.d.ts +84 -0
- package/types/shival99-z-ui-components-z-code.d.ts +35 -0
- package/types/shival99-z-ui-components-z-drawer.d.ts +232 -0
- package/types/shival99-z-ui-components-z-dropdown-menu.d.ts +50 -0
- package/types/shival99-z-ui-components-z-editor.d.ts +115 -0
- package/types/shival99-z-ui-components-z-filter.d.ts +268 -0
- package/types/shival99-z-ui-components-z-icon.d.ts +291 -0
- package/types/shival99-z-ui-components-z-input.d.ts +188 -0
- package/types/shival99-z-ui-components-z-loading.d.ts +46 -0
- package/types/shival99-z-ui-components-z-menu.d.ts +116 -0
- package/types/shival99-z-ui-components-z-modal.d.ts +270 -0
- package/types/shival99-z-ui-components-z-pagination.d.ts +52 -0
- package/types/shival99-z-ui-components-z-popover.d.ts +134 -0
- package/types/shival99-z-ui-components-z-radio.d.ts +63 -0
- package/types/shival99-z-ui-components-z-select.d.ts +268 -0
- package/types/shival99-z-ui-components-z-skeleton.d.ts +55 -0
- package/types/shival99-z-ui-components-z-switch.d.ts +48 -0
- package/types/shival99-z-ui-components-z-table.d.ts +482 -0
- package/types/shival99-z-ui-components-z-tabs.d.ts +75 -0
- package/types/shival99-z-ui-components-z-timeline.d.ts +98 -0
- package/types/shival99-z-ui-components-z-toast.d.ts +61 -0
- package/types/shival99-z-ui-components-z-tooltip.d.ts +85 -0
- package/types/shival99-z-ui-components-z-upload.d.ts +136 -0
- package/types/shival99-z-ui-i18n.d.ts +50 -0
- package/types/shival99-z-ui-pipes.d.ts +36 -0
- package/types/shival99-z-ui-providers.d.ts +132 -0
- package/types/shival99-z-ui-services.d.ts +364 -0
- package/types/shival99-z-ui-utils.d.ts +145 -0
- package/types/z-ui.d.ts +3 -4977
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
import { isSignal } from '@angular/core';
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import MiniSearch from 'minisearch';
|
|
4
|
+
import { of, delay, finalize } from 'rxjs';
|
|
5
|
+
import { twMerge } from 'tailwind-merge';
|
|
6
|
+
import * as echarts from 'echarts';
|
|
7
|
+
import { FormGroup, FormArray } from '@angular/forms';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Z-Common Utils
|
|
11
|
+
* Common utility functions for z-ui library
|
|
12
|
+
* All functions are prefixed with 'z' for consistency
|
|
13
|
+
*/
|
|
14
|
+
/** Merge Tailwind CSS classes with clsx */
|
|
15
|
+
const zMergeClasses = (...inputs) => twMerge(clsx(inputs));
|
|
16
|
+
/** Transform boolean-like values to boolean */
|
|
17
|
+
const zTransform = (value) => {
|
|
18
|
+
if (typeof value === 'string') {
|
|
19
|
+
return value === '';
|
|
20
|
+
}
|
|
21
|
+
if (typeof value === 'number') {
|
|
22
|
+
return value === 0;
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
};
|
|
26
|
+
/** Generate a unique ID with optional prefix */
|
|
27
|
+
const zGenerateId = (prefix = '') => {
|
|
28
|
+
const id = crypto.randomUUID();
|
|
29
|
+
return prefix ? `${prefix}-${id}` : id;
|
|
30
|
+
};
|
|
31
|
+
const zNoop = () => void 0;
|
|
32
|
+
/** Simple UUID generator */
|
|
33
|
+
const zUuid = () => {
|
|
34
|
+
const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
|
35
|
+
const time = Date.now();
|
|
36
|
+
return 'xxxx-xxxx-xxxx'.replace(/x/g, () => {
|
|
37
|
+
const r = (Math.random() * chars.length) | 0;
|
|
38
|
+
const t = ((time + Math.random() * 1000) % chars.length) | 0;
|
|
39
|
+
const index = (r + t) % chars.length;
|
|
40
|
+
return chars[index];
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
/** Capitalize each word in a string */
|
|
44
|
+
const zCapitalCase = (text) => {
|
|
45
|
+
if (!text) {
|
|
46
|
+
return '';
|
|
47
|
+
}
|
|
48
|
+
return text
|
|
49
|
+
.split(' ')
|
|
50
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
51
|
+
.join(' ');
|
|
52
|
+
};
|
|
53
|
+
/** Check if text is truncated (requires element to be rendered) */
|
|
54
|
+
const zIsTextTruncated = async (el) => {
|
|
55
|
+
if (!el.offsetWidth || !el.isConnected) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const style = getComputedStyle(el);
|
|
59
|
+
const isCssTruncate = ((style.overflow === 'hidden' || style.textOverflow === 'ellipsis') && style.whiteSpace === 'nowrap') ||
|
|
60
|
+
el.classList.contains('truncate');
|
|
61
|
+
if (isCssTruncate) {
|
|
62
|
+
if (el.scrollWidth > el.clientWidth) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
const range = document.createRange();
|
|
66
|
+
range.selectNodeContents(el);
|
|
67
|
+
return range.getBoundingClientRect().width > el.getBoundingClientRect().width;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
};
|
|
71
|
+
/** Decode unicode escape sequences */
|
|
72
|
+
const zDecodeUnicode = (str) => {
|
|
73
|
+
if (!str) {
|
|
74
|
+
return '';
|
|
75
|
+
}
|
|
76
|
+
str = str.replace(/\\\\u/g, '\\u');
|
|
77
|
+
str = str.replace(/\\u([\dA-Fa-f]{4})/g, (_, g1) => String.fromCharCode(parseInt(g1, 16)));
|
|
78
|
+
str = str.replace(/(^|[^\\])u([\dA-Fa-f]{4})/g, (_, p1, g1) => p1 + String.fromCharCode(parseInt(g1, 16)));
|
|
79
|
+
return str.replace(/([\uD800-\uDBFF])([\uDC00-\uDFFF])/g, (_, high, low) => {
|
|
80
|
+
const hi = high.charCodeAt(0);
|
|
81
|
+
const lo = low.charCodeAt(0);
|
|
82
|
+
const codePoint = (hi - 0xd800) * 0x400 + (lo - 0xdc00) + 0x10000;
|
|
83
|
+
return String.fromCodePoint(codePoint);
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
/** Generate a random color in hex, rgb, and hsl formats */
|
|
87
|
+
const zRandomColor = () => {
|
|
88
|
+
const h = Math.floor(Math.random() * 360);
|
|
89
|
+
const s = Math.floor(Math.random() * 40) + 60;
|
|
90
|
+
const l = Math.floor(Math.random() * 20) + 60;
|
|
91
|
+
const hsl = `hsl(${h}, ${s}%, ${l}%)`;
|
|
92
|
+
const a = s / 100;
|
|
93
|
+
const b = l / 100;
|
|
94
|
+
const c = (1 - Math.abs(2 * b - 1)) * a;
|
|
95
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
96
|
+
const m = b - c / 2;
|
|
97
|
+
let r = 0, g = 0, bl = 0;
|
|
98
|
+
if (h >= 0 && h < 60) {
|
|
99
|
+
[r, g, bl] = [c, x, 0];
|
|
100
|
+
}
|
|
101
|
+
else if (h >= 60 && h < 120) {
|
|
102
|
+
[r, g, bl] = [x, c, 0];
|
|
103
|
+
}
|
|
104
|
+
else if (h >= 120 && h < 180) {
|
|
105
|
+
[r, g, bl] = [0, c, x];
|
|
106
|
+
}
|
|
107
|
+
else if (h >= 180 && h < 240) {
|
|
108
|
+
[r, g, bl] = [0, x, c];
|
|
109
|
+
}
|
|
110
|
+
else if (h >= 240 && h < 300) {
|
|
111
|
+
[r, g, bl] = [x, 0, c];
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
[r, g, bl] = [c, 0, x];
|
|
115
|
+
}
|
|
116
|
+
const R = Math.round((r + m) * 255);
|
|
117
|
+
const G = Math.round((g + m) * 255);
|
|
118
|
+
const B = Math.round((bl + m) * 255);
|
|
119
|
+
const rgb = `rgb(${R}, ${G}, ${B})`;
|
|
120
|
+
const toHex = (n) => n.toString(16).padStart(2, '0');
|
|
121
|
+
const hex = `#${toHex(R)}${toHex(G)}${toHex(B)}`;
|
|
122
|
+
return { hex, rgb, hsl };
|
|
123
|
+
};
|
|
124
|
+
/** Convert color string to ARGB format */
|
|
125
|
+
const zConvertColorToArgb = (color) => {
|
|
126
|
+
if (color.startsWith('#')) {
|
|
127
|
+
return 'FF' + color.substring(1).toUpperCase();
|
|
128
|
+
}
|
|
129
|
+
if (color.startsWith('rgb')) {
|
|
130
|
+
const matches = color.match(/\d+/g);
|
|
131
|
+
if (matches && matches.length >= 3) {
|
|
132
|
+
const r = parseInt(matches[0]).toString(16).padStart(2, '0');
|
|
133
|
+
const g = parseInt(matches[1]).toString(16).padStart(2, '0');
|
|
134
|
+
const b = parseInt(matches[2]).toString(16).padStart(2, '0');
|
|
135
|
+
return `FF${r}${g}${b}`.toUpperCase();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return 'FF000000';
|
|
139
|
+
};
|
|
140
|
+
/** Clean null/undefined values from object recursively */
|
|
141
|
+
const zCleanObject = (obj) => {
|
|
142
|
+
if (obj !== Object(obj)) {
|
|
143
|
+
return obj;
|
|
144
|
+
}
|
|
145
|
+
return Object.entries(obj).reduce((acc, [key, value]) => {
|
|
146
|
+
if (value === null || value === undefined) {
|
|
147
|
+
return acc;
|
|
148
|
+
}
|
|
149
|
+
const cleaned = zCleanObject(value);
|
|
150
|
+
if (cleaned !== null &&
|
|
151
|
+
cleaned !== undefined &&
|
|
152
|
+
(typeof cleaned !== 'object' || Object.keys(cleaned).length > 0)) {
|
|
153
|
+
acc[key] = cleaned;
|
|
154
|
+
}
|
|
155
|
+
return acc;
|
|
156
|
+
}, {});
|
|
157
|
+
};
|
|
158
|
+
/** Flatten tree structure to flat array */
|
|
159
|
+
const zTreeFlatten = (list, keyMap, parentKeyMap, sortFn) => {
|
|
160
|
+
const sortedList = sortFn ? [...list].sort(sortFn) : list;
|
|
161
|
+
const byParent = {};
|
|
162
|
+
for (const item of sortedList) {
|
|
163
|
+
const parentKey = item[parentKeyMap] ?? 'root';
|
|
164
|
+
if (!byParent[parentKey]) {
|
|
165
|
+
byParent[parentKey] = [];
|
|
166
|
+
}
|
|
167
|
+
byParent[parentKey].push(item);
|
|
168
|
+
}
|
|
169
|
+
const flatten = (parentKey, level, parentsKey) => {
|
|
170
|
+
const children = byParent[parentKey ?? 'root'] || [];
|
|
171
|
+
return children.flatMap(child => {
|
|
172
|
+
const keyVal = String(child[keyMap]);
|
|
173
|
+
const newParents = [...parentsKey, keyVal];
|
|
174
|
+
return [{ ...child, level, parentsKey }, ...flatten(keyVal, level + 1, newParents)];
|
|
175
|
+
});
|
|
176
|
+
};
|
|
177
|
+
return flatten(null, 0, []);
|
|
178
|
+
};
|
|
179
|
+
/** Build tree structure from flat array */
|
|
180
|
+
const zTreeBuild = (list, keyMap, parentKeyMap, sortFn) => {
|
|
181
|
+
const sortedList = sortFn ? [...list].sort(sortFn) : list;
|
|
182
|
+
const byParent = {};
|
|
183
|
+
for (const item of sortedList) {
|
|
184
|
+
const parentKey = item[parentKeyMap] ?? 'root';
|
|
185
|
+
if (!byParent[parentKey]) {
|
|
186
|
+
byParent[parentKey] = [];
|
|
187
|
+
}
|
|
188
|
+
byParent[parentKey].push(item);
|
|
189
|
+
}
|
|
190
|
+
const buildTree = (parentKey, level, parentsKey) => {
|
|
191
|
+
const children = byParent[parentKey ?? 'root'] || [];
|
|
192
|
+
return children.map(child => {
|
|
193
|
+
const keyVal = String(child[keyMap]);
|
|
194
|
+
const newParents = [...parentsKey, keyVal];
|
|
195
|
+
return {
|
|
196
|
+
...child,
|
|
197
|
+
level,
|
|
198
|
+
parentsKey,
|
|
199
|
+
children: buildTree(keyVal, level + 1, newParents),
|
|
200
|
+
};
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
return buildTree(null, 0, []);
|
|
204
|
+
};
|
|
205
|
+
/** Vietnamese character map for normalization */
|
|
206
|
+
const VIETNAMESE_MAP = {
|
|
207
|
+
à: 'a',
|
|
208
|
+
á: 'a',
|
|
209
|
+
ạ: 'a',
|
|
210
|
+
ả: 'a',
|
|
211
|
+
ã: 'a',
|
|
212
|
+
â: 'a',
|
|
213
|
+
ầ: 'a',
|
|
214
|
+
ấ: 'a',
|
|
215
|
+
ậ: 'a',
|
|
216
|
+
ẩ: 'a',
|
|
217
|
+
ẫ: 'a',
|
|
218
|
+
ă: 'a',
|
|
219
|
+
ằ: 'a',
|
|
220
|
+
ắ: 'a',
|
|
221
|
+
ặ: 'a',
|
|
222
|
+
ẳ: 'a',
|
|
223
|
+
ẵ: 'a',
|
|
224
|
+
è: 'e',
|
|
225
|
+
é: 'e',
|
|
226
|
+
ẹ: 'e',
|
|
227
|
+
ẻ: 'e',
|
|
228
|
+
ẽ: 'e',
|
|
229
|
+
ê: 'e',
|
|
230
|
+
ề: 'e',
|
|
231
|
+
ế: 'e',
|
|
232
|
+
ệ: 'e',
|
|
233
|
+
ể: 'e',
|
|
234
|
+
ễ: 'e',
|
|
235
|
+
ì: 'i',
|
|
236
|
+
í: 'i',
|
|
237
|
+
ị: 'i',
|
|
238
|
+
ỉ: 'i',
|
|
239
|
+
ĩ: 'i',
|
|
240
|
+
ò: 'o',
|
|
241
|
+
ó: 'o',
|
|
242
|
+
ọ: 'o',
|
|
243
|
+
ỏ: 'o',
|
|
244
|
+
õ: 'o',
|
|
245
|
+
ô: 'o',
|
|
246
|
+
ồ: 'o',
|
|
247
|
+
ố: 'o',
|
|
248
|
+
ộ: 'o',
|
|
249
|
+
ổ: 'o',
|
|
250
|
+
ỗ: 'o',
|
|
251
|
+
ơ: 'o',
|
|
252
|
+
ờ: 'o',
|
|
253
|
+
ớ: 'o',
|
|
254
|
+
ợ: 'o',
|
|
255
|
+
ở: 'o',
|
|
256
|
+
ỡ: 'o',
|
|
257
|
+
ù: 'u',
|
|
258
|
+
ú: 'u',
|
|
259
|
+
ụ: 'u',
|
|
260
|
+
ủ: 'u',
|
|
261
|
+
ũ: 'u',
|
|
262
|
+
ư: 'u',
|
|
263
|
+
ừ: 'u',
|
|
264
|
+
ứ: 'u',
|
|
265
|
+
ự: 'u',
|
|
266
|
+
ử: 'u',
|
|
267
|
+
ữ: 'u',
|
|
268
|
+
ỳ: 'y',
|
|
269
|
+
ý: 'y',
|
|
270
|
+
ỵ: 'y',
|
|
271
|
+
ỷ: 'y',
|
|
272
|
+
ỹ: 'y',
|
|
273
|
+
đ: 'd',
|
|
274
|
+
À: 'A',
|
|
275
|
+
Á: 'A',
|
|
276
|
+
Ạ: 'A',
|
|
277
|
+
Ả: 'A',
|
|
278
|
+
Ã: 'A',
|
|
279
|
+
Â: 'A',
|
|
280
|
+
Ầ: 'A',
|
|
281
|
+
Ấ: 'A',
|
|
282
|
+
Ậ: 'A',
|
|
283
|
+
Ẩ: 'A',
|
|
284
|
+
Ẫ: 'A',
|
|
285
|
+
Ă: 'A',
|
|
286
|
+
Ằ: 'A',
|
|
287
|
+
Ắ: 'A',
|
|
288
|
+
Ặ: 'A',
|
|
289
|
+
Ẳ: 'A',
|
|
290
|
+
Ẵ: 'A',
|
|
291
|
+
È: 'E',
|
|
292
|
+
É: 'E',
|
|
293
|
+
Ẹ: 'E',
|
|
294
|
+
Ẻ: 'E',
|
|
295
|
+
Ẽ: 'E',
|
|
296
|
+
Ê: 'E',
|
|
297
|
+
Ề: 'E',
|
|
298
|
+
Ế: 'E',
|
|
299
|
+
Ệ: 'E',
|
|
300
|
+
Ể: 'E',
|
|
301
|
+
Ễ: 'E',
|
|
302
|
+
Ì: 'I',
|
|
303
|
+
Í: 'I',
|
|
304
|
+
Ị: 'I',
|
|
305
|
+
Ỉ: 'I',
|
|
306
|
+
Ĩ: 'I',
|
|
307
|
+
Ò: 'O',
|
|
308
|
+
Ó: 'O',
|
|
309
|
+
Ọ: 'O',
|
|
310
|
+
Ỏ: 'O',
|
|
311
|
+
Õ: 'O',
|
|
312
|
+
Ô: 'O',
|
|
313
|
+
Ồ: 'O',
|
|
314
|
+
Ố: 'O',
|
|
315
|
+
Ộ: 'O',
|
|
316
|
+
Ổ: 'O',
|
|
317
|
+
Ỗ: 'O',
|
|
318
|
+
Ơ: 'O',
|
|
319
|
+
Ờ: 'O',
|
|
320
|
+
Ớ: 'O',
|
|
321
|
+
Ợ: 'O',
|
|
322
|
+
Ở: 'O',
|
|
323
|
+
Ỡ: 'O',
|
|
324
|
+
Ù: 'U',
|
|
325
|
+
Ú: 'U',
|
|
326
|
+
Ụ: 'U',
|
|
327
|
+
Ủ: 'U',
|
|
328
|
+
Ũ: 'U',
|
|
329
|
+
Ư: 'U',
|
|
330
|
+
Ừ: 'U',
|
|
331
|
+
Ứ: 'U',
|
|
332
|
+
Ự: 'U',
|
|
333
|
+
Ử: 'U',
|
|
334
|
+
Ữ: 'U',
|
|
335
|
+
Ỳ: 'Y',
|
|
336
|
+
Ý: 'Y',
|
|
337
|
+
Ỵ: 'Y',
|
|
338
|
+
Ỷ: 'Y',
|
|
339
|
+
Ỹ: 'Y',
|
|
340
|
+
Đ: 'D',
|
|
341
|
+
};
|
|
342
|
+
/** Remove Vietnamese diacritics from string */
|
|
343
|
+
const zRemoveVietnamese = (str) => str
|
|
344
|
+
.split('')
|
|
345
|
+
.map(char => VIETNAMESE_MAP[char] || char)
|
|
346
|
+
.join('');
|
|
347
|
+
/** Get nested object value by path */
|
|
348
|
+
const getDeepValue = (obj, path) => {
|
|
349
|
+
try {
|
|
350
|
+
const value = path.split('.').reduce((acc, key) => {
|
|
351
|
+
if (acc && typeof acc === 'object' && key in acc) {
|
|
352
|
+
return acc[key];
|
|
353
|
+
}
|
|
354
|
+
return '';
|
|
355
|
+
}, obj);
|
|
356
|
+
if (Array.isArray(value)) {
|
|
357
|
+
return value.map(v => String(v)).join(' ');
|
|
358
|
+
}
|
|
359
|
+
return value;
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
return '';
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
/** Full-text search using MiniSearch */
|
|
366
|
+
const zMiniSearch = (data, query, fields) => {
|
|
367
|
+
if (!query) {
|
|
368
|
+
return data;
|
|
369
|
+
}
|
|
370
|
+
const fieldStrings = fields.map(f => String(f));
|
|
371
|
+
const flatData = data.map((item, index) => ({
|
|
372
|
+
...item,
|
|
373
|
+
_index: index,
|
|
374
|
+
...Object.fromEntries(fieldStrings.map(field => [field, getDeepValue(item, field)])),
|
|
375
|
+
}));
|
|
376
|
+
const search = new MiniSearch({
|
|
377
|
+
idField: '_index',
|
|
378
|
+
fields: fieldStrings,
|
|
379
|
+
storeFields: ['_index'],
|
|
380
|
+
tokenize: (text) => zRemoveVietnamese(text.toLowerCase())
|
|
381
|
+
.split(/[\s@.\-_]+/)
|
|
382
|
+
.filter(Boolean),
|
|
383
|
+
processTerm: (term) => zRemoveVietnamese(term.toLowerCase()),
|
|
384
|
+
});
|
|
385
|
+
search.addAll(flatData);
|
|
386
|
+
const results = search.search(query, { prefix: true });
|
|
387
|
+
return results.map(result => data[result._index]);
|
|
388
|
+
};
|
|
389
|
+
/** Full-text search as Observable with loading state */
|
|
390
|
+
const zMiniSearch$ = (data, query, fields, loading, fakeDelay = 200) => {
|
|
391
|
+
if (loading && isSignal(loading)) {
|
|
392
|
+
loading.set(true);
|
|
393
|
+
}
|
|
394
|
+
return of(zMiniSearch(data, query, fields)).pipe(delay(fakeDelay), finalize(() => {
|
|
395
|
+
if (loading && isSignal(loading)) {
|
|
396
|
+
loading.set(false);
|
|
397
|
+
}
|
|
398
|
+
}));
|
|
399
|
+
};
|
|
400
|
+
/** Detect device type from user agent */
|
|
401
|
+
const _detectDevice = (ua) => {
|
|
402
|
+
if (/Mobi|Android.*Mobile|iPhone|iPod|BlackBerry|IEMobile/i.test(ua)) {
|
|
403
|
+
return 'mobile';
|
|
404
|
+
}
|
|
405
|
+
if (/iPad|Android(?!.*Mobile)|Tablet/i.test(ua)) {
|
|
406
|
+
return 'tablet';
|
|
407
|
+
}
|
|
408
|
+
return 'desktop';
|
|
409
|
+
};
|
|
410
|
+
/** Detect browser information */
|
|
411
|
+
const zDetectBrowser = () => {
|
|
412
|
+
const ua = navigator.userAgent;
|
|
413
|
+
const result = {
|
|
414
|
+
name: 'Unknown',
|
|
415
|
+
version: '',
|
|
416
|
+
agent: ua,
|
|
417
|
+
device: _detectDevice(ua),
|
|
418
|
+
time: new Date().toISOString(),
|
|
419
|
+
};
|
|
420
|
+
if (!navigator.userAgentData) {
|
|
421
|
+
return result;
|
|
422
|
+
}
|
|
423
|
+
const brands = navigator.userAgentData.brands || [];
|
|
424
|
+
const isMobile = navigator.userAgentData.mobile;
|
|
425
|
+
if (isMobile) {
|
|
426
|
+
result.device = 'mobile';
|
|
427
|
+
}
|
|
428
|
+
const mainBrand = brands.find((b) => !['Chromium', 'Not_A Brand', 'Not A;Brand', 'Not/A)Brand'].includes(b.brand));
|
|
429
|
+
if (mainBrand) {
|
|
430
|
+
result.name = mainBrand.brand.replace('Google ', '');
|
|
431
|
+
result.version = mainBrand.version;
|
|
432
|
+
return result;
|
|
433
|
+
}
|
|
434
|
+
const chromium = brands.find((b) => b.brand === 'Chromium');
|
|
435
|
+
if (chromium) {
|
|
436
|
+
result.name = 'Chrome';
|
|
437
|
+
result.version = chromium.version;
|
|
438
|
+
}
|
|
439
|
+
return result;
|
|
440
|
+
};
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Z-Echarts Utils
|
|
444
|
+
* ECharts utility functions
|
|
445
|
+
*/
|
|
446
|
+
const Z_ECHARTS_DEFAULT_FONT = `'Lexend', 'Arial', 'Helvetica', 'sans-serif'`;
|
|
447
|
+
/**
|
|
448
|
+
* Register custom Z-UI theme for ECharts
|
|
449
|
+
* @param options - Theme configuration options
|
|
450
|
+
*/
|
|
451
|
+
function zRegisterEchartsTheme(options = {}) {
|
|
452
|
+
const { themeName = 'zTheme', fontFamily = Z_ECHARTS_DEFAULT_FONT } = options;
|
|
453
|
+
echarts.registerTheme(themeName, {
|
|
454
|
+
textStyle: {
|
|
455
|
+
fontFamily,
|
|
456
|
+
color: '#333',
|
|
457
|
+
},
|
|
458
|
+
title: {
|
|
459
|
+
textStyle: {
|
|
460
|
+
fontFamily,
|
|
461
|
+
fontWeight: '450',
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
legend: {
|
|
465
|
+
textStyle: {
|
|
466
|
+
fontFamily,
|
|
467
|
+
fontSize: 13,
|
|
468
|
+
color: '#333',
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
tooltip: {
|
|
472
|
+
textStyle: {
|
|
473
|
+
fontFamily,
|
|
474
|
+
color: '#333',
|
|
475
|
+
fontSize: 13,
|
|
476
|
+
},
|
|
477
|
+
},
|
|
478
|
+
axisPointer: {
|
|
479
|
+
lineStyle: { color: '#999' },
|
|
480
|
+
crossStyle: { color: '#999' },
|
|
481
|
+
},
|
|
482
|
+
categoryAxis: {
|
|
483
|
+
axisLine: { lineStyle: { color: '#ccc' } },
|
|
484
|
+
axisTick: { lineStyle: { color: '#ccc' } },
|
|
485
|
+
axisLabel: {
|
|
486
|
+
fontFamily,
|
|
487
|
+
color: '#444',
|
|
488
|
+
fontSize: 12,
|
|
489
|
+
},
|
|
490
|
+
splitLine: { show: false },
|
|
491
|
+
},
|
|
492
|
+
valueAxis: {
|
|
493
|
+
axisLine: { lineStyle: { color: '#ccc' } },
|
|
494
|
+
axisTick: { lineStyle: { color: '#ccc' } },
|
|
495
|
+
axisLabel: {
|
|
496
|
+
fontFamily,
|
|
497
|
+
color: '#444',
|
|
498
|
+
fontSize: 12,
|
|
499
|
+
},
|
|
500
|
+
splitLine: { lineStyle: { color: '#eee' } },
|
|
501
|
+
},
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
/** @deprecated Use zRegisterEchartsTheme instead */
|
|
505
|
+
const registerEchartsMsgTheme = () => zRegisterEchartsTheme({ themeName: 'msgThemes' });
|
|
506
|
+
|
|
507
|
+
/**
|
|
508
|
+
* Z-Form Utils
|
|
509
|
+
* Form utility functions
|
|
510
|
+
*/
|
|
511
|
+
/**
|
|
512
|
+
* Submit form and mark invalid controls as dirty
|
|
513
|
+
* @param form - FormGroup or FormArray to submit
|
|
514
|
+
* @returns true if form is valid, false otherwise
|
|
515
|
+
*/
|
|
516
|
+
const zSubmitForm = (form) => {
|
|
517
|
+
if (form.invalid) {
|
|
518
|
+
Object.values(form.controls).forEach(control => {
|
|
519
|
+
if (control.invalid) {
|
|
520
|
+
control.markAsDirty();
|
|
521
|
+
control.updateValueAndValidity({ onlySelf: true });
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
return false;
|
|
525
|
+
}
|
|
526
|
+
return true;
|
|
527
|
+
};
|
|
528
|
+
/** Legacy alias */
|
|
529
|
+
const submitForm = zSubmitForm;
|
|
530
|
+
/**
|
|
531
|
+
* Debug invalid form controls by logging to console
|
|
532
|
+
* @param form - FormGroup to debug
|
|
533
|
+
* @param parentKey - Parent key for nested controls
|
|
534
|
+
*/
|
|
535
|
+
const zDebugFormInvalid = (form, parentKey = '') => {
|
|
536
|
+
Object.keys(form.controls).forEach(key => {
|
|
537
|
+
const control = form.get(key);
|
|
538
|
+
const controlPath = parentKey ? `${parentKey}.${key}` : key;
|
|
539
|
+
if (control instanceof FormGroup) {
|
|
540
|
+
zDebugFormInvalid(control, controlPath);
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
if (control instanceof FormArray) {
|
|
544
|
+
control.controls.forEach((ctrl, index) => {
|
|
545
|
+
const arrayPath = `${controlPath}[${index}]`;
|
|
546
|
+
if (ctrl instanceof FormGroup) {
|
|
547
|
+
zDebugFormInvalid(ctrl, arrayPath);
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
if (ctrl?.invalid) {
|
|
551
|
+
console.log(`❌ Field: ${arrayPath}`, ctrl.errors);
|
|
552
|
+
}
|
|
553
|
+
});
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
if (control?.invalid) {
|
|
557
|
+
console.log(`❌ Field: ${controlPath}`, control.errors);
|
|
558
|
+
}
|
|
559
|
+
});
|
|
560
|
+
};
|
|
561
|
+
/** Legacy alias */
|
|
562
|
+
const debugFormInvalid = zDebugFormInvalid;
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* Z-Common Types
|
|
566
|
+
* Common utility types
|
|
567
|
+
*/
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* Z-Echarts Types
|
|
571
|
+
*/
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* Z-Form Types
|
|
575
|
+
* Form utility types
|
|
576
|
+
*/
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* Utils types index
|
|
580
|
+
*/
|
|
581
|
+
|
|
582
|
+
/**
|
|
583
|
+
* Utils index
|
|
584
|
+
*/
|
|
585
|
+
|
|
586
|
+
/**
|
|
587
|
+
* Generated bundle index. Do not edit.
|
|
588
|
+
*/
|
|
589
|
+
|
|
590
|
+
export { VIETNAMESE_MAP, debugFormInvalid, registerEchartsMsgTheme, submitForm, zCapitalCase, zCleanObject, zConvertColorToArgb, zDebugFormInvalid, zDecodeUnicode, zDetectBrowser, zGenerateId, zIsTextTruncated, zMergeClasses, zMiniSearch, zMiniSearch$, zNoop, zRandomColor, zRegisterEchartsTheme, zRemoveVietnamese, zSubmitForm, zTransform, zTreeBuild, zTreeFlatten, zUuid };
|
|
591
|
+
//# sourceMappingURL=shival99-z-ui-utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shival99-z-ui-utils.mjs","sources":["../../../../libs/core-ui/utils/z-common.utils.ts","../../../../libs/core-ui/utils/z-echarts.utils.ts","../../../../libs/core-ui/utils/z-form.utils.ts","../../../../libs/core-ui/utils/types/z-common.types.ts","../../../../libs/core-ui/utils/types/z-echarts.types.ts","../../../../libs/core-ui/utils/types/z-form.types.ts","../../../../libs/core-ui/utils/types/index.ts","../../../../libs/core-ui/utils/index.ts","../../../../libs/core-ui/utils/shival99-z-ui-utils.ts"],"sourcesContent":["/**\n * Z-Common Utils\n * Common utility functions for z-ui library\n * All functions are prefixed with 'z' for consistency\n */\n\nimport { isSignal, type WritableSignal } from '@angular/core';\nimport { type ClassValue, clsx } from 'clsx';\nimport MiniSearch from 'minisearch';\nimport { delay, finalize, type Observable, of } from 'rxjs';\nimport { twMerge } from 'tailwind-merge';\nimport { type ZDeviceType, type ZBrowserInfo, type ZNavigatorUABrandVersion } from './types/z-common.types';\n\n/** Merge Tailwind CSS classes with clsx */\nexport const zMergeClasses = (...inputs: ClassValue[]) => twMerge(clsx(inputs));\n\n/** Transform boolean-like values to boolean */\nexport const zTransform = (value: boolean | string): boolean => {\n if (typeof value === 'string') {\n return value === '';\n }\n if (typeof value === 'number') {\n return value === 0;\n }\n return value;\n};\n\n/** Generate a unique ID with optional prefix */\nexport const zGenerateId = (prefix = ''): string => {\n const id = crypto.randomUUID();\n return prefix ? `${prefix}-${id}` : id;\n};\n\nexport const zNoop = () => void 0;\n\n/** Simple UUID generator */\nexport const zUuid = (): string => {\n const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n const time = Date.now();\n\n return 'xxxx-xxxx-xxxx'.replace(/x/g, () => {\n const r = (Math.random() * chars.length) | 0;\n const t = ((time + Math.random() * 1000) % chars.length) | 0;\n const index = (r + t) % chars.length;\n return chars[index];\n });\n};\n\n/** Capitalize each word in a string */\nexport const zCapitalCase = (text: string): string => {\n if (!text) {\n return '';\n }\n return text\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n};\n\n/** Check if text is truncated (requires element to be rendered) */\nexport const zIsTextTruncated = async (el: HTMLElement): Promise<boolean> => {\n if (!el.offsetWidth || !el.isConnected) {\n return false;\n }\n\n const style = getComputedStyle(el);\n const isCssTruncate =\n ((style.overflow === 'hidden' || style.textOverflow === 'ellipsis') && style.whiteSpace === 'nowrap') ||\n el.classList.contains('truncate');\n\n if (isCssTruncate) {\n if (el.scrollWidth > el.clientWidth) {\n return true;\n }\n\n const range = document.createRange();\n range.selectNodeContents(el);\n return range.getBoundingClientRect().width > el.getBoundingClientRect().width;\n }\n\n return false;\n};\n\n/** Decode unicode escape sequences */\nexport const zDecodeUnicode = (str: string): string => {\n if (!str) {\n return '';\n }\n\n str = str.replace(/\\\\\\\\u/g, '\\\\u');\n str = str.replace(/\\\\u([\\dA-Fa-f]{4})/g, (_, g1) => String.fromCharCode(parseInt(g1, 16)));\n str = str.replace(/(^|[^\\\\])u([\\dA-Fa-f]{4})/g, (_, p1, g1) => p1 + String.fromCharCode(parseInt(g1, 16)));\n\n return str.replace(/([\\uD800-\\uDBFF])([\\uDC00-\\uDFFF])/g, (_, high, low) => {\n const hi = high.charCodeAt(0);\n const lo = low.charCodeAt(0);\n const codePoint = (hi - 0xd800) * 0x400 + (lo - 0xdc00) + 0x10000;\n return String.fromCodePoint(codePoint);\n });\n};\n\n/** Generate a random color in hex, rgb, and hsl formats */\nexport const zRandomColor = (): { hex: string; rgb: string; hsl: string } => {\n const h = Math.floor(Math.random() * 360);\n const s = Math.floor(Math.random() * 40) + 60;\n const l = Math.floor(Math.random() * 20) + 60;\n const hsl = `hsl(${h}, ${s}%, ${l}%)`;\n\n const a = s / 100;\n const b = l / 100;\n const c = (1 - Math.abs(2 * b - 1)) * a;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = b - c / 2;\n\n let r = 0,\n g = 0,\n bl = 0;\n if (h >= 0 && h < 60) {\n [r, g, bl] = [c, x, 0];\n } else if (h >= 60 && h < 120) {\n [r, g, bl] = [x, c, 0];\n } else if (h >= 120 && h < 180) {\n [r, g, bl] = [0, c, x];\n } else if (h >= 180 && h < 240) {\n [r, g, bl] = [0, x, c];\n } else if (h >= 240 && h < 300) {\n [r, g, bl] = [x, 0, c];\n } else {\n [r, g, bl] = [c, 0, x];\n }\n\n const R = Math.round((r + m) * 255);\n const G = Math.round((g + m) * 255);\n const B = Math.round((bl + m) * 255);\n\n const rgb = `rgb(${R}, ${G}, ${B})`;\n const toHex = (n: number) => n.toString(16).padStart(2, '0');\n const hex = `#${toHex(R)}${toHex(G)}${toHex(B)}`;\n\n return { hex, rgb, hsl };\n};\n\n/** Convert color string to ARGB format */\nexport const zConvertColorToArgb = (color: string): string => {\n if (color.startsWith('#')) {\n return 'FF' + color.substring(1).toUpperCase();\n }\n\n if (color.startsWith('rgb')) {\n const matches = color.match(/\\d+/g);\n if (matches && matches.length >= 3) {\n const r = parseInt(matches[0]).toString(16).padStart(2, '0');\n const g = parseInt(matches[1]).toString(16).padStart(2, '0');\n const b = parseInt(matches[2]).toString(16).padStart(2, '0');\n return `FF${r}${g}${b}`.toUpperCase();\n }\n }\n\n return 'FF000000';\n};\n\n/** Clean null/undefined values from object recursively */\nexport const zCleanObject = <T = unknown>(obj: T): T => {\n if (obj !== Object(obj)) {\n return obj;\n }\n\n return Object.entries(obj as Record<string, unknown>).reduce(\n (acc, [key, value]) => {\n if (value === null || value === undefined) {\n return acc;\n }\n\n const cleaned = zCleanObject(value);\n if (\n cleaned !== null &&\n cleaned !== undefined &&\n (typeof cleaned !== 'object' || Object.keys(cleaned).length > 0)\n ) {\n (acc as Record<string, unknown>)[key] = cleaned;\n }\n\n return acc;\n },\n {} as Record<string, unknown>\n ) as T;\n};\n\n/** Flatten tree structure to flat array */\nexport const zTreeFlatten = <T extends Record<string, unknown>>(\n list: T[],\n keyMap: keyof T,\n parentKeyMap: keyof T,\n sortFn?: (a: T, b: T) => number\n): (T & { level: number; parentsKey: string[] })[] => {\n const sortedList = sortFn ? [...list].sort(sortFn) : list;\n const byParent: Record<string, T[]> = {};\n\n for (const item of sortedList) {\n const parentKey = (item[parentKeyMap] as string) ?? 'root';\n if (!byParent[parentKey]) {\n byParent[parentKey] = [];\n }\n byParent[parentKey].push(item);\n }\n\n const flatten = (\n parentKey: string | null,\n level: number,\n parentsKey: string[]\n ): (T & { level: number; parentsKey: string[] })[] => {\n const children = byParent[parentKey ?? 'root'] || [];\n return children.flatMap(child => {\n const keyVal = String(child[keyMap]);\n const newParents = [...parentsKey, keyVal];\n return [{ ...child, level, parentsKey }, ...flatten(keyVal, level + 1, newParents)];\n });\n };\n\n return flatten(null, 0, []);\n};\n\n/** Build tree structure from flat array */\nexport const zTreeBuild = <T extends Record<string, unknown>>(\n list: T[],\n keyMap: keyof T,\n parentKeyMap: keyof T,\n sortFn?: (a: T, b: T) => number\n): (T & { level: number; parentsKey: string[]; children: unknown[] })[] => {\n const sortedList = sortFn ? [...list].sort(sortFn) : list;\n const byParent: Record<string, T[]> = {};\n\n for (const item of sortedList) {\n const parentKey = (item[parentKeyMap] as string) ?? 'root';\n if (!byParent[parentKey]) {\n byParent[parentKey] = [];\n }\n byParent[parentKey].push(item);\n }\n\n const buildTree = (\n parentKey: string | null,\n level: number,\n parentsKey: string[]\n ): (T & { level: number; parentsKey: string[]; children: unknown[] })[] => {\n const children = byParent[parentKey ?? 'root'] || [];\n return children.map(child => {\n const keyVal = String(child[keyMap]);\n const newParents = [...parentsKey, keyVal];\n return {\n ...child,\n level,\n parentsKey,\n children: buildTree(keyVal, level + 1, newParents),\n };\n });\n };\n\n return buildTree(null, 0, []);\n};\n\n/** Vietnamese character map for normalization */\nexport const VIETNAMESE_MAP: Record<string, string> = {\n à: 'a',\n á: 'a',\n ạ: 'a',\n ả: 'a',\n ã: 'a',\n â: 'a',\n ầ: 'a',\n ấ: 'a',\n ậ: 'a',\n ẩ: 'a',\n ẫ: 'a',\n ă: 'a',\n ằ: 'a',\n ắ: 'a',\n ặ: 'a',\n ẳ: 'a',\n ẵ: 'a',\n è: 'e',\n é: 'e',\n ẹ: 'e',\n ẻ: 'e',\n ẽ: 'e',\n ê: 'e',\n ề: 'e',\n ế: 'e',\n ệ: 'e',\n ể: 'e',\n ễ: 'e',\n ì: 'i',\n í: 'i',\n ị: 'i',\n ỉ: 'i',\n ĩ: 'i',\n ò: 'o',\n ó: 'o',\n ọ: 'o',\n ỏ: 'o',\n õ: 'o',\n ô: 'o',\n ồ: 'o',\n ố: 'o',\n ộ: 'o',\n ổ: 'o',\n ỗ: 'o',\n ơ: 'o',\n ờ: 'o',\n ớ: 'o',\n ợ: 'o',\n ở: 'o',\n ỡ: 'o',\n ù: 'u',\n ú: 'u',\n ụ: 'u',\n ủ: 'u',\n ũ: 'u',\n ư: 'u',\n ừ: 'u',\n ứ: 'u',\n ự: 'u',\n ử: 'u',\n ữ: 'u',\n ỳ: 'y',\n ý: 'y',\n ỵ: 'y',\n ỷ: 'y',\n ỹ: 'y',\n đ: 'd',\n À: 'A',\n Á: 'A',\n Ạ: 'A',\n Ả: 'A',\n Ã: 'A',\n Â: 'A',\n Ầ: 'A',\n Ấ: 'A',\n Ậ: 'A',\n Ẩ: 'A',\n Ẫ: 'A',\n Ă: 'A',\n Ằ: 'A',\n Ắ: 'A',\n Ặ: 'A',\n Ẳ: 'A',\n Ẵ: 'A',\n È: 'E',\n É: 'E',\n Ẹ: 'E',\n Ẻ: 'E',\n Ẽ: 'E',\n Ê: 'E',\n Ề: 'E',\n Ế: 'E',\n Ệ: 'E',\n Ể: 'E',\n Ễ: 'E',\n Ì: 'I',\n Í: 'I',\n Ị: 'I',\n Ỉ: 'I',\n Ĩ: 'I',\n Ò: 'O',\n Ó: 'O',\n Ọ: 'O',\n Ỏ: 'O',\n Õ: 'O',\n Ô: 'O',\n Ồ: 'O',\n Ố: 'O',\n Ộ: 'O',\n Ổ: 'O',\n Ỗ: 'O',\n Ơ: 'O',\n Ờ: 'O',\n Ớ: 'O',\n Ợ: 'O',\n Ở: 'O',\n Ỡ: 'O',\n Ù: 'U',\n Ú: 'U',\n Ụ: 'U',\n Ủ: 'U',\n Ũ: 'U',\n Ư: 'U',\n Ừ: 'U',\n Ứ: 'U',\n Ự: 'U',\n Ử: 'U',\n Ữ: 'U',\n Ỳ: 'Y',\n Ý: 'Y',\n Ỵ: 'Y',\n Ỷ: 'Y',\n Ỹ: 'Y',\n Đ: 'D',\n};\n\n/** Remove Vietnamese diacritics from string */\nexport const zRemoveVietnamese = (str: string): string =>\n str\n .split('')\n .map(char => VIETNAMESE_MAP[char] || char)\n .join('');\n\n/** Get nested object value by path */\nconst getDeepValue = (obj: unknown, path: string): string => {\n try {\n const value = path.split('.').reduce((acc: unknown, key: string) => {\n if (acc && typeof acc === 'object' && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return '';\n }, obj);\n\n if (Array.isArray(value)) {\n return value.map(v => String(v)).join(' ');\n }\n\n return value as string;\n } catch {\n return '';\n }\n};\n\n/** Full-text search using MiniSearch */\nexport const zMiniSearch = <T>(data: T[], query: string, fields: (keyof T | string)[]): T[] => {\n if (!query) {\n return data;\n }\n\n const fieldStrings = fields.map(f => String(f));\n const flatData = data.map((item, index) => ({\n ...item,\n _index: index,\n ...Object.fromEntries(fieldStrings.map(field => [field, getDeepValue(item, field)])),\n }));\n\n const search = new MiniSearch({\n idField: '_index',\n fields: fieldStrings,\n storeFields: ['_index'],\n tokenize: (text: string) =>\n zRemoveVietnamese(text.toLowerCase())\n .split(/[\\s@.\\-_]+/)\n .filter(Boolean),\n processTerm: (term: string) => zRemoveVietnamese(term.toLowerCase()),\n });\n\n search.addAll(flatData);\n const results = search.search(query, { prefix: true });\n\n return results.map(result => data[(result as unknown as { _index: number })._index]);\n};\n\n/** Full-text search as Observable with loading state */\nexport const zMiniSearch$ = <T>(\n data: T[],\n query: string,\n fields: (keyof T | string)[],\n loading?: WritableSignal<boolean>,\n fakeDelay = 200\n): Observable<T[]> => {\n if (loading && isSignal(loading)) {\n loading.set(true);\n }\n\n return of(zMiniSearch(data, query, fields)).pipe(\n delay(fakeDelay),\n finalize(() => {\n if (loading && isSignal(loading)) {\n loading.set(false);\n }\n })\n );\n};\n\n/** Detect device type from user agent */\nconst _detectDevice = (ua: string): ZDeviceType => {\n if (/Mobi|Android.*Mobile|iPhone|iPod|BlackBerry|IEMobile/i.test(ua)) {\n return 'mobile';\n }\n if (/iPad|Android(?!.*Mobile)|Tablet/i.test(ua)) {\n return 'tablet';\n }\n return 'desktop';\n};\n\n/** Detect browser information */\nexport const zDetectBrowser = (): ZBrowserInfo => {\n const ua = navigator.userAgent;\n const result: ZBrowserInfo = {\n name: 'Unknown',\n version: '',\n agent: ua,\n device: _detectDevice(ua),\n time: new Date().toISOString(),\n };\n\n if (!navigator.userAgentData) {\n return result;\n }\n\n const brands = navigator.userAgentData.brands || [];\n const isMobile = navigator.userAgentData.mobile;\n\n if (isMobile) {\n result.device = 'mobile';\n }\n\n const mainBrand = brands.find(\n (b: ZNavigatorUABrandVersion) => !['Chromium', 'Not_A Brand', 'Not A;Brand', 'Not/A)Brand'].includes(b.brand)\n );\n\n if (mainBrand) {\n result.name = mainBrand.brand.replace('Google ', '');\n result.version = mainBrand.version;\n return result;\n }\n\n const chromium = brands.find((b: ZNavigatorUABrandVersion) => b.brand === 'Chromium');\n if (chromium) {\n result.name = 'Chrome';\n result.version = chromium.version;\n }\n\n return result;\n};\n","/**\n * Z-Echarts Utils\n * ECharts utility functions\n */\n\nimport * as echarts from 'echarts';\nimport type { ZEchartsThemeOptions } from './types/z-echarts.types';\n\nconst Z_ECHARTS_DEFAULT_FONT = `'Lexend', 'Arial', 'Helvetica', 'sans-serif'`;\n\n/**\n * Register custom Z-UI theme for ECharts\n * @param options - Theme configuration options\n */\nexport function zRegisterEchartsTheme(options: ZEchartsThemeOptions = {}): void {\n const { themeName = 'zTheme', fontFamily = Z_ECHARTS_DEFAULT_FONT } = options;\n\n echarts.registerTheme(themeName, {\n textStyle: {\n fontFamily,\n color: '#333',\n },\n title: {\n textStyle: {\n fontFamily,\n fontWeight: '450',\n },\n },\n legend: {\n textStyle: {\n fontFamily,\n fontSize: 13,\n color: '#333',\n },\n },\n tooltip: {\n textStyle: {\n fontFamily,\n color: '#333',\n fontSize: 13,\n },\n },\n axisPointer: {\n lineStyle: { color: '#999' },\n crossStyle: { color: '#999' },\n },\n categoryAxis: {\n axisLine: { lineStyle: { color: '#ccc' } },\n axisTick: { lineStyle: { color: '#ccc' } },\n axisLabel: {\n fontFamily,\n color: '#444',\n fontSize: 12,\n },\n splitLine: { show: false },\n },\n valueAxis: {\n axisLine: { lineStyle: { color: '#ccc' } },\n axisTick: { lineStyle: { color: '#ccc' } },\n axisLabel: {\n fontFamily,\n color: '#444',\n fontSize: 12,\n },\n splitLine: { lineStyle: { color: '#eee' } },\n },\n });\n}\n\n/** @deprecated Use zRegisterEchartsTheme instead */\nexport const registerEchartsMsgTheme = (): void => zRegisterEchartsTheme({ themeName: 'msgThemes' });\n","/**\n * Z-Form Utils\n * Form utility functions\n */\n\nimport { FormArray, FormGroup } from '@angular/forms';\n\n/**\n * Submit form and mark invalid controls as dirty\n * @param form - FormGroup or FormArray to submit\n * @returns true if form is valid, false otherwise\n */\nexport const zSubmitForm = (form: FormGroup | FormArray): boolean => {\n if (form.invalid) {\n Object.values(form.controls).forEach(control => {\n if (control.invalid) {\n control.markAsDirty();\n control.updateValueAndValidity({ onlySelf: true });\n }\n });\n\n return false;\n }\n\n return true;\n};\n\n/** Legacy alias */\nexport const submitForm = zSubmitForm;\n\n/**\n * Debug invalid form controls by logging to console\n * @param form - FormGroup to debug\n * @param parentKey - Parent key for nested controls\n */\nexport const zDebugFormInvalid = (form: FormGroup, parentKey = ''): void => {\n Object.keys(form.controls).forEach(key => {\n const control = form.get(key);\n const controlPath = parentKey ? `${parentKey}.${key}` : key;\n\n if (control instanceof FormGroup) {\n zDebugFormInvalid(control, controlPath);\n return;\n }\n\n if (control instanceof FormArray) {\n control.controls.forEach((ctrl, index) => {\n const arrayPath = `${controlPath}[${index}]`;\n\n if (ctrl instanceof FormGroup) {\n zDebugFormInvalid(ctrl, arrayPath);\n return;\n }\n\n if (ctrl?.invalid) {\n console.log(`❌ Field: ${arrayPath}`, ctrl.errors);\n }\n });\n return;\n }\n\n if (control?.invalid) {\n console.log(`❌ Field: ${controlPath}`, control.errors);\n }\n });\n};\n\n/** Legacy alias */\nexport const debugFormInvalid = zDebugFormInvalid;\n","/**\n * Z-Common Types\n * Common utility types\n */\n\nexport type ZBrowserName = 'Chrome' | 'Edge' | 'Firefox' | 'Safari' | 'Opera' | 'IE' | 'Unknown' | string;\n\nexport type ZDeviceType = 'mobile' | 'tablet' | 'desktop';\n\nexport interface ZBrowserInfo {\n name: ZBrowserName;\n version: string;\n agent: string;\n device: ZDeviceType;\n time: string;\n}\n\nexport interface ZNavigatorUABrandVersion {\n brand: string;\n version: string;\n}\n\nexport interface ZNavigatorUAData {\n brands: ZNavigatorUABrandVersion[];\n mobile: boolean;\n platform: string;\n}\n\ndeclare global {\n interface Navigator {\n userAgentData?: ZNavigatorUAData;\n }\n}\n","/**\n * Z-Echarts Types\n */\n\nexport interface ZEchartsThemeOptions {\n /** Theme name (default: 'zTheme') */\n themeName?: string;\n /** Font family (default: Lexend, Arial, Helvetica, sans-serif) */\n fontFamily?: string;\n}\n","/**\n * Z-Form Types\n * Form utility types\n */\n\n/** Form submit result */\nexport type ZFormSubmitResult = boolean;\n\n/** Form debug options */\nexport interface ZFormDebugOptions {\n showValid?: boolean;\n logLevel?: 'error' | 'warn' | 'log';\n}\n","/**\n * Utils types index\n */\n\nexport * from './z-common.types';\nexport * from './z-echarts.types';\nexport * from './z-form.types';\n","/**\n * Utils index\n */\n\nexport * from './z-common.utils';\nexport * from './z-echarts.utils';\nexport * from './z-form.utils';\n\n// Export all types\nexport * from './types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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N,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,CAAC,EAAE,GAAG;;AAGR;MACa,iBAAiB,GAAG,CAAC,GAAW,KAC3C;KACG,KAAK,CAAC,EAAE;KACR,GAAG,CAAC,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI;KACxC,IAAI,CAAC,EAAE;AAEZ;AACA,MAAM,YAAY,GAAG,CAAC,GAAY,EAAE,IAAY,KAAY;AAC1D,IAAA,IAAI;AACF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAY,EAAE,GAAW,KAAI;YACjE,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,GAAG,EAAE;AAChD,gBAAA,OAAQ,GAA+B,CAAC,GAAG,CAAC;YAC9C;AACA,YAAA,OAAO,EAAE;QACX,CAAC,EAAE,GAAG,CAAC;AAEP,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5C;AAEA,QAAA,OAAO,KAAe;IACxB;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,EAAE;IACX;AACF,CAAC;AAED;AACO,MAAM,WAAW,GAAG,CAAI,IAAS,EAAE,KAAa,EAAE,MAA4B,KAAS;IAC5F,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;AAC/C,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;AAC1C,QAAA,GAAG,IAAI;AACP,QAAA,MAAM,EAAE,KAAK;QACb,GAAG,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACrF,KAAA,CAAC,CAAC;AAEH,IAAA,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC;AAC5B,QAAA,OAAO,EAAE,QAAQ;AACjB,QAAA,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,CAAC,QAAQ,CAAC;AACvB,QAAA,QAAQ,EAAE,CAAC,IAAY,KACrB,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE;aACjC,KAAK,CAAC,YAAY;aAClB,MAAM,CAAC,OAAO,CAAC;AACpB,QAAA,WAAW,EAAE,CAAC,IAAY,KAAK,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACrE,KAAA,CAAC;AAEF,IAAA,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;AACvB,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAEtD,IAAA,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAE,MAAwC,CAAC,MAAM,CAAC,CAAC;AACtF;AAEA;AACO,MAAM,YAAY,GAAG,CAC1B,IAAS,EACT,KAAa,EACb,MAA4B,EAC5B,OAAiC,EACjC,SAAS,GAAG,GAAG,KACI;AACnB,IAAA,IAAI,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE;AAChC,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACnB;IAEA,OAAO,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAC9C,KAAK,CAAC,SAAS,CAAC,EAChB,QAAQ,CAAC,MAAK;AACZ,QAAA,IAAI,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE;AAChC,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACpB;IACF,CAAC,CAAC,CACH;AACH;AAEA;AACA,MAAM,aAAa,GAAG,CAAC,EAAU,KAAiB;AAChD,IAAA,IAAI,uDAAuD,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AACpE,QAAA,OAAO,QAAQ;IACjB;AACA,IAAA,IAAI,kCAAkC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AAC/C,QAAA,OAAO,QAAQ;IACjB;AACA,IAAA,OAAO,SAAS;AAClB,CAAC;AAED;AACO,MAAM,cAAc,GAAG,MAAmB;AAC/C,IAAA,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS;AAC9B,IAAA,MAAM,MAAM,GAAiB;AAC3B,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,OAAO,EAAE,EAAE;AACX,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;AACzB,QAAA,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC/B;AAED,IAAA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;AAC5B,QAAA,OAAO,MAAM;IACf;IAEA,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,IAAI,EAAE;AACnD,IAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM;IAE/C,IAAI,QAAQ,EAAE;AACZ,QAAA,MAAM,CAAC,MAAM,GAAG,QAAQ;IAC1B;AAEA,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAC3B,CAAC,CAA2B,KAAK,CAAC,CAAC,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAC9G;IAED,IAAI,SAAS,EAAE;AACb,QAAA,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;AACpD,QAAA,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO;AAClC,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAA2B,KAAK,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC;IACrF,IAAI,QAAQ,EAAE;AACZ,QAAA,MAAM,CAAC,IAAI,GAAG,QAAQ;AACtB,QAAA,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO;IACnC;AAEA,IAAA,OAAO,MAAM;AACf;;AChhBA;;;AAGG;AAKH,MAAM,sBAAsB,GAAG,CAAA,4CAAA,CAA8C;AAE7E;;;AAGG;AACG,SAAU,qBAAqB,CAAC,OAAA,GAAgC,EAAE,EAAA;IACtE,MAAM,EAAE,SAAS,GAAG,QAAQ,EAAE,UAAU,GAAG,sBAAsB,EAAE,GAAG,OAAO;AAE7E,IAAA,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE;AAC/B,QAAA,SAAS,EAAE;YACT,UAAU;AACV,YAAA,KAAK,EAAE,MAAM;AACd,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,SAAS,EAAE;gBACT,UAAU;AACV,gBAAA,UAAU,EAAE,KAAK;AAClB,aAAA;AACF,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,SAAS,EAAE;gBACT,UAAU;AACV,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,KAAK,EAAE,MAAM;AACd,aAAA;AACF,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,SAAS,EAAE;gBACT,UAAU;AACV,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,QAAQ,EAAE,EAAE;AACb,aAAA;AACF,SAAA;AACD,QAAA,WAAW,EAAE;AACX,YAAA,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;AAC5B,YAAA,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;AAC9B,SAAA;AACD,QAAA,YAAY,EAAE;YACZ,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC1C,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;AAC1C,YAAA,SAAS,EAAE;gBACT,UAAU;AACV,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,QAAQ,EAAE,EAAE;AACb,aAAA;AACD,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AAC3B,SAAA;AACD,QAAA,SAAS,EAAE;YACT,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC1C,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;AAC1C,YAAA,SAAS,EAAE;gBACT,UAAU;AACV,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,QAAQ,EAAE,EAAE;AACb,aAAA;YACD,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;AAC5C,SAAA;AACF,KAAA,CAAC;AACJ;AAEA;AACO,MAAM,uBAAuB,GAAG,MAAY,qBAAqB,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE;;ACtEnG;;;AAGG;AAIH;;;;AAIG;AACI,MAAM,WAAW,GAAG,CAAC,IAA2B,KAAa;AAClE,IAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,IAAG;AAC7C,YAAA,IAAI,OAAO,CAAC,OAAO,EAAE;gBACnB,OAAO,CAAC,WAAW,EAAE;gBACrB,OAAO,CAAC,sBAAsB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpD;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;AACO,MAAM,UAAU,GAAG;AAE1B;;;;AAIG;AACI,MAAM,iBAAiB,GAAG,CAAC,IAAe,EAAE,SAAS,GAAG,EAAE,KAAU;AACzE,IAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7B,QAAA,MAAM,WAAW,GAAG,SAAS,GAAG,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,GAAG,GAAG;AAE3D,QAAA,IAAI,OAAO,YAAY,SAAS,EAAE;AAChC,YAAA,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC;YACvC;QACF;AAEA,QAAA,IAAI,OAAO,YAAY,SAAS,EAAE;YAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACvC,gBAAA,MAAM,SAAS,GAAG,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,KAAK,GAAG;AAE5C,gBAAA,IAAI,IAAI,YAAY,SAAS,EAAE;AAC7B,oBAAA,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC;oBAClC;gBACF;AAEA,gBAAA,IAAI,IAAI,EAAE,OAAO,EAAE;oBACjB,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,SAAS,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC;gBACnD;AACF,YAAA,CAAC,CAAC;YACF;QACF;AAEA,QAAA,IAAI,OAAO,EAAE,OAAO,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,WAAW,CAAA,CAAE,EAAE,OAAO,CAAC,MAAM,CAAC;QACxD;AACF,IAAA,CAAC,CAAC;AACJ;AAEA;AACO,MAAM,gBAAgB,GAAG;;ACpEhC;;;AAGG;;ACHH;;AAEG;;ACFH;;;AAGG;;ACHH;;AAEG;;ACFH;;AAEG;;ACFH;;AAEG;;;;"}
|