@neural-ui/core 1.5.14 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/neural-ui-core-accordion.mjs +13 -9
- package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
- package/fesm2022/neural-ui-core-alert.mjs +25 -14
- package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
- package/fesm2022/neural-ui-core-autocomplete.mjs +53 -28
- package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
- package/fesm2022/neural-ui-core-avatar.mjs +23 -13
- package/fesm2022/neural-ui-core-avatar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-badge.mjs +15 -9
- package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
- package/fesm2022/neural-ui-core-block-ui.mjs +16 -11
- package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -1
- package/fesm2022/neural-ui-core-breadcrumb.mjs +8 -6
- package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -1
- package/fesm2022/neural-ui-core-button.mjs +29 -16
- package/fesm2022/neural-ui-core-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-calendar.mjs +75 -50
- package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-card.mjs +13 -8
- package/fesm2022/neural-ui-core-card.mjs.map +1 -1
- package/fesm2022/neural-ui-core-chart.mjs +45 -24
- package/fesm2022/neural-ui-core-chart.mjs.map +1 -1
- package/fesm2022/neural-ui-core-checkbox.mjs +15 -9
- package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -1
- package/fesm2022/neural-ui-core-chip.mjs +23 -13
- package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
- package/fesm2022/neural-ui-core-code-block.mjs +32 -17
- package/fesm2022/neural-ui-core-code-block.mjs.map +1 -1
- package/fesm2022/neural-ui-core-color-picker.mjs +19 -11
- package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
- package/fesm2022/neural-ui-core-command-palette.mjs +16 -11
- package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -1
- package/fesm2022/neural-ui-core-confirm-dialog.mjs +6 -6
- package/fesm2022/neural-ui-core-context-menu.mjs +12 -9
- package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
- package/fesm2022/neural-ui-core-dashboard-grid.mjs +11 -7
- package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
- package/fesm2022/neural-ui-core-date-input.mjs +111 -57
- package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-divider.mjs +7 -5
- package/fesm2022/neural-ui-core-divider.mjs.map +1 -1
- package/fesm2022/neural-ui-core-empty-state.mjs +13 -8
- package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
- package/fesm2022/neural-ui-core-filter-bar.mjs +19 -11
- package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-icon.mjs +11 -7
- package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
- package/fesm2022/neural-ui-core-image-gallery.mjs +23 -13
- package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -1
- package/fesm2022/neural-ui-core-image-viewer.mjs +22 -14
- package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -1
- package/fesm2022/neural-ui-core-input-otp.mjs +19 -11
- package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -1
- package/fesm2022/neural-ui-core-input.mjs +67 -35
- package/fesm2022/neural-ui-core-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-kanban.mjs +17 -11
- package/fesm2022/neural-ui-core-kanban.mjs.map +1 -1
- package/fesm2022/neural-ui-core-knob.mjs +41 -22
- package/fesm2022/neural-ui-core-knob.mjs.map +1 -1
- package/fesm2022/neural-ui-core-meter-group.mjs +23 -13
- package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -1
- package/fesm2022/neural-ui-core-modal.mjs +16 -11
- package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
- package/fesm2022/neural-ui-core-multiselect.mjs +72 -39
- package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
- package/fesm2022/neural-ui-core-nav.mjs +22 -13
- package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
- package/fesm2022/neural-ui-core-notification-center.mjs +27 -10
- package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -1
- package/fesm2022/neural-ui-core-number-input.mjs +35 -19
- package/fesm2022/neural-ui-core-number-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-pagination.mjs +15 -9
- package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
- package/fesm2022/neural-ui-core-popover.mjs +22 -14
- package/fesm2022/neural-ui-core-popover.mjs.map +1 -1
- package/fesm2022/neural-ui-core-progress-bar.mjs +19 -11
- package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-radio.mjs +24 -15
- package/fesm2022/neural-ui-core-radio.mjs.map +1 -1
- package/fesm2022/neural-ui-core-rating.mjs +13 -8
- package/fesm2022/neural-ui-core-rating.mjs.map +1 -1
- package/fesm2022/neural-ui-core-rich-text-editor.mjs +773 -0
- package/fesm2022/neural-ui-core-rich-text-editor.mjs.map +1 -0
- package/fesm2022/neural-ui-core-scheduler-gantt.mjs +41 -22
- package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -1
- package/fesm2022/neural-ui-core-select.mjs +77 -43
- package/fesm2022/neural-ui-core-select.mjs.map +1 -1
- package/fesm2022/neural-ui-core-sidebar.mjs +23 -14
- package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-skeleton.mjs +11 -7
- package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -1
- package/fesm2022/neural-ui-core-slider.mjs +23 -13
- package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
- package/fesm2022/neural-ui-core-spinner.mjs +17 -10
- package/fesm2022/neural-ui-core-spinner.mjs.map +1 -1
- package/fesm2022/neural-ui-core-split-button.mjs +27 -15
- package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-splitter.mjs +9 -6
- package/fesm2022/neural-ui-core-splitter.mjs.map +1 -1
- package/fesm2022/neural-ui-core-stats-card.mjs +19 -11
- package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
- package/fesm2022/neural-ui-core-stepper.mjs +13 -8
- package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
- package/fesm2022/neural-ui-core-switch.mjs +15 -9
- package/fesm2022/neural-ui-core-switch.mjs.map +1 -1
- package/fesm2022/neural-ui-core-table.mjs +242 -124
- package/fesm2022/neural-ui-core-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tabs.mjs +30 -18
- package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
- package/fesm2022/neural-ui-core-textarea.mjs +43 -23
- package/fesm2022/neural-ui-core-textarea.mjs.map +1 -1
- package/fesm2022/neural-ui-core-timeline-grid.mjs +21 -12
- package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -1
- package/fesm2022/neural-ui-core-timeline.mjs +5 -4
- package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toast.mjs +25 -9
- package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toggle-button-group.mjs +17 -10
- package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toolbar.mjs +13 -8
- package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tooltip.mjs +16 -11
- package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree-table.mjs +57 -30
- package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree.mjs +31 -17
- package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
- package/fesm2022/neural-ui-core-uploader.mjs +91 -47
- package/fesm2022/neural-ui-core-uploader.mjs.map +1 -1
- package/fesm2022/neural-ui-core-url-state.mjs +7 -5
- package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
- package/fesm2022/neural-ui-core-virtual-list.mjs +32 -19
- package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
- package/package.json +5 -1
- package/types/neural-ui-core-notification-center.d.ts +2 -0
- package/types/neural-ui-core-rich-text-editor.d.ts +97 -0
- package/types/neural-ui-core-toast.d.ts +2 -0
|
@@ -7,58 +7,99 @@ import { NeuProgressBarComponent } from '@neural-ui/core/progress-bar';
|
|
|
7
7
|
let _neuUploaderIdSeq = 0;
|
|
8
8
|
class NeuUploaderComponent {
|
|
9
9
|
fileInput = viewChild.required('fileInput');
|
|
10
|
-
label = input('',
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
10
|
+
label = input('', /* @ts-ignore */
|
|
11
|
+
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
12
|
+
hint = input('', /* @ts-ignore */
|
|
13
|
+
...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
|
|
14
|
+
errorMessage = input('', /* @ts-ignore */
|
|
15
|
+
...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
|
|
16
|
+
placeholder = input('Drag files here or select them from your device.', /* @ts-ignore */
|
|
17
|
+
...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
|
|
18
|
+
pickerDescription = input('Use the button below to choose files from your device.', /* @ts-ignore */
|
|
19
|
+
...(ngDevMode ? [{ debugName: "pickerDescription" }] : /* istanbul ignore next */ []));
|
|
20
|
+
dropzoneLabel = input('Drop files here to add them', /* @ts-ignore */
|
|
21
|
+
...(ngDevMode ? [{ debugName: "dropzoneLabel" }] : /* istanbul ignore next */ []));
|
|
22
|
+
chooseLabel = input('Choose files', /* @ts-ignore */
|
|
23
|
+
...(ngDevMode ? [{ debugName: "chooseLabel" }] : /* istanbul ignore next */ []));
|
|
24
|
+
clearLabel = input('Clear', /* @ts-ignore */
|
|
25
|
+
...(ngDevMode ? [{ debugName: "clearLabel" }] : /* istanbul ignore next */ []));
|
|
26
|
+
progressLabel = input('Upload in progress', /* @ts-ignore */
|
|
27
|
+
...(ngDevMode ? [{ debugName: "progressLabel" }] : /* istanbul ignore next */ []));
|
|
28
|
+
showPickerText = input(false, /* @ts-ignore */
|
|
29
|
+
...(ngDevMode ? [{ debugName: "showPickerText" }] : /* istanbul ignore next */ []));
|
|
30
|
+
showProgress = input(true, /* @ts-ignore */
|
|
31
|
+
...(ngDevMode ? [{ debugName: "showProgress" }] : /* istanbul ignore next */ []));
|
|
32
|
+
listAriaLabel = input('Selected files', /* @ts-ignore */
|
|
33
|
+
...(ngDevMode ? [{ debugName: "listAriaLabel" }] : /* istanbul ignore next */ []));
|
|
34
|
+
removeAriaLabel = input('Remove file', /* @ts-ignore */
|
|
35
|
+
...(ngDevMode ? [{ debugName: "removeAriaLabel" }] : /* istanbul ignore next */ []));
|
|
36
|
+
acceptedTypesLabel = input('Allowed types', /* @ts-ignore */
|
|
37
|
+
...(ngDevMode ? [{ debugName: "acceptedTypesLabel" }] : /* istanbul ignore next */ []));
|
|
38
|
+
maxFileSizeTextLabel = input('Max size', /* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [{ debugName: "maxFileSizeTextLabel" }] : /* istanbul ignore next */ []));
|
|
40
|
+
fileCountSingularLabel = input('file', /* @ts-ignore */
|
|
41
|
+
...(ngDevMode ? [{ debugName: "fileCountSingularLabel" }] : /* istanbul ignore next */ []));
|
|
42
|
+
fileCountPluralLabel = input('files', /* @ts-ignore */
|
|
43
|
+
...(ngDevMode ? [{ debugName: "fileCountPluralLabel" }] : /* istanbul ignore next */ []));
|
|
44
|
+
emptySelectionMessage = input('No file was selected.', /* @ts-ignore */
|
|
45
|
+
...(ngDevMode ? [{ debugName: "emptySelectionMessage" }] : /* istanbul ignore next */ []));
|
|
46
|
+
invalidTypeMessage = input('File {{fileName}} does not match the allowed file types.', /* @ts-ignore */
|
|
47
|
+
...(ngDevMode ? [{ debugName: "invalidTypeMessage" }] : /* istanbul ignore next */ []));
|
|
48
|
+
maxFileSizeMessage = input('File {{fileName}} exceeds the allowed maximum size.', /* @ts-ignore */
|
|
49
|
+
...(ngDevMode ? [{ debugName: "maxFileSizeMessage" }] : /* istanbul ignore next */ []));
|
|
50
|
+
duplicateFileMessage = input('File {{fileName}} has already been selected.', /* @ts-ignore */
|
|
51
|
+
...(ngDevMode ? [{ debugName: "duplicateFileMessage" }] : /* istanbul ignore next */ []));
|
|
52
|
+
maxFilesMessage = input('You can only select up to {{maxFiles}} files.', /* @ts-ignore */
|
|
53
|
+
...(ngDevMode ? [{ debugName: "maxFilesMessage" }] : /* istanbul ignore next */ []));
|
|
54
|
+
accept = input('', /* @ts-ignore */
|
|
55
|
+
...(ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []));
|
|
56
|
+
multiple = input(true, /* @ts-ignore */
|
|
57
|
+
...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
|
|
58
|
+
dropzone = input(true, /* @ts-ignore */
|
|
59
|
+
...(ngDevMode ? [{ debugName: "dropzone" }] : /* istanbul ignore next */ []));
|
|
60
|
+
disabled = input(false, /* @ts-ignore */
|
|
61
|
+
...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
62
|
+
size = input('md', /* @ts-ignore */
|
|
63
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
64
|
+
maxFiles = input(null, /* @ts-ignore */
|
|
65
|
+
...(ngDevMode ? [{ debugName: "maxFiles" }] : /* istanbul ignore next */ []));
|
|
66
|
+
maxFileSize = input(null, /* @ts-ignore */
|
|
67
|
+
...(ngDevMode ? [{ debugName: "maxFileSize" }] : /* istanbul ignore next */ []));
|
|
68
|
+
progress = input(null, /* @ts-ignore */
|
|
69
|
+
...(ngDevMode ? [{ debugName: "progress" }] : /* istanbul ignore next */ []));
|
|
40
70
|
filesSelected = output();
|
|
41
71
|
fileRemoved = output();
|
|
42
72
|
filesRejected = output();
|
|
43
73
|
cleared = output();
|
|
44
|
-
inputId = input(`neu-uploader-${++_neuUploaderIdSeq}`,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
74
|
+
inputId = input(`neu-uploader-${++_neuUploaderIdSeq}`, /* @ts-ignore */
|
|
75
|
+
...(ngDevMode ? [{ debugName: "inputId" }] : /* istanbul ignore next */ []));
|
|
76
|
+
isDragOver = signal(false, /* @ts-ignore */
|
|
77
|
+
...(ngDevMode ? [{ debugName: "isDragOver" }] : /* istanbul ignore next */ []));
|
|
78
|
+
internalErrors = signal([], /* @ts-ignore */
|
|
79
|
+
...(ngDevMode ? [{ debugName: "internalErrors" }] : /* istanbul ignore next */ []));
|
|
80
|
+
fileItems = signal([], /* @ts-ignore */
|
|
81
|
+
...(ngDevMode ? [{ debugName: "fileItems" }] : /* istanbul ignore next */ []));
|
|
82
|
+
cvaDisabled = signal(false, /* @ts-ignore */
|
|
83
|
+
...(ngDevMode ? [{ debugName: "cvaDisabled" }] : /* istanbul ignore next */ []));
|
|
49
84
|
onChange = () => { };
|
|
50
85
|
onTouched = () => { };
|
|
51
|
-
isDisabledFinal = computed(() => this.disabled() || this.cvaDisabled(),
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
86
|
+
isDisabledFinal = computed(() => this.disabled() || this.cvaDisabled(), /* @ts-ignore */
|
|
87
|
+
...(ngDevMode ? [{ debugName: "isDisabledFinal" }] : /* istanbul ignore next */ []));
|
|
88
|
+
hasError = computed(() => !!this.displayErrorMessage(), /* @ts-ignore */
|
|
89
|
+
...(ngDevMode ? [{ debugName: "hasError" }] : /* istanbul ignore next */ []));
|
|
90
|
+
shouldShowProgress = computed(() => this.showProgress() && this.progress() !== null, /* @ts-ignore */
|
|
91
|
+
...(ngDevMode ? [{ debugName: "shouldShowProgress" }] : /* istanbul ignore next */ []));
|
|
92
|
+
pickerButtonAriaLabel = computed(() => this.showPickerText() && this.chooseLabel() ? null : this.chooseLabel(), /* @ts-ignore */
|
|
93
|
+
...(ngDevMode ? [{ debugName: "pickerButtonAriaLabel" }] : /* istanbul ignore next */ []));
|
|
55
94
|
describedBy = computed(() => {
|
|
56
95
|
if (this.hasError()) {
|
|
57
96
|
return `${this.inputId()}-error`;
|
|
58
97
|
}
|
|
59
98
|
return this.hint() ? `${this.inputId()}-hint` : null;
|
|
60
|
-
},
|
|
61
|
-
|
|
99
|
+
}, /* @ts-ignore */
|
|
100
|
+
...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
|
|
101
|
+
headlineText = computed(() => this.isDragOver() && this.dropzone() ? this.dropzoneLabel() : this.chooseLabel(), /* @ts-ignore */
|
|
102
|
+
...(ngDevMode ? [{ debugName: "headlineText" }] : /* istanbul ignore next */ []));
|
|
62
103
|
descriptionText = computed(() => {
|
|
63
104
|
const parts = [this.dropzone() ? this.placeholder() : this.pickerDescription()];
|
|
64
105
|
if (this.accept()) {
|
|
@@ -68,19 +109,22 @@ class NeuUploaderComponent {
|
|
|
68
109
|
parts.push(`${this.maxFileSizeTextLabel()}: ${this.formatBytes(this.maxFileSize() ?? 0)}`);
|
|
69
110
|
}
|
|
70
111
|
return parts.join(' · ');
|
|
71
|
-
},
|
|
112
|
+
}, /* @ts-ignore */
|
|
113
|
+
...(ngDevMode ? [{ debugName: "descriptionText" }] : /* istanbul ignore next */ []));
|
|
72
114
|
summaryText = computed(() => {
|
|
73
115
|
const totalSize = this.fileItems().reduce((acc, item) => acc + item.size, 0);
|
|
74
116
|
const fileCount = this.fileItems().length;
|
|
75
117
|
return `${fileCount} ${fileCount === 1 ? this.fileCountSingularLabel() : this.fileCountPluralLabel()} · ${this.formatBytes(totalSize)}`;
|
|
76
|
-
},
|
|
118
|
+
}, /* @ts-ignore */
|
|
119
|
+
...(ngDevMode ? [{ debugName: "summaryText" }] : /* istanbul ignore next */ []));
|
|
77
120
|
displayErrorMessage = computed(() => {
|
|
78
121
|
if (this.errorMessage()) {
|
|
79
122
|
return this.errorMessage();
|
|
80
123
|
}
|
|
81
124
|
const [first] = this.internalErrors();
|
|
82
125
|
return first?.message ?? '';
|
|
83
|
-
},
|
|
126
|
+
}, /* @ts-ignore */
|
|
127
|
+
...(ngDevMode ? [{ debugName: "displayErrorMessage" }] : /* istanbul ignore next */ []));
|
|
84
128
|
writeValue(value) {
|
|
85
129
|
if (!value) {
|
|
86
130
|
this.fileItems.set([]);
|
|
@@ -280,8 +324,8 @@ class NeuUploaderComponent {
|
|
|
280
324
|
return mimeType === rule;
|
|
281
325
|
});
|
|
282
326
|
}
|
|
283
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
284
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
327
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuUploaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
328
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuUploaderComponent, isStandalone: true, selector: "neu-uploader", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, pickerDescription: { classPropertyName: "pickerDescription", publicName: "pickerDescription", isSignal: true, isRequired: false, transformFunction: null }, dropzoneLabel: { classPropertyName: "dropzoneLabel", publicName: "dropzoneLabel", isSignal: true, isRequired: false, transformFunction: null }, chooseLabel: { classPropertyName: "chooseLabel", publicName: "chooseLabel", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, progressLabel: { classPropertyName: "progressLabel", publicName: "progressLabel", isSignal: true, isRequired: false, transformFunction: null }, showPickerText: { classPropertyName: "showPickerText", publicName: "showPickerText", isSignal: true, isRequired: false, transformFunction: null }, showProgress: { classPropertyName: "showProgress", publicName: "showProgress", isSignal: true, isRequired: false, transformFunction: null }, listAriaLabel: { classPropertyName: "listAriaLabel", publicName: "listAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, removeAriaLabel: { classPropertyName: "removeAriaLabel", publicName: "removeAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, acceptedTypesLabel: { classPropertyName: "acceptedTypesLabel", publicName: "acceptedTypesLabel", isSignal: true, isRequired: false, transformFunction: null }, maxFileSizeTextLabel: { classPropertyName: "maxFileSizeTextLabel", publicName: "maxFileSizeTextLabel", isSignal: true, isRequired: false, transformFunction: null }, fileCountSingularLabel: { classPropertyName: "fileCountSingularLabel", publicName: "fileCountSingularLabel", isSignal: true, isRequired: false, transformFunction: null }, fileCountPluralLabel: { classPropertyName: "fileCountPluralLabel", publicName: "fileCountPluralLabel", isSignal: true, isRequired: false, transformFunction: null }, emptySelectionMessage: { classPropertyName: "emptySelectionMessage", publicName: "emptySelectionMessage", isSignal: true, isRequired: false, transformFunction: null }, invalidTypeMessage: { classPropertyName: "invalidTypeMessage", publicName: "invalidTypeMessage", isSignal: true, isRequired: false, transformFunction: null }, maxFileSizeMessage: { classPropertyName: "maxFileSizeMessage", publicName: "maxFileSizeMessage", isSignal: true, isRequired: false, transformFunction: null }, duplicateFileMessage: { classPropertyName: "duplicateFileMessage", publicName: "duplicateFileMessage", isSignal: true, isRequired: false, transformFunction: null }, maxFilesMessage: { classPropertyName: "maxFilesMessage", publicName: "maxFilesMessage", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, dropzone: { classPropertyName: "dropzone", publicName: "dropzone", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, progress: { classPropertyName: "progress", publicName: "progress", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesSelected: "filesSelected", fileRemoved: "fileRemoved", filesRejected: "filesRejected", cleared: "cleared" }, host: { properties: { "class.neu-uploader-host--sm": "size() === \"sm\"", "class.neu-uploader-host--lg": "size() === \"lg\"" }, classAttribute: "neu-uploader-host" }, providers: [
|
|
285
329
|
{
|
|
286
330
|
provide: NG_VALUE_ACCESSOR,
|
|
287
331
|
useExisting: forwardRef(() => NeuUploaderComponent),
|
|
@@ -445,7 +489,7 @@ class NeuUploaderComponent {
|
|
|
445
489
|
}
|
|
446
490
|
`, isInline: true, styles: [".neu-uploader-host{display:block}.neu-uploader-host--sm .neu-uploader__dropzone{min-height:144px;padding:var(--neu-space-4)}.neu-uploader-host--sm .neu-uploader__headline{font-size:var(--neu-text-base)}.neu-uploader-host--lg .neu-uploader__dropzone{min-height:208px;padding:var(--neu-space-8)}.neu-uploader-host--lg .neu-uploader__headline{font-size:var(--neu-text-xl)}.neu-uploader__label{display:block;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);margin-bottom:var(--neu-space-2)}.neu-uploader__native-input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.neu-uploader{display:grid;gap:var(--neu-space-3)}.neu-uploader--picker-only{gap:var(--neu-space-2)}.neu-uploader--picker-only .neu-uploader__copy{gap:2px;max-width:none}.neu-uploader--picker-only .neu-uploader__progress{padding:var(--neu-space-2) var(--neu-space-3)}.neu-uploader--picker-only .neu-uploader__headline{font-size:var(--neu-text-base)}.neu-uploader--drag-over .neu-uploader__dropzone{border-color:var(--neu-primary);box-shadow:var(--neu-focus-ring-strong);transform:translateY(-1px)}.neu-uploader--error .neu-uploader__dropzone{border-color:var(--neu-error);background:radial-gradient(circle at top right,color-mix(in srgb,var(--neu-error) 6%,transparent),transparent 35%),color-mix(in srgb,var(--neu-error) 5%,var(--neu-surface))}.neu-uploader--disabled .neu-uploader__dropzone{opacity:.7;cursor:not-allowed;background:var(--neu-surface-2)}.neu-uploader__dropzone{position:relative;display:grid;justify-items:center;gap:var(--neu-space-3);min-height:176px;padding:var(--neu-space-6);background:radial-gradient(circle at top right,color-mix(in srgb,var(--neu-primary) 7%,transparent),transparent 35%),color-mix(in srgb,var(--neu-surface) 97%,var(--neu-primary));border:1.5px dashed var(--neu-border-hover);border-radius:var(--neu-radius-lg);box-shadow:var(--neu-shadow-sm);cursor:pointer;text-align:center;transition:border-color var(--neu-transition),box-shadow var(--neu-transition),background var(--neu-transition),transform var(--neu-transition)}.neu-uploader__dropzone:hover{border-color:var(--neu-primary);box-shadow:var(--neu-shadow)}.neu-uploader__dropzone:focus-visible{outline:none;box-shadow:var(--neu-focus-ring-strong);border-color:var(--neu-primary)}.neu-uploader__picker-trigger{justify-self:start}.neu-uploader__actions--picker-only{justify-content:flex-end;flex-shrink:0}@media(max-width:640px){.neu-uploader__actions--picker-only{justify-content:flex-start}}.neu-uploader__empty-icon{display:grid;place-items:center;width:56px;height:56px;border-radius:var(--neu-radius-full);background:color-mix(in srgb,var(--neu-primary) 12%,transparent);color:var(--neu-primary)}.neu-uploader__empty-icon svg{width:24px;height:24px}.neu-uploader__copy{display:grid;gap:var(--neu-space-1);max-width:40rem}.neu-uploader__headline{margin:0;color:var(--neu-text);font-size:var(--neu-text-lg);font-weight:700}.neu-uploader__description{margin:0;color:var(--neu-text-muted);font-size:var(--neu-text-sm);line-height:1.55}.neu-uploader__actions{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--neu-space-2)}.neu-uploader__progress,.neu-uploader__summary,.neu-uploader__list{background:var(--neu-surface);border:1px solid var(--neu-border);border-radius:var(--neu-radius)}.neu-uploader__progress{padding:var(--neu-space-3)}.neu-uploader__summary{display:flex;align-items:center;justify-content:space-between;gap:var(--neu-space-3);padding:var(--neu-space-3) var(--neu-space-4);font-size:var(--neu-text-sm);color:var(--neu-text-muted)}.neu-uploader__list{list-style:none;margin:0;padding:0;overflow:hidden}.neu-uploader__item{display:flex;align-items:center;justify-content:space-between;gap:var(--neu-space-3);padding:var(--neu-space-3) var(--neu-space-4)}.neu-uploader__item:not(:last-child){border-bottom:1px solid var(--neu-border)}.neu-uploader__item-main{display:grid;gap:2px;min-width:0}.neu-uploader__item-name{font-size:var(--neu-text-sm);font-weight:600;color:var(--neu-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.neu-uploader__item-meta{font-size:var(--neu-text-xs);color:var(--neu-text-muted)}.neu-uploader__remove{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;border:none;border-radius:var(--neu-radius-full);background:transparent;color:var(--neu-text-muted);cursor:pointer;transition:background-color var(--neu-transition),color var(--neu-transition),box-shadow var(--neu-transition)}.neu-uploader__remove:hover:not(:disabled){background:var(--neu-error-bg);color:var(--neu-error)}.neu-uploader__remove:focus-visible{outline:none;box-shadow:var(--neu-focus-ring)}.neu-uploader__remove:disabled{cursor:not-allowed;opacity:.55}.neu-uploader__remove svg{width:1rem;height:1rem}.neu-uploader__error,.neu-uploader__hint{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);line-height:1.45}.neu-uploader__error{color:var(--neu-error-text)}.neu-uploader__hint{color:var(--neu-text-muted)}@media(max-width:399px){.neu-uploader__dropzone{min-height:auto;padding:var(--neu-space-5)}.neu-uploader--picker-only .neu-uploader__dropzone{grid-template-columns:1fr;align-items:start;gap:var(--neu-space-3);padding:var(--neu-space-4)}.neu-uploader--picker-only .neu-uploader__actions{justify-content:flex-start}.neu-uploader__summary,.neu-uploader__item{align-items:flex-start;flex-direction:column}.neu-uploader__remove{align-self:flex-end}}\n"], dependencies: [{ kind: "component", type: NeuButtonComponent, selector: "button[neu-button]", inputs: ["variant", "size", "disabled", "loading", "fullWidth", "icon", "iconPosition", "iconOnly", "ariaLabel"], outputs: ["neuClick"] }, { kind: "component", type: NeuProgressBarComponent, selector: "neu-progress-bar", inputs: ["value", "variant", "label", "showValue", "indeterminate", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
447
491
|
}
|
|
448
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
492
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuUploaderComponent, decorators: [{
|
|
449
493
|
type: Component,
|
|
450
494
|
args: [{ selector: 'neu-uploader', imports: [NeuButtonComponent, NeuProgressBarComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
451
495
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-uploader.mjs","sources":["../../../../projects/ui-core/uploader/neu-uploader.component.ts","../../../../projects/ui-core/uploader/neural-ui-core-uploader.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\nimport { NeuProgressBarComponent } from '@neural-ui/core/progress-bar';\nimport type { NeuUploaderError, NeuUploaderFileItem, NeuUploaderSize } from './neu-uploader.types';\n\nexport type { NeuUploaderError, NeuUploaderFileItem, NeuUploaderSize } from './neu-uploader.types';\n\nlet _neuUploaderIdSeq = 0;\n\n@Component({\n selector: 'neu-uploader',\n imports: [NeuButtonComponent, NeuProgressBarComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuUploaderComponent),\n multi: true,\n },\n ],\n host: {\n class: 'neu-uploader-host',\n '[class.neu-uploader-host--sm]': 'size() === \"sm\"',\n '[class.neu-uploader-host--lg]': 'size() === \"lg\"',\n },\n template: `\n @if (label()) {\n <label class=\"neu-uploader__label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n\n <input\n #fileInput\n class=\"neu-uploader__native-input\"\n [id]=\"inputId()\"\n type=\"file\"\n [attr.accept]=\"accept() || null\"\n [attr.multiple]=\"multiple() ? '' : null\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n (change)=\"onNativeInputChange($event)\"\n />\n\n <div\n class=\"neu-uploader\"\n [class.neu-uploader--disabled]=\"isDisabledFinal()\"\n [class.neu-uploader--drag-over]=\"isDragOver()\"\n [class.neu-uploader--error]=\"hasError()\"\n [class.neu-uploader--has-files]=\"fileItems().length > 0\"\n [class.neu-uploader--picker-only]=\"!dropzone()\"\n >\n @if (dropzone()) {\n <div\n class=\"neu-uploader__dropzone\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div class=\"neu-uploader__empty-icon\" aria-hidden=\"true\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n </div>\n\n <div class=\"neu-uploader__copy\">\n <p class=\"neu-uploader__headline\">{{ headlineText() }}</p>\n <p class=\"neu-uploader__description\">{{ descriptionText() }}</p>\n </div>\n\n <div class=\"neu-uploader__actions\">\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n size=\"sm\"\n (click)=\"openFilePicker(); $event.stopPropagation()\"\n >\n {{ chooseLabel() }}\n </button>\n @if (fileItems().length > 0) {\n <button\n neu-button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n (click)=\"clearFiles($event)\"\n >\n {{ clearLabel() }}\n </button>\n }\n </div>\n </div>\n } @else {\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n size=\"sm\"\n icon=\"lucideUpload\"\n class=\"neu-uploader__picker-trigger\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-label]=\"pickerButtonAriaLabel()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n >\n @if (showPickerText() && chooseLabel()) {\n {{ chooseLabel() }}\n }\n </button>\n }\n\n @if (shouldShowProgress()) {\n <div class=\"neu-uploader__progress\">\n <neu-progress-bar\n [value]=\"progress() ?? 0\"\n [label]=\"progressLabel()\"\n [showValue]=\"true\"\n size=\"sm\"\n />\n </div>\n }\n\n @if (fileItems().length > 0) {\n <div class=\"neu-uploader__summary\">\n <span>{{ summaryText() }}</span>\n @if (maxFiles() !== null) {\n <span>{{ fileItems().length }}/{{ maxFiles() }}</span>\n }\n </div>\n\n <ul class=\"neu-uploader__list\" [attr.aria-label]=\"listAriaLabel()\">\n @for (item of fileItems(); track item.id) {\n <li class=\"neu-uploader__item\">\n <div class=\"neu-uploader__item-main\">\n <span class=\"neu-uploader__item-name\">{{ item.name }}</span>\n <span class=\"neu-uploader__item-meta\">{{ formatBytes(item.size) }}</span>\n </div>\n <button\n class=\"neu-uploader__remove\"\n type=\"button\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-label]=\"removeAriaLabel() + ' ' + item.name\"\n (click)=\"removeFile(item.id, $event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </li>\n }\n </ul>\n }\n </div>\n\n @if (hasError()) {\n <p class=\"neu-uploader__error\" [id]=\"inputId() + '-error'\" role=\"alert\">\n {{ displayErrorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-uploader__hint\" [id]=\"inputId() + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-uploader.component.scss',\n})\nexport class NeuUploaderComponent implements ControlValueAccessor {\n readonly fileInput = viewChild.required<ElementRef<HTMLInputElement>>('fileInput');\n\n label = input<string>('');\n hint = input<string>('');\n errorMessage = input<string>('');\n placeholder = input<string>('Drag files here or select them from your device.');\n pickerDescription = input<string>('Use the button below to choose files from your device.');\n dropzoneLabel = input<string>('Drop files here to add them');\n chooseLabel = input<string>('Choose files');\n clearLabel = input<string>('Clear');\n progressLabel = input<string>('Upload in progress');\n showPickerText = input<boolean>(false);\n showProgress = input<boolean>(true);\n listAriaLabel = input<string>('Selected files');\n removeAriaLabel = input<string>('Remove file');\n acceptedTypesLabel = input<string>('Allowed types');\n maxFileSizeTextLabel = input<string>('Max size');\n fileCountSingularLabel = input<string>('file');\n fileCountPluralLabel = input<string>('files');\n emptySelectionMessage = input<string>('No file was selected.');\n invalidTypeMessage = input<string>('File {{fileName}} does not match the allowed file types.');\n maxFileSizeMessage = input<string>('File {{fileName}} exceeds the allowed maximum size.');\n duplicateFileMessage = input<string>('File {{fileName}} has already been selected.');\n maxFilesMessage = input<string>('You can only select up to {{maxFiles}} files.');\n accept = input<string>('');\n multiple = input<boolean>(true);\n dropzone = input<boolean>(true);\n disabled = input<boolean>(false);\n size = input<NeuUploaderSize>('md');\n maxFiles = input<number | null>(null);\n maxFileSize = input<number | null>(null);\n progress = input<number | null>(null);\n\n readonly filesSelected = output<File[]>();\n readonly fileRemoved = output<File>();\n readonly filesRejected = output<NeuUploaderError[]>();\n readonly cleared = output<void>();\n\n readonly inputId = input<string>(`neu-uploader-${++_neuUploaderIdSeq}`);\n\n protected readonly isDragOver = signal(false);\n protected readonly internalErrors = signal<NeuUploaderError[]>([]);\n protected readonly fileItems = signal<NeuUploaderFileItem[]>([]);\n\n private readonly cvaDisabled = signal(false);\n private onChange: (value: File[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n readonly isDisabledFinal = computed(() => this.disabled() || this.cvaDisabled());\n readonly hasError = computed(() => !!this.displayErrorMessage());\n readonly shouldShowProgress = computed(() => this.showProgress() && this.progress() !== null);\n readonly pickerButtonAriaLabel = computed(() =>\n this.showPickerText() && this.chooseLabel() ? null : this.chooseLabel(),\n );\n readonly describedBy = computed(() => {\n if (this.hasError()) {\n return `${this.inputId()}-error`;\n }\n return this.hint() ? `${this.inputId()}-hint` : null;\n });\n readonly headlineText = computed(() =>\n this.isDragOver() && this.dropzone() ? this.dropzoneLabel() : this.chooseLabel(),\n );\n readonly descriptionText = computed(() => {\n const parts: string[] = [this.dropzone() ? this.placeholder() : this.pickerDescription()];\n if (this.accept()) {\n parts.push(`${this.acceptedTypesLabel()}: ${this.accept()}`);\n }\n if (this.maxFileSize() !== null) {\n parts.push(`${this.maxFileSizeTextLabel()}: ${this.formatBytes(this.maxFileSize() ?? 0)}`);\n }\n return parts.join(' · ');\n });\n readonly summaryText = computed(() => {\n const totalSize = this.fileItems().reduce((acc, item) => acc + item.size, 0);\n const fileCount = this.fileItems().length;\n return `${fileCount} ${fileCount === 1 ? this.fileCountSingularLabel() : this.fileCountPluralLabel()} · ${this.formatBytes(totalSize)}`;\n });\n readonly displayErrorMessage = computed(() => {\n if (this.errorMessage()) {\n return this.errorMessage();\n }\n const [first] = this.internalErrors();\n return first?.message ?? '';\n });\n\n writeValue(value: File[] | File | null | undefined): void {\n if (!value) {\n this.fileItems.set([]);\n return;\n }\n\n const files = Array.isArray(value) ? value : [value];\n this.fileItems.set(files.map((file) => this.toItem(file)));\n }\n\n registerOnChange(fn: (value: File[]) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n openFilePicker(): void {\n if (this.isDisabledFinal()) {\n return;\n }\n\n this.onTouched();\n this.fileInput().nativeElement.click();\n }\n\n onDropzoneKey(event: KeyboardEvent): void {\n event.preventDefault();\n this.openFilePicker();\n }\n\n onNativeInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.consumeFiles(input.files);\n input.value = '';\n }\n\n onDragOver(event: DragEvent): void {\n if (!this.dropzone() || this.isDisabledFinal()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(true);\n }\n\n onDragLeave(event: DragEvent): void {\n if (!this.dropzone()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(false);\n }\n\n onDrop(event: DragEvent): void {\n if (!this.dropzone() || this.isDisabledFinal()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(false);\n this.consumeFiles(event.dataTransfer?.files ?? null);\n }\n\n removeFile(id: string, event?: Event): void {\n event?.stopPropagation();\n const current = this.fileItems();\n const match = current.find((item) => item.id === id);\n if (!match) {\n return;\n }\n\n const next = current.filter((item) => item.id !== id);\n this.fileItems.set(next);\n this.internalErrors.set([]);\n this.emitValue(next);\n this.fileRemoved.emit(match.file);\n this.onTouched();\n }\n\n clearFiles(event?: Event): void {\n event?.stopPropagation();\n this.fileItems.set([]);\n this.internalErrors.set([]);\n this.fileInput().nativeElement.value = '';\n this.emitValue([]);\n this.cleared.emit();\n this.onTouched();\n }\n\n formatBytes(bytes: number): string {\n if (bytes === 0) {\n return '0 B';\n }\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const base = 1024;\n const exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(base)), units.length - 1);\n const size = bytes / Math.pow(base, exponent);\n return `${size.toFixed(size >= 10 || exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n }\n\n private consumeFiles(list: FileList | null): void {\n if (!list || list.length === 0) {\n this.reportErrors([\n {\n code: 'empty-selection',\n message: this.emptySelectionMessage(),\n },\n ]);\n return;\n }\n\n this.onTouched();\n const incoming = Array.from(list);\n const current = this.fileItems();\n const nextItems = this.multiple() ? [...current] : [];\n const errors: NeuUploaderError[] = [];\n const existingIds = new Set(nextItems.map((item) => item.id));\n\n for (const file of incoming) {\n if (!this.isAcceptedType(file)) {\n errors.push({\n code: 'accept',\n file,\n message: this.interpolate(this.invalidTypeMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n if (this.maxFileSize() !== null && file.size > (this.maxFileSize() ?? 0)) {\n errors.push({\n code: 'max-file-size',\n file,\n message: this.interpolate(this.maxFileSizeMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n const item = this.toItem(file);\n if (existingIds.has(item.id)) {\n errors.push({\n code: 'duplicate',\n file,\n message: this.interpolate(this.duplicateFileMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n if (this.maxFiles() !== null && nextItems.length >= (this.maxFiles() ?? 0)) {\n errors.push({\n code: 'max-files',\n file,\n message: this.interpolate(this.maxFilesMessage(), {\n maxFiles: String(this.maxFiles() ?? 0),\n }),\n });\n continue;\n }\n\n nextItems.push(item);\n existingIds.add(item.id);\n\n if (!this.multiple()) {\n break;\n }\n }\n\n this.fileItems.set(nextItems);\n this.internalErrors.set(errors);\n this.emitValue(nextItems);\n this.filesSelected.emit(nextItems.map((item) => item.file));\n\n if (errors.length > 0) {\n this.filesRejected.emit(errors);\n }\n }\n\n private emitValue(items: NeuUploaderFileItem[]): void {\n this.onChange(items.map((item) => item.file));\n }\n\n private toItem(file: File): NeuUploaderFileItem {\n return {\n id: this.fileSignature(file),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n progress: this.progress(),\n };\n }\n\n private fileSignature(file: File): string {\n return `${file.name}__${file.size}__${file.lastModified}`;\n }\n\n private reportErrors(errors: NeuUploaderError[]): void {\n this.internalErrors.set(errors);\n this.filesRejected.emit(errors);\n }\n\n private interpolate(template: string, values: Record<string, string>): string {\n return Object.entries(values).reduce(\n (result, [key, value]) => result.replaceAll(`{{${key}}}`, value),\n template,\n );\n }\n\n private isAcceptedType(file: File): boolean {\n const accept = this.accept().trim();\n if (!accept) {\n return true;\n }\n\n const acceptedTypes = accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean);\n\n const fileName = file.name.toLowerCase();\n const mimeType = file.type.toLowerCase();\n\n return acceptedTypes.some((rule) => {\n if (rule.startsWith('.')) {\n return fileName.endsWith(rule);\n }\n\n if (rule.endsWith('/*')) {\n const prefix = rule.slice(0, -1);\n return mimeType.startsWith(prefix);\n }\n\n return mimeType === rule;\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;AAmBA,IAAI,iBAAiB,GAAG,CAAC;MAkLZ,oBAAoB,CAAA;AACtB,IAAA,SAAS,GAAG,SAAS,CAAC,QAAQ,CAA+B,WAAW,CAAC;AAElF,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AACzB,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,2EAAC;AACxB,IAAA,YAAY,GAAG,KAAK,CAAS,EAAE,mFAAC;AAChC,IAAA,WAAW,GAAG,KAAK,CAAS,kDAAkD,kFAAC;AAC/E,IAAA,iBAAiB,GAAG,KAAK,CAAS,wDAAwD,wFAAC;AAC3F,IAAA,aAAa,GAAG,KAAK,CAAS,6BAA6B,oFAAC;AAC5D,IAAA,WAAW,GAAG,KAAK,CAAS,cAAc,kFAAC;AAC3C,IAAA,UAAU,GAAG,KAAK,CAAS,OAAO,iFAAC;AACnC,IAAA,aAAa,GAAG,KAAK,CAAS,oBAAoB,oFAAC;AACnD,IAAA,cAAc,GAAG,KAAK,CAAU,KAAK,qFAAC;AACtC,IAAA,YAAY,GAAG,KAAK,CAAU,IAAI,mFAAC;AACnC,IAAA,aAAa,GAAG,KAAK,CAAS,gBAAgB,oFAAC;AAC/C,IAAA,eAAe,GAAG,KAAK,CAAS,aAAa,sFAAC;AAC9C,IAAA,kBAAkB,GAAG,KAAK,CAAS,eAAe,yFAAC;AACnD,IAAA,oBAAoB,GAAG,KAAK,CAAS,UAAU,2FAAC;AAChD,IAAA,sBAAsB,GAAG,KAAK,CAAS,MAAM,6FAAC;AAC9C,IAAA,oBAAoB,GAAG,KAAK,CAAS,OAAO,2FAAC;AAC7C,IAAA,qBAAqB,GAAG,KAAK,CAAS,uBAAuB,4FAAC;AAC9D,IAAA,kBAAkB,GAAG,KAAK,CAAS,0DAA0D,yFAAC;AAC9F,IAAA,kBAAkB,GAAG,KAAK,CAAS,qDAAqD,yFAAC;AACzF,IAAA,oBAAoB,GAAG,KAAK,CAAS,8CAA8C,2FAAC;AACpF,IAAA,eAAe,GAAG,KAAK,CAAS,+CAA+C,sFAAC;AAChF,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,6EAAC;AAC1B,IAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,+EAAC;AAC/B,IAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,+EAAC;AAC/B,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,IAAI,GAAG,KAAK,CAAkB,IAAI,2EAAC;AACnC,IAAA,QAAQ,GAAG,KAAK,CAAgB,IAAI,+EAAC;AACrC,IAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,kFAAC;AACxC,IAAA,QAAQ,GAAG,KAAK,CAAgB,IAAI,+EAAC;IAE5B,aAAa,GAAG,MAAM,EAAU;IAChC,WAAW,GAAG,MAAM,EAAQ;IAC5B,aAAa,GAAG,MAAM,EAAsB;IAC5C,OAAO,GAAG,MAAM,EAAQ;IAExB,OAAO,GAAG,KAAK,CAAS,CAAA,aAAA,EAAgB,EAAE,iBAAiB,CAAA,CAAE,8EAAC;AAEpD,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;AAC1B,IAAA,cAAc,GAAG,MAAM,CAAqB,EAAE,qFAAC;AAC/C,IAAA,SAAS,GAAG,MAAM,CAAwB,EAAE,gFAAC;AAE/C,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,kFAAC;AACpC,IAAA,QAAQ,GAA4B,MAAK,EAAE,CAAC;AAC5C,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAE/B,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,sFAAC;AACvE,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE,+EAAC;AACvD,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,yFAAC;IACpF,qBAAqB,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACxE;AACQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ;QAClC;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,EAAE,CAAA,KAAA,CAAO,GAAG,IAAI;AACtD,IAAA,CAAC,kFAAC;AACO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAC/B,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,mFACjF;AACQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;QACvC,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACzF,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjB,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,EAAE,CAAA,CAAE,CAAC;QAC9D;AACA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YAC/B,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA,EAAA,EAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAA,CAAE,CAAC;QAC5F;AACA,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1B,IAAA,CAAC,sFAAC;AACO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM;AACzC,QAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,SAAS,KAAK,CAAC,GAAG,IAAI,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA,GAAA,EAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA,CAAE;AACzI,IAAA,CAAC,kFAAC;AACO,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AAC3C,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACvB,YAAA,OAAO,IAAI,CAAC,YAAY,EAAE;QAC5B;QACA,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE;AACrC,QAAA,OAAO,KAAK,EAAE,OAAO,IAAI,EAAE;AAC7B,IAAA,CAAC,0FAAC;AAEF,IAAA,UAAU,CAAC,KAAuC,EAAA;QAChD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB;QACF;AAEA,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D;AAEA,IAAA,gBAAgB,CAAC,EAA2B,EAAA;AAC1C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;IAClC;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC1B;QACF;QAEA,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;IACxC;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;QAChC,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,cAAc,EAAE;IACvB;AAEA,IAAA,mBAAmB,CAAC,KAAY,EAAA;AAC9B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;AAC9B,QAAA,KAAK,CAAC,KAAK,GAAG,EAAE;IAClB;AAEA,IAAA,UAAU,CAAC,KAAgB,EAAA;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC9C;QACF;QACA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;AAEA,IAAA,WAAW,CAAC,KAAgB,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB;QACF;QACA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;AAEA,IAAA,MAAM,CAAC,KAAgB,EAAA;QACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC9C;QACF;QACA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,IAAI,CAAC;IACtD;IAEA,UAAU,CAAC,EAAU,EAAE,KAAa,EAAA;QAClC,KAAK,EAAE,eAAe,EAAE;AACxB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE;AAChC,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,KAAK,EAAE,eAAe,EAAE;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE;AACzC,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACnB,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI;AACjB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACzF,QAAA,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC7C,OAAO,CAAA,EAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,IAAI,QAAQ,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAC,CAAA,CAAE;IACnF;AAEQ,IAAA,YAAY,CAAC,IAAqB,EAAA;QACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,YAAY,CAAC;AAChB,gBAAA;AACE,oBAAA,IAAI,EAAE,iBAAiB;AACvB,oBAAA,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE;AACtC,iBAAA;AACF,aAAA,CAAC;YACF;QACF;QAEA,IAAI,CAAC,SAAS,EAAE;QAChB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE;AAChC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE;QACrD,MAAM,MAAM,GAAuB,EAAE;AACrC,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;AAE7D,QAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;gBAC9B,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,QAAQ;oBACd,IAAI;AACJ,oBAAA,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAC9E,iBAAA,CAAC;gBACF;YACF;YAEA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE;gBACxE,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,eAAe;oBACrB,IAAI;AACJ,oBAAA,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAC9E,iBAAA,CAAC;gBACF;YACF;YAEA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAC9B,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAC5B,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,WAAW;oBACjB,IAAI;AACJ,oBAAA,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAChF,iBAAA,CAAC;gBACF;YACF;YAEA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE;gBAC1E,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,WAAW;oBACjB,IAAI;oBACJ,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;wBAChD,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;qBACvC,CAAC;AACH,iBAAA,CAAC;gBACF;YACF;AAEA,YAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACpB,YAAA,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAExB,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACpB;YACF;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;AAE3D,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;QACjC;IACF;AAEQ,IAAA,SAAS,CAAC,KAA4B,EAAA;AAC5C,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C;AAEQ,IAAA,MAAM,CAAC,IAAU,EAAA;QACvB,OAAO;AACL,YAAA,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAC5B,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC1B;IACH;AAEQ,IAAA,aAAa,CAAC,IAAU,EAAA;AAC9B,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,EAAA,EAAK,IAAI,CAAC,IAAI,CAAA,EAAA,EAAK,IAAI,CAAC,YAAY,EAAE;IAC3D;AAEQ,IAAA,YAAY,CAAC,MAA0B,EAAA;AAC7C,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;IACjC;IAEQ,WAAW,CAAC,QAAgB,EAAE,MAA8B,EAAA;AAClE,QAAA,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAClC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,MAAM,CAAC,UAAU,CAAC,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,CAAI,EAAE,KAAK,CAAC,EAChE,QAAQ,CACT;IACH;AAEQ,IAAA,cAAc,CAAC,IAAU,EAAA;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;QACnC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,aAAa,GAAG;aACnB,KAAK,CAAC,GAAG;AACT,aAAA,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;aACvC,MAAM,CAAC,OAAO,CAAC;QAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAExC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;AACjC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACxB,gBAAA,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChC;AAEA,YAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBACvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChC,gBAAA,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;YACpC;YAEA,OAAO,QAAQ,KAAK,IAAI;AAC1B,QAAA,CAAC,CAAC;IACJ;uGArUW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,6BAAA,EAAA,mBAAA,EAAA,6BAAA,EAAA,mBAAA,EAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,EAAA,SAAA,EA3KpB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,oBAAoB,CAAC;AACnD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAMS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4JT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,g4KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA3KS,kBAAkB,wMAAE,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,WAAA,EAAA,eAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FA8K1C,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAhLhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,OAAA,EACf,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,EAAA,aAAA,EACvC,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,0BAA0B,CAAC;AACnD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,IAAA,EACK;AACJ,wBAAA,KAAK,EAAE,mBAAmB;AAC1B,wBAAA,+BAA+B,EAAE,iBAAiB;AAClD,wBAAA,+BAA+B,EAAE,iBAAiB;qBACnD,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4JT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,g4KAAA,CAAA,EAAA;uEAIqE,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACtMnF;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"neural-ui-core-uploader.mjs","sources":["../../../../projects/ui-core/uploader/neu-uploader.component.ts","../../../../projects/ui-core/uploader/neural-ui-core-uploader.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\nimport { NeuProgressBarComponent } from '@neural-ui/core/progress-bar';\nimport type { NeuUploaderError, NeuUploaderFileItem, NeuUploaderSize } from './neu-uploader.types';\n\nexport type { NeuUploaderError, NeuUploaderFileItem, NeuUploaderSize } from './neu-uploader.types';\n\nlet _neuUploaderIdSeq = 0;\n\n@Component({\n selector: 'neu-uploader',\n imports: [NeuButtonComponent, NeuProgressBarComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuUploaderComponent),\n multi: true,\n },\n ],\n host: {\n class: 'neu-uploader-host',\n '[class.neu-uploader-host--sm]': 'size() === \"sm\"',\n '[class.neu-uploader-host--lg]': 'size() === \"lg\"',\n },\n template: `\n @if (label()) {\n <label class=\"neu-uploader__label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n\n <input\n #fileInput\n class=\"neu-uploader__native-input\"\n [id]=\"inputId()\"\n type=\"file\"\n [attr.accept]=\"accept() || null\"\n [attr.multiple]=\"multiple() ? '' : null\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n (change)=\"onNativeInputChange($event)\"\n />\n\n <div\n class=\"neu-uploader\"\n [class.neu-uploader--disabled]=\"isDisabledFinal()\"\n [class.neu-uploader--drag-over]=\"isDragOver()\"\n [class.neu-uploader--error]=\"hasError()\"\n [class.neu-uploader--has-files]=\"fileItems().length > 0\"\n [class.neu-uploader--picker-only]=\"!dropzone()\"\n >\n @if (dropzone()) {\n <div\n class=\"neu-uploader__dropzone\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div class=\"neu-uploader__empty-icon\" aria-hidden=\"true\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n </div>\n\n <div class=\"neu-uploader__copy\">\n <p class=\"neu-uploader__headline\">{{ headlineText() }}</p>\n <p class=\"neu-uploader__description\">{{ descriptionText() }}</p>\n </div>\n\n <div class=\"neu-uploader__actions\">\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n size=\"sm\"\n (click)=\"openFilePicker(); $event.stopPropagation()\"\n >\n {{ chooseLabel() }}\n </button>\n @if (fileItems().length > 0) {\n <button\n neu-button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n (click)=\"clearFiles($event)\"\n >\n {{ clearLabel() }}\n </button>\n }\n </div>\n </div>\n } @else {\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n size=\"sm\"\n icon=\"lucideUpload\"\n class=\"neu-uploader__picker-trigger\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-label]=\"pickerButtonAriaLabel()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n >\n @if (showPickerText() && chooseLabel()) {\n {{ chooseLabel() }}\n }\n </button>\n }\n\n @if (shouldShowProgress()) {\n <div class=\"neu-uploader__progress\">\n <neu-progress-bar\n [value]=\"progress() ?? 0\"\n [label]=\"progressLabel()\"\n [showValue]=\"true\"\n size=\"sm\"\n />\n </div>\n }\n\n @if (fileItems().length > 0) {\n <div class=\"neu-uploader__summary\">\n <span>{{ summaryText() }}</span>\n @if (maxFiles() !== null) {\n <span>{{ fileItems().length }}/{{ maxFiles() }}</span>\n }\n </div>\n\n <ul class=\"neu-uploader__list\" [attr.aria-label]=\"listAriaLabel()\">\n @for (item of fileItems(); track item.id) {\n <li class=\"neu-uploader__item\">\n <div class=\"neu-uploader__item-main\">\n <span class=\"neu-uploader__item-name\">{{ item.name }}</span>\n <span class=\"neu-uploader__item-meta\">{{ formatBytes(item.size) }}</span>\n </div>\n <button\n class=\"neu-uploader__remove\"\n type=\"button\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-label]=\"removeAriaLabel() + ' ' + item.name\"\n (click)=\"removeFile(item.id, $event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </li>\n }\n </ul>\n }\n </div>\n\n @if (hasError()) {\n <p class=\"neu-uploader__error\" [id]=\"inputId() + '-error'\" role=\"alert\">\n {{ displayErrorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-uploader__hint\" [id]=\"inputId() + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-uploader.component.scss',\n})\nexport class NeuUploaderComponent implements ControlValueAccessor {\n readonly fileInput = viewChild.required<ElementRef<HTMLInputElement>>('fileInput');\n\n label = input<string>('');\n hint = input<string>('');\n errorMessage = input<string>('');\n placeholder = input<string>('Drag files here or select them from your device.');\n pickerDescription = input<string>('Use the button below to choose files from your device.');\n dropzoneLabel = input<string>('Drop files here to add them');\n chooseLabel = input<string>('Choose files');\n clearLabel = input<string>('Clear');\n progressLabel = input<string>('Upload in progress');\n showPickerText = input<boolean>(false);\n showProgress = input<boolean>(true);\n listAriaLabel = input<string>('Selected files');\n removeAriaLabel = input<string>('Remove file');\n acceptedTypesLabel = input<string>('Allowed types');\n maxFileSizeTextLabel = input<string>('Max size');\n fileCountSingularLabel = input<string>('file');\n fileCountPluralLabel = input<string>('files');\n emptySelectionMessage = input<string>('No file was selected.');\n invalidTypeMessage = input<string>('File {{fileName}} does not match the allowed file types.');\n maxFileSizeMessage = input<string>('File {{fileName}} exceeds the allowed maximum size.');\n duplicateFileMessage = input<string>('File {{fileName}} has already been selected.');\n maxFilesMessage = input<string>('You can only select up to {{maxFiles}} files.');\n accept = input<string>('');\n multiple = input<boolean>(true);\n dropzone = input<boolean>(true);\n disabled = input<boolean>(false);\n size = input<NeuUploaderSize>('md');\n maxFiles = input<number | null>(null);\n maxFileSize = input<number | null>(null);\n progress = input<number | null>(null);\n\n readonly filesSelected = output<File[]>();\n readonly fileRemoved = output<File>();\n readonly filesRejected = output<NeuUploaderError[]>();\n readonly cleared = output<void>();\n\n readonly inputId = input<string>(`neu-uploader-${++_neuUploaderIdSeq}`);\n\n protected readonly isDragOver = signal(false);\n protected readonly internalErrors = signal<NeuUploaderError[]>([]);\n protected readonly fileItems = signal<NeuUploaderFileItem[]>([]);\n\n private readonly cvaDisabled = signal(false);\n private onChange: (value: File[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n readonly isDisabledFinal = computed(() => this.disabled() || this.cvaDisabled());\n readonly hasError = computed(() => !!this.displayErrorMessage());\n readonly shouldShowProgress = computed(() => this.showProgress() && this.progress() !== null);\n readonly pickerButtonAriaLabel = computed(() =>\n this.showPickerText() && this.chooseLabel() ? null : this.chooseLabel(),\n );\n readonly describedBy = computed(() => {\n if (this.hasError()) {\n return `${this.inputId()}-error`;\n }\n return this.hint() ? `${this.inputId()}-hint` : null;\n });\n readonly headlineText = computed(() =>\n this.isDragOver() && this.dropzone() ? this.dropzoneLabel() : this.chooseLabel(),\n );\n readonly descriptionText = computed(() => {\n const parts: string[] = [this.dropzone() ? this.placeholder() : this.pickerDescription()];\n if (this.accept()) {\n parts.push(`${this.acceptedTypesLabel()}: ${this.accept()}`);\n }\n if (this.maxFileSize() !== null) {\n parts.push(`${this.maxFileSizeTextLabel()}: ${this.formatBytes(this.maxFileSize() ?? 0)}`);\n }\n return parts.join(' · ');\n });\n readonly summaryText = computed(() => {\n const totalSize = this.fileItems().reduce((acc, item) => acc + item.size, 0);\n const fileCount = this.fileItems().length;\n return `${fileCount} ${fileCount === 1 ? this.fileCountSingularLabel() : this.fileCountPluralLabel()} · ${this.formatBytes(totalSize)}`;\n });\n readonly displayErrorMessage = computed(() => {\n if (this.errorMessage()) {\n return this.errorMessage();\n }\n const [first] = this.internalErrors();\n return first?.message ?? '';\n });\n\n writeValue(value: File[] | File | null | undefined): void {\n if (!value) {\n this.fileItems.set([]);\n return;\n }\n\n const files = Array.isArray(value) ? value : [value];\n this.fileItems.set(files.map((file) => this.toItem(file)));\n }\n\n registerOnChange(fn: (value: File[]) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n openFilePicker(): void {\n if (this.isDisabledFinal()) {\n return;\n }\n\n this.onTouched();\n this.fileInput().nativeElement.click();\n }\n\n onDropzoneKey(event: KeyboardEvent): void {\n event.preventDefault();\n this.openFilePicker();\n }\n\n onNativeInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.consumeFiles(input.files);\n input.value = '';\n }\n\n onDragOver(event: DragEvent): void {\n if (!this.dropzone() || this.isDisabledFinal()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(true);\n }\n\n onDragLeave(event: DragEvent): void {\n if (!this.dropzone()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(false);\n }\n\n onDrop(event: DragEvent): void {\n if (!this.dropzone() || this.isDisabledFinal()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(false);\n this.consumeFiles(event.dataTransfer?.files ?? null);\n }\n\n removeFile(id: string, event?: Event): void {\n event?.stopPropagation();\n const current = this.fileItems();\n const match = current.find((item) => item.id === id);\n if (!match) {\n return;\n }\n\n const next = current.filter((item) => item.id !== id);\n this.fileItems.set(next);\n this.internalErrors.set([]);\n this.emitValue(next);\n this.fileRemoved.emit(match.file);\n this.onTouched();\n }\n\n clearFiles(event?: Event): void {\n event?.stopPropagation();\n this.fileItems.set([]);\n this.internalErrors.set([]);\n this.fileInput().nativeElement.value = '';\n this.emitValue([]);\n this.cleared.emit();\n this.onTouched();\n }\n\n formatBytes(bytes: number): string {\n if (bytes === 0) {\n return '0 B';\n }\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const base = 1024;\n const exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(base)), units.length - 1);\n const size = bytes / Math.pow(base, exponent);\n return `${size.toFixed(size >= 10 || exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n }\n\n private consumeFiles(list: FileList | null): void {\n if (!list || list.length === 0) {\n this.reportErrors([\n {\n code: 'empty-selection',\n message: this.emptySelectionMessage(),\n },\n ]);\n return;\n }\n\n this.onTouched();\n const incoming = Array.from(list);\n const current = this.fileItems();\n const nextItems = this.multiple() ? [...current] : [];\n const errors: NeuUploaderError[] = [];\n const existingIds = new Set(nextItems.map((item) => item.id));\n\n for (const file of incoming) {\n if (!this.isAcceptedType(file)) {\n errors.push({\n code: 'accept',\n file,\n message: this.interpolate(this.invalidTypeMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n if (this.maxFileSize() !== null && file.size > (this.maxFileSize() ?? 0)) {\n errors.push({\n code: 'max-file-size',\n file,\n message: this.interpolate(this.maxFileSizeMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n const item = this.toItem(file);\n if (existingIds.has(item.id)) {\n errors.push({\n code: 'duplicate',\n file,\n message: this.interpolate(this.duplicateFileMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n if (this.maxFiles() !== null && nextItems.length >= (this.maxFiles() ?? 0)) {\n errors.push({\n code: 'max-files',\n file,\n message: this.interpolate(this.maxFilesMessage(), {\n maxFiles: String(this.maxFiles() ?? 0),\n }),\n });\n continue;\n }\n\n nextItems.push(item);\n existingIds.add(item.id);\n\n if (!this.multiple()) {\n break;\n }\n }\n\n this.fileItems.set(nextItems);\n this.internalErrors.set(errors);\n this.emitValue(nextItems);\n this.filesSelected.emit(nextItems.map((item) => item.file));\n\n if (errors.length > 0) {\n this.filesRejected.emit(errors);\n }\n }\n\n private emitValue(items: NeuUploaderFileItem[]): void {\n this.onChange(items.map((item) => item.file));\n }\n\n private toItem(file: File): NeuUploaderFileItem {\n return {\n id: this.fileSignature(file),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n progress: this.progress(),\n };\n }\n\n private fileSignature(file: File): string {\n return `${file.name}__${file.size}__${file.lastModified}`;\n }\n\n private reportErrors(errors: NeuUploaderError[]): void {\n this.internalErrors.set(errors);\n this.filesRejected.emit(errors);\n }\n\n private interpolate(template: string, values: Record<string, string>): string {\n return Object.entries(values).reduce(\n (result, [key, value]) => result.replaceAll(`{{${key}}}`, value),\n template,\n );\n }\n\n private isAcceptedType(file: File): boolean {\n const accept = this.accept().trim();\n if (!accept) {\n return true;\n }\n\n const acceptedTypes = accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean);\n\n const fileName = file.name.toLowerCase();\n const mimeType = file.type.toLowerCase();\n\n return acceptedTypes.some((rule) => {\n if (rule.startsWith('.')) {\n return fileName.endsWith(rule);\n }\n\n if (rule.endsWith('/*')) {\n const prefix = rule.slice(0, -1);\n return mimeType.startsWith(prefix);\n }\n\n return mimeType === rule;\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -23,7 +23,8 @@ class NeuUrlStateService {
|
|
|
23
23
|
_pendingParams = {};
|
|
24
24
|
_pendingReplaceUrl = true;
|
|
25
25
|
_batchScheduled = false;
|
|
26
|
-
_pendingParamsState = signal({},
|
|
26
|
+
_pendingParamsState = signal({}, /* @ts-ignore */
|
|
27
|
+
...(ngDevMode ? [{ debugName: "_pendingParamsState" }] : /* istanbul ignore next */ []));
|
|
27
28
|
_routerParams;
|
|
28
29
|
/**
|
|
29
30
|
* Signal con el mapa completo de queryParams actual.
|
|
@@ -52,7 +53,8 @@ class NeuUrlStateService {
|
|
|
52
53
|
mergedParams[key] = value;
|
|
53
54
|
}
|
|
54
55
|
return mergedParams;
|
|
55
|
-
},
|
|
56
|
+
}, /* @ts-ignore */
|
|
57
|
+
...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
|
|
56
58
|
}
|
|
57
59
|
/**
|
|
58
60
|
* Devuelve un Signal reactivo con el valor del parámetro indicado.
|
|
@@ -160,10 +162,10 @@ class NeuUrlStateService {
|
|
|
160
162
|
replaceUrl,
|
|
161
163
|
});
|
|
162
164
|
}
|
|
163
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
164
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
165
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuUrlStateService, deps: [{ token: i0.Injector }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
166
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuUrlStateService, providedIn: 'root' });
|
|
165
167
|
}
|
|
166
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
168
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuUrlStateService, decorators: [{
|
|
167
169
|
type: Injectable,
|
|
168
170
|
args: [{ providedIn: 'root' }]
|
|
169
171
|
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-url-state.mjs","sources":["../../../../projects/ui-core/url-state/neu-url-state.service.ts","../../../../projects/ui-core/url-state/neural-ui-core-url-state.ts"],"sourcesContent":["import { Injectable, Injector, Signal, computed, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Params, Router } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs/operators';\n\n/**\n * NeuUrlStateService — El Sistema Nervioso de NeuralUI\n *\n * Sincroniza el estado de la UI con los QueryParams de la URL.\n * Completamente reactivo via Angular Signals.\n *\n * Uso:\n * const urlState = inject(NeuUrlStateService);\n * const page = urlState.getParam('page'); // Signal<string | null>\n * urlState.setParam('menu', 'open'); // Actualiza ?menu=open\n * urlState.patchParams({ page: '2', q: 'filter' }); // Actualiza múltiples\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuUrlStateService {\n private _pendingParams: Record<string, string | null> = {};\n private _pendingReplaceUrl = true;\n private _batchScheduled = false;\n private readonly _pendingParamsState = signal<Record<string, string | null>>({});\n private readonly _routerParams: Signal<Params>;\n\n /**\n * Signal con el mapa completo de queryParams actual.\n * Se actualiza automáticamente en cada NavigationEnd.\n */\n readonly params: Signal<Params>;\n\n constructor(\n private readonly injector: Injector,\n private readonly router: Router,\n ) {\n this._routerParams = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n startWith(null as null),\n map(() => this.router.parseUrl(this.router.url).queryParams as Params),\n ),\n {\n initialValue: this.router.parseUrl(this.router.url).queryParams as Params,\n injector: this.injector,\n },\n );\n\n this.params = computed(() => {\n const currentParams = this._routerParams();\n const pendingParams = this._pendingParamsState();\n if (Object.keys(pendingParams).length === 0) {\n return currentParams;\n }\n\n const mergedParams: Params = { ...currentParams };\n for (const [key, value] of Object.entries(pendingParams)) {\n if (value === null) {\n delete mergedParams[key];\n continue;\n }\n mergedParams[key] = value;\n }\n\n return mergedParams;\n });\n }\n\n /**\n * Devuelve un Signal reactivo con el valor del parámetro indicado.\n * Memorizar el resultado: no llamar en bucle pues crea un computed nuevo c/vez.\n *\n * @example\n * readonly menuOpen = computed(() => this.urlState.getParam('menu')() === 'open');\n */\n getParam(key: string): Signal<string | null> {\n return computed(() => (this.params()[key] as string | undefined) ?? null);\n }\n\n /**\n * Establece un único queryParam en la URL.\n *\n * @param key Nombre del parámetro\n * @param value Valor. Pasar `null` para eliminarlo de la URL.\n * @param replaceUrl Si true (default) usa replaceState — no ensucia el historial.\n * Pasar false para acciones que el usuario debe poder deshacer con Atrás.\n */\n setParam(key: string, value: string | null, replaceUrl = true): void {\n this._pendingParams[key] = value;\n this._pendingParamsState.set({ ...this._pendingParams });\n this._pendingReplaceUrl = this._pendingReplaceUrl && replaceUrl;\n this._schedulePendingNavigation();\n }\n\n private _schedulePendingNavigation(): void {\n if (this._batchScheduled) {\n return;\n }\n\n this._batchScheduled = true;\n queueMicrotask(() => {\n const pending = this._consumePendingNavigation();\n if (!pending) {\n return;\n }\n\n void this.router\n .navigate([], {\n queryParams: pending.params,\n queryParamsHandling: 'merge',\n replaceUrl: pending.replaceUrl,\n })\n .finally(() => this._finalizePendingNavigation(pending.params));\n });\n }\n\n private _consumePendingNavigation(): {\n params: Record<string, string | null>;\n replaceUrl: boolean;\n } | null {\n const hasPendingParams = Object.keys(this._pendingParams).length > 0;\n const replaceUrl = this._pendingReplaceUrl;\n const params = { ...this._pendingParams };\n\n this._pendingParams = {};\n this._pendingParamsState.set({});\n this._pendingReplaceUrl = true;\n this._batchScheduled = false;\n\n if (!hasPendingParams) {\n return null;\n }\n\n return { params, replaceUrl };\n }\n\n private _resetPendingNavigation(): void {\n this._pendingParams = {};\n this._pendingParamsState.set({});\n this._pendingReplaceUrl = true;\n this._batchScheduled = false;\n }\n\n private _finalizePendingNavigation(flushedParams: Record<string, string | null>): void {\n const currentVisiblePending = { ...this._pendingParamsState() };\n let changed = false;\n\n for (const [key, value] of Object.entries(flushedParams)) {\n if (Object.prototype.hasOwnProperty.call(this._pendingParams, key)) {\n continue;\n }\n\n if (currentVisiblePending[key] === value) {\n delete currentVisiblePending[key];\n changed = true;\n }\n }\n\n if (changed) {\n this._pendingParamsState.set(currentVisiblePending);\n }\n }\n\n /**\n * Actualiza múltiples queryParams en una sola navegación.\n *\n * @example\n * urlState.patchParams({ page: '1', q: 'Angular' });\n */\n patchParams(params: Record<string, string | null>, replaceUrl = true): void {\n const pending = this._consumePendingNavigation();\n const mergedParams = pending ? { ...pending.params, ...params } : params;\n this._pendingParamsState.set({ ...this._pendingParamsState(), ...mergedParams });\n void this.router\n .navigate([], {\n queryParams: mergedParams,\n queryParamsHandling: 'merge',\n replaceUrl: pending ? pending.replaceUrl && replaceUrl : replaceUrl,\n })\n .finally(() => this._finalizePendingNavigation(mergedParams));\n }\n\n /**\n * Elimina todos los queryParams de la URL de una vez.\n */\n clearParams(replaceUrl = true): void {\n this._resetPendingNavigation();\n void this.router.navigate([], {\n queryParams: {},\n replaceUrl,\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"neural-ui-core-url-state.mjs","sources":["../../../../projects/ui-core/url-state/neu-url-state.service.ts","../../../../projects/ui-core/url-state/neural-ui-core-url-state.ts"],"sourcesContent":["import { Injectable, Injector, Signal, computed, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Params, Router } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs/operators';\n\n/**\n * NeuUrlStateService — El Sistema Nervioso de NeuralUI\n *\n * Sincroniza el estado de la UI con los QueryParams de la URL.\n * Completamente reactivo via Angular Signals.\n *\n * Uso:\n * const urlState = inject(NeuUrlStateService);\n * const page = urlState.getParam('page'); // Signal<string | null>\n * urlState.setParam('menu', 'open'); // Actualiza ?menu=open\n * urlState.patchParams({ page: '2', q: 'filter' }); // Actualiza múltiples\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuUrlStateService {\n private _pendingParams: Record<string, string | null> = {};\n private _pendingReplaceUrl = true;\n private _batchScheduled = false;\n private readonly _pendingParamsState = signal<Record<string, string | null>>({});\n private readonly _routerParams: Signal<Params>;\n\n /**\n * Signal con el mapa completo de queryParams actual.\n * Se actualiza automáticamente en cada NavigationEnd.\n */\n readonly params: Signal<Params>;\n\n constructor(\n private readonly injector: Injector,\n private readonly router: Router,\n ) {\n this._routerParams = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n startWith(null as null),\n map(() => this.router.parseUrl(this.router.url).queryParams as Params),\n ),\n {\n initialValue: this.router.parseUrl(this.router.url).queryParams as Params,\n injector: this.injector,\n },\n );\n\n this.params = computed(() => {\n const currentParams = this._routerParams();\n const pendingParams = this._pendingParamsState();\n if (Object.keys(pendingParams).length === 0) {\n return currentParams;\n }\n\n const mergedParams: Params = { ...currentParams };\n for (const [key, value] of Object.entries(pendingParams)) {\n if (value === null) {\n delete mergedParams[key];\n continue;\n }\n mergedParams[key] = value;\n }\n\n return mergedParams;\n });\n }\n\n /**\n * Devuelve un Signal reactivo con el valor del parámetro indicado.\n * Memorizar el resultado: no llamar en bucle pues crea un computed nuevo c/vez.\n *\n * @example\n * readonly menuOpen = computed(() => this.urlState.getParam('menu')() === 'open');\n */\n getParam(key: string): Signal<string | null> {\n return computed(() => (this.params()[key] as string | undefined) ?? null);\n }\n\n /**\n * Establece un único queryParam en la URL.\n *\n * @param key Nombre del parámetro\n * @param value Valor. Pasar `null` para eliminarlo de la URL.\n * @param replaceUrl Si true (default) usa replaceState — no ensucia el historial.\n * Pasar false para acciones que el usuario debe poder deshacer con Atrás.\n */\n setParam(key: string, value: string | null, replaceUrl = true): void {\n this._pendingParams[key] = value;\n this._pendingParamsState.set({ ...this._pendingParams });\n this._pendingReplaceUrl = this._pendingReplaceUrl && replaceUrl;\n this._schedulePendingNavigation();\n }\n\n private _schedulePendingNavigation(): void {\n if (this._batchScheduled) {\n return;\n }\n\n this._batchScheduled = true;\n queueMicrotask(() => {\n const pending = this._consumePendingNavigation();\n if (!pending) {\n return;\n }\n\n void this.router\n .navigate([], {\n queryParams: pending.params,\n queryParamsHandling: 'merge',\n replaceUrl: pending.replaceUrl,\n })\n .finally(() => this._finalizePendingNavigation(pending.params));\n });\n }\n\n private _consumePendingNavigation(): {\n params: Record<string, string | null>;\n replaceUrl: boolean;\n } | null {\n const hasPendingParams = Object.keys(this._pendingParams).length > 0;\n const replaceUrl = this._pendingReplaceUrl;\n const params = { ...this._pendingParams };\n\n this._pendingParams = {};\n this._pendingParamsState.set({});\n this._pendingReplaceUrl = true;\n this._batchScheduled = false;\n\n if (!hasPendingParams) {\n return null;\n }\n\n return { params, replaceUrl };\n }\n\n private _resetPendingNavigation(): void {\n this._pendingParams = {};\n this._pendingParamsState.set({});\n this._pendingReplaceUrl = true;\n this._batchScheduled = false;\n }\n\n private _finalizePendingNavigation(flushedParams: Record<string, string | null>): void {\n const currentVisiblePending = { ...this._pendingParamsState() };\n let changed = false;\n\n for (const [key, value] of Object.entries(flushedParams)) {\n if (Object.prototype.hasOwnProperty.call(this._pendingParams, key)) {\n continue;\n }\n\n if (currentVisiblePending[key] === value) {\n delete currentVisiblePending[key];\n changed = true;\n }\n }\n\n if (changed) {\n this._pendingParamsState.set(currentVisiblePending);\n }\n }\n\n /**\n * Actualiza múltiples queryParams en una sola navegación.\n *\n * @example\n * urlState.patchParams({ page: '1', q: 'Angular' });\n */\n patchParams(params: Record<string, string | null>, replaceUrl = true): void {\n const pending = this._consumePendingNavigation();\n const mergedParams = pending ? { ...pending.params, ...params } : params;\n this._pendingParamsState.set({ ...this._pendingParamsState(), ...mergedParams });\n void this.router\n .navigate([], {\n queryParams: mergedParams,\n queryParamsHandling: 'merge',\n replaceUrl: pending ? pending.replaceUrl && replaceUrl : replaceUrl,\n })\n .finally(() => this._finalizePendingNavigation(mergedParams));\n }\n\n /**\n * Elimina todos los queryParams de la URL de una vez.\n */\n clearParams(replaceUrl = true): void {\n this._resetPendingNavigation();\n void this.router.navigate([], {\n queryParams: {},\n replaceUrl,\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|