@maro-tech/table 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -8,16 +8,16 @@ import * as i4 from '@angular/router';
|
|
|
8
8
|
import { Router, RouterModule } from '@angular/router';
|
|
9
9
|
import * as i1$1 from 'lucide-angular';
|
|
10
10
|
import { ArrowDown, ArrowUp, ArrowUpDown, ChevronLeft, ChevronRight, LucideAngularModule } from 'lucide-angular';
|
|
11
|
-
import {
|
|
11
|
+
import { InputSelectComponent } from '@maro-tech/form';
|
|
12
12
|
import { UiButtonComponent, UiBadgeComponent } from '@maro-tech/core';
|
|
13
13
|
|
|
14
14
|
class UiTableColumnDirective {
|
|
15
15
|
columnName;
|
|
16
16
|
template = inject((TemplateRef));
|
|
17
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
18
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.
|
|
17
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableColumnDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
18
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.19", type: UiTableColumnDirective, isStandalone: true, selector: "[appUiTableColumn]", inputs: { columnName: ["appUiTableColumn", "columnName"] }, ngImport: i0 });
|
|
19
19
|
}
|
|
20
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableColumnDirective, decorators: [{
|
|
21
21
|
type: Directive,
|
|
22
22
|
args: [{
|
|
23
23
|
selector: '[appUiTableColumn]',
|
|
@@ -44,8 +44,8 @@ class UiTableActionsCellComponent {
|
|
|
44
44
|
resolveAriaLabel(action) {
|
|
45
45
|
return String(action.label?.trim() || (action.id === 'edit' ? 'Редагувати' : action.id === 'delete' ? 'Видалити' : action.id));
|
|
46
46
|
}
|
|
47
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
48
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
47
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableActionsCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
48
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableActionsCellComponent, isStandalone: true, selector: "app-ui-table-actions-cell", inputs: { actions: "actions", row: "row" }, outputs: { actionClick: "actionClick" }, ngImport: i0, template: `
|
|
49
49
|
<div class="flex flex-wrap gap-2" (click)="$event.stopPropagation()">
|
|
50
50
|
@for (action of actions; track action.id) {
|
|
51
51
|
<ui-button
|
|
@@ -66,7 +66,7 @@ class UiTableActionsCellComponent {
|
|
|
66
66
|
</div>
|
|
67
67
|
`, isInline: true, dependencies: [{ kind: "component", type: UiButtonComponent, selector: "ui-button", inputs: ["variant", "size", "disabled", "fullWidth", "type", "withShadow", "icon", "iconOnly", "ariaLabel"] }] });
|
|
68
68
|
}
|
|
69
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
69
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableActionsCellComponent, decorators: [{
|
|
70
70
|
type: Component,
|
|
71
71
|
args: [{
|
|
72
72
|
selector: 'app-ui-table-actions-cell',
|
|
@@ -104,8 +104,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
|
|
|
104
104
|
|
|
105
105
|
class UiTableBadgeCellComponent {
|
|
106
106
|
value = '';
|
|
107
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
108
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
107
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableBadgeCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
108
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableBadgeCellComponent, isStandalone: true, selector: "app-ui-table-badge-cell", inputs: { value: "value" }, ngImport: i0, template: `
|
|
109
109
|
@if (value === null || value === undefined || value === '') {
|
|
110
110
|
—
|
|
111
111
|
} @else {
|
|
@@ -115,7 +115,7 @@ class UiTableBadgeCellComponent {
|
|
|
115
115
|
}
|
|
116
116
|
`, isInline: true, dependencies: [{ kind: "component", type: UiBadgeComponent, selector: "ui-badge", inputs: ["variant", "color"] }] });
|
|
117
117
|
}
|
|
118
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
118
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableBadgeCellComponent, decorators: [{
|
|
119
119
|
type: Component,
|
|
120
120
|
args: [{
|
|
121
121
|
selector: 'app-ui-table-badge-cell',
|
|
@@ -140,11 +140,11 @@ class UiTableEditableCellComponent {
|
|
|
140
140
|
value = null;
|
|
141
141
|
inputType = 'text';
|
|
142
142
|
valueChange = new EventEmitter();
|
|
143
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
144
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
143
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableEditableCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
144
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableEditableCellComponent, isStandalone: true, selector: "app-ui-table-editable-cell", inputs: { column: "column", value: "value", inputType: "inputType" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
|
|
145
145
|
<div class="min-w-0" (click)="$event.stopPropagation()">
|
|
146
146
|
@if (column.editor === 'select') {
|
|
147
|
-
<
|
|
147
|
+
<input-select
|
|
148
148
|
[options]="column.options || []"
|
|
149
149
|
[includeBlankOption]="column.includeBlankOption ?? true"
|
|
150
150
|
[blankOptionLabel]="column.blankOptionLabel || 'Оберіть значення'"
|
|
@@ -153,7 +153,7 @@ class UiTableEditableCellComponent {
|
|
|
153
153
|
[ngModel]="value"
|
|
154
154
|
[ngModelOptions]="{ standalone: true }"
|
|
155
155
|
(valueChange)="valueChange.emit($event)"
|
|
156
|
-
></
|
|
156
|
+
></input-select>
|
|
157
157
|
} @else {
|
|
158
158
|
<input
|
|
159
159
|
class="w-full rounded-xl border border-slate-200 bg-white px-3 py-2 text-sm text-slate-800 outline-none transition focus:border-slate-400"
|
|
@@ -165,18 +165,18 @@ class UiTableEditableCellComponent {
|
|
|
165
165
|
/>
|
|
166
166
|
}
|
|
167
167
|
</div>
|
|
168
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type:
|
|
168
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputSelectComponent, selector: "input-select", inputs: ["label", "placeholder", "name", "data", "required", "fullWidth", "disabled", "multiple", "includeBlankOption", "blankOptionLabel", "emptyStateLabel", "searchable", "remoteSearch", "searchPlaceholder", "options", "error", "hint", "triggerClass", "panelClass"], outputs: ["valueChange", "searchChange"] }] });
|
|
169
169
|
}
|
|
170
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
170
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableEditableCellComponent, decorators: [{
|
|
171
171
|
type: Component,
|
|
172
172
|
args: [{
|
|
173
173
|
selector: 'app-ui-table-editable-cell',
|
|
174
174
|
standalone: true,
|
|
175
|
-
imports: [FormsModule,
|
|
175
|
+
imports: [FormsModule, InputSelectComponent],
|
|
176
176
|
template: `
|
|
177
177
|
<div class="min-w-0" (click)="$event.stopPropagation()">
|
|
178
178
|
@if (column.editor === 'select') {
|
|
179
|
-
<
|
|
179
|
+
<input-select
|
|
180
180
|
[options]="column.options || []"
|
|
181
181
|
[includeBlankOption]="column.includeBlankOption ?? true"
|
|
182
182
|
[blankOptionLabel]="column.blankOptionLabel || 'Оберіть значення'"
|
|
@@ -185,7 +185,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
|
|
|
185
185
|
[ngModel]="value"
|
|
186
186
|
[ngModelOptions]="{ standalone: true }"
|
|
187
187
|
(valueChange)="valueChange.emit($event)"
|
|
188
|
-
></
|
|
188
|
+
></input-select>
|
|
189
189
|
} @else {
|
|
190
190
|
<input
|
|
191
191
|
class="w-full rounded-xl border border-slate-200 bg-white px-3 py-2 text-sm text-slate-800 outline-none transition focus:border-slate-400"
|
|
@@ -213,8 +213,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
|
|
|
213
213
|
class UiTableImageCellComponent {
|
|
214
214
|
src = '';
|
|
215
215
|
alt = '';
|
|
216
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
217
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
216
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableImageCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
217
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableImageCellComponent, isStandalone: true, selector: "app-ui-table-image-cell", inputs: { src: "src", alt: "alt" }, ngImport: i0, template: `
|
|
218
218
|
@if (src) {
|
|
219
219
|
<span class="block">
|
|
220
220
|
<img [src]="src" [alt]="alt" class="h-10 w-10 rounded-lg border border-slate-200 object-cover transition hover:opacity-80" />
|
|
@@ -225,7 +225,7 @@ class UiTableImageCellComponent {
|
|
|
225
225
|
|
|
226
226
|
`, isInline: true });
|
|
227
227
|
}
|
|
228
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
228
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableImageCellComponent, decorators: [{
|
|
229
229
|
type: Component,
|
|
230
230
|
args: [{
|
|
231
231
|
selector: 'app-ui-table-image-cell',
|
|
@@ -250,8 +250,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
|
|
|
250
250
|
|
|
251
251
|
class UiTableTextCellComponent {
|
|
252
252
|
value = '';
|
|
253
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
254
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
253
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableTextCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
254
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableTextCellComponent, isStandalone: true, selector: "app-ui-table-text-cell", inputs: { value: "value" }, ngImport: i0, template: `
|
|
255
255
|
<span class="block whitespace-normal break-words">
|
|
256
256
|
@if (value === null || value === undefined || value === '') {
|
|
257
257
|
—
|
|
@@ -261,7 +261,7 @@ class UiTableTextCellComponent {
|
|
|
261
261
|
</span>
|
|
262
262
|
`, isInline: true });
|
|
263
263
|
}
|
|
264
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
264
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableTextCellComponent, decorators: [{
|
|
265
265
|
type: Component,
|
|
266
266
|
args: [{
|
|
267
267
|
selector: 'app-ui-table-text-cell',
|
|
@@ -781,12 +781,12 @@ class UiTableComponent {
|
|
|
781
781
|
}
|
|
782
782
|
resolveColumnWidth(column) {
|
|
783
783
|
if (column.width == null || column.width === '') {
|
|
784
|
-
return
|
|
784
|
+
return undefined;
|
|
785
785
|
}
|
|
786
786
|
if (typeof column.width === 'number') {
|
|
787
787
|
return `${Math.max(1, Math.round(column.width))}px`;
|
|
788
788
|
}
|
|
789
|
-
return String(column.width).trim() ||
|
|
789
|
+
return String(column.width).trim() || undefined;
|
|
790
790
|
}
|
|
791
791
|
resolveImageSrc(value, row) {
|
|
792
792
|
return this.imageResolver(value, row);
|
|
@@ -804,16 +804,16 @@ class UiTableComponent {
|
|
|
804
804
|
this.currentPageIndex = Math.max(0, this.totalPages - 1);
|
|
805
805
|
}
|
|
806
806
|
}
|
|
807
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
808
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: UiTableComponent, isStandalone: true, selector: "app-ui-table", inputs: { columns: "columns", isLoading: "isLoading", data: "data", disablePaging: "disablePaging", rowClickable: "rowClickable", imageResolver: "imageResolver" }, outputs: { pageChange: "pageChange", rowClick: "rowClick", actionClick: "actionClick", cellChange: "cellChange" }, queries: [{ propertyName: "columnTemplates", predicate: UiTableColumnDirective }], ngImport: i0, template: "<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n \u0414\u0456\u0457\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n \u041D\u0435\u043C\u0430\u0454 \u0434\u0430\u043D\u0438\u0445\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>\u0420\u044F\u0434\u043A\u0456\u0432 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u0446\u0456</span>\n <forms-select\n [options]=\"pageSizeSelectOptions\"\n [ngModel]=\"'' + currentPageSize\"\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n ></forms-select>\n\n <span class=\"text-[0.65rem] tracking-[0.2em] text-slate-400\">\n {{ startItemIndex }}-{{ endItemIndex }} / {{ totalCount }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4 text-sm font-medium\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex - 1)\"\n [disabled]=\"currentPageIndex === 0\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n\n <span class=\"text-slate-600\">{{ currentPageIndex + 1 }} / {{ totalPages }}</span>\n\n <div class=\"hidden items-center gap-2 md:flex\">\n @for (pageIndex of visiblePageNumbers; track trackPageNumber($index, pageIndex)) {\n <button\n type=\"button\"\n class=\"inline-flex h-8 min-w-8 items-center justify-center rounded-lg border px-2 text-xs font-semibold transition\"\n [class.border-slate-900]=\"pageIndex === currentPageIndex\"\n [class.bg-slate-900]=\"pageIndex === currentPageIndex\"\n [class.text-white]=\"pageIndex === currentPageIndex\"\n [class.border-slate-200]=\"pageIndex !== currentPageIndex\"\n [class.text-slate-700]=\"pageIndex !== currentPageIndex\"\n [class.hover:border-slate-400]=\"pageIndex !== currentPageIndex\"\n (click)=\"changePage(pageIndex)\"\n >\n {{ pageIndex + 1 }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex + 1)\"\n [disabled]=\"currentPageIndex >= totalPages - 1\"\n >\n <lucide-icon [img]=\"chevronRightIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n </div>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1$1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: UiSelectComponent, selector: "forms-select", inputs: ["label", "placeholder", "name", "data", "required", "fullWidth", "disabled", "multiple", "includeBlankOption", "blankOptionLabel", "emptyStateLabel", "searchable", "remoteSearch", "searchPlaceholder", "options", "error", "hint", "triggerClass", "panelClass"], outputs: ["valueChange", "searchChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: UiTableActionsCellComponent, selector: "app-ui-table-actions-cell", inputs: ["actions", "row"], outputs: ["actionClick"] }, { kind: "component", type: UiTableBadgeCellComponent, selector: "app-ui-table-badge-cell", inputs: ["value"] }, { kind: "component", type: UiTableEditableCellComponent, selector: "app-ui-table-editable-cell", inputs: ["column", "value", "inputType"], outputs: ["valueChange"] }, { kind: "component", type: UiTableImageCellComponent, selector: "app-ui-table-image-cell", inputs: ["src", "alt"] }, { kind: "component", type: UiTableTextCellComponent, selector: "app-ui-table-text-cell", inputs: ["value"] }] });
|
|
807
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
808
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiTableComponent, isStandalone: true, selector: "app-ui-table", inputs: { columns: "columns", isLoading: "isLoading", data: "data", disablePaging: "disablePaging", rowClickable: "rowClickable", imageResolver: "imageResolver" }, outputs: { pageChange: "pageChange", rowClick: "rowClick", actionClick: "actionClick", cellChange: "cellChange" }, queries: [{ propertyName: "columnTemplates", predicate: UiTableColumnDirective }], ngImport: i0, template: "<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n \u0414\u0456\u0457\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n \u041D\u0435\u043C\u0430\u0454 \u0434\u0430\u043D\u0438\u0445\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>\u0420\u044F\u0434\u043A\u0456\u0432 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u0446\u0456</span>\n <input-select\n [options]=\"pageSizeSelectOptions\"\n [ngModel]=\"'' + currentPageSize\"\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n ></input-select>\n\n <span class=\"text-[0.65rem] tracking-[0.2em] text-slate-400\">\n {{ startItemIndex }}-{{ endItemIndex }} / {{ totalCount }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4 text-sm font-medium\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex - 1)\"\n [disabled]=\"currentPageIndex === 0\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n\n <span class=\"text-slate-600\">{{ currentPageIndex + 1 }} / {{ totalPages }}</span>\n\n <div class=\"hidden items-center gap-2 md:flex\">\n @for (pageIndex of visiblePageNumbers; track trackPageNumber($index, pageIndex)) {\n <button\n type=\"button\"\n class=\"inline-flex h-8 min-w-8 items-center justify-center rounded-lg border px-2 text-xs font-semibold transition\"\n [class.border-slate-900]=\"pageIndex === currentPageIndex\"\n [class.bg-slate-900]=\"pageIndex === currentPageIndex\"\n [class.text-white]=\"pageIndex === currentPageIndex\"\n [class.border-slate-200]=\"pageIndex !== currentPageIndex\"\n [class.text-slate-700]=\"pageIndex !== currentPageIndex\"\n [class.hover:border-slate-400]=\"pageIndex !== currentPageIndex\"\n (click)=\"changePage(pageIndex)\"\n >\n {{ pageIndex + 1 }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex + 1)\"\n [disabled]=\"currentPageIndex >= totalPages - 1\"\n >\n <lucide-icon [img]=\"chevronRightIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n </div>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1$1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: InputSelectComponent, selector: "input-select", inputs: ["label", "placeholder", "name", "data", "required", "fullWidth", "disabled", "multiple", "includeBlankOption", "blankOptionLabel", "emptyStateLabel", "searchable", "remoteSearch", "searchPlaceholder", "options", "error", "hint", "triggerClass", "panelClass"], outputs: ["valueChange", "searchChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: UiTableActionsCellComponent, selector: "app-ui-table-actions-cell", inputs: ["actions", "row"], outputs: ["actionClick"] }, { kind: "component", type: UiTableBadgeCellComponent, selector: "app-ui-table-badge-cell", inputs: ["value"] }, { kind: "component", type: UiTableEditableCellComponent, selector: "app-ui-table-editable-cell", inputs: ["column", "value", "inputType"], outputs: ["valueChange"] }, { kind: "component", type: UiTableImageCellComponent, selector: "app-ui-table-image-cell", inputs: ["src", "alt"] }, { kind: "component", type: UiTableTextCellComponent, selector: "app-ui-table-text-cell", inputs: ["value"] }] });
|
|
809
809
|
}
|
|
810
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
810
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiTableComponent, decorators: [{
|
|
811
811
|
type: Component,
|
|
812
812
|
args: [{ selector: 'app-ui-table', standalone: true, imports: [
|
|
813
813
|
LucideAngularModule,
|
|
814
814
|
CommonModule,
|
|
815
815
|
NgTemplateOutlet,
|
|
816
|
-
|
|
816
|
+
InputSelectComponent,
|
|
817
817
|
FormsModule,
|
|
818
818
|
RouterModule,
|
|
819
819
|
UiTableActionsCellComponent,
|
|
@@ -821,7 +821,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
|
|
|
821
821
|
UiTableEditableCellComponent,
|
|
822
822
|
UiTableImageCellComponent,
|
|
823
823
|
UiTableTextCellComponent,
|
|
824
|
-
], template: "<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n \u0414\u0456\u0457\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n \u041D\u0435\u043C\u0430\u0454 \u0434\u0430\u043D\u0438\u0445\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>\u0420\u044F\u0434\u043A\u0456\u0432 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u0446\u0456</span>\n <
|
|
824
|
+
], template: "<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n \u0414\u0456\u0457\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n \u041D\u0435\u043C\u0430\u0454 \u0434\u0430\u043D\u0438\u0445\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>\u0420\u044F\u0434\u043A\u0456\u0432 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u0446\u0456</span>\n <input-select\n [options]=\"pageSizeSelectOptions\"\n [ngModel]=\"'' + currentPageSize\"\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n ></input-select>\n\n <span class=\"text-[0.65rem] tracking-[0.2em] text-slate-400\">\n {{ startItemIndex }}-{{ endItemIndex }} / {{ totalCount }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4 text-sm font-medium\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex - 1)\"\n [disabled]=\"currentPageIndex === 0\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n\n <span class=\"text-slate-600\">{{ currentPageIndex + 1 }} / {{ totalPages }}</span>\n\n <div class=\"hidden items-center gap-2 md:flex\">\n @for (pageIndex of visiblePageNumbers; track trackPageNumber($index, pageIndex)) {\n <button\n type=\"button\"\n class=\"inline-flex h-8 min-w-8 items-center justify-center rounded-lg border px-2 text-xs font-semibold transition\"\n [class.border-slate-900]=\"pageIndex === currentPageIndex\"\n [class.bg-slate-900]=\"pageIndex === currentPageIndex\"\n [class.text-white]=\"pageIndex === currentPageIndex\"\n [class.border-slate-200]=\"pageIndex !== currentPageIndex\"\n [class.text-slate-700]=\"pageIndex !== currentPageIndex\"\n [class.hover:border-slate-400]=\"pageIndex !== currentPageIndex\"\n (click)=\"changePage(pageIndex)\"\n >\n {{ pageIndex + 1 }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex + 1)\"\n [disabled]=\"currentPageIndex >= totalPages - 1\"\n >\n <lucide-icon [img]=\"chevronRightIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n </div>\n </div>\n }\n</div>\n" }]
|
|
825
825
|
}], propDecorators: { columnTemplates: [{
|
|
826
826
|
type: ContentChildren,
|
|
827
827
|
args: [UiTableColumnDirective]
|
|
@@ -905,12 +905,12 @@ class UiPaginatorComponent {
|
|
|
905
905
|
return;
|
|
906
906
|
this.pageChange.emit(clamped);
|
|
907
907
|
}
|
|
908
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
909
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
908
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiPaginatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
909
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: UiPaginatorComponent, isStandalone: true, selector: "app-ui-paginator", inputs: { pageIndex: "pageIndex", pageSize: "pageSize", total: "total", pageSizeOptions: "pageSizeOptions" }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, ngImport: i0, template: "<div class=\"flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-slate-200 bg-white px-5 py-4\">\n <div class=\"flex shrink-0 items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <input-select\n [options]=\"selectOptions\"\n [ngModel]=\"'' + pageSize\"\n (ngModelChange)=\"onPageSizeModelChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n [triggerClass]=\"'h-9 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm hover:border-slate-300 focus:ring-slate-200'\"\n [panelClass]=\"'rounded-xl border-slate-200 shadow-lg'\"\n ></input-select>\n </div>\n\n <nav class=\"flex min-w-0 flex-1 items-center justify-end gap-x-1 overflow-x-auto\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex - 1)\"\n [disabled]=\"pageIndex === 0\"\n aria-label=\"\u041D\u0430\u0437\u0430\u0434\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n <span class=\"sr-only\">\u041D\u0430\u0437\u0430\u0434</span>\n </button>\n\n <div class=\"flex min-w-max items-center gap-x-1\">\n @for (item of paginationItems; track $index) {\n @if (item === 'ellipsis') {\n <span class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-xs text-slate-500\" aria-hidden=\"true\">\u2022\u2022\u2022</span>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex h-9 min-w-9 items-center justify-center rounded-md border px-3 text-sm transition focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n [class.border-slate-200]=\"item !== pageIndex\"\n [class.border-slate-900]=\"item === pageIndex\"\n [class.text-slate-900]=\"item !== pageIndex\"\n [class.text-white]=\"item === pageIndex\"\n [class.bg-slate-900]=\"item === pageIndex\"\n [class.hover:bg-slate-100]=\"item !== pageIndex\"\n (click)=\"changePage(item)\"\n [attr.aria-current]=\"item === pageIndex ? 'page' : null\"\n >\n {{ item + 1 }}\n </button>\n }\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex + 1)\"\n [disabled]=\"pageIndex >= totalPages - 1\"\n aria-label=\"\u0414\u0430\u043B\u0456\"\n >\n <span class=\"sr-only\">\u0414\u0430\u043B\u0456</span>\n <lucide-icon [img]=\"chevronRightIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n </button>\n </nav>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputSelectComponent, selector: "input-select", inputs: ["label", "placeholder", "name", "data", "required", "fullWidth", "disabled", "multiple", "includeBlankOption", "blankOptionLabel", "emptyStateLabel", "searchable", "remoteSearch", "searchPlaceholder", "options", "error", "hint", "triggerClass", "panelClass"], outputs: ["valueChange", "searchChange"] }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1$1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }] });
|
|
910
910
|
}
|
|
911
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
911
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UiPaginatorComponent, decorators: [{
|
|
912
912
|
type: Component,
|
|
913
|
-
args: [{ selector: 'app-ui-paginator', standalone: true, imports: [CommonModule, FormsModule,
|
|
913
|
+
args: [{ selector: 'app-ui-paginator', standalone: true, imports: [CommonModule, FormsModule, InputSelectComponent, LucideAngularModule], template: "<div class=\"flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-slate-200 bg-white px-5 py-4\">\n <div class=\"flex shrink-0 items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <input-select\n [options]=\"selectOptions\"\n [ngModel]=\"'' + pageSize\"\n (ngModelChange)=\"onPageSizeModelChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n [triggerClass]=\"'h-9 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm hover:border-slate-300 focus:ring-slate-200'\"\n [panelClass]=\"'rounded-xl border-slate-200 shadow-lg'\"\n ></input-select>\n </div>\n\n <nav class=\"flex min-w-0 flex-1 items-center justify-end gap-x-1 overflow-x-auto\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex - 1)\"\n [disabled]=\"pageIndex === 0\"\n aria-label=\"\u041D\u0430\u0437\u0430\u0434\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n <span class=\"sr-only\">\u041D\u0430\u0437\u0430\u0434</span>\n </button>\n\n <div class=\"flex min-w-max items-center gap-x-1\">\n @for (item of paginationItems; track $index) {\n @if (item === 'ellipsis') {\n <span class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-xs text-slate-500\" aria-hidden=\"true\">\u2022\u2022\u2022</span>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex h-9 min-w-9 items-center justify-center rounded-md border px-3 text-sm transition focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n [class.border-slate-200]=\"item !== pageIndex\"\n [class.border-slate-900]=\"item === pageIndex\"\n [class.text-slate-900]=\"item !== pageIndex\"\n [class.text-white]=\"item === pageIndex\"\n [class.bg-slate-900]=\"item === pageIndex\"\n [class.hover:bg-slate-100]=\"item !== pageIndex\"\n (click)=\"changePage(item)\"\n [attr.aria-current]=\"item === pageIndex ? 'page' : null\"\n >\n {{ item + 1 }}\n </button>\n }\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex + 1)\"\n [disabled]=\"pageIndex >= totalPages - 1\"\n aria-label=\"\u0414\u0430\u043B\u0456\"\n >\n <span class=\"sr-only\">\u0414\u0430\u043B\u0456</span>\n <lucide-icon [img]=\"chevronRightIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n </button>\n </nav>\n</div>\n" }]
|
|
914
914
|
}], propDecorators: { pageIndex: [{
|
|
915
915
|
type: Input
|
|
916
916
|
}], pageSize: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maro-tech-table.mjs","sources":["../../../src/lib/table/ui-table-column.directive.ts","../../../src/lib/table/cells/ui-table-actions-cell.component.ts","../../../src/lib/table/cells/ui-table-badge-cell.component.ts","../../../src/lib/table/cells/ui-table-editable-cell.component.ts","../../../src/lib/table/cells/ui-table-image-cell.component.ts","../../../src/lib/table/cells/ui-table-text-cell.component.ts","../../../src/lib/table/ui-table.component.ts","../../../src/lib/table/ui-table.component.html","../../../src/lib/paginator/ui-paginator.component.ts","../../../src/lib/paginator/ui-paginator.component.html","../../../src/maro-tech-table.ts"],"sourcesContent":["import { Directive, Input, TemplateRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[appUiTableColumn]',\n standalone: true,\n})\nexport class UiTableColumnDirective {\n @Input('appUiTableColumn') columnName!: string;\n public readonly template = inject(TemplateRef<unknown>);\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiTableRowAction } from '../ui-table.models';\n\n@Component({\n selector: 'app-ui-table-actions-cell',\n standalone: true,\n imports: [UiButtonComponent],\n template: `\n <div class=\"flex flex-wrap gap-2\" (click)=\"$event.stopPropagation()\">\n @for (action of actions; track action.id) {\n <ui-button\n [variant]=\"action.variant || 'ghost'\"\n [icon]=\"action.icon || ''\"\n [iconOnly]=\"isIconOnlyAction(action)\"\n [ariaLabel]=\"resolveAriaLabel(action)\"\n size=\"sm\"\n type=\"button\"\n [disabled]=\"action.disabled || false\"\n (click)=\"onActionClick($event, action)\"\n >\n @if (action.label?.trim()) {\n {{ action.label }}\n }\n </ui-button>\n }\n </div>\n `,\n})\nexport class UiTableActionsCellComponent<T = Record<string, unknown>> {\n @Input() actions: UiTableRowAction[] = [];\n @Input({ required: true }) row!: T;\n\n @Output() actionClick = new EventEmitter<{ action: UiTableRowAction; row: T }>();\n\n onActionClick(event: Event, action: UiTableRowAction): void {\n event.stopPropagation();\n if (action.disabled) return;\n this.actionClick.emit({ action, row: this.row });\n }\n\n isIconOnlyAction(action: UiTableRowAction): boolean {\n return !String(action.label || '').trim();\n }\n\n resolveAriaLabel(action: UiTableRowAction): string {\n return String(action.label?.trim() || (action.id === 'edit' ? 'Редагувати' : action.id === 'delete' ? 'Видалити' : action.id));\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { UiBadgeComponent } from '@maro-tech/core';\n\n@Component({\n selector: 'app-ui-table-badge-cell',\n standalone: true,\n imports: [UiBadgeComponent],\n template: `\n @if (value === null || value === undefined || value === '') {\n —\n } @else {\n <ui-badge variant=\"neutral\">\n {{ value }}\n </ui-badge>\n }\n `,\n})\nexport class UiTableBadgeCellComponent {\n @Input() value: string | number | null | undefined = '';\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { UiSelectComponent } from '@maro-tech/form';\nimport { UiTableColumnConfig } from '../ui-table.models';\n\n@Component({\n selector: 'app-ui-table-editable-cell',\n standalone: true,\n imports: [FormsModule, UiSelectComponent],\n template: `\n <div class=\"min-w-0\" (click)=\"$event.stopPropagation()\">\n @if (column.editor === 'select') {\n <forms-select\n [options]=\"column.options || []\"\n [includeBlankOption]=\"column.includeBlankOption ?? true\"\n [blankOptionLabel]=\"column.blankOptionLabel || 'Оберіть значення'\"\n [searchable]=\"true\"\n [fullWidth]=\"true\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{ standalone: true }\"\n (valueChange)=\"valueChange.emit($event)\"\n ></forms-select>\n } @else {\n <input\n class=\"w-full rounded-xl border border-slate-200 bg-white px-3 py-2 text-sm text-slate-800 outline-none transition focus:border-slate-400\"\n [type]=\"inputType\"\n [placeholder]=\"column.placeholder || ''\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"valueChange.emit($event)\"\n />\n }\n </div>\n `,\n})\nexport class UiTableEditableCellComponent {\n @Input({ required: true }) column!: UiTableColumnConfig;\n @Input() value: string | number | null = null;\n @Input() inputType: 'text' | 'number' = 'text';\n\n @Output() valueChange = new EventEmitter<unknown>();\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-ui-table-image-cell',\n standalone: true,\n imports: [],\n template: `\n @if (src) {\n <span class=\"block\">\n <img [src]=\"src\" [alt]=\"alt\" class=\"h-10 w-10 rounded-lg border border-slate-200 object-cover transition hover:opacity-80\" />\n </span>\n } @else {\n <span class=\"text-slate-400\">—</span>\n }\n\n `,\n})\nexport class UiTableImageCellComponent {\n @Input() src = '';\n @Input() alt = '';\n\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-ui-table-text-cell',\n standalone: true,\n template: `\n <span class=\"block whitespace-normal break-words\">\n @if (value === null || value === undefined || value === '') {\n —\n } @else {\n {{ value }}\n }\n </span>\n `,\n})\nexport class UiTableTextCellComponent {\n @Input() value: string | number | null | undefined = '';\n}\n","import { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { Component, ContentChildren, EventEmitter, Input, Output, QueryList, TemplateRef, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router, RouterModule, UrlTree } from '@angular/router';\nimport { ArrowDown, ArrowUp, ArrowUpDown, ChevronLeft, ChevronRight, LucideAngularModule } from 'lucide-angular';\nimport { UiSelectComponent, UiSelectOption } from '@maro-tech/form';\nimport { SortDirection, UiTableCellChange, UiTableColumnConfig, UiTableFilter, UiTableResponse, UiTableRowAction } from './ui-table.models';\nimport { UiTableColumnDirective } from './ui-table-column.directive';\nimport { UiTableActionsCellComponent } from './cells/ui-table-actions-cell.component';\nimport { UiTableBadgeCellComponent } from './cells/ui-table-badge-cell.component';\nimport { UiTableEditableCellComponent } from './cells/ui-table-editable-cell.component';\nimport { UiTableImageCellComponent } from './cells/ui-table-image-cell.component';\nimport { UiTableTextCellComponent } from './cells/ui-table-text-cell.component';\n\ntype ConditionToken =\n | { type: 'identifier'; value: string }\n | { type: 'string'; value: string }\n | { type: 'number'; value: number }\n | { type: 'boolean'; value: boolean }\n | { type: 'null'; value: null }\n | { type: 'operator'; value: '==' | '!=' | '===' | '!==' | '&&' | '||' | '!' | '(' | ')' };\n\nconst getConditionPathValue = (source: any, pathRaw: string): any => {\n const path = String(pathRaw || '').trim();\n if (!path) return undefined;\n\n const parts = path.split('.');\n let current = source;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = current[part];\n }\n return current;\n};\n\nconst evaluateCondition = (conditionRaw: string | undefined, context: Record<string, unknown>): boolean => {\n const condition = String(conditionRaw || '').trim();\n if (!condition) return true;\n\n const tokens: ConditionToken[] = [];\n let index = 0;\n\n const pushOperator = (value: ConditionToken['value']): void => {\n tokens.push({ type: 'operator', value } as ConditionToken);\n };\n\n while (index < condition.length) {\n const char = condition[index];\n\n if (/\\s/.test(char)) {\n index += 1;\n continue;\n }\n\n const nextThree = condition.slice(index, index + 3);\n const nextTwo = condition.slice(index, index + 2);\n if (nextThree === '===') {\n pushOperator('===');\n index += 3;\n continue;\n }\n if (nextThree === '!==') {\n pushOperator('!==');\n index += 3;\n continue;\n }\n if (nextTwo === '==') {\n pushOperator('==');\n index += 2;\n continue;\n }\n if (nextTwo === '!=') {\n pushOperator('!=');\n index += 2;\n continue;\n }\n if (nextTwo === '&&') {\n pushOperator('&&');\n index += 2;\n continue;\n }\n if (nextTwo === '||') {\n pushOperator('||');\n index += 2;\n continue;\n }\n if (char === '!' || char === '(' || char === ')') {\n pushOperator(char as ConditionToken['value']);\n index += 1;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n const quote = char;\n index += 1;\n let value = '';\n let escaped = false;\n let closed = false;\n while (index < condition.length) {\n const current = condition[index];\n index += 1;\n if (escaped) {\n value += current;\n escaped = false;\n continue;\n }\n if (current === '\\\\') {\n escaped = true;\n continue;\n }\n if (current === quote) {\n closed = true;\n break;\n }\n value += current;\n }\n if (!closed) return true;\n tokens.push({ type: 'string', value });\n continue;\n }\n if (/[0-9.-]/.test(char)) {\n const match = condition.slice(index).match(/^-?\\d+(?:\\.\\d+)?/);\n if (match) {\n tokens.push({ type: 'number', value: Number(match[0]) });\n index += match[0].length;\n continue;\n }\n }\n if (/[A-Za-z_$]/.test(char)) {\n const match = condition.slice(index).match(/^[A-Za-z_$][A-Za-z0-9_.$-]*/);\n if (match) {\n const raw = match[0];\n const normalized = raw.toLowerCase();\n if (normalized === 'true' || normalized === 'false') {\n tokens.push({ type: 'boolean', value: normalized === 'true' });\n } else if (normalized === 'null') {\n tokens.push({ type: 'null', value: null });\n } else {\n tokens.push({ type: 'identifier', value: raw });\n }\n index += raw.length;\n continue;\n }\n }\n\n return true;\n }\n\n let tokenIndex = 0;\n const peek = (): ConditionToken | undefined => tokens[tokenIndex];\n const consume = (): ConditionToken | undefined => {\n const token = tokens[tokenIndex];\n tokenIndex += 1;\n return token;\n };\n const matchOperator = (...values: Array<ConditionToken['value']>): boolean => {\n const token = peek();\n if (token?.type !== 'operator') return false;\n if (!values.includes(token.value)) return false;\n tokenIndex += 1;\n return true;\n };\n const toBoolean = (value: unknown): boolean => {\n if (typeof value === 'string') return value.trim().length > 0;\n return Boolean(value);\n };\n const getValue = (identifierRaw: string): unknown => {\n const identifier = String(identifierRaw || '').trim();\n if (!identifier) return undefined;\n if (identifier === 'data') return context;\n if (identifier.startsWith('data.')) return getConditionPathValue(context, identifier.slice(5));\n return getConditionPathValue(context, identifier);\n };\n const parseExpression = (): unknown => parseOr();\n const parseOr = (): unknown => {\n let left = parseAnd();\n while (matchOperator('||')) {\n const right = parseAnd();\n left = toBoolean(left) || toBoolean(right);\n }\n return left;\n };\n const parseAnd = (): unknown => {\n let left = parseEquality();\n while (matchOperator('&&')) {\n const right = parseEquality();\n left = toBoolean(left) && toBoolean(right);\n }\n return left;\n };\n const parseEquality = (): unknown => {\n let left = parseUnary();\n while (true) {\n if (matchOperator('==')) {\n left = left == parseUnary();\n continue;\n }\n if (matchOperator('!=')) {\n left = left != parseUnary();\n continue;\n }\n if (matchOperator('===')) {\n left = left === parseUnary();\n continue;\n }\n if (matchOperator('!==')) {\n left = left !== parseUnary();\n continue;\n }\n break;\n }\n return left;\n };\n const parseUnary = (): unknown => {\n if (matchOperator('!')) {\n return !toBoolean(parseUnary());\n }\n return parsePrimary();\n };\n const parsePrimary = (): unknown => {\n const token = consume();\n if (!token) return undefined;\n if (token.type === 'operator' && token.value === '(') {\n const value = parseExpression();\n matchOperator(')');\n return value;\n }\n if (token.type === 'identifier') return getValue(token.value);\n return token.value;\n };\n\n return toBoolean(parseExpression());\n};\n\n@Component({\n selector: 'app-ui-table',\n standalone: true,\n imports: [\n LucideAngularModule,\n CommonModule,\n NgTemplateOutlet,\n UiSelectComponent,\n FormsModule,\n RouterModule,\n UiTableActionsCellComponent,\n UiTableBadgeCellComponent,\n UiTableEditableCellComponent,\n UiTableImageCellComponent,\n UiTableTextCellComponent,\n ],\n templateUrl: './ui-table.component.html',\n})\nexport class UiTableComponent<T> {\n readonly arrowDownIcon = ArrowDown;\n readonly arrowUpIcon = ArrowUp;\n readonly arrowUpDownIcon = ArrowUpDown;\n readonly chevronLeftIcon = ChevronLeft;\n readonly chevronRightIcon = ChevronRight;\n private readonly router = inject(Router);\n readonly columnsSignal = signal<UiTableColumnConfig[]>([]);\n readonly isLoadingSignal = signal(false);\n private _data: UiTableResponse<T> = {\n items: [],\n pagination: { page: 0, pageSize: 10, total: 0 },\n };\n readonly dataSignal = signal<UiTableResponse<T>>(this._data);\n readonly disablePagingSignal = signal(false);\n readonly rowClickableSignal = signal(true);\n\n currentPageIndex = 0;\n currentPageSize = this._data.pagination.pageSize;\n currentSortField = '';\n currentSortDirection: SortDirection = '';\n\n get currentSortIcon() {\n return this.currentSortDirection === 'asc' ? this.arrowUpIcon : this.arrowDownIcon;\n }\n readonly pageSizeOptions = [5, 10, 20];\n readonly pageSizeSelectOptions: UiSelectOption[] = this.pageSizeOptions.map((size) => ({\n label: String(size),\n value: String(size),\n }));\n\n @ContentChildren(UiTableColumnDirective)\n columnTemplates!: QueryList<UiTableColumnDirective>;\n\n @Input()\n set columns(value: UiTableColumnConfig[]) {\n this.columnsSignal.set(value ?? []);\n }\n\n @Input()\n set isLoading(value: boolean) {\n this.isLoadingSignal.set(!!value);\n }\n\n @Input()\n set data(value: UiTableResponse<T>) {\n const normalized = value ?? {\n items: [],\n pagination: { page: 0, pageSize: this.currentPageSize, total: 0 },\n };\n this._data = normalized;\n this.currentPageIndex = normalized.pagination.page ?? this.currentPageIndex;\n this.currentPageSize = normalized.pagination.pageSize ?? this.currentPageSize;\n this.dataSignal.set(normalized);\n this.ensurePageIndexInRange();\n }\n\n get data(): UiTableResponse<T> {\n return this._data;\n }\n\n @Input()\n set disablePaging(value: boolean) {\n this.disablePagingSignal.set(!!value);\n }\n\n get disablePaging(): boolean {\n return this.disablePagingSignal();\n }\n\n @Input()\n set rowClickable(value: boolean) {\n this.rowClickableSignal.set(!!value);\n }\n\n get rowClickable(): boolean {\n return this.rowClickableSignal();\n }\n\n @Input() imageResolver: (value: unknown, row?: T) => string = (value) => {\n const raw = String(value ?? '').trim();\n if (!raw) return '';\n if (raw.startsWith('http://') || raw.startsWith('https://') || raw.startsWith('/')) return raw;\n return `/api/files/${encodeURIComponent(raw)}/preview?scale=25`;\n };\n\n @Output() pageChange = new EventEmitter<UiTableFilter>();\n @Output() rowClick = new EventEmitter<T>();\n @Output() actionClick = new EventEmitter<{ action: UiTableRowAction; row: T }>();\n @Output() cellChange = new EventEmitter<UiTableCellChange<T>>();\n\n get totalPages(): number {\n const total = this.dataSignal().pagination.total ?? this.dataSignal().items.length ?? 0;\n const perPage = this.currentPageSize || 1;\n return Math.max(1, Math.ceil(total / perPage));\n }\n\n get totalCount(): number {\n return this.dataSignal().pagination.total ?? this.dataSignal().items.length ?? 0;\n }\n\n get visibleColumnCount(): number {\n return Math.max(1, this.columnsSignal().length + (this.hasAnyRowActions() ? 1 : 0));\n }\n\n get startItemIndex(): number {\n if (this.totalCount === 0) {\n return 0;\n }\n return this.currentPageIndex * this.currentPageSize + 1;\n }\n\n get endItemIndex(): number {\n if (this.totalCount === 0) {\n return 0;\n }\n return Math.min((this.currentPageIndex + 1) * this.currentPageSize, this.totalCount);\n }\n\n get visiblePageNumbers(): number[] {\n const pages: number[] = [];\n const maxButtons = 5;\n const total = this.totalPages;\n if (total <= maxButtons) {\n for (let i = 0; i < total; i += 1) {\n pages.push(i);\n }\n return pages;\n }\n\n let start = Math.max(0, this.currentPageIndex - Math.floor(maxButtons / 2));\n const maxStart = total - maxButtons;\n if (start > maxStart) {\n start = maxStart;\n }\n for (let i = 0; i < maxButtons; i += 1) {\n pages.push(start + i);\n }\n return pages;\n }\n\n toggleSort(column: UiTableColumnConfig): void {\n if (!column?.key || column.sortable === false) {\n return;\n }\n\n if (this.currentSortField === column.key) {\n if (this.currentSortDirection === 'asc') {\n this.currentSortDirection = 'desc';\n } else if (this.currentSortDirection === 'desc') {\n this.currentSortDirection = '';\n this.currentSortField = '';\n } else {\n this.currentSortDirection = 'asc';\n }\n } else {\n this.currentSortField = column.key;\n this.currentSortDirection = 'asc';\n }\n\n this.currentPageIndex = 0;\n this.emitPageChange();\n }\n\n changePage(index: number): void {\n const target = Math.max(0, Math.min(this.totalPages - 1, index));\n if (target === this.currentPageIndex) {\n return;\n }\n this.currentPageIndex = target;\n this.emitPageChange();\n }\n\n onPageSizeChange(pageSize: number | string): void {\n const numericSize = Number(pageSize);\n if (!numericSize || numericSize === this.currentPageSize) {\n return;\n }\n this.currentPageSize = numericSize;\n this.currentPageIndex = 0;\n this.ensurePageIndexInRange();\n this.emitPageChange();\n }\n\n processRowClick(rowData: T): void {\n this.rowClick.emit(rowData);\n }\n\n processActionClick(action: UiTableRowAction, rowData: T): void {\n if (action.disabled) return;\n this.actionClick.emit({ action, row: rowData });\n }\n\n processCellChange(column: UiTableColumnConfig, rowData: T, value: unknown): void {\n const currentValue = this.getCellValue(rowData, column.bindKey || column.key);\n if (this.normalizeCellValue(currentValue) === this.normalizeCellValue(value)) {\n return;\n }\n\n this.cellChange.emit({ column, row: rowData, value });\n }\n\n hasAnyRowActions(): boolean {\n return this.dataSignal().items.some((row) => this.getRowActions(row).length > 0);\n }\n\n getRowActions(row: T): UiTableRowAction[] {\n const raw = (row as Record<string, unknown>)['actions'];\n if (!Array.isArray(raw)) {\n return [];\n }\n\n return raw\n .filter((item): item is UiTableRowAction => !!item && typeof item === 'object' && typeof (item as UiTableRowAction).id === 'string')\n .filter((item) => evaluateCondition(item.condition, row as unknown as Record<string, unknown>))\n .map((item) => ({\n id: item.id,\n label: typeof item.label === 'string' ? item.label : item.id,\n variant: item.variant,\n icon: typeof item.icon === 'string' ? item.icon : undefined,\n type: item.type,\n component: item.component,\n template: typeof item.template === 'string' ? item.template : undefined,\n disabled: !!item.disabled,\n api: typeof item.api === 'string' ? item.api : undefined,\n formId: typeof item.formId === 'string' ? item.formId : undefined,\n title: typeof item.title === 'string' ? item.title : undefined,\n text: typeof item.text === 'string' ? item.text : undefined,\n submit: typeof item.submit === 'string' || typeof item.submit === 'boolean' ? item.submit : undefined,\n danger: typeof item.danger === 'boolean' ? item.danger : undefined,\n method: item.method,\n payload: item.payload && typeof item.payload === 'object' && !Array.isArray(item.payload) ? item.payload : undefined,\n }));\n }\n\n getTemplateForColumn(column: string): TemplateRef<unknown> | undefined {\n return this.columnTemplates?.find((template) => template.columnName === column)?.template;\n }\n\n trackTableRow(index: number): number {\n return index;\n }\n\n trackPageNumber(_: number, pageIndex: number): number {\n return pageIndex;\n }\n\n getCellValue(row: T, column: string): unknown {\n return (row as Record<string, unknown>)[column];\n }\n\n isEditableColumn(row: T, column: UiTableColumnConfig): boolean {\n const context = row as Record<string, unknown>;\n return evaluateCondition(column.editableCondition, context);\n }\n\n resolveDisplayValue(row: T, column: UiTableColumnConfig): string {\n const rawValue = this.getCellValue(row, column.bindKey || column.key);\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return '—';\n }\n\n if (column.editor === 'select') {\n const value = String(rawValue).trim();\n const option = (column.options || []).find((item) => String(item.value ?? '').trim() === value);\n return String(option?.label || rawValue).trim() || '—';\n }\n\n return String(rawValue);\n }\n\n resolveLink(row: T, column: UiTableColumnConfig): string {\n const source = row as Record<string, unknown>;\n const linkConfig = column.link;\n const template = typeof linkConfig === 'string'\n ? linkConfig.trim()\n : String(linkConfig?.values[this.resolveLinkValue(source, linkConfig.by)] || '').trim();\n if (!template) return '';\n\n let hasMissingValue = false;\n const link = template.replace(/\\{([a-zA-Z0-9_.]+)\\}/g, (_match, key: string) => {\n const value = key.split('.').reduce<unknown>((current, part) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[part];\n }, source);\n if (value == null || value === '') {\n hasMissingValue = true;\n return '';\n }\n return encodeURIComponent(String(value));\n });\n\n return hasMissingValue ? '' : link;\n }\n\n resolveLinkTree(row: T, column: UiTableColumnConfig): UrlTree | null {\n const link = this.resolveLink(row, column);\n return link ? this.router.parseUrl(link) : null;\n }\n\n private resolveLinkValue(source: Record<string, unknown>, path: string): string {\n const value = path.split('.').reduce<unknown>((current, part) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[part];\n }, source);\n return value == null ? '' : String(value).trim();\n }\n\n resolveEditableValue(row: T, column: UiTableColumnConfig): string | number | null {\n const value = this.getCellValue(row, column.bindKey || column.key);\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n if (column.editor === 'number' || column.inputType === 'number') {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : null;\n }\n\n return String(value);\n }\n\n resolveEditableInputType(column: UiTableColumnConfig): 'text' | 'number' {\n return column.editor === 'number' || column.inputType === 'number' ? 'number' : 'text';\n }\n\n private normalizeCellValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return String(value).trim();\n }\n\n resolveColumnWidth(column: UiTableColumnConfig): string | undefined {\n if (column.width == null || column.width === '') {\n return '500px';\n }\n\n if (typeof column.width === 'number') {\n return `${Math.max(1, Math.round(column.width))}px`;\n }\n\n return String(column.width).trim() || '500px';\n }\n\n resolveImageSrc(value: unknown, row?: T): string {\n return this.imageResolver(value, row);\n }\n\n private emitPageChange(): void {\n this.pageChange.emit({\n pageIndex: this.currentPageIndex,\n pageSize: this.currentPageSize,\n active: this.currentSortField,\n direction: this.currentSortDirection,\n });\n }\n\n private ensurePageIndexInRange(): void {\n if (this.currentPageIndex >= this.totalPages) {\n this.currentPageIndex = Math.max(0, this.totalPages - 1);\n }\n }\n}\n","<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n Дії\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n Немає даних\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>Рядків на сторінці</span>\n <forms-select\n [options]=\"pageSizeSelectOptions\"\n [ngModel]=\"'' + currentPageSize\"\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n ></forms-select>\n\n <span class=\"text-[0.65rem] tracking-[0.2em] text-slate-400\">\n {{ startItemIndex }}-{{ endItemIndex }} / {{ totalCount }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4 text-sm font-medium\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex - 1)\"\n [disabled]=\"currentPageIndex === 0\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n\n <span class=\"text-slate-600\">{{ currentPageIndex + 1 }} / {{ totalPages }}</span>\n\n <div class=\"hidden items-center gap-2 md:flex\">\n @for (pageIndex of visiblePageNumbers; track trackPageNumber($index, pageIndex)) {\n <button\n type=\"button\"\n class=\"inline-flex h-8 min-w-8 items-center justify-center rounded-lg border px-2 text-xs font-semibold transition\"\n [class.border-slate-900]=\"pageIndex === currentPageIndex\"\n [class.bg-slate-900]=\"pageIndex === currentPageIndex\"\n [class.text-white]=\"pageIndex === currentPageIndex\"\n [class.border-slate-200]=\"pageIndex !== currentPageIndex\"\n [class.text-slate-700]=\"pageIndex !== currentPageIndex\"\n [class.hover:border-slate-400]=\"pageIndex !== currentPageIndex\"\n (click)=\"changePage(pageIndex)\"\n >\n {{ pageIndex + 1 }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex + 1)\"\n [disabled]=\"currentPageIndex >= totalPages - 1\"\n >\n <lucide-icon [img]=\"chevronRightIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n </div>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { UiSelectComponent, UiSelectOption } from '@maro-tech/form';\nimport { ChevronLeft, ChevronRight, LucideAngularModule } from 'lucide-angular';\n\ntype PaginationItem = number | 'ellipsis';\n\n@Component({\n selector: 'app-ui-paginator',\n standalone: true,\n imports: [CommonModule, FormsModule, UiSelectComponent, LucideAngularModule],\n templateUrl: './ui-paginator.component.html',\n})\nexport class UiPaginatorComponent {\n readonly chevronLeftIcon = ChevronLeft;\n readonly chevronRightIcon = ChevronRight;\n @Input() pageIndex = 0;\n @Input() pageSize = 10;\n @Input() total = 0;\n @Input() pageSizeOptions: number[] = [5, 10, 20];\n\n @Output() pageChange = new EventEmitter<number>();\n @Output() pageSizeChange = new EventEmitter<number>();\n\n get totalPages(): number {\n const perPage = this.pageSize || 1;\n return Math.max(1, Math.ceil((this.total || 0) / perPage));\n }\n\n get startItemIndex(): number {\n if (!this.total) return 0;\n return this.pageIndex * this.pageSize + 1;\n }\n\n get endItemIndex(): number {\n if (!this.total) return 0;\n return Math.min((this.pageIndex + 1) * this.pageSize, this.total);\n }\n\n get selectOptions(): UiSelectOption[] {\n return this.pageSizeOptions.map((size) => ({ label: String(size), value: String(size) }));\n }\n\n get paginationItems(): PaginationItem[] {\n const total = this.totalPages;\n if (total <= 7) {\n return Array.from({ length: total }, (_value, index) => index);\n }\n\n const items: PaginationItem[] = [0];\n const start = Math.max(1, this.pageIndex - 1);\n const end = Math.min(total - 2, this.pageIndex + 1);\n\n if (start > 1) {\n items.push('ellipsis');\n }\n\n for (let page = start; page <= end; page++) {\n items.push(page);\n }\n\n if (end < total - 2) {\n items.push('ellipsis');\n }\n\n items.push(total - 1);\n return items;\n }\n\n onPageSizeModelChange(value: string | number): void {\n const numeric = Number(value);\n if (!numeric || numeric === this.pageSize) return;\n this.pageSizeChange.emit(numeric);\n }\n\n changePage(nextIndex: number): void {\n const clamped = Math.max(0, Math.min(this.totalPages - 1, nextIndex));\n if (clamped === this.pageIndex) return;\n this.pageChange.emit(clamped);\n }\n}\n","<div class=\"flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-slate-200 bg-white px-5 py-4\">\n <div class=\"flex shrink-0 items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <forms-select\n [options]=\"selectOptions\"\n [ngModel]=\"'' + pageSize\"\n (ngModelChange)=\"onPageSizeModelChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n [triggerClass]=\"'h-9 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm hover:border-slate-300 focus:ring-slate-200'\"\n [panelClass]=\"'rounded-xl border-slate-200 shadow-lg'\"\n ></forms-select>\n </div>\n\n <nav class=\"flex min-w-0 flex-1 items-center justify-end gap-x-1 overflow-x-auto\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex - 1)\"\n [disabled]=\"pageIndex === 0\"\n aria-label=\"Назад\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n <span class=\"sr-only\">Назад</span>\n </button>\n\n <div class=\"flex min-w-max items-center gap-x-1\">\n @for (item of paginationItems; track $index) {\n @if (item === 'ellipsis') {\n <span class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-xs text-slate-500\" aria-hidden=\"true\">•••</span>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex h-9 min-w-9 items-center justify-center rounded-md border px-3 text-sm transition focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n [class.border-slate-200]=\"item !== pageIndex\"\n [class.border-slate-900]=\"item === pageIndex\"\n [class.text-slate-900]=\"item !== pageIndex\"\n [class.text-white]=\"item === pageIndex\"\n [class.bg-slate-900]=\"item === pageIndex\"\n [class.hover:bg-slate-100]=\"item !== pageIndex\"\n (click)=\"changePage(item)\"\n [attr.aria-current]=\"item === pageIndex ? 'page' : null\"\n >\n {{ item + 1 }}\n </button>\n }\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex + 1)\"\n [disabled]=\"pageIndex >= totalPages - 1\"\n aria-label=\"Далі\"\n >\n <span class=\"sr-only\">Далі</span>\n <lucide-icon [img]=\"chevronRightIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n </button>\n </nav>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"maro-tech-table.mjs","sources":["../../../src/lib/table/ui-table-column.directive.ts","../../../src/lib/table/cells/ui-table-actions-cell.component.ts","../../../src/lib/table/cells/ui-table-badge-cell.component.ts","../../../src/lib/table/cells/ui-table-editable-cell.component.ts","../../../src/lib/table/cells/ui-table-image-cell.component.ts","../../../src/lib/table/cells/ui-table-text-cell.component.ts","../../../src/lib/table/ui-table.component.ts","../../../src/lib/table/ui-table.component.html","../../../src/lib/paginator/ui-paginator.component.ts","../../../src/lib/paginator/ui-paginator.component.html","../../../src/maro-tech-table.ts"],"sourcesContent":["import { Directive, Input, TemplateRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[appUiTableColumn]',\n standalone: true,\n})\nexport class UiTableColumnDirective {\n @Input('appUiTableColumn') columnName!: string;\n public readonly template = inject(TemplateRef<unknown>);\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiTableRowAction } from '../ui-table.models';\n\n@Component({\n selector: 'app-ui-table-actions-cell',\n standalone: true,\n imports: [UiButtonComponent],\n template: `\n <div class=\"flex flex-wrap gap-2\" (click)=\"$event.stopPropagation()\">\n @for (action of actions; track action.id) {\n <ui-button\n [variant]=\"action.variant || 'ghost'\"\n [icon]=\"action.icon || ''\"\n [iconOnly]=\"isIconOnlyAction(action)\"\n [ariaLabel]=\"resolveAriaLabel(action)\"\n size=\"sm\"\n type=\"button\"\n [disabled]=\"action.disabled || false\"\n (click)=\"onActionClick($event, action)\"\n >\n @if (action.label?.trim()) {\n {{ action.label }}\n }\n </ui-button>\n }\n </div>\n `,\n})\nexport class UiTableActionsCellComponent<T = Record<string, unknown>> {\n @Input() actions: UiTableRowAction[] = [];\n @Input({ required: true }) row!: T;\n\n @Output() actionClick = new EventEmitter<{ action: UiTableRowAction; row: T }>();\n\n onActionClick(event: Event, action: UiTableRowAction): void {\n event.stopPropagation();\n if (action.disabled) return;\n this.actionClick.emit({ action, row: this.row });\n }\n\n isIconOnlyAction(action: UiTableRowAction): boolean {\n return !String(action.label || '').trim();\n }\n\n resolveAriaLabel(action: UiTableRowAction): string {\n return String(action.label?.trim() || (action.id === 'edit' ? 'Редагувати' : action.id === 'delete' ? 'Видалити' : action.id));\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { UiBadgeComponent } from '@maro-tech/core';\n\n@Component({\n selector: 'app-ui-table-badge-cell',\n standalone: true,\n imports: [UiBadgeComponent],\n template: `\n @if (value === null || value === undefined || value === '') {\n —\n } @else {\n <ui-badge variant=\"neutral\">\n {{ value }}\n </ui-badge>\n }\n `,\n})\nexport class UiTableBadgeCellComponent {\n @Input() value: string | number | null | undefined = '';\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { InputSelectComponent } from '@maro-tech/form';\nimport { UiTableColumnConfig } from '../ui-table.models';\n\n@Component({\n selector: 'app-ui-table-editable-cell',\n standalone: true,\n imports: [FormsModule, InputSelectComponent],\n template: `\n <div class=\"min-w-0\" (click)=\"$event.stopPropagation()\">\n @if (column.editor === 'select') {\n <input-select\n [options]=\"column.options || []\"\n [includeBlankOption]=\"column.includeBlankOption ?? true\"\n [blankOptionLabel]=\"column.blankOptionLabel || 'Оберіть значення'\"\n [searchable]=\"true\"\n [fullWidth]=\"true\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{ standalone: true }\"\n (valueChange)=\"valueChange.emit($event)\"\n ></input-select>\n } @else {\n <input\n class=\"w-full rounded-xl border border-slate-200 bg-white px-3 py-2 text-sm text-slate-800 outline-none transition focus:border-slate-400\"\n [type]=\"inputType\"\n [placeholder]=\"column.placeholder || ''\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"valueChange.emit($event)\"\n />\n }\n </div>\n `,\n})\nexport class UiTableEditableCellComponent {\n @Input({ required: true }) column!: UiTableColumnConfig;\n @Input() value: string | number | null = null;\n @Input() inputType: 'text' | 'number' = 'text';\n\n @Output() valueChange = new EventEmitter<unknown>();\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-ui-table-image-cell',\n standalone: true,\n imports: [],\n template: `\n @if (src) {\n <span class=\"block\">\n <img [src]=\"src\" [alt]=\"alt\" class=\"h-10 w-10 rounded-lg border border-slate-200 object-cover transition hover:opacity-80\" />\n </span>\n } @else {\n <span class=\"text-slate-400\">—</span>\n }\n\n `,\n})\nexport class UiTableImageCellComponent {\n @Input() src = '';\n @Input() alt = '';\n\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-ui-table-text-cell',\n standalone: true,\n template: `\n <span class=\"block whitespace-normal break-words\">\n @if (value === null || value === undefined || value === '') {\n —\n } @else {\n {{ value }}\n }\n </span>\n `,\n})\nexport class UiTableTextCellComponent {\n @Input() value: string | number | null | undefined = '';\n}\n","import { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { Component, ContentChildren, EventEmitter, Input, Output, QueryList, TemplateRef, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router, RouterModule, UrlTree } from '@angular/router';\nimport { ArrowDown, ArrowUp, ArrowUpDown, ChevronLeft, ChevronRight, LucideAngularModule } from 'lucide-angular';\nimport { InputSelectComponent, UiSelectOption } from '@maro-tech/form';\nimport { SortDirection, UiTableCellChange, UiTableColumnConfig, UiTableFilter, UiTableResponse, UiTableRowAction } from './ui-table.models';\nimport { UiTableColumnDirective } from './ui-table-column.directive';\nimport { UiTableActionsCellComponent } from './cells/ui-table-actions-cell.component';\nimport { UiTableBadgeCellComponent } from './cells/ui-table-badge-cell.component';\nimport { UiTableEditableCellComponent } from './cells/ui-table-editable-cell.component';\nimport { UiTableImageCellComponent } from './cells/ui-table-image-cell.component';\nimport { UiTableTextCellComponent } from './cells/ui-table-text-cell.component';\n\ntype ConditionToken =\n | { type: 'identifier'; value: string }\n | { type: 'string'; value: string }\n | { type: 'number'; value: number }\n | { type: 'boolean'; value: boolean }\n | { type: 'null'; value: null }\n | { type: 'operator'; value: '==' | '!=' | '===' | '!==' | '&&' | '||' | '!' | '(' | ')' };\n\nconst getConditionPathValue = (source: any, pathRaw: string): any => {\n const path = String(pathRaw || '').trim();\n if (!path) return undefined;\n\n const parts = path.split('.');\n let current = source;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = current[part];\n }\n return current;\n};\n\nconst evaluateCondition = (conditionRaw: string | undefined, context: Record<string, unknown>): boolean => {\n const condition = String(conditionRaw || '').trim();\n if (!condition) return true;\n\n const tokens: ConditionToken[] = [];\n let index = 0;\n\n const pushOperator = (value: ConditionToken['value']): void => {\n tokens.push({ type: 'operator', value } as ConditionToken);\n };\n\n while (index < condition.length) {\n const char = condition[index];\n\n if (/\\s/.test(char)) {\n index += 1;\n continue;\n }\n\n const nextThree = condition.slice(index, index + 3);\n const nextTwo = condition.slice(index, index + 2);\n if (nextThree === '===') {\n pushOperator('===');\n index += 3;\n continue;\n }\n if (nextThree === '!==') {\n pushOperator('!==');\n index += 3;\n continue;\n }\n if (nextTwo === '==') {\n pushOperator('==');\n index += 2;\n continue;\n }\n if (nextTwo === '!=') {\n pushOperator('!=');\n index += 2;\n continue;\n }\n if (nextTwo === '&&') {\n pushOperator('&&');\n index += 2;\n continue;\n }\n if (nextTwo === '||') {\n pushOperator('||');\n index += 2;\n continue;\n }\n if (char === '!' || char === '(' || char === ')') {\n pushOperator(char as ConditionToken['value']);\n index += 1;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n const quote = char;\n index += 1;\n let value = '';\n let escaped = false;\n let closed = false;\n while (index < condition.length) {\n const current = condition[index];\n index += 1;\n if (escaped) {\n value += current;\n escaped = false;\n continue;\n }\n if (current === '\\\\') {\n escaped = true;\n continue;\n }\n if (current === quote) {\n closed = true;\n break;\n }\n value += current;\n }\n if (!closed) return true;\n tokens.push({ type: 'string', value });\n continue;\n }\n if (/[0-9.-]/.test(char)) {\n const match = condition.slice(index).match(/^-?\\d+(?:\\.\\d+)?/);\n if (match) {\n tokens.push({ type: 'number', value: Number(match[0]) });\n index += match[0].length;\n continue;\n }\n }\n if (/[A-Za-z_$]/.test(char)) {\n const match = condition.slice(index).match(/^[A-Za-z_$][A-Za-z0-9_.$-]*/);\n if (match) {\n const raw = match[0];\n const normalized = raw.toLowerCase();\n if (normalized === 'true' || normalized === 'false') {\n tokens.push({ type: 'boolean', value: normalized === 'true' });\n } else if (normalized === 'null') {\n tokens.push({ type: 'null', value: null });\n } else {\n tokens.push({ type: 'identifier', value: raw });\n }\n index += raw.length;\n continue;\n }\n }\n\n return true;\n }\n\n let tokenIndex = 0;\n const peek = (): ConditionToken | undefined => tokens[tokenIndex];\n const consume = (): ConditionToken | undefined => {\n const token = tokens[tokenIndex];\n tokenIndex += 1;\n return token;\n };\n const matchOperator = (...values: Array<ConditionToken['value']>): boolean => {\n const token = peek();\n if (token?.type !== 'operator') return false;\n if (!values.includes(token.value)) return false;\n tokenIndex += 1;\n return true;\n };\n const toBoolean = (value: unknown): boolean => {\n if (typeof value === 'string') return value.trim().length > 0;\n return Boolean(value);\n };\n const getValue = (identifierRaw: string): unknown => {\n const identifier = String(identifierRaw || '').trim();\n if (!identifier) return undefined;\n if (identifier === 'data') return context;\n if (identifier.startsWith('data.')) return getConditionPathValue(context, identifier.slice(5));\n return getConditionPathValue(context, identifier);\n };\n const parseExpression = (): unknown => parseOr();\n const parseOr = (): unknown => {\n let left = parseAnd();\n while (matchOperator('||')) {\n const right = parseAnd();\n left = toBoolean(left) || toBoolean(right);\n }\n return left;\n };\n const parseAnd = (): unknown => {\n let left = parseEquality();\n while (matchOperator('&&')) {\n const right = parseEquality();\n left = toBoolean(left) && toBoolean(right);\n }\n return left;\n };\n const parseEquality = (): unknown => {\n let left = parseUnary();\n while (true) {\n if (matchOperator('==')) {\n left = left == parseUnary();\n continue;\n }\n if (matchOperator('!=')) {\n left = left != parseUnary();\n continue;\n }\n if (matchOperator('===')) {\n left = left === parseUnary();\n continue;\n }\n if (matchOperator('!==')) {\n left = left !== parseUnary();\n continue;\n }\n break;\n }\n return left;\n };\n const parseUnary = (): unknown => {\n if (matchOperator('!')) {\n return !toBoolean(parseUnary());\n }\n return parsePrimary();\n };\n const parsePrimary = (): unknown => {\n const token = consume();\n if (!token) return undefined;\n if (token.type === 'operator' && token.value === '(') {\n const value = parseExpression();\n matchOperator(')');\n return value;\n }\n if (token.type === 'identifier') return getValue(token.value);\n return token.value;\n };\n\n return toBoolean(parseExpression());\n};\n\n@Component({\n selector: 'app-ui-table',\n standalone: true,\n imports: [\n LucideAngularModule,\n CommonModule,\n NgTemplateOutlet,\n InputSelectComponent,\n FormsModule,\n RouterModule,\n UiTableActionsCellComponent,\n UiTableBadgeCellComponent,\n UiTableEditableCellComponent,\n UiTableImageCellComponent,\n UiTableTextCellComponent,\n ],\n templateUrl: './ui-table.component.html',\n})\nexport class UiTableComponent<T> {\n readonly arrowDownIcon = ArrowDown;\n readonly arrowUpIcon = ArrowUp;\n readonly arrowUpDownIcon = ArrowUpDown;\n readonly chevronLeftIcon = ChevronLeft;\n readonly chevronRightIcon = ChevronRight;\n private readonly router = inject(Router);\n readonly columnsSignal = signal<UiTableColumnConfig[]>([]);\n readonly isLoadingSignal = signal(false);\n private _data: UiTableResponse<T> = {\n items: [],\n pagination: { page: 0, pageSize: 10, total: 0 },\n };\n readonly dataSignal = signal<UiTableResponse<T>>(this._data);\n readonly disablePagingSignal = signal(false);\n readonly rowClickableSignal = signal(true);\n\n currentPageIndex = 0;\n currentPageSize = this._data.pagination.pageSize;\n currentSortField = '';\n currentSortDirection: SortDirection = '';\n\n get currentSortIcon() {\n return this.currentSortDirection === 'asc' ? this.arrowUpIcon : this.arrowDownIcon;\n }\n readonly pageSizeOptions = [5, 10, 20];\n readonly pageSizeSelectOptions: UiSelectOption[] = this.pageSizeOptions.map((size) => ({\n label: String(size),\n value: String(size),\n }));\n\n @ContentChildren(UiTableColumnDirective)\n columnTemplates!: QueryList<UiTableColumnDirective>;\n\n @Input()\n set columns(value: UiTableColumnConfig[]) {\n this.columnsSignal.set(value ?? []);\n }\n\n @Input()\n set isLoading(value: boolean) {\n this.isLoadingSignal.set(!!value);\n }\n\n @Input()\n set data(value: UiTableResponse<T>) {\n const normalized = value ?? {\n items: [],\n pagination: { page: 0, pageSize: this.currentPageSize, total: 0 },\n };\n this._data = normalized;\n this.currentPageIndex = normalized.pagination.page ?? this.currentPageIndex;\n this.currentPageSize = normalized.pagination.pageSize ?? this.currentPageSize;\n this.dataSignal.set(normalized);\n this.ensurePageIndexInRange();\n }\n\n get data(): UiTableResponse<T> {\n return this._data;\n }\n\n @Input()\n set disablePaging(value: boolean) {\n this.disablePagingSignal.set(!!value);\n }\n\n get disablePaging(): boolean {\n return this.disablePagingSignal();\n }\n\n @Input()\n set rowClickable(value: boolean) {\n this.rowClickableSignal.set(!!value);\n }\n\n get rowClickable(): boolean {\n return this.rowClickableSignal();\n }\n\n @Input() imageResolver: (value: unknown, row?: T) => string = (value) => {\n const raw = String(value ?? '').trim();\n if (!raw) return '';\n if (raw.startsWith('http://') || raw.startsWith('https://') || raw.startsWith('/')) return raw;\n return `/api/files/${encodeURIComponent(raw)}/preview?scale=25`;\n };\n\n @Output() pageChange = new EventEmitter<UiTableFilter>();\n @Output() rowClick = new EventEmitter<T>();\n @Output() actionClick = new EventEmitter<{ action: UiTableRowAction; row: T }>();\n @Output() cellChange = new EventEmitter<UiTableCellChange<T>>();\n\n get totalPages(): number {\n const total = this.dataSignal().pagination.total ?? this.dataSignal().items.length ?? 0;\n const perPage = this.currentPageSize || 1;\n return Math.max(1, Math.ceil(total / perPage));\n }\n\n get totalCount(): number {\n return this.dataSignal().pagination.total ?? this.dataSignal().items.length ?? 0;\n }\n\n get visibleColumnCount(): number {\n return Math.max(1, this.columnsSignal().length + (this.hasAnyRowActions() ? 1 : 0));\n }\n\n get startItemIndex(): number {\n if (this.totalCount === 0) {\n return 0;\n }\n return this.currentPageIndex * this.currentPageSize + 1;\n }\n\n get endItemIndex(): number {\n if (this.totalCount === 0) {\n return 0;\n }\n return Math.min((this.currentPageIndex + 1) * this.currentPageSize, this.totalCount);\n }\n\n get visiblePageNumbers(): number[] {\n const pages: number[] = [];\n const maxButtons = 5;\n const total = this.totalPages;\n if (total <= maxButtons) {\n for (let i = 0; i < total; i += 1) {\n pages.push(i);\n }\n return pages;\n }\n\n let start = Math.max(0, this.currentPageIndex - Math.floor(maxButtons / 2));\n const maxStart = total - maxButtons;\n if (start > maxStart) {\n start = maxStart;\n }\n for (let i = 0; i < maxButtons; i += 1) {\n pages.push(start + i);\n }\n return pages;\n }\n\n toggleSort(column: UiTableColumnConfig): void {\n if (!column?.key || column.sortable === false) {\n return;\n }\n\n if (this.currentSortField === column.key) {\n if (this.currentSortDirection === 'asc') {\n this.currentSortDirection = 'desc';\n } else if (this.currentSortDirection === 'desc') {\n this.currentSortDirection = '';\n this.currentSortField = '';\n } else {\n this.currentSortDirection = 'asc';\n }\n } else {\n this.currentSortField = column.key;\n this.currentSortDirection = 'asc';\n }\n\n this.currentPageIndex = 0;\n this.emitPageChange();\n }\n\n changePage(index: number): void {\n const target = Math.max(0, Math.min(this.totalPages - 1, index));\n if (target === this.currentPageIndex) {\n return;\n }\n this.currentPageIndex = target;\n this.emitPageChange();\n }\n\n onPageSizeChange(pageSize: number | string): void {\n const numericSize = Number(pageSize);\n if (!numericSize || numericSize === this.currentPageSize) {\n return;\n }\n this.currentPageSize = numericSize;\n this.currentPageIndex = 0;\n this.ensurePageIndexInRange();\n this.emitPageChange();\n }\n\n processRowClick(rowData: T): void {\n this.rowClick.emit(rowData);\n }\n\n processActionClick(action: UiTableRowAction, rowData: T): void {\n if (action.disabled) return;\n this.actionClick.emit({ action, row: rowData });\n }\n\n processCellChange(column: UiTableColumnConfig, rowData: T, value: unknown): void {\n const currentValue = this.getCellValue(rowData, column.bindKey || column.key);\n if (this.normalizeCellValue(currentValue) === this.normalizeCellValue(value)) {\n return;\n }\n\n this.cellChange.emit({ column, row: rowData, value });\n }\n\n hasAnyRowActions(): boolean {\n return this.dataSignal().items.some((row) => this.getRowActions(row).length > 0);\n }\n\n getRowActions(row: T): UiTableRowAction[] {\n const raw = (row as Record<string, unknown>)['actions'];\n if (!Array.isArray(raw)) {\n return [];\n }\n\n return raw\n .filter((item): item is UiTableRowAction => !!item && typeof item === 'object' && typeof (item as UiTableRowAction).id === 'string')\n .filter((item) => evaluateCondition(item.condition, row as unknown as Record<string, unknown>))\n .map((item) => ({\n id: item.id,\n label: typeof item.label === 'string' ? item.label : item.id,\n variant: item.variant,\n icon: typeof item.icon === 'string' ? item.icon : undefined,\n type: item.type,\n component: item.component,\n template: typeof item.template === 'string' ? item.template : undefined,\n disabled: !!item.disabled,\n api: typeof item.api === 'string' ? item.api : undefined,\n formId: typeof item.formId === 'string' ? item.formId : undefined,\n title: typeof item.title === 'string' ? item.title : undefined,\n text: typeof item.text === 'string' ? item.text : undefined,\n submit: typeof item.submit === 'string' || typeof item.submit === 'boolean' ? item.submit : undefined,\n danger: typeof item.danger === 'boolean' ? item.danger : undefined,\n method: item.method,\n payload: item.payload && typeof item.payload === 'object' && !Array.isArray(item.payload) ? item.payload : undefined,\n }));\n }\n\n getTemplateForColumn(column: string): TemplateRef<unknown> | undefined {\n return this.columnTemplates?.find((template) => template.columnName === column)?.template;\n }\n\n trackTableRow(index: number): number {\n return index;\n }\n\n trackPageNumber(_: number, pageIndex: number): number {\n return pageIndex;\n }\n\n getCellValue(row: T, column: string): unknown {\n return (row as Record<string, unknown>)[column];\n }\n\n isEditableColumn(row: T, column: UiTableColumnConfig): boolean {\n const context = row as Record<string, unknown>;\n return evaluateCondition(column.editableCondition, context);\n }\n\n resolveDisplayValue(row: T, column: UiTableColumnConfig): string {\n const rawValue = this.getCellValue(row, column.bindKey || column.key);\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return '—';\n }\n\n if (column.editor === 'select') {\n const value = String(rawValue).trim();\n const option = (column.options || []).find((item) => String(item.value ?? '').trim() === value);\n return String(option?.label || rawValue).trim() || '—';\n }\n\n return String(rawValue);\n }\n\n resolveLink(row: T, column: UiTableColumnConfig): string {\n const source = row as Record<string, unknown>;\n const linkConfig = column.link;\n const template = typeof linkConfig === 'string'\n ? linkConfig.trim()\n : String(linkConfig?.values[this.resolveLinkValue(source, linkConfig.by)] || '').trim();\n if (!template) return '';\n\n let hasMissingValue = false;\n const link = template.replace(/\\{([a-zA-Z0-9_.]+)\\}/g, (_match, key: string) => {\n const value = key.split('.').reduce<unknown>((current, part) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[part];\n }, source);\n if (value == null || value === '') {\n hasMissingValue = true;\n return '';\n }\n return encodeURIComponent(String(value));\n });\n\n return hasMissingValue ? '' : link;\n }\n\n resolveLinkTree(row: T, column: UiTableColumnConfig): UrlTree | null {\n const link = this.resolveLink(row, column);\n return link ? this.router.parseUrl(link) : null;\n }\n\n private resolveLinkValue(source: Record<string, unknown>, path: string): string {\n const value = path.split('.').reduce<unknown>((current, part) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[part];\n }, source);\n return value == null ? '' : String(value).trim();\n }\n\n resolveEditableValue(row: T, column: UiTableColumnConfig): string | number | null {\n const value = this.getCellValue(row, column.bindKey || column.key);\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n if (column.editor === 'number' || column.inputType === 'number') {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : null;\n }\n\n return String(value);\n }\n\n resolveEditableInputType(column: UiTableColumnConfig): 'text' | 'number' {\n return column.editor === 'number' || column.inputType === 'number' ? 'number' : 'text';\n }\n\n private normalizeCellValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return String(value).trim();\n }\n\n resolveColumnWidth(column: UiTableColumnConfig): string | undefined {\n if (column.width == null || column.width === '') {\n return undefined;\n }\n\n if (typeof column.width === 'number') {\n return `${Math.max(1, Math.round(column.width))}px`;\n }\n\n return String(column.width).trim() || undefined;\n }\n\n resolveImageSrc(value: unknown, row?: T): string {\n return this.imageResolver(value, row);\n }\n\n private emitPageChange(): void {\n this.pageChange.emit({\n pageIndex: this.currentPageIndex,\n pageSize: this.currentPageSize,\n active: this.currentSortField,\n direction: this.currentSortDirection,\n });\n }\n\n private ensurePageIndexInRange(): void {\n if (this.currentPageIndex >= this.totalPages) {\n this.currentPageIndex = Math.max(0, this.totalPages - 1);\n }\n }\n}\n","<div class=\"rounded-2xl border border-slate-200 bg-white shadow-sm\">\n <div class=\"w-full overflow-x-auto rounded-2xl\">\n <div class=\"inline-block min-w-full align-middle\">\n <table class=\"min-w-full table-fixed border-separate border-spacing-0 text-sm\">\n <thead class=\"bg-slate-50 text-xs uppercase tracking-wider text-slate-500\">\n <tr>\n @for (column of columnsSignal(); track column.key) {\n <th\n class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n <button type=\"button\" class=\"group flex items-center gap-2\" (click)=\"toggleSort(column)\">\n <span>\n {{ column.labelKey ? column.labelKey : column.key }}\n </span>\n\n @if (column.sortable !== false) {\n @if (currentSortField === column.key) {\n <lucide-icon [img]=\"currentSortIcon\" class=\"text-[0.65rem]\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"arrowUpDownIcon\" class=\"text-[0.65rem] text-slate-300 group-hover:text-slate-500\"></lucide-icon>\n }\n }\n </button>\n </th>\n }\n @if (hasAnyRowActions()) {\n <th class=\"sticky top-0 z-10 whitespace-nowrap border-b border-slate-200 bg-slate-50 px-5 py-3 text-left font-semibold\">\n Дії\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-slate-100\">\n @if (isLoadingSignal()) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center\">\n <div class=\"inline-block\" role=\"status\">\n <svg aria-hidden=\"true\" class=\"h-8 w-8 animate-spin fill-slate-800 text-slate-200\" viewBox=\"0 0 100 101\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\" fill=\"currentColor\"></path>\n <path d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\" fill=\"currentFill\"></path>\n </svg>\n </div>\n </td>\n </tr>\n }\n\n @if (!isLoadingSignal() && dataSignal().items.length === 0) {\n <tr>\n <td [attr.colspan]=\"visibleColumnCount\" class=\"py-10 text-center text-sm text-slate-500\">\n Немає даних\n </td>\n </tr>\n }\n\n @for (row of dataSignal().items; track trackTableRow($index)) {\n <tr\n class=\"transition-colors duration-150 hover:bg-slate-50\"\n [class.cursor-pointer]=\"rowClickableSignal()\"\n (click)=\"processRowClick(row)\"\n >\n @for (column of columnsSignal(); track column.key) {\n <td\n class=\"max-w-0 whitespace-normal break-words px-5 py-4 align-middle text-slate-800\"\n [style.width]=\"resolveColumnWidth(column)\"\n >\n @let template = getTemplateForColumn(column.key);\n @let displayValue = resolveDisplayValue(row, column);\n @let editableValue = resolveEditableValue(row, column);\n\n @if (template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: row, element: row }\" />\n } @else {\n @if (column.editable && isEditableColumn(row, column)) {\n <app-ui-table-editable-cell\n [column]=\"column\"\n [value]=\"editableValue\"\n [inputType]=\"resolveEditableInputType(column)\"\n (valueChange)=\"processCellChange(column, row, $event)\"\n />\n } @else {\n @if (column.link && resolveLink(row, column); as link) {\n <a\n [routerLink]=\"resolveLinkTree(row, column)\"\n class=\"text-blue-700 hover:underline\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ displayValue }}\n </a>\n } @else {\n @switch (column.type) {\n @case ('image') {\n <app-ui-table-image-cell\n [src]=\"resolveImageSrc(getCellValue(row, column.key))\"\n [alt]=\"column.labelKey ? column.labelKey : column.key\"\n />\n }\n @case ('badge') {\n <app-ui-table-badge-cell [value]=\"displayValue\" />\n }\n @default {\n <app-ui-table-text-cell [value]=\"displayValue\" />\n }\n }\n }\n }\n }\n </td>\n }\n @if (hasAnyRowActions()) {\n <td class=\"whitespace-nowrap px-5 py-4 align-middle\">\n <app-ui-table-actions-cell\n [actions]=\"getRowActions(row)\"\n [row]=\"row\"\n (actionClick)=\"processActionClick($event.action, $event.row)\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n\n @if (!disablePagingSignal()) {\n <div class=\"flex flex-col gap-4 border-t border-slate-200 px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"flex items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <span>Рядків на сторінці</span>\n <input-select\n [options]=\"pageSizeSelectOptions\"\n [ngModel]=\"'' + currentPageSize\"\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n ></input-select>\n\n <span class=\"text-[0.65rem] tracking-[0.2em] text-slate-400\">\n {{ startItemIndex }}-{{ endItemIndex }} / {{ totalCount }}\n </span>\n </div>\n\n <div class=\"flex items-center gap-4 text-sm font-medium\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex - 1)\"\n [disabled]=\"currentPageIndex === 0\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n\n <span class=\"text-slate-600\">{{ currentPageIndex + 1 }} / {{ totalPages }}</span>\n\n <div class=\"hidden items-center gap-2 md:flex\">\n @for (pageIndex of visiblePageNumbers; track trackPageNumber($index, pageIndex)) {\n <button\n type=\"button\"\n class=\"inline-flex h-8 min-w-8 items-center justify-center rounded-lg border px-2 text-xs font-semibold transition\"\n [class.border-slate-900]=\"pageIndex === currentPageIndex\"\n [class.bg-slate-900]=\"pageIndex === currentPageIndex\"\n [class.text-white]=\"pageIndex === currentPageIndex\"\n [class.border-slate-200]=\"pageIndex !== currentPageIndex\"\n [class.text-slate-700]=\"pageIndex !== currentPageIndex\"\n [class.hover:border-slate-400]=\"pageIndex !== currentPageIndex\"\n (click)=\"changePage(pageIndex)\"\n >\n {{ pageIndex + 1 }}\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-slate-200 px-3 py-1.5 transition hover:border-slate-400 disabled:cursor-not-allowed disabled:opacity-40\"\n (click)=\"changePage(currentPageIndex + 1)\"\n [disabled]=\"currentPageIndex >= totalPages - 1\"\n >\n <lucide-icon [img]=\"chevronRightIcon\" class=\"text-xs\"></lucide-icon>\n </button>\n </div>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { InputSelectComponent, UiSelectOption } from '@maro-tech/form';\nimport { ChevronLeft, ChevronRight, LucideAngularModule } from 'lucide-angular';\n\ntype PaginationItem = number | 'ellipsis';\n\n@Component({\n selector: 'app-ui-paginator',\n standalone: true,\n imports: [CommonModule, FormsModule, InputSelectComponent, LucideAngularModule],\n templateUrl: './ui-paginator.component.html',\n})\nexport class UiPaginatorComponent {\n readonly chevronLeftIcon = ChevronLeft;\n readonly chevronRightIcon = ChevronRight;\n @Input() pageIndex = 0;\n @Input() pageSize = 10;\n @Input() total = 0;\n @Input() pageSizeOptions: number[] = [5, 10, 20];\n\n @Output() pageChange = new EventEmitter<number>();\n @Output() pageSizeChange = new EventEmitter<number>();\n\n get totalPages(): number {\n const perPage = this.pageSize || 1;\n return Math.max(1, Math.ceil((this.total || 0) / perPage));\n }\n\n get startItemIndex(): number {\n if (!this.total) return 0;\n return this.pageIndex * this.pageSize + 1;\n }\n\n get endItemIndex(): number {\n if (!this.total) return 0;\n return Math.min((this.pageIndex + 1) * this.pageSize, this.total);\n }\n\n get selectOptions(): UiSelectOption[] {\n return this.pageSizeOptions.map((size) => ({ label: String(size), value: String(size) }));\n }\n\n get paginationItems(): PaginationItem[] {\n const total = this.totalPages;\n if (total <= 7) {\n return Array.from({ length: total }, (_value, index) => index);\n }\n\n const items: PaginationItem[] = [0];\n const start = Math.max(1, this.pageIndex - 1);\n const end = Math.min(total - 2, this.pageIndex + 1);\n\n if (start > 1) {\n items.push('ellipsis');\n }\n\n for (let page = start; page <= end; page++) {\n items.push(page);\n }\n\n if (end < total - 2) {\n items.push('ellipsis');\n }\n\n items.push(total - 1);\n return items;\n }\n\n onPageSizeModelChange(value: string | number): void {\n const numeric = Number(value);\n if (!numeric || numeric === this.pageSize) return;\n this.pageSizeChange.emit(numeric);\n }\n\n changePage(nextIndex: number): void {\n const clamped = Math.max(0, Math.min(this.totalPages - 1, nextIndex));\n if (clamped === this.pageIndex) return;\n this.pageChange.emit(clamped);\n }\n}\n","<div class=\"flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-slate-200 bg-white px-5 py-4\">\n <div class=\"flex shrink-0 items-center gap-3 text-xs uppercase tracking-wider text-slate-500\">\n <input-select\n [options]=\"selectOptions\"\n [ngModel]=\"'' + pageSize\"\n (ngModelChange)=\"onPageSizeModelChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [searchable]=\"false\"\n [fullWidth]=\"false\"\n [triggerClass]=\"'h-9 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm hover:border-slate-300 focus:ring-slate-200'\"\n [panelClass]=\"'rounded-xl border-slate-200 shadow-lg'\"\n ></input-select>\n </div>\n\n <nav class=\"flex min-w-0 flex-1 items-center justify-end gap-x-1 overflow-x-auto\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex - 1)\"\n [disabled]=\"pageIndex === 0\"\n aria-label=\"Назад\"\n >\n <lucide-icon [img]=\"chevronLeftIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n <span class=\"sr-only\">Назад</span>\n </button>\n\n <div class=\"flex min-w-max items-center gap-x-1\">\n @for (item of paginationItems; track $index) {\n @if (item === 'ellipsis') {\n <span class=\"inline-flex h-9 w-9 items-center justify-center rounded-md text-xs text-slate-500\" aria-hidden=\"true\">•••</span>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex h-9 min-w-9 items-center justify-center rounded-md border px-3 text-sm transition focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n [class.border-slate-200]=\"item !== pageIndex\"\n [class.border-slate-900]=\"item === pageIndex\"\n [class.text-slate-900]=\"item !== pageIndex\"\n [class.text-white]=\"item === pageIndex\"\n [class.bg-slate-900]=\"item === pageIndex\"\n [class.hover:bg-slate-100]=\"item !== pageIndex\"\n (click)=\"changePage(item)\"\n [attr.aria-current]=\"item === pageIndex ? 'page' : null\"\n >\n {{ item + 1 }}\n </button>\n }\n }\n </div>\n\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center gap-x-2 rounded-md border border-transparent text-sm text-slate-900 transition hover:bg-slate-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-slate-900 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"changePage(pageIndex + 1)\"\n [disabled]=\"pageIndex >= totalPages - 1\"\n aria-label=\"Далі\"\n >\n <span class=\"sr-only\">Далі</span>\n <lucide-icon [img]=\"chevronRightIcon\" class=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\"></lucide-icon>\n </button>\n </nav>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i2"],"mappings":";;;;;;;;;;;;;MAMa,sBAAsB,CAAA;AACN,IAAA,UAAU;AACrB,IAAA,QAAQ,GAAG,MAAM,EAAC,WAAoB,EAAC;wGAF5C,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAJlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAEE,KAAK;uBAAC,kBAAkB;;;MCsBd,2BAA2B,CAAA;IAC7B,OAAO,GAAuB,EAAE;AACd,IAAA,GAAG;AAEpB,IAAA,WAAW,GAAG,IAAI,YAAY,EAAwC;IAEhF,aAAa,CAAC,KAAY,EAAE,MAAwB,EAAA;QAClD,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,MAAM,CAAC,QAAQ;YAAE;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IAClD;AAEA,IAAA,gBAAgB,CAAC,MAAwB,EAAA;AACvC,QAAA,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;IAC3C;AAEA,IAAA,gBAAgB,CAAC,MAAwB,EAAA;AACvC,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,MAAM,CAAC,EAAE,KAAK,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC,EAAE,KAAK,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAChI;wGAlBW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,GAAA,EAAA,KAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArB5B;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EApBS,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,MAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAsBhB,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAzBvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,2BAA2B;AACrC,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,iBAAiB,CAAC;AAC5B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA;AACF,iBAAA;;sBAEE;;sBACA,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBAExB;;;MChBU,yBAAyB,CAAA;IAC3B,KAAK,GAAuC,EAAE;wGAD5C,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAV1B;;;;;;;;AAQT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EATS,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAWf,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAdrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,gBAAgB,CAAC;AAC3B,oBAAA,QAAQ,EAAE;;;;;;;;AAQT,EAAA,CAAA;AACF,iBAAA;;sBAEE;;;MCiBU,4BAA4B,CAAA;AACZ,IAAA,MAAM;IACxB,KAAK,GAA2B,IAAI;IACpC,SAAS,GAAsB,MAAM;AAEpC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAW;wGALxC,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1B7B;;;;;;;;;;;;;;;;;;;;;;;;GAwBT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzBS,WAAW,+mBAAE,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA2BhC,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBA9BxC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,4BAA4B;AACtC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,WAAW,EAAE,oBAAoB,CAAC;AAC5C,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA;AACF,iBAAA;;sBAEE,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;sBACA;;sBAEA;;;MCvBU,yBAAyB,CAAA;IAC3B,GAAG,GAAG,EAAE;IACR,GAAG,GAAG,EAAE;wGAFN,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,GAAA,EAAA,KAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAX1B;;;;;;;;;AAST,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;4FAEU,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAfrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,QAAQ,EAAE;;;;;;;;;AAST,EAAA,CAAA;AACF,iBAAA;;sBAEE;;sBACA;;;MCJU,wBAAwB,CAAA;IAC1B,KAAK,GAAuC,EAAE;wGAD5C,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAVzB;;;;;;;;AAQT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;4FAEU,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAbpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE;;;;;;;;AAQT,EAAA,CAAA;AACF,iBAAA;;sBAEE;;;ACMH,MAAM,qBAAqB,GAAG,CAAC,MAAW,EAAE,OAAe,KAAS;IAClE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AACzC,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,SAAS;IAE3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IAC7B,IAAI,OAAO,GAAG,MAAM;AACpB,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,SAAS;AACpE,QAAA,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IACzB;AACA,IAAA,OAAO,OAAO;AAChB,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,YAAgC,EAAE,OAAgC,KAAa;IACxG,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AACnD,IAAA,IAAI,CAAC,SAAS;AAAE,QAAA,OAAO,IAAI;IAE3B,MAAM,MAAM,GAAqB,EAAE;IACnC,IAAI,KAAK,GAAG,CAAC;AAEb,IAAA,MAAM,YAAY,GAAG,CAAC,KAA8B,KAAU;QAC5D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAoB,CAAC;AAC5D,IAAA,CAAC;AAED,IAAA,OAAO,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE;AAC/B,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC;AAE7B,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACnB,KAAK,IAAI,CAAC;YACV;QACF;AAEA,QAAA,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC;AACnD,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC;AACjD,QAAA,IAAI,SAAS,KAAK,KAAK,EAAE;YACvB,YAAY,CAAC,KAAK,CAAC;YACnB,KAAK,IAAI,CAAC;YACV;QACF;AACA,QAAA,IAAI,SAAS,KAAK,KAAK,EAAE;YACvB,YAAY,CAAC,KAAK,CAAC;YACnB,KAAK,IAAI,CAAC;YACV;QACF;AACA,QAAA,IAAI,OAAO,KAAK,IAAI,EAAE;YACpB,YAAY,CAAC,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC;YACV;QACF;AACA,QAAA,IAAI,OAAO,KAAK,IAAI,EAAE;YACpB,YAAY,CAAC,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC;YACV;QACF;AACA,QAAA,IAAI,OAAO,KAAK,IAAI,EAAE;YACpB,YAAY,CAAC,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC;YACV;QACF;AACA,QAAA,IAAI,OAAO,KAAK,IAAI,EAAE;YACpB,YAAY,CAAC,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC;YACV;QACF;AACA,QAAA,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE;YAChD,YAAY,CAAC,IAA+B,CAAC;YAC7C,KAAK,IAAI,CAAC;YACV;QACF;QACA,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE;YAChC,MAAM,KAAK,GAAG,IAAI;YAClB,KAAK,IAAI,CAAC;YACV,IAAI,KAAK,GAAG,EAAE;YACd,IAAI,OAAO,GAAG,KAAK;YACnB,IAAI,MAAM,GAAG,KAAK;AAClB,YAAA,OAAO,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE;AAC/B,gBAAA,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC;gBAChC,KAAK,IAAI,CAAC;gBACV,IAAI,OAAO,EAAE;oBACX,KAAK,IAAI,OAAO;oBAChB,OAAO,GAAG,KAAK;oBACf;gBACF;AACA,gBAAA,IAAI,OAAO,KAAK,IAAI,EAAE;oBACpB,OAAO,GAAG,IAAI;oBACd;gBACF;AACA,gBAAA,IAAI,OAAO,KAAK,KAAK,EAAE;oBACrB,MAAM,GAAG,IAAI;oBACb;gBACF;gBACA,KAAK,IAAI,OAAO;YAClB;AACA,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI;YACxB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YACtC;QACF;AACA,QAAA,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACxB,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAC9D,IAAI,KAAK,EAAE;AACT,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,gBAAA,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBACxB;YACF;QACF;AACA,QAAA,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAC3B,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC;YACzE,IAAI,KAAK,EAAE;AACT,gBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAA,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE;gBACpC,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,OAAO,EAAE;AACnD,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,KAAK,MAAM,EAAE,CAAC;gBAChE;AAAO,qBAAA,IAAI,UAAU,KAAK,MAAM,EAAE;AAChC,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;gBAC5C;qBAAO;AACL,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;gBACjD;AACA,gBAAA,KAAK,IAAI,GAAG,CAAC,MAAM;gBACnB;YACF;QACF;AAEA,QAAA,OAAO,IAAI;IACb;IAEA,IAAI,UAAU,GAAG,CAAC;IAClB,MAAM,IAAI,GAAG,MAAkC,MAAM,CAAC,UAAU,CAAC;IACjE,MAAM,OAAO,GAAG,MAAiC;AAC/C,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;QAChC,UAAU,IAAI,CAAC;AACf,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;AACD,IAAA,MAAM,aAAa,GAAG,CAAC,GAAG,MAAsC,KAAa;AAC3E,QAAA,MAAM,KAAK,GAAG,IAAI,EAAE;AACpB,QAAA,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU;AAAE,YAAA,OAAO,KAAK;QAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAC/C,UAAU,IAAI,CAAC;AACf,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AACD,IAAA,MAAM,SAAS,GAAG,CAAC,KAAc,KAAa;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;AAC7D,QAAA,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,IAAA,CAAC;AACD,IAAA,MAAM,QAAQ,GAAG,CAAC,aAAqB,KAAa;QAClD,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AACrD,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,SAAS;QACjC,IAAI,UAAU,KAAK,MAAM;AAAE,YAAA,OAAO,OAAO;AACzC,QAAA,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,qBAAqB,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9F,QAAA,OAAO,qBAAqB,CAAC,OAAO,EAAE,UAAU,CAAC;AACnD,IAAA,CAAC;AACD,IAAA,MAAM,eAAe,GAAG,MAAe,OAAO,EAAE;IAChD,MAAM,OAAO,GAAG,MAAc;AAC5B,QAAA,IAAI,IAAI,GAAG,QAAQ,EAAE;AACrB,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,EAAE;AAC1B,YAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;YACxB,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC;QAC5C;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;IACD,MAAM,QAAQ,GAAG,MAAc;AAC7B,QAAA,IAAI,IAAI,GAAG,aAAa,EAAE;AAC1B,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,EAAE;AAC1B,YAAA,MAAM,KAAK,GAAG,aAAa,EAAE;YAC7B,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC;QAC5C;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;IACD,MAAM,aAAa,GAAG,MAAc;AAClC,QAAA,IAAI,IAAI,GAAG,UAAU,EAAE;QACvB,OAAO,IAAI,EAAE;AACX,YAAA,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;AACvB,gBAAA,IAAI,GAAG,IAAI,IAAI,UAAU,EAAE;gBAC3B;YACF;AACA,YAAA,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;AACvB,gBAAA,IAAI,GAAG,IAAI,IAAI,UAAU,EAAE;gBAC3B;YACF;AACA,YAAA,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;AACxB,gBAAA,IAAI,GAAG,IAAI,KAAK,UAAU,EAAE;gBAC5B;YACF;AACA,YAAA,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;AACxB,gBAAA,IAAI,GAAG,IAAI,KAAK,UAAU,EAAE;gBAC5B;YACF;YACA;QACF;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;IACD,MAAM,UAAU,GAAG,MAAc;AAC/B,QAAA,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QACjC;QACA,OAAO,YAAY,EAAE;AACvB,IAAA,CAAC;IACD,MAAM,YAAY,GAAG,MAAc;AACjC,QAAA,MAAM,KAAK,GAAG,OAAO,EAAE;AACvB,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,SAAS;AAC5B,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,KAAK,KAAK,GAAG,EAAE;AACpD,YAAA,MAAM,KAAK,GAAG,eAAe,EAAE;YAC/B,aAAa,CAAC,GAAG,CAAC;AAClB,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;AAAE,YAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7D,OAAO,KAAK,CAAC,KAAK;AACpB,IAAA,CAAC;AAED,IAAA,OAAO,SAAS,CAAC,eAAe,EAAE,CAAC;AACrC,CAAC;MAoBY,gBAAgB,CAAA;IAClB,aAAa,GAAG,SAAS;IACzB,WAAW,GAAG,OAAO;IACrB,eAAe,GAAG,WAAW;IAC7B,eAAe,GAAG,WAAW;IAC7B,gBAAgB,GAAG,YAAY;AACvB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC/B,IAAA,aAAa,GAAG,MAAM,CAAwB,EAAE,oFAAC;AACjD,IAAA,eAAe,GAAG,MAAM,CAAC,KAAK,sFAAC;AAChC,IAAA,KAAK,GAAuB;AAClC,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;KAChD;AACQ,IAAA,UAAU,GAAG,MAAM,CAAqB,IAAI,CAAC,KAAK,iFAAC;AACnD,IAAA,mBAAmB,GAAG,MAAM,CAAC,KAAK,0FAAC;AACnC,IAAA,kBAAkB,GAAG,MAAM,CAAC,IAAI,yFAAC;IAE1C,gBAAgB,GAAG,CAAC;IACpB,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ;IAChD,gBAAgB,GAAG,EAAE;IACrB,oBAAoB,GAAkB,EAAE;AAExC,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,oBAAoB,KAAK,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa;IACpF;IACS,eAAe,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;AAC7B,IAAA,qBAAqB,GAAqB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AACrF,QAAA,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC;AACnB,QAAA,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC;AACpB,KAAA,CAAC,CAAC;AAGH,IAAA,eAAe;IAEf,IACI,OAAO,CAAC,KAA4B,EAAA;QACtC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IACrC;IAEA,IACI,SAAS,CAAC,KAAc,EAAA;QAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IACnC;IAEA,IACI,IAAI,CAAC,KAAyB,EAAA;QAChC,MAAM,UAAU,GAAG,KAAK,IAAI;AAC1B,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE;SAClE;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,UAAU;AACvB,QAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC,gBAAgB;AAC3E,QAAA,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe;AAC7E,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;QAC/B,IAAI,CAAC,sBAAsB,EAAE;IAC/B;AAEA,IAAA,IAAI,IAAI,GAAA;QACN,OAAO,IAAI,CAAC,KAAK;IACnB;IAEA,IACI,aAAa,CAAC,KAAc,EAAA;QAC9B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IACvC;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,mBAAmB,EAAE;IACnC;IAEA,IACI,YAAY,CAAC,KAAc,EAAA;QAC7B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IACtC;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,kBAAkB,EAAE;IAClC;AAES,IAAA,aAAa,GAAwC,CAAC,KAAK,KAAI;QACtE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AACtC,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,EAAE;AACnB,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,GAAG;AAC9F,QAAA,OAAO,cAAc,kBAAkB,CAAC,GAAG,CAAC,mBAAmB;AACjE,IAAA,CAAC;AAES,IAAA,UAAU,GAAG,IAAI,YAAY,EAAiB;AAC9C,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAK;AAChC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAwC;AACtE,IAAA,UAAU,GAAG,IAAI,YAAY,EAAwB;AAE/D,IAAA,IAAI,UAAU,GAAA;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;AACvF,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,IAAI,CAAC;AACzC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC;IAChD;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;IAClF;AAEA,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACrF;AAEA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;AACzB,YAAA,OAAO,CAAC;QACV;QACA,OAAO,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC;IACzD;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;AACzB,YAAA,OAAO,CAAC;QACV;QACA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC;IACtF;AAEA,IAAA,IAAI,kBAAkB,GAAA;QACpB,MAAM,KAAK,GAAa,EAAE;QAC1B,MAAM,UAAU,GAAG,CAAC;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU;AAC7B,QAAA,IAAI,KAAK,IAAI,UAAU,EAAE;AACvB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE;AACjC,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACf;AACA,YAAA,OAAO,KAAK;QACd;QAEA,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AAC3E,QAAA,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU;AACnC,QAAA,IAAI,KAAK,GAAG,QAAQ,EAAE;YACpB,KAAK,GAAG,QAAQ;QAClB;AACA,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE;AACtC,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACvB;AACA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,UAAU,CAAC,MAA2B,EAAA;QACpC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,EAAE;YAC7C;QACF;QAEA,IAAI,IAAI,CAAC,gBAAgB,KAAK,MAAM,CAAC,GAAG,EAAE;AACxC,YAAA,IAAI,IAAI,CAAC,oBAAoB,KAAK,KAAK,EAAE;AACvC,gBAAA,IAAI,CAAC,oBAAoB,GAAG,MAAM;YACpC;AAAO,iBAAA,IAAI,IAAI,CAAC,oBAAoB,KAAK,MAAM,EAAE;AAC/C,gBAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE;AAC9B,gBAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;YAC5B;iBAAO;AACL,gBAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;YACnC;QACF;aAAO;AACL,YAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,GAAG;AAClC,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;QACnC;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC;QACzB,IAAI,CAAC,cAAc,EAAE;IACvB;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAChE,QAAA,IAAI,MAAM,KAAK,IAAI,CAAC,gBAAgB,EAAE;YACpC;QACF;AACA,QAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM;QAC9B,IAAI,CAAC,cAAc,EAAE;IACvB;AAEA,IAAA,gBAAgB,CAAC,QAAyB,EAAA;AACxC,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,IAAI,CAAC,eAAe,EAAE;YACxD;QACF;AACA,QAAA,IAAI,CAAC,eAAe,GAAG,WAAW;AAClC,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC;QACzB,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,cAAc,EAAE;IACvB;AAEA,IAAA,eAAe,CAAC,OAAU,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAC7B;IAEA,kBAAkB,CAAC,MAAwB,EAAE,OAAU,EAAA;QACrD,IAAI,MAAM,CAAC,QAAQ;YAAE;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IACjD;AAEA,IAAA,iBAAiB,CAAC,MAA2B,EAAE,OAAU,EAAE,KAAc,EAAA;AACvE,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;AAC7E,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;YAC5E;QACF;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACvD;IAEA,gBAAgB,GAAA;QACd,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAClF;AAEA,IAAA,aAAa,CAAC,GAAM,EAAA;AAClB,QAAA,MAAM,GAAG,GAAI,GAA+B,CAAC,SAAS,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACvB,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO;aACJ,MAAM,CAAC,CAAC,IAAI,KAA+B,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAQ,IAAyB,CAAC,EAAE,KAAK,QAAQ;AAClI,aAAA,MAAM,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,GAAyC,CAAC;AAC7F,aAAA,GAAG,CAAC,CAAC,IAAI,MAAM;YACd,EAAE,EAAE,IAAI,CAAC,EAAE;AACX,YAAA,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE;YAC5D,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,SAAS;YAC3D,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,YAAA,QAAQ,EAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,SAAS;AACvE,YAAA,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ;AACzB,YAAA,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,GAAG,GAAG,SAAS;AACxD,YAAA,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS;AACjE,YAAA,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS;AAC9D,YAAA,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,SAAS;YAC3D,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS;AACrG,YAAA,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS;YAClE,MAAM,EAAE,IAAI,CAAC,MAAM;AACnB,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,SAAS;AACrH,SAAA,CAAC,CAAC;IACP;AAEA,IAAA,oBAAoB,CAAC,MAAc,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,UAAU,KAAK,MAAM,CAAC,EAAE,QAAQ;IAC3F;AAEA,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,OAAO,KAAK;IACd;IAEA,eAAe,CAAC,CAAS,EAAE,SAAiB,EAAA;AAC1C,QAAA,OAAO,SAAS;IAClB;IAEA,YAAY,CAAC,GAAM,EAAE,MAAc,EAAA;AACjC,QAAA,OAAQ,GAA+B,CAAC,MAAM,CAAC;IACjD;IAEA,gBAAgB,CAAC,GAAM,EAAE,MAA2B,EAAA;QAClD,MAAM,OAAO,GAAG,GAA8B;QAC9C,OAAO,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAAC;IAC7D;IAEA,mBAAmB,CAAC,GAAM,EAAE,MAA2B,EAAA;AACrD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;AACrE,QAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,EAAE;AAClE,YAAA,OAAO,GAAG;QACZ;AAEA,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;YAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;AACrC,YAAA,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC;AAC/F,YAAA,OAAO,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG;QACxD;AAEA,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB;IAEA,WAAW,CAAC,GAAM,EAAE,MAA2B,EAAA;QAC7C,MAAM,MAAM,GAAG,GAA8B;AAC7C,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI;AAC9B,QAAA,MAAM,QAAQ,GAAG,OAAO,UAAU,KAAK;AACrC,cAAE,UAAU,CAAC,IAAI;cACf,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AACzF,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;QAExB,IAAI,eAAe,GAAG,KAAK;AAC3B,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,MAAM,EAAE,GAAW,KAAI;AAC7E,YAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAU,CAAC,OAAO,EAAE,IAAI,KAAI;AAC7D,gBAAA,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,oBAAA,OAAO,SAAS;AACpE,gBAAA,OAAQ,OAAmC,CAAC,IAAI,CAAC;YACnD,CAAC,EAAE,MAAM,CAAC;YACV,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE;gBACjC,eAAe,GAAG,IAAI;AACtB,gBAAA,OAAO,EAAE;YACX;AACA,YAAA,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1C,QAAA,CAAC,CAAC;QAEF,OAAO,eAAe,GAAG,EAAE,GAAG,IAAI;IACpC;IAEA,eAAe,CAAC,GAAM,EAAE,MAA2B,EAAA;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC;AAC1C,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI;IACjD;IAEQ,gBAAgB,CAAC,MAA+B,EAAE,IAAY,EAAA;AACpE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAU,CAAC,OAAO,EAAE,IAAI,KAAI;AAC9D,YAAA,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,gBAAA,OAAO,SAAS;AACpE,YAAA,OAAQ,OAAmC,CAAC,IAAI,CAAC;QACnD,CAAC,EAAE,MAAM,CAAC;AACV,QAAA,OAAO,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;IAClD;IAEA,oBAAoB,CAAC,GAAM,EAAE,MAA2B,EAAA;AACtD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;AAClE,QAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE;AACzD,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE;AAC/D,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC7B,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI;QAClD;AAEA,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;AAEA,IAAA,wBAAwB,CAAC,MAA2B,EAAA;AAClD,QAAA,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,GAAG,QAAQ,GAAG,MAAM;IACxF;AAEQ,IAAA,kBAAkB,CAAC,KAAc,EAAA;QACvC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;IAC7B;AAEA,IAAA,kBAAkB,CAAC,MAA2B,EAAA;AAC5C,QAAA,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,EAAE,EAAE;AAC/C,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE;AACpC,YAAA,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI;QACrD;QAEA,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS;IACjD;IAEA,eAAe,CAAC,KAAc,EAAE,GAAO,EAAA;QACrC,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC;IACvC;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,SAAS,EAAE,IAAI,CAAC,gBAAgB;YAChC,QAAQ,EAAE,IAAI,CAAC,eAAe;YAC9B,MAAM,EAAE,IAAI,CAAC,gBAAgB;YAC7B,SAAS,EAAE,IAAI,CAAC,oBAAoB;AACrC,SAAA,CAAC;IACJ;IAEQ,sBAAsB,GAAA;QAC5B,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,UAAU,EAAE;AAC5C,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAC1D;IACF;wGA3WW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EA+BV,sBAAsB,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1RzC,whTA0LA,2CDmDI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,oDAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEZ,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,2BAA2B,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,KAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,yBAAyB,uFACzB,4BAA4B,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,yBAAyB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,wBAAwB,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIf,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAlB5B,SAAS;+BACE,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,OAAA,EACP;wBACP,mBAAmB;wBACnB,YAAY;wBACZ,gBAAgB;wBAChB,oBAAoB;wBACpB,WAAW;wBACX,YAAY;wBACZ,2BAA2B;wBAC3B,yBAAyB;wBACzB,4BAA4B;wBAC5B,yBAAyB;wBACzB,wBAAwB;AACzB,qBAAA,EAAA,QAAA,EAAA,whTAAA,EAAA;;sBAkCA,eAAe;uBAAC,sBAAsB;;sBAGtC;;sBAKA;;sBAKA;;sBAiBA;;sBASA;;sBASA;;sBAOA;;sBACA;;sBACA;;sBACA;;;MEtUU,oBAAoB,CAAA;IACtB,eAAe,GAAG,WAAW;IAC7B,gBAAgB,GAAG,YAAY;IAC/B,SAAS,GAAG,CAAC;IACb,QAAQ,GAAG,EAAE;IACb,KAAK,GAAG,CAAC;IACT,eAAe,GAAa,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;AAEtC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAU;AACvC,IAAA,cAAc,GAAG,IAAI,YAAY,EAAU;AAErD,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;IAC5D;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,CAAC;QACzB,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC;IAC3C;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,IAAI,CAAC,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,CAAC;QACzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;IACnE;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU;AAC7B,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,KAAK,CAAC;QAChE;AAEA,QAAA,MAAM,KAAK,GAAqB,CAAC,CAAC,CAAC;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;AAC7C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;AAEnD,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,YAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;QACxB;AAEA,QAAA,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE;AAC1C,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAClB;AAEA,QAAA,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,EAAE;AACnB,YAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;QACxB;AAEA,QAAA,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;AACrB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,qBAAqB,CAAC,KAAsB,EAAA;AAC1C,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ;YAAE;AAC3C,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;IACnC;AAEA,IAAA,UAAU,CAAC,SAAiB,EAAA;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;AACrE,QAAA,IAAI,OAAO,KAAK,IAAI,CAAC,SAAS;YAAE;AAChC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/B;wGAlEW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECdjC,o3GA6DA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDlDY,YAAY,8BAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,oDAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAGnE,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,o3GAAA,EAAA;;sBAM9E;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;;AEvBH;;AAEG;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maro-tech/table",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^21.2.0",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"@angular/forms": "^21.2.0",
|
|
9
9
|
"@angular/router": "^21.2.0",
|
|
10
10
|
"@maro-tech/core": "^0.0.4",
|
|
11
|
-
"@maro-tech/form": "^0.0
|
|
11
|
+
"@maro-tech/form": "^0.1.0",
|
|
12
12
|
"lucide-angular": "^0.577.0",
|
|
13
13
|
"rxjs": "~7.8.0"
|
|
14
14
|
},
|