ng-primitives 0.91.2 → 0.92.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ng-primitives-file-upload.mjs +202 -196
- package/fesm2022/ng-primitives-file-upload.mjs.map +1 -1
- package/fesm2022/ng-primitives-form-field.mjs +13 -47
- package/fesm2022/ng-primitives-form-field.mjs.map +1 -1
- package/fesm2022/ng-primitives-menu.mjs.map +1 -1
- package/fesm2022/ng-primitives-portal.mjs +5 -1
- package/fesm2022/ng-primitives-portal.mjs.map +1 -1
- package/fesm2022/ng-primitives-state.mjs +9 -4
- package/fesm2022/ng-primitives-state.mjs.map +1 -1
- package/fesm2022/ng-primitives-utils.mjs +23 -14
- package/fesm2022/ng-primitives-utils.mjs.map +1 -1
- package/file-upload/index.d.ts +82 -52
- package/package.json +1 -1
- package/state/index.d.ts +2 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { coerceStringArray } from '@angular/cdk/coercion';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { signal, input, booleanAttribute, output, Directive, inject, DOCUMENT } from '@angular/core';
|
|
4
4
|
import { ngpHoverInteraction, ngpInteractions } from 'ng-primitives/interactions';
|
|
5
|
-
import {
|
|
5
|
+
import { injectElementRef } from 'ng-primitives/internal';
|
|
6
|
+
import { createPrimitive, dataBinding, listener } from 'ng-primitives/state';
|
|
7
|
+
import { Subject } from 'rxjs';
|
|
6
8
|
|
|
7
9
|
function fileDropFilter(fileList, acceptedTypes, multiple) {
|
|
8
10
|
const validFiles = Array.from(fileList).filter(file => isFileTypeAccepted(file, acceptedTypes));
|
|
@@ -33,32 +35,91 @@ function filesToFileList(files) {
|
|
|
33
35
|
return dataTransfer.files;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
38
|
+
const [NgpFileDropzoneStateToken, ngpFileDropzone, injectFileDropzoneState, provideFileDropzoneState,] = createPrimitive('NgpFileDropzone', ({ fileTypes, multiple, directory, disabled, onSelected, onRejected, onDragOver, }) => {
|
|
39
|
+
const element = injectElementRef();
|
|
40
|
+
const isDragOverState = signal(false, ...(ngDevMode ? [{ debugName: "isDragOverState" }] : []));
|
|
41
|
+
// Create observables
|
|
42
|
+
const selectedSubject = new Subject();
|
|
43
|
+
const rejectedSubject = new Subject();
|
|
44
|
+
const dragOverSubject = new Subject();
|
|
45
|
+
// Host bindings
|
|
46
|
+
dataBinding(element, 'data-dragover', () => (isDragOverState() ? '' : null));
|
|
47
|
+
dataBinding(element, 'data-disabled', () => (disabled?.() ? '' : null));
|
|
48
|
+
function onDragEnter(event) {
|
|
49
|
+
if (disabled?.()) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
event.stopPropagation();
|
|
54
|
+
isDragOverState.set(true);
|
|
55
|
+
dragOverSubject.next(true);
|
|
56
|
+
onDragOver?.(true);
|
|
57
|
+
}
|
|
58
|
+
function onDragOverHandler(event) {
|
|
59
|
+
if (disabled?.()) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
event.stopPropagation();
|
|
63
|
+
event.preventDefault();
|
|
64
|
+
isDragOverState.set(true);
|
|
65
|
+
}
|
|
66
|
+
function onDragLeave(event) {
|
|
67
|
+
if (disabled?.() || !isDragOverState()) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// if the element we are dragging over is a child of the file dropzone, ignore the event
|
|
71
|
+
if (element.nativeElement.contains(event.relatedTarget)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
event.preventDefault();
|
|
75
|
+
event.stopPropagation();
|
|
76
|
+
isDragOverState.set(false);
|
|
77
|
+
dragOverSubject.next(false);
|
|
78
|
+
onDragOver?.(false);
|
|
79
|
+
}
|
|
80
|
+
function onDrop(event) {
|
|
81
|
+
if (disabled?.()) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
isDragOverState.set(false);
|
|
86
|
+
dragOverSubject.next(false);
|
|
87
|
+
onDragOver?.(false);
|
|
88
|
+
const fileList = event.dataTransfer?.files;
|
|
89
|
+
if (fileList) {
|
|
90
|
+
const filteredFiles = fileDropFilter(fileList, fileTypes?.(), multiple?.() ?? false);
|
|
91
|
+
if (filteredFiles) {
|
|
92
|
+
selectedSubject.next(filteredFiles);
|
|
93
|
+
onSelected?.(filteredFiles);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
rejectedSubject.next();
|
|
97
|
+
onRejected?.();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Event listeners
|
|
102
|
+
listener(element, 'dragenter', onDragEnter);
|
|
103
|
+
listener(element, 'dragover', onDragOverHandler);
|
|
104
|
+
listener(element, 'dragleave', onDragLeave);
|
|
105
|
+
listener(element, 'drop', onDrop);
|
|
106
|
+
return {
|
|
107
|
+
disabled,
|
|
108
|
+
fileTypes,
|
|
109
|
+
multiple,
|
|
110
|
+
directory,
|
|
111
|
+
isDragOver: isDragOverState,
|
|
112
|
+
selected: selectedSubject.asObservable(),
|
|
113
|
+
rejected: rejectedSubject.asObservable(),
|
|
114
|
+
dragOverChanged: dragOverSubject.asObservable(),
|
|
115
|
+
};
|
|
116
|
+
});
|
|
52
117
|
|
|
53
118
|
/**
|
|
54
119
|
* Capture files dropped on the element.
|
|
55
120
|
*/
|
|
56
121
|
class NgpFileDropzone {
|
|
57
122
|
constructor() {
|
|
58
|
-
/**
|
|
59
|
-
* Access the host element.
|
|
60
|
-
*/
|
|
61
|
-
this.elementRef = inject(ElementRef);
|
|
62
123
|
/**
|
|
63
124
|
* The accepted file types. This can be an array of strings or a comma-separated string.
|
|
64
125
|
* Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).
|
|
@@ -110,122 +171,145 @@ class NgpFileDropzone {
|
|
|
110
171
|
this.dragOver = output({
|
|
111
172
|
alias: 'ngpFileDropzoneDragOver',
|
|
112
173
|
});
|
|
174
|
+
this.state = ngpFileDropzone({
|
|
175
|
+
fileTypes: this.fileTypes,
|
|
176
|
+
multiple: this.multiple,
|
|
177
|
+
directory: this.directory,
|
|
178
|
+
disabled: this.disabled,
|
|
179
|
+
onSelected: files => this.selected.emit(files),
|
|
180
|
+
onRejected: () => this.rejected.emit(),
|
|
181
|
+
onDragOver: isDragOver => this.dragOver.emit(isDragOver),
|
|
182
|
+
});
|
|
113
183
|
/**
|
|
114
184
|
* Whether the user is currently dragging a file over the file upload.
|
|
115
185
|
*/
|
|
116
|
-
this.isDragOver =
|
|
117
|
-
|
|
118
|
-
* The file upload state.
|
|
119
|
-
*/
|
|
120
|
-
this.state = fileDropzoneState(this);
|
|
121
|
-
ngpHoverInteraction({ disabled: this.state.disabled });
|
|
186
|
+
this.isDragOver = this.state.isDragOver;
|
|
187
|
+
ngpHoverInteraction({ disabled: this.disabled });
|
|
122
188
|
}
|
|
123
|
-
|
|
124
|
-
|
|
189
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpFileDropzone, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
190
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpFileDropzone, isStandalone: true, selector: "[ngpFileDropzone]", inputs: { fileTypes: { classPropertyName: "fileTypes", publicName: "ngpFileDropzoneFileTypes", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "ngpFileDropzoneMultiple", isSignal: true, isRequired: false, transformFunction: null }, directory: { classPropertyName: "directory", publicName: "ngpFileDropzoneDirectory", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpFileDropzoneDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "ngpFileDropzoneSelected", rejected: "ngpFileDropzoneRejected", dragOver: "ngpFileDropzoneDragOver" }, providers: [provideFileDropzoneState()], exportAs: ["ngpFileDropzone"], ngImport: i0 }); }
|
|
191
|
+
}
|
|
192
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpFileDropzone, decorators: [{
|
|
193
|
+
type: Directive,
|
|
194
|
+
args: [{
|
|
195
|
+
selector: '[ngpFileDropzone]',
|
|
196
|
+
exportAs: 'ngpFileDropzone',
|
|
197
|
+
providers: [provideFileDropzoneState()],
|
|
198
|
+
}]
|
|
199
|
+
}], ctorParameters: () => [], propDecorators: { fileTypes: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneFileTypes", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneMultiple", required: false }] }], directory: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneDirectory", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileDropzoneDisabled", required: false }] }], selected: [{ type: i0.Output, args: ["ngpFileDropzoneSelected"] }], rejected: [{ type: i0.Output, args: ["ngpFileDropzoneRejected"] }], dragOver: [{ type: i0.Output, args: ["ngpFileDropzoneDragOver"] }] } });
|
|
200
|
+
|
|
201
|
+
const [NgpFileUploadStateToken, ngpFileUpload, injectFileUploadState, provideFileUploadState,] = createPrimitive('NgpFileUpload', ({ fileTypes, multiple, directory, dragAndDrop, disabled, onSelected, onCanceled, onRejected, onDragOver, }) => {
|
|
202
|
+
const element = injectElementRef();
|
|
203
|
+
const document = inject(DOCUMENT);
|
|
204
|
+
const isDragOver = signal(false, ...(ngDevMode ? [{ debugName: "isDragOver" }] : []));
|
|
205
|
+
// Create observables
|
|
206
|
+
const selectedSubject = new Subject();
|
|
207
|
+
const canceledSubject = new Subject();
|
|
208
|
+
const rejectedSubject = new Subject();
|
|
209
|
+
const dragOverSubject = new Subject();
|
|
210
|
+
// Host bindings
|
|
211
|
+
dataBinding(element, 'data-disabled', () => (disabled?.() ? '' : null));
|
|
212
|
+
dataBinding(element, 'data-dragover', () => (isDragOver() ? '' : null));
|
|
213
|
+
// Create file input
|
|
214
|
+
const input = document.createElement('input');
|
|
215
|
+
input.type = 'file';
|
|
216
|
+
input.style.display = 'none';
|
|
217
|
+
input.addEventListener('change', () => {
|
|
218
|
+
const files = input.files;
|
|
219
|
+
selectedSubject.next(files);
|
|
220
|
+
onSelected?.(files);
|
|
221
|
+
input.value = '';
|
|
222
|
+
});
|
|
223
|
+
input.addEventListener('cancel', () => {
|
|
224
|
+
canceledSubject.next();
|
|
225
|
+
onCanceled?.();
|
|
226
|
+
});
|
|
227
|
+
function showFileDialog() {
|
|
228
|
+
if (disabled?.()) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const fileTypesValue = fileTypes?.()?.join(',');
|
|
232
|
+
if (fileTypesValue) {
|
|
233
|
+
input.accept = fileTypesValue;
|
|
234
|
+
}
|
|
235
|
+
input.multiple = multiple?.() ?? false;
|
|
236
|
+
input.webkitdirectory = directory?.() ?? false;
|
|
237
|
+
input.click();
|
|
238
|
+
}
|
|
239
|
+
function onDragEnter(event) {
|
|
240
|
+
if (disabled?.() || !dragAndDrop?.()) {
|
|
125
241
|
return;
|
|
126
242
|
}
|
|
127
243
|
event.preventDefault();
|
|
128
244
|
event.stopPropagation();
|
|
129
|
-
|
|
130
|
-
|
|
245
|
+
isDragOver.set(true);
|
|
246
|
+
dragOverSubject.next(true);
|
|
247
|
+
onDragOver?.(true);
|
|
131
248
|
}
|
|
132
|
-
|
|
133
|
-
if (
|
|
249
|
+
function onDragOverHandler(event) {
|
|
250
|
+
if (disabled?.() || !dragAndDrop?.()) {
|
|
134
251
|
return;
|
|
135
252
|
}
|
|
136
253
|
event.stopPropagation();
|
|
137
254
|
event.preventDefault();
|
|
138
|
-
|
|
255
|
+
isDragOver.set(true);
|
|
139
256
|
}
|
|
140
|
-
onDragLeave(event) {
|
|
141
|
-
if (
|
|
257
|
+
function onDragLeave(event) {
|
|
258
|
+
if (disabled?.() || !dragAndDrop?.() || !isDragOver()) {
|
|
142
259
|
return;
|
|
143
260
|
}
|
|
144
261
|
// if the element we are dragging over is a child of the file upload, ignore the event
|
|
145
|
-
if (
|
|
262
|
+
if (element.nativeElement.contains(event.relatedTarget)) {
|
|
146
263
|
return;
|
|
147
264
|
}
|
|
148
265
|
event.preventDefault();
|
|
149
266
|
event.stopPropagation();
|
|
150
|
-
|
|
151
|
-
|
|
267
|
+
isDragOver.set(false);
|
|
268
|
+
dragOverSubject.next(false);
|
|
269
|
+
onDragOver?.(false);
|
|
152
270
|
}
|
|
153
|
-
onDrop(event) {
|
|
154
|
-
if (
|
|
271
|
+
function onDrop(event) {
|
|
272
|
+
if (disabled?.() || !dragAndDrop?.()) {
|
|
155
273
|
return;
|
|
156
274
|
}
|
|
157
275
|
event.preventDefault();
|
|
158
|
-
|
|
159
|
-
|
|
276
|
+
isDragOver.set(false);
|
|
277
|
+
dragOverSubject.next(false);
|
|
278
|
+
onDragOver?.(false);
|
|
160
279
|
const fileList = event.dataTransfer?.files;
|
|
161
280
|
if (fileList) {
|
|
162
|
-
const filteredFiles = fileDropFilter(fileList,
|
|
281
|
+
const filteredFiles = fileDropFilter(fileList, fileTypes?.(), multiple?.() ?? false);
|
|
163
282
|
if (filteredFiles) {
|
|
164
|
-
|
|
283
|
+
selectedSubject.next(filteredFiles);
|
|
284
|
+
onSelected?.(filteredFiles);
|
|
165
285
|
}
|
|
166
286
|
else {
|
|
167
|
-
|
|
287
|
+
rejectedSubject.next();
|
|
288
|
+
onRejected?.();
|
|
168
289
|
}
|
|
169
290
|
}
|
|
170
291
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
type: HostListener,
|
|
187
|
-
args: ['dragenter', ['$event']]
|
|
188
|
-
}], onDragOver: [{
|
|
189
|
-
type: HostListener,
|
|
190
|
-
args: ['dragover', ['$event']]
|
|
191
|
-
}], onDragLeave: [{
|
|
192
|
-
type: HostListener,
|
|
193
|
-
args: ['dragleave', ['$event']]
|
|
194
|
-
}], onDrop: [{
|
|
195
|
-
type: HostListener,
|
|
196
|
-
args: ['drop', ['$event']]
|
|
197
|
-
}] } });
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* The state token for the FileUpload primitive.
|
|
201
|
-
*/
|
|
202
|
-
const NgpFileUploadStateToken = createStateToken('FileUpload');
|
|
203
|
-
/**
|
|
204
|
-
* Provides the FileUpload state.
|
|
205
|
-
*/
|
|
206
|
-
const provideFileUploadState = createStateProvider(NgpFileUploadStateToken);
|
|
207
|
-
/**
|
|
208
|
-
* Injects the FileUpload state.
|
|
209
|
-
*/
|
|
210
|
-
const injectFileUploadState = createStateInjector(NgpFileUploadStateToken);
|
|
211
|
-
/**
|
|
212
|
-
* The FileUpload state registration function.
|
|
213
|
-
*/
|
|
214
|
-
const fileUploadState = createState(NgpFileUploadStateToken);
|
|
292
|
+
// Event listeners
|
|
293
|
+
listener(element, 'click', showFileDialog);
|
|
294
|
+
listener(element, 'dragenter', onDragEnter);
|
|
295
|
+
listener(element, 'dragover', onDragOverHandler);
|
|
296
|
+
listener(element, 'dragleave', onDragLeave);
|
|
297
|
+
listener(element, 'drop', onDrop);
|
|
298
|
+
return {
|
|
299
|
+
isDragOver,
|
|
300
|
+
selected: selectedSubject.asObservable(),
|
|
301
|
+
canceled: canceledSubject.asObservable(),
|
|
302
|
+
rejected: rejectedSubject.asObservable(),
|
|
303
|
+
dragOverChanged: dragOverSubject.asObservable(),
|
|
304
|
+
showFileDialog,
|
|
305
|
+
};
|
|
306
|
+
});
|
|
215
307
|
|
|
216
308
|
/**
|
|
217
309
|
* A directive that allows you to turn any element into a file upload trigger.
|
|
218
310
|
*/
|
|
219
311
|
class NgpFileUpload {
|
|
220
312
|
constructor() {
|
|
221
|
-
/**
|
|
222
|
-
* Access the document
|
|
223
|
-
*/
|
|
224
|
-
this.document = inject(DOCUMENT);
|
|
225
|
-
/**
|
|
226
|
-
* Access the host element.
|
|
227
|
-
*/
|
|
228
|
-
this.elementRef = inject(ElementRef);
|
|
229
313
|
/**
|
|
230
314
|
* The accepted file types. This can be an array of strings or a comma-separated string.
|
|
231
315
|
* Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).
|
|
@@ -291,95 +375,36 @@ class NgpFileUpload {
|
|
|
291
375
|
this.dragOver = output({
|
|
292
376
|
alias: 'ngpFileUploadDragOver',
|
|
293
377
|
});
|
|
378
|
+
this.state = ngpFileUpload({
|
|
379
|
+
fileTypes: this.fileTypes,
|
|
380
|
+
multiple: this.multiple,
|
|
381
|
+
directory: this.directory,
|
|
382
|
+
dragAndDrop: this.dragAndDrop,
|
|
383
|
+
disabled: this.disabled,
|
|
384
|
+
onSelected: files => this.selected.emit(files),
|
|
385
|
+
onCanceled: () => this.canceled.emit(),
|
|
386
|
+
onRejected: () => this.rejected.emit(),
|
|
387
|
+
onDragOver: isDragOver => this.dragOver.emit(isDragOver),
|
|
388
|
+
});
|
|
294
389
|
/**
|
|
295
390
|
* Whether the user is currently dragging a file over the file upload.
|
|
296
391
|
*/
|
|
297
|
-
this.isDragOver =
|
|
298
|
-
/**
|
|
299
|
-
* Store the file input element.
|
|
300
|
-
*/
|
|
301
|
-
this.input = this.document.createElement('input');
|
|
302
|
-
/**
|
|
303
|
-
* The file upload state.
|
|
304
|
-
*/
|
|
305
|
-
this.state = fileUploadState(this);
|
|
392
|
+
this.isDragOver = this.state.isDragOver;
|
|
306
393
|
ngpInteractions({
|
|
307
394
|
hover: true,
|
|
308
395
|
press: true,
|
|
309
396
|
focusVisible: true,
|
|
310
|
-
disabled: this.
|
|
311
|
-
});
|
|
312
|
-
this.input.type = 'file';
|
|
313
|
-
this.input.style.display = 'none';
|
|
314
|
-
this.input.addEventListener('change', () => {
|
|
315
|
-
this.selected.emit(this.input.files);
|
|
316
|
-
// clear the input value to allow re-uploading the same file
|
|
317
|
-
this.input.value = '';
|
|
397
|
+
disabled: this.disabled,
|
|
318
398
|
});
|
|
319
|
-
this.input.addEventListener('cancel', () => this.canceled.emit());
|
|
320
399
|
}
|
|
400
|
+
/**
|
|
401
|
+
* Show the file dialog.
|
|
402
|
+
*/
|
|
321
403
|
showFileDialog() {
|
|
322
|
-
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
const fileTypes = this.state.fileTypes()?.join(',');
|
|
326
|
-
if (fileTypes) {
|
|
327
|
-
this.input.accept = fileTypes;
|
|
328
|
-
}
|
|
329
|
-
this.input.multiple = this.state.multiple();
|
|
330
|
-
this.input.webkitdirectory = this.state.directory();
|
|
331
|
-
this.input.click();
|
|
332
|
-
}
|
|
333
|
-
onDragEnter(event) {
|
|
334
|
-
if (this.state.disabled() || !this.state.dragAndDrop()) {
|
|
335
|
-
return;
|
|
336
|
-
}
|
|
337
|
-
event.preventDefault();
|
|
338
|
-
event.stopPropagation();
|
|
339
|
-
this.isDragOver.set(true);
|
|
340
|
-
this.dragOver.emit(true);
|
|
341
|
-
}
|
|
342
|
-
onDragOver(event) {
|
|
343
|
-
if (this.state.disabled() || !this.state.dragAndDrop()) {
|
|
344
|
-
return;
|
|
345
|
-
}
|
|
346
|
-
event.stopPropagation();
|
|
347
|
-
event.preventDefault();
|
|
348
|
-
this.isDragOver.set(true);
|
|
349
|
-
}
|
|
350
|
-
onDragLeave(event) {
|
|
351
|
-
if (this.state.disabled() || !this.state.dragAndDrop() || !this.isDragOver()) {
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
// if the element we are dragging over is a child of the file upload, ignore the event
|
|
355
|
-
if (this.elementRef.nativeElement.contains(event.relatedTarget)) {
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
event.preventDefault();
|
|
359
|
-
event.stopPropagation();
|
|
360
|
-
this.isDragOver.set(false);
|
|
361
|
-
this.dragOver.emit(false);
|
|
362
|
-
}
|
|
363
|
-
onDrop(event) {
|
|
364
|
-
if (this.state.disabled() || !this.state.dragAndDrop()) {
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
event.preventDefault();
|
|
368
|
-
this.isDragOver.set(false);
|
|
369
|
-
this.dragOver.emit(false);
|
|
370
|
-
const fileList = event.dataTransfer?.files;
|
|
371
|
-
if (fileList) {
|
|
372
|
-
const filteredFiles = fileDropFilter(fileList, this.state.fileTypes(), this.state.multiple());
|
|
373
|
-
if (filteredFiles) {
|
|
374
|
-
this.selected.emit(filteredFiles);
|
|
375
|
-
}
|
|
376
|
-
else {
|
|
377
|
-
this.rejected.emit();
|
|
378
|
-
}
|
|
379
|
-
}
|
|
404
|
+
this.state.showFileDialog();
|
|
380
405
|
}
|
|
381
406
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpFileUpload, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
382
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpFileUpload, isStandalone: true, selector: "[ngpFileUpload]", inputs: { fileTypes: { classPropertyName: "fileTypes", publicName: "ngpFileUploadFileTypes", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "ngpFileUploadMultiple", isSignal: true, isRequired: false, transformFunction: null }, directory: { classPropertyName: "directory", publicName: "ngpFileUploadDirectory", isSignal: true, isRequired: false, transformFunction: null }, dragAndDrop: { classPropertyName: "dragAndDrop", publicName: "ngpFileUploadDragDrop", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpFileUploadDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "ngpFileUploadSelected", canceled: "ngpFileUploadCanceled", rejected: "ngpFileUploadRejected", dragOver: "ngpFileUploadDragOver" },
|
|
407
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpFileUpload, isStandalone: true, selector: "[ngpFileUpload]", inputs: { fileTypes: { classPropertyName: "fileTypes", publicName: "ngpFileUploadFileTypes", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "ngpFileUploadMultiple", isSignal: true, isRequired: false, transformFunction: null }, directory: { classPropertyName: "directory", publicName: "ngpFileUploadDirectory", isSignal: true, isRequired: false, transformFunction: null }, dragAndDrop: { classPropertyName: "dragAndDrop", publicName: "ngpFileUploadDragDrop", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpFileUploadDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "ngpFileUploadSelected", canceled: "ngpFileUploadCanceled", rejected: "ngpFileUploadRejected", dragOver: "ngpFileUploadDragOver" }, providers: [provideFileUploadState()], exportAs: ["ngpFileUpload"], ngImport: i0 }); }
|
|
383
408
|
}
|
|
384
409
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpFileUpload, decorators: [{
|
|
385
410
|
type: Directive,
|
|
@@ -387,27 +412,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
387
412
|
selector: '[ngpFileUpload]',
|
|
388
413
|
exportAs: 'ngpFileUpload',
|
|
389
414
|
providers: [provideFileUploadState()],
|
|
390
|
-
host: {
|
|
391
|
-
'[attr.data-disabled]': 'state.disabled() ? "" : null',
|
|
392
|
-
'[attr.data-dragover]': 'isDragOver() ? "" : null',
|
|
393
|
-
},
|
|
394
415
|
}]
|
|
395
|
-
}], ctorParameters: () => [], propDecorators: { fileTypes: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadFileTypes", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadMultiple", required: false }] }], directory: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDirectory", required: false }] }], dragAndDrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDragDrop", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDisabled", required: false }] }], selected: [{ type: i0.Output, args: ["ngpFileUploadSelected"] }], canceled: [{ type: i0.Output, args: ["ngpFileUploadCanceled"] }], rejected: [{ type: i0.Output, args: ["ngpFileUploadRejected"] }], dragOver: [{ type: i0.Output, args: ["ngpFileUploadDragOver"] }]
|
|
396
|
-
type: HostListener,
|
|
397
|
-
args: ['click']
|
|
398
|
-
}], onDragEnter: [{
|
|
399
|
-
type: HostListener,
|
|
400
|
-
args: ['dragenter', ['$event']]
|
|
401
|
-
}], onDragOver: [{
|
|
402
|
-
type: HostListener,
|
|
403
|
-
args: ['dragover', ['$event']]
|
|
404
|
-
}], onDragLeave: [{
|
|
405
|
-
type: HostListener,
|
|
406
|
-
args: ['dragleave', ['$event']]
|
|
407
|
-
}], onDrop: [{
|
|
408
|
-
type: HostListener,
|
|
409
|
-
args: ['drop', ['$event']]
|
|
410
|
-
}] } });
|
|
416
|
+
}], ctorParameters: () => [], propDecorators: { fileTypes: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadFileTypes", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadMultiple", required: false }] }], directory: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDirectory", required: false }] }], dragAndDrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDragDrop", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpFileUploadDisabled", required: false }] }], selected: [{ type: i0.Output, args: ["ngpFileUploadSelected"] }], canceled: [{ type: i0.Output, args: ["ngpFileUploadCanceled"] }], rejected: [{ type: i0.Output, args: ["ngpFileUploadRejected"] }], dragOver: [{ type: i0.Output, args: ["ngpFileUploadDragOver"] }] } });
|
|
411
417
|
|
|
412
418
|
/**
|
|
413
419
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-primitives-file-upload.mjs","sources":["../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-drop-filter.ts","../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-dropzone-state.ts","../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-dropzone.ts","../../../../packages/ng-primitives/file-upload/src/file-upload/file-upload-state.ts","../../../../packages/ng-primitives/file-upload/src/file-upload/file-upload.ts","../../../../packages/ng-primitives/file-upload/src/ng-primitives-file-upload.ts"],"sourcesContent":["export function fileDropFilter(\n fileList: FileList,\n acceptedTypes: string[] | undefined,\n multiple: boolean,\n) {\n const validFiles = Array.from(fileList).filter(file => isFileTypeAccepted(file, acceptedTypes));\n\n const limitedFiles = multiple ? validFiles : validFiles.slice(0, 1);\n\n return limitedFiles.length > 0 ? filesToFileList(limitedFiles) : null;\n}\n\nexport function isFileTypeAccepted(file: File, acceptedTypes: string[] | undefined) {\n // allow all file types if no types are specified\n if (!acceptedTypes || acceptedTypes.length === 0) return true;\n\n const mimeType = file.type;\n const fileName = file.name.toLowerCase();\n\n return acceptedTypes.some(type => {\n type = type.toLowerCase();\n\n if (type.startsWith('.')) {\n return fileName.endsWith(type);\n }\n\n if (type.endsWith('/*')) {\n const baseType = type.replace('/*', '');\n return mimeType.startsWith(baseType);\n }\n\n return mimeType === type;\n });\n}\n\nfunction filesToFileList(files: File[]): FileList {\n const dataTransfer = new DataTransfer();\n files.forEach(file => dataTransfer.items.add(file));\n return dataTransfer.files;\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpFileDropzone } from './file-dropzone';\n\n/**\n * The state token for the FileDropzone primitive.\n */\nexport const NgpFileDropzoneStateToken = createStateToken<NgpFileDropzone>('FileDropzone');\n\n/**\n * Provides the FileDropzone state.\n */\nexport const provideFileDropzoneState = createStateProvider(NgpFileDropzoneStateToken);\n\n/**\n * Injects the FileDropzone state.\n */\nexport const injectFileDropzoneState =\n createStateInjector<NgpFileDropzone>(NgpFileDropzoneStateToken);\n\n/**\n * The FileDropzone state registration function.\n */\nexport const fileDropzoneState = createState(NgpFileDropzoneStateToken);\n","import { BooleanInput, coerceStringArray } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ngpHoverInteraction } from 'ng-primitives/interactions';\nimport { fileDropFilter } from './file-drop-filter';\nimport { fileDropzoneState, provideFileDropzoneState } from './file-dropzone-state';\n\n/**\n * Capture files dropped on the element.\n */\n@Directive({\n selector: '[ngpFileDropzone]',\n exportAs: 'ngpFileDropzone',\n providers: [provideFileDropzoneState()],\n host: {\n '[attr.data-dragover]': 'isDragOver() ? \"\" : null',\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\n },\n})\nexport class NgpFileDropzone {\n /**\n * Access the host element.\n */\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * The accepted file types. This can be an array of strings or a comma-separated string.\n * Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).\n */\n readonly fileTypes = input<string[], string | string[]>(undefined, {\n alias: 'ngpFileDropzoneFileTypes',\n transform: types => coerceStringArray(types, ','),\n });\n\n /**\n * Whether to allow multiple files to be selected.\n */\n readonly multiple = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneMultiple',\n transform: booleanAttribute,\n });\n\n /**\n * Whether to allow the user to select directories.\n */\n readonly directory = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneDirectory',\n transform: booleanAttribute,\n });\n\n /**\n * Whether the file upload is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emits when the user selects files.\n */\n readonly selected = output<FileList | null>({\n alias: 'ngpFileDropzoneSelected',\n });\n\n /**\n * Emits when uploaded files are rejected because they do not match the allowed {@link fileTypes}.\n */\n readonly rejected = output<void>({\n alias: 'ngpFileDropzoneRejected',\n });\n\n /**\n * Emits when the user drags a file over the file upload.\n */\n readonly dragOver = output<boolean>({\n alias: 'ngpFileDropzoneDragOver',\n });\n\n /**\n * Whether the user is currently dragging a file over the file upload.\n */\n protected readonly isDragOver = signal<boolean>(false);\n\n /**\n * The file upload state.\n */\n private readonly state = fileDropzoneState<NgpFileDropzone>(this);\n\n constructor() {\n ngpHoverInteraction({ disabled: this.state.disabled });\n }\n\n @HostListener('dragenter', ['$event'])\n protected onDragEnter(event: DragEvent): void {\n if (this.state.disabled()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(true);\n this.dragOver.emit(true);\n }\n\n @HostListener('dragover', ['$event'])\n protected onDragOver(event: DragEvent): void {\n if (this.state.disabled()) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n this.isDragOver.set(true);\n }\n\n @HostListener('dragleave', ['$event'])\n protected onDragLeave(event: DragEvent): void {\n if (this.state.disabled() || !this.isDragOver()) {\n return;\n }\n\n // if the element we are dragging over is a child of the file upload, ignore the event\n if (this.elementRef.nativeElement.contains(event.relatedTarget as Node)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n this.dragOver.emit(false);\n }\n\n @HostListener('drop', ['$event'])\n protected onDrop(event: DragEvent): void {\n if (this.state.disabled()) {\n return;\n }\n\n event.preventDefault();\n this.isDragOver.set(false);\n this.dragOver.emit(false);\n\n const fileList = event.dataTransfer?.files;\n if (fileList) {\n const filteredFiles = fileDropFilter(fileList, this.state.fileTypes(), this.state.multiple());\n\n if (filteredFiles) {\n this.selected.emit(filteredFiles);\n } else {\n this.rejected.emit();\n }\n }\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpFileUpload } from './file-upload';\n\n/**\n * The state token for the FileUpload primitive.\n */\nexport const NgpFileUploadStateToken = createStateToken<NgpFileUpload>('FileUpload');\n\n/**\n * Provides the FileUpload state.\n */\nexport const provideFileUploadState = createStateProvider(NgpFileUploadStateToken);\n\n/**\n * Injects the FileUpload state.\n */\nexport const injectFileUploadState = createStateInjector<NgpFileUpload>(NgpFileUploadStateToken);\n\n/**\n * The FileUpload state registration function.\n */\nexport const fileUploadState = createState(NgpFileUploadStateToken);\n","import { BooleanInput, coerceStringArray } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n output,\n signal,\n DOCUMENT,\n} from '@angular/core';\nimport { ngpInteractions } from 'ng-primitives/interactions';\nimport { fileDropFilter } from '../file-dropzone/file-drop-filter';\nimport { fileUploadState, provideFileUploadState } from './file-upload-state';\n\n/**\n * A directive that allows you to turn any element into a file upload trigger.\n */\n@Directive({\n selector: '[ngpFileUpload]',\n exportAs: 'ngpFileUpload',\n providers: [provideFileUploadState()],\n host: {\n '[attr.data-disabled]': 'state.disabled() ? \"\" : null',\n '[attr.data-dragover]': 'isDragOver() ? \"\" : null',\n },\n})\nexport class NgpFileUpload {\n /**\n * Access the document\n */\n private readonly document = inject<Document>(DOCUMENT);\n\n /**\n * Access the host element.\n */\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * The accepted file types. This can be an array of strings or a comma-separated string.\n * Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).\n */\n readonly fileTypes = input<string[], string | string[]>(undefined, {\n alias: 'ngpFileUploadFileTypes',\n transform: types => coerceStringArray(types, ','),\n });\n\n /**\n * Whether to allow multiple files to be selected.\n */\n readonly multiple = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadMultiple',\n transform: booleanAttribute,\n });\n\n /**\n * Whether to allow the user to select directories.\n */\n readonly directory = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadDirectory',\n transform: booleanAttribute,\n });\n\n /**\n * Whether drag-and-drop is enabled.\n */\n readonly dragAndDrop = input<boolean, BooleanInput>(true, {\n alias: 'ngpFileUploadDragDrop',\n transform: booleanAttribute,\n });\n\n /**\n * Whether the file upload is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emits when the user selects files.\n */\n readonly selected = output<FileList | null>({\n alias: 'ngpFileUploadSelected',\n });\n\n /**\n * Emits when the user cancel the file selection.\n */\n readonly canceled = output<void>({\n alias: 'ngpFileUploadCanceled',\n });\n\n /**\n * Emits when uploaded files are rejected because they do not match the allowed {@link fileTypes}.\n */\n readonly rejected = output<void>({\n alias: 'ngpFileUploadRejected',\n });\n\n /**\n * Emits when the user drags a file over the file upload.\n */\n readonly dragOver = output<boolean>({\n alias: 'ngpFileUploadDragOver',\n });\n\n /**\n * Whether the user is currently dragging a file over the file upload.\n */\n protected readonly isDragOver = signal<boolean>(false);\n\n /**\n * Store the file input element.\n */\n private input: HTMLInputElement = this.document.createElement('input');\n\n /**\n * The file upload state.\n */\n protected readonly state = fileUploadState<NgpFileUpload>(this);\n\n constructor() {\n ngpInteractions({\n hover: true,\n press: true,\n focusVisible: true,\n disabled: this.state.disabled,\n });\n this.input.type = 'file';\n this.input.style.display = 'none';\n this.input.addEventListener('change', () => {\n this.selected.emit(this.input.files);\n // clear the input value to allow re-uploading the same file\n this.input.value = '';\n });\n this.input.addEventListener('cancel', () => this.canceled.emit());\n }\n\n @HostListener('click')\n protected showFileDialog(): void {\n if (this.state.disabled()) {\n return;\n }\n\n const fileTypes = this.state.fileTypes()?.join(',');\n\n if (fileTypes) {\n this.input.accept = fileTypes;\n }\n\n this.input.multiple = this.state.multiple();\n this.input.webkitdirectory = this.state.directory();\n this.input.click();\n }\n\n @HostListener('dragenter', ['$event'])\n protected onDragEnter(event: DragEvent): void {\n if (this.state.disabled() || !this.state.dragAndDrop()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(true);\n this.dragOver.emit(true);\n }\n\n @HostListener('dragover', ['$event'])\n protected onDragOver(event: DragEvent): void {\n if (this.state.disabled() || !this.state.dragAndDrop()) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n this.isDragOver.set(true);\n }\n\n @HostListener('dragleave', ['$event'])\n protected onDragLeave(event: DragEvent): void {\n if (this.state.disabled() || !this.state.dragAndDrop() || !this.isDragOver()) {\n return;\n }\n\n // if the element we are dragging over is a child of the file upload, ignore the event\n if (this.elementRef.nativeElement.contains(event.relatedTarget as Node)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n this.dragOver.emit(false);\n }\n\n @HostListener('drop', ['$event'])\n protected onDrop(event: DragEvent): void {\n if (this.state.disabled() || !this.state.dragAndDrop()) {\n return;\n }\n\n event.preventDefault();\n this.isDragOver.set(false);\n this.dragOver.emit(false);\n\n const fileList = event.dataTransfer?.files;\n if (fileList) {\n const filteredFiles = fileDropFilter(fileList, this.state.fileTypes(), this.state.multiple());\n\n if (filteredFiles) {\n this.selected.emit(filteredFiles);\n } else {\n this.rejected.emit();\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-primitives-file-upload.mjs","sources":["../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-drop-filter.ts","../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-dropzone-state.ts","../../../../packages/ng-primitives/file-upload/src/file-dropzone/file-dropzone.ts","../../../../packages/ng-primitives/file-upload/src/file-upload/file-upload-state.ts","../../../../packages/ng-primitives/file-upload/src/file-upload/file-upload.ts","../../../../packages/ng-primitives/file-upload/src/ng-primitives-file-upload.ts"],"sourcesContent":["export function fileDropFilter(\n fileList: FileList,\n acceptedTypes: string[] | undefined,\n multiple: boolean,\n) {\n const validFiles = Array.from(fileList).filter(file => isFileTypeAccepted(file, acceptedTypes));\n\n const limitedFiles = multiple ? validFiles : validFiles.slice(0, 1);\n\n return limitedFiles.length > 0 ? filesToFileList(limitedFiles) : null;\n}\n\nexport function isFileTypeAccepted(file: File, acceptedTypes: string[] | undefined) {\n // allow all file types if no types are specified\n if (!acceptedTypes || acceptedTypes.length === 0) return true;\n\n const mimeType = file.type;\n const fileName = file.name.toLowerCase();\n\n return acceptedTypes.some(type => {\n type = type.toLowerCase();\n\n if (type.startsWith('.')) {\n return fileName.endsWith(type);\n }\n\n if (type.endsWith('/*')) {\n const baseType = type.replace('/*', '');\n return mimeType.startsWith(baseType);\n }\n\n return mimeType === type;\n });\n}\n\nfunction filesToFileList(files: File[]): FileList {\n const dataTransfer = new DataTransfer();\n files.forEach(file => dataTransfer.items.add(file));\n return dataTransfer.files;\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { createPrimitive, dataBinding, listener } from 'ng-primitives/state';\nimport { Observable, Subject } from 'rxjs';\nimport { fileDropFilter } from './file-drop-filter';\n\n/**\n * The state for the NgpFileDropzone directive.\n */\nexport interface NgpFileDropzoneState {\n /**\n * Whether the user is currently dragging over the element.\n */\n readonly isDragOver: Signal<boolean>;\n /**\n * Observable that emits when files are selected.\n */\n readonly selected: Observable<FileList | null>;\n /**\n * Observable that emits when files are rejected.\n */\n readonly rejected: Observable<void>;\n /**\n * Observable that emits when drag over state changes.\n */\n readonly dragOverChanged: Observable<boolean>;\n}\n\n/**\n * The props for the NgpFileDropzone state.\n */\nexport interface NgpFileDropzoneProps {\n /**\n * The accepted file types.\n */\n readonly fileTypes?: Signal<string[] | undefined>;\n /**\n * Whether multiple files can be selected.\n */\n readonly multiple?: Signal<boolean>;\n /**\n * Whether directories can be selected.\n */\n readonly directory?: Signal<boolean>;\n /**\n * Whether the file dropzone is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * Callback when files are selected.\n */\n readonly onSelected?: (files: FileList | null) => void;\n /**\n * Callback when files are rejected.\n */\n readonly onRejected?: () => void;\n /**\n * Callback when drag over state changes.\n */\n readonly onDragOver?: (isDragOver: boolean) => void;\n}\n\nexport const [\n NgpFileDropzoneStateToken,\n ngpFileDropzone,\n injectFileDropzoneState,\n provideFileDropzoneState,\n] = createPrimitive(\n 'NgpFileDropzone',\n ({\n fileTypes,\n multiple,\n directory,\n disabled,\n onSelected,\n onRejected,\n onDragOver,\n }: NgpFileDropzoneProps) => {\n const element = injectElementRef();\n const isDragOverState = signal(false);\n\n // Create observables\n const selectedSubject = new Subject<FileList | null>();\n const rejectedSubject = new Subject<void>();\n const dragOverSubject = new Subject<boolean>();\n\n // Host bindings\n dataBinding(element, 'data-dragover', () => (isDragOverState() ? '' : null));\n dataBinding(element, 'data-disabled', () => (disabled?.() ? '' : null));\n\n function onDragEnter(event: DragEvent): void {\n if (disabled?.()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n isDragOverState.set(true);\n dragOverSubject.next(true);\n onDragOver?.(true);\n }\n\n function onDragOverHandler(event: DragEvent): void {\n if (disabled?.()) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n isDragOverState.set(true);\n }\n\n function onDragLeave(event: DragEvent): void {\n if (disabled?.() || !isDragOverState()) {\n return;\n }\n\n // if the element we are dragging over is a child of the file dropzone, ignore the event\n if (element.nativeElement.contains(event.relatedTarget as Node)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n isDragOverState.set(false);\n dragOverSubject.next(false);\n onDragOver?.(false);\n }\n\n function onDrop(event: DragEvent): void {\n if (disabled?.()) {\n return;\n }\n\n event.preventDefault();\n isDragOverState.set(false);\n dragOverSubject.next(false);\n onDragOver?.(false);\n\n const fileList = event.dataTransfer?.files;\n if (fileList) {\n const filteredFiles = fileDropFilter(fileList, fileTypes?.(), multiple?.() ?? false);\n\n if (filteredFiles) {\n selectedSubject.next(filteredFiles);\n onSelected?.(filteredFiles);\n } else {\n rejectedSubject.next();\n onRejected?.();\n }\n }\n }\n\n // Event listeners\n listener(element, 'dragenter', onDragEnter);\n listener(element, 'dragover', onDragOverHandler);\n listener(element, 'dragleave', onDragLeave);\n listener(element, 'drop', onDrop);\n\n return {\n disabled,\n fileTypes,\n multiple,\n directory,\n isDragOver: isDragOverState,\n selected: selectedSubject.asObservable(),\n rejected: rejectedSubject.asObservable(),\n dragOverChanged: dragOverSubject.asObservable(),\n };\n },\n);\n","import { BooleanInput, coerceStringArray } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, output } from '@angular/core';\nimport { ngpHoverInteraction } from 'ng-primitives/interactions';\nimport { ngpFileDropzone, provideFileDropzoneState } from './file-dropzone-state';\n\n/**\n * Capture files dropped on the element.\n */\n@Directive({\n selector: '[ngpFileDropzone]',\n exportAs: 'ngpFileDropzone',\n providers: [provideFileDropzoneState()],\n})\nexport class NgpFileDropzone {\n /**\n * The accepted file types. This can be an array of strings or a comma-separated string.\n * Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).\n */\n readonly fileTypes = input<string[], string | string[]>(undefined, {\n alias: 'ngpFileDropzoneFileTypes',\n transform: types => coerceStringArray(types, ','),\n });\n\n /**\n * Whether to allow multiple files to be selected.\n */\n readonly multiple = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneMultiple',\n transform: booleanAttribute,\n });\n\n /**\n * Whether to allow the user to select directories.\n */\n readonly directory = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneDirectory',\n transform: booleanAttribute,\n });\n\n /**\n * Whether the file upload is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileDropzoneDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emits when the user selects files.\n */\n readonly selected = output<FileList | null>({\n alias: 'ngpFileDropzoneSelected',\n });\n\n /**\n * Emits when uploaded files are rejected because they do not match the allowed {@link fileTypes}.\n */\n readonly rejected = output<void>({\n alias: 'ngpFileDropzoneRejected',\n });\n\n /**\n * Emits when the user drags a file over the file upload.\n */\n readonly dragOver = output<boolean>({\n alias: 'ngpFileDropzoneDragOver',\n });\n\n private readonly state = ngpFileDropzone({\n fileTypes: this.fileTypes,\n multiple: this.multiple,\n directory: this.directory,\n disabled: this.disabled,\n onSelected: files => this.selected.emit(files),\n onRejected: () => this.rejected.emit(),\n onDragOver: isDragOver => this.dragOver.emit(isDragOver),\n });\n\n constructor() {\n ngpHoverInteraction({ disabled: this.disabled });\n }\n\n /**\n * Whether the user is currently dragging a file over the file upload.\n */\n readonly isDragOver = this.state.isDragOver;\n}\n","import { DOCUMENT, inject, Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { createPrimitive, dataBinding, listener } from 'ng-primitives/state';\nimport { Observable, Subject } from 'rxjs';\nimport { fileDropFilter } from '../file-dropzone/file-drop-filter';\n\n/**\n * The state for the NgpFileUpload directive.\n */\nexport interface NgpFileUploadState {\n /**\n * Whether the user is currently dragging over the element.\n */\n readonly isDragOver: Signal<boolean>;\n /**\n * Observable that emits when files are selected.\n */\n readonly selected: Observable<FileList | null>;\n /**\n * Observable that emits when file selection is canceled.\n */\n readonly canceled: Observable<void>;\n /**\n * Observable that emits when files are rejected.\n */\n readonly rejected: Observable<void>;\n /**\n * Observable that emits when drag over state changes.\n */\n readonly dragOverChanged: Observable<boolean>;\n /**\n * Show the file dialog.\n */\n showFileDialog(): void;\n}\n\n/**\n * The props for the NgpFileUpload state.\n */\nexport interface NgpFileUploadProps {\n /**\n * The accepted file types.\n */\n readonly fileTypes?: Signal<string[] | undefined>;\n /**\n * Whether multiple files can be selected.\n */\n readonly multiple?: Signal<boolean>;\n /**\n * Whether directories can be selected.\n */\n readonly directory?: Signal<boolean>;\n /**\n * Whether drag and drop is enabled.\n */\n readonly dragAndDrop?: Signal<boolean>;\n /**\n * Whether the file upload is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * Callback when files are selected.\n */\n readonly onSelected?: (files: FileList | null) => void;\n /**\n * Callback when file selection is canceled.\n */\n readonly onCanceled?: () => void;\n /**\n * Callback when files are rejected.\n */\n readonly onRejected?: () => void;\n /**\n * Callback when drag over state changes.\n */\n readonly onDragOver?: (isDragOver: boolean) => void;\n}\n\nexport const [\n NgpFileUploadStateToken,\n ngpFileUpload,\n injectFileUploadState,\n provideFileUploadState,\n] = createPrimitive(\n 'NgpFileUpload',\n ({\n fileTypes,\n multiple,\n directory,\n dragAndDrop,\n disabled,\n onSelected,\n onCanceled,\n onRejected,\n onDragOver,\n }: NgpFileUploadProps) => {\n const element = injectElementRef();\n const document = inject(DOCUMENT);\n\n const isDragOver = signal(false);\n\n // Create observables\n const selectedSubject = new Subject<FileList | null>();\n const canceledSubject = new Subject<void>();\n const rejectedSubject = new Subject<void>();\n const dragOverSubject = new Subject<boolean>();\n\n // Host bindings\n dataBinding(element, 'data-disabled', () => (disabled?.() ? '' : null));\n dataBinding(element, 'data-dragover', () => (isDragOver() ? '' : null));\n\n // Create file input\n const input: HTMLInputElement = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n\n input.addEventListener('change', () => {\n const files = input.files;\n selectedSubject.next(files);\n onSelected?.(files);\n input.value = '';\n });\n\n input.addEventListener('cancel', () => {\n canceledSubject.next();\n onCanceled?.();\n });\n\n function showFileDialog(): void {\n if (disabled?.()) {\n return;\n }\n\n const fileTypesValue = fileTypes?.()?.join(',');\n if (fileTypesValue) {\n input.accept = fileTypesValue;\n }\n\n input.multiple = multiple?.() ?? false;\n input.webkitdirectory = directory?.() ?? false;\n input.click();\n }\n\n function onDragEnter(event: DragEvent): void {\n if (disabled?.() || !dragAndDrop?.()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n isDragOver.set(true);\n dragOverSubject.next(true);\n onDragOver?.(true);\n }\n\n function onDragOverHandler(event: DragEvent): void {\n if (disabled?.() || !dragAndDrop?.()) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n isDragOver.set(true);\n }\n\n function onDragLeave(event: DragEvent): void {\n if (disabled?.() || !dragAndDrop?.() || !isDragOver()) {\n return;\n }\n\n // if the element we are dragging over is a child of the file upload, ignore the event\n if (element.nativeElement.contains(event.relatedTarget as Node)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n isDragOver.set(false);\n dragOverSubject.next(false);\n onDragOver?.(false);\n }\n\n function onDrop(event: DragEvent): void {\n if (disabled?.() || !dragAndDrop?.()) {\n return;\n }\n\n event.preventDefault();\n isDragOver.set(false);\n dragOverSubject.next(false);\n onDragOver?.(false);\n\n const fileList = event.dataTransfer?.files;\n if (fileList) {\n const filteredFiles = fileDropFilter(fileList, fileTypes?.(), multiple?.() ?? false);\n\n if (filteredFiles) {\n selectedSubject.next(filteredFiles);\n onSelected?.(filteredFiles);\n } else {\n rejectedSubject.next();\n onRejected?.();\n }\n }\n }\n\n // Event listeners\n listener(element, 'click', showFileDialog);\n listener(element, 'dragenter', onDragEnter);\n listener(element, 'dragover', onDragOverHandler);\n listener(element, 'dragleave', onDragLeave);\n listener(element, 'drop', onDrop);\n\n return {\n isDragOver,\n selected: selectedSubject.asObservable(),\n canceled: canceledSubject.asObservable(),\n rejected: rejectedSubject.asObservable(),\n dragOverChanged: dragOverSubject.asObservable(),\n showFileDialog,\n };\n },\n);\n","import { BooleanInput, coerceStringArray } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, output } from '@angular/core';\nimport { ngpInteractions } from 'ng-primitives/interactions';\nimport { ngpFileUpload, provideFileUploadState } from './file-upload-state';\n\n/**\n * A directive that allows you to turn any element into a file upload trigger.\n */\n@Directive({\n selector: '[ngpFileUpload]',\n exportAs: 'ngpFileUpload',\n providers: [provideFileUploadState()],\n})\nexport class NgpFileUpload {\n /**\n * The accepted file types. This can be an array of strings or a comma-separated string.\n * Accepted types can either be file extensions (e.g. `.jpg`) or MIME types (e.g. `image/jpeg`).\n */\n readonly fileTypes = input<string[], string | string[]>(undefined, {\n alias: 'ngpFileUploadFileTypes',\n transform: types => coerceStringArray(types, ','),\n });\n\n /**\n * Whether to allow multiple files to be selected.\n */\n readonly multiple = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadMultiple',\n transform: booleanAttribute,\n });\n\n /**\n * Whether to allow the user to select directories.\n */\n readonly directory = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadDirectory',\n transform: booleanAttribute,\n });\n\n /**\n * Whether drag-and-drop is enabled.\n */\n readonly dragAndDrop = input<boolean, BooleanInput>(true, {\n alias: 'ngpFileUploadDragDrop',\n transform: booleanAttribute,\n });\n\n /**\n * Whether the file upload is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFileUploadDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emits when the user selects files.\n */\n readonly selected = output<FileList | null>({\n alias: 'ngpFileUploadSelected',\n });\n\n /**\n * Emits when the user cancel the file selection.\n */\n readonly canceled = output<void>({\n alias: 'ngpFileUploadCanceled',\n });\n\n /**\n * Emits when uploaded files are rejected because they do not match the allowed {@link fileTypes}.\n */\n readonly rejected = output<void>({\n alias: 'ngpFileUploadRejected',\n });\n\n /**\n * Emits when the user drags a file over the file upload.\n */\n readonly dragOver = output<boolean>({\n alias: 'ngpFileUploadDragOver',\n });\n\n private readonly state = ngpFileUpload({\n fileTypes: this.fileTypes,\n multiple: this.multiple,\n directory: this.directory,\n dragAndDrop: this.dragAndDrop,\n disabled: this.disabled,\n onSelected: files => this.selected.emit(files),\n onCanceled: () => this.canceled.emit(),\n onRejected: () => this.rejected.emit(),\n onDragOver: isDragOver => this.dragOver.emit(isDragOver),\n });\n\n constructor() {\n ngpInteractions({\n hover: true,\n press: true,\n focusVisible: true,\n disabled: this.disabled,\n });\n }\n\n /**\n * Whether the user is currently dragging a file over the file upload.\n */\n readonly isDragOver = this.state.isDragOver;\n\n /**\n * Show the file dialog.\n */\n showFileDialog(): void {\n this.state.showFileDialog();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;SAAgB,cAAc,CAC5B,QAAkB,EAClB,aAAmC,EACnC,QAAiB,EAAA;IAEjB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,kBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AAE/F,IAAA,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAEnE,IAAA,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG,eAAe,CAAC,YAAY,CAAC,GAAG,IAAI;AACvE;AAEM,SAAU,kBAAkB,CAAC,IAAU,EAAE,aAAmC,EAAA;;AAEhF,IAAA,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI;AAE7D,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAExC,IAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,IAAG;AAC/B,QAAA,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAEzB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACxB,YAAA,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAChC;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;AACvC,YAAA,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QACtC;QAEA,OAAO,QAAQ,KAAK,IAAI;AAC1B,IAAA,CAAC,CAAC;AACJ;AAEA,SAAS,eAAe,CAAC,KAAa,EAAA;AACpC,IAAA,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE;AACvC,IAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnD,OAAO,YAAY,CAAC,KAAK;AAC3B;;ACuBO,MAAM,CACX,yBAAyB,EACzB,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACzB,GAAG,eAAe,CACjB,iBAAiB,EACjB,CAAC,EACC,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,UAAU,EACV,UAAU,EACV,UAAU,GACW,KAAI;AACzB,IAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,2DAAC;;AAGrC,IAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAmB;AACtD,IAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAQ;AAC3C,IAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAW;;IAG9C,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,eAAe,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5E,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,QAAQ,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAEvE,SAAS,WAAW,CAAC,KAAgB,EAAA;AACnC,QAAA,IAAI,QAAQ,IAAI,EAAE;YAChB;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1B,QAAA,UAAU,GAAG,IAAI,CAAC;IACpB;IAEA,SAAS,iBAAiB,CAAC,KAAgB,EAAA;AACzC,QAAA,IAAI,QAAQ,IAAI,EAAE;YAChB;QACF;QAEA,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;IAEA,SAAS,WAAW,CAAC,KAAgB,EAAA;QACnC,IAAI,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YACtC;QACF;;QAGA,IAAI,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAqB,CAAC,EAAE;YAC/D;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,QAAA,UAAU,GAAG,KAAK,CAAC;IACrB;IAEA,SAAS,MAAM,CAAC,KAAgB,EAAA;AAC9B,QAAA,IAAI,QAAQ,IAAI,EAAE;YAChB;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,QAAA,UAAU,GAAG,KAAK,CAAC;AAEnB,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,EAAE,KAAK;QAC1C,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,QAAQ,IAAI,IAAI,KAAK,CAAC;YAEpF,IAAI,aAAa,EAAE;AACjB,gBAAA,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC;AACnC,gBAAA,UAAU,GAAG,aAAa,CAAC;YAC7B;iBAAO;gBACL,eAAe,CAAC,IAAI,EAAE;gBACtB,UAAU,IAAI;YAChB;QACF;IACF;;AAGA,IAAA,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC;AAC3C,IAAA,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,iBAAiB,CAAC;AAChD,IAAA,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC;AAC3C,IAAA,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;IAEjC,OAAO;QACL,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,SAAS;AACT,QAAA,UAAU,EAAE,eAAe;AAC3B,QAAA,QAAQ,EAAE,eAAe,CAAC,YAAY,EAAE;AACxC,QAAA,QAAQ,EAAE,eAAe,CAAC,YAAY,EAAE;AACxC,QAAA,eAAe,EAAE,eAAe,CAAC,YAAY,EAAE;KAChD;AACH,CAAC;;ACpKH;;AAEG;MAMU,eAAe,CAAA;AAiE1B,IAAA,WAAA,GAAA;AAhEA;;;AAGG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAA8B,SAAS,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAC/D,KAAK,EAAE,0BAA0B;gBACjC,SAAS,EAAE,KAAK,IAAI,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,EAAA,CAAA,GAAA,CAFgB;AACjE,gBAAA,KAAK,EAAE,0BAA0B;gBACjC,SAAS,EAAE,KAAK,IAAI,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC;AAClD,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EACpD,KAAK,EAAE,yBAAyB;gBAChC,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF2B;AACtD,gBAAA,KAAK,EAAE,yBAAyB;AAChC,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAwB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EACrD,KAAK,EAAE,0BAA0B;gBACjC,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF4B;AACvD,gBAAA,KAAK,EAAE,0BAA0B;AACjC,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EACpD,KAAK,EAAE,yBAAyB;gBAChC,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF2B;AACtD,gBAAA,KAAK,EAAE,yBAAyB;AAChC,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAkB;AAC1C,YAAA,KAAK,EAAE,yBAAyB;AACjC,SAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAO;AAC/B,YAAA,KAAK,EAAE,yBAAyB;AACjC,SAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAU;AAClC,YAAA,KAAK,EAAE,yBAAyB;AACjC,SAAA,CAAC;QAEe,IAAA,CAAA,KAAK,GAAG,eAAe,CAAC;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,YAAA,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9C,UAAU,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACtC,YAAA,UAAU,EAAE,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;AACzD,SAAA,CAAC;AAMF;;AAEG;AACM,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU;QANzC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClD;8GAnEW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,EAAA,SAAA,EAFf,CAAC,wBAAwB,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAE5B,eAAe,EAAA,UAAA,EAAA,CAAA;kBAL3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,SAAS,EAAE,CAAC,wBAAwB,EAAE,CAAC;AACxC,iBAAA;;;ACkEM,MAAM,CACX,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACvB,GAAG,eAAe,CACjB,eAAe,EACf,CAAC,EACC,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,QAAQ,EACR,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,GACS,KAAI;AACvB,IAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAEjC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;;AAGhC,IAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAmB;AACtD,IAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAQ;AAC3C,IAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAQ;AAC3C,IAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAW;;IAG9C,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,QAAQ,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACvE,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,UAAU,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;;IAGvE,MAAM,KAAK,GAAqB,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC/D,IAAA,KAAK,CAAC,IAAI,GAAG,MAAM;AACnB,IAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAE5B,IAAA,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAK;AACpC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK;AACzB,QAAA,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,QAAA,UAAU,GAAG,KAAK,CAAC;AACnB,QAAA,KAAK,CAAC,KAAK,GAAG,EAAE;AAClB,IAAA,CAAC,CAAC;AAEF,IAAA,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAK;QACpC,eAAe,CAAC,IAAI,EAAE;QACtB,UAAU,IAAI;AAChB,IAAA,CAAC,CAAC;AAEF,IAAA,SAAS,cAAc,GAAA;AACrB,QAAA,IAAI,QAAQ,IAAI,EAAE;YAChB;QACF;QAEA,MAAM,cAAc,GAAG,SAAS,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;QAC/C,IAAI,cAAc,EAAE;AAClB,YAAA,KAAK,CAAC,MAAM,GAAG,cAAc;QAC/B;QAEA,KAAK,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,KAAK;QACtC,KAAK,CAAC,eAAe,GAAG,SAAS,IAAI,IAAI,KAAK;QAC9C,KAAK,CAAC,KAAK,EAAE;IACf;IAEA,SAAS,WAAW,CAAC,KAAgB,EAAA;QACnC,IAAI,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE;YACpC;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1B,QAAA,UAAU,GAAG,IAAI,CAAC;IACpB;IAEA,SAAS,iBAAiB,CAAC,KAAgB,EAAA;QACzC,IAAI,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE;YACpC;QACF;QAEA,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB;IAEA,SAAS,WAAW,CAAC,KAAgB,EAAA;AACnC,QAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrD;QACF;;QAGA,IAAI,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAqB,CAAC,EAAE;YAC/D;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,QAAA,UAAU,GAAG,KAAK,CAAC;IACrB;IAEA,SAAS,MAAM,CAAC,KAAgB,EAAA;QAC9B,IAAI,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE;YACpC;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,QAAA,UAAU,GAAG,KAAK,CAAC;AAEnB,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,EAAE,KAAK;QAC1C,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,QAAQ,IAAI,IAAI,KAAK,CAAC;YAEpF,IAAI,aAAa,EAAE;AACjB,gBAAA,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC;AACnC,gBAAA,UAAU,GAAG,aAAa,CAAC;YAC7B;iBAAO;gBACL,eAAe,CAAC,IAAI,EAAE;gBACtB,UAAU,IAAI;YAChB;QACF;IACF;;AAGA,IAAA,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC;AAC1C,IAAA,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC;AAC3C,IAAA,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,iBAAiB,CAAC;AAChD,IAAA,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC;AAC3C,IAAA,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;IAEjC,OAAO;QACL,UAAU;AACV,QAAA,QAAQ,EAAE,eAAe,CAAC,YAAY,EAAE;AACxC,QAAA,QAAQ,EAAE,eAAe,CAAC,YAAY,EAAE;AACxC,QAAA,QAAQ,EAAE,eAAe,CAAC,YAAY,EAAE;AACxC,QAAA,eAAe,EAAE,eAAe,CAAC,YAAY,EAAE;QAC/C,cAAc;KACf;AACH,CAAC;;ACxNH;;AAEG;MAMU,aAAa,CAAA;AAkFxB,IAAA,WAAA,GAAA;AAjFA;;;AAGG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAA8B,SAAS,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAC/D,KAAK,EAAE,wBAAwB;gBAC/B,SAAS,EAAE,KAAK,IAAI,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,EAAA,CAAA,GAAA,CAFgB;AACjE,gBAAA,KAAK,EAAE,wBAAwB;gBAC/B,SAAS,EAAE,KAAK,IAAI,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC;AAClD,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EACpD,KAAK,EAAE,uBAAuB;gBAC9B,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF2B;AACtD,gBAAA,KAAK,EAAE,uBAAuB;AAC9B,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAwB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EACrD,KAAK,EAAE,wBAAwB;gBAC/B,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF4B;AACvD,gBAAA,KAAK,EAAE,wBAAwB;AAC/B,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;AACM,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAwB,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EACtD,KAAK,EAAE,uBAAuB;gBAC9B,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF6B;AACxD,gBAAA,KAAK,EAAE,uBAAuB;AAC9B,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EACpD,KAAK,EAAE,uBAAuB;gBAC9B,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF2B;AACtD,gBAAA,KAAK,EAAE,uBAAuB;AAC9B,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAkB;AAC1C,YAAA,KAAK,EAAE,uBAAuB;AAC/B,SAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAO;AAC/B,YAAA,KAAK,EAAE,uBAAuB;AAC/B,SAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAO;AAC/B,YAAA,KAAK,EAAE,uBAAuB;AAC/B,SAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAU;AAClC,YAAA,KAAK,EAAE,uBAAuB;AAC/B,SAAA,CAAC;QAEe,IAAA,CAAA,KAAK,GAAG,aAAa,CAAC;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,YAAA,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9C,UAAU,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YACtC,UAAU,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACtC,YAAA,UAAU,EAAE,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;AACzD,SAAA,CAAC;AAWF;;AAEG;AACM,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU;AAXzC,QAAA,eAAe,CAAC;AACd,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,SAAA,CAAC;IACJ;AAOA;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;IAC7B;8GArGW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,SAAA,EAFb,CAAC,sBAAsB,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAE1B,aAAa,EAAA,UAAA,EAAA,CAAA;kBALzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,SAAS,EAAE,CAAC,sBAAsB,EAAE,CAAC;AACtC,iBAAA;;;ACZD;;AAEG;;;;"}
|