@ecodev/natural-editor 62.1.2 → 62.3.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/ecodev-natural-editor.mjs +40 -44
- package/fesm2022/ecodev-natural-editor.mjs.map +1 -1
- package/lib/class-dialog/class-dialog.component.d.ts +1 -1
- package/lib/color-dialog/color-dialog.component.d.ts +1 -1
- package/lib/editor/editor.component.d.ts +6 -4
- package/lib/id-dialog/id-dialog.component.d.ts +1 -1
- package/lib/link-dialog/link-dialog.component.d.ts +1 -1
- package/package.json +6 -8
- package/esm2022/ecodev-natural-editor.mjs +0 -5
- package/esm2022/lib/class-dialog/class-dialog.component.mjs +0 -40
- package/esm2022/lib/color-dialog/color-dialog.component.mjs +0 -197
- package/esm2022/lib/custom-css/custom-css.directive.mjs +0 -75
- package/esm2022/lib/editor/editor.component.mjs +0 -238
- package/esm2022/lib/id-dialog/id-dialog.component.mjs +0 -40
- package/esm2022/lib/link-dialog/link-dialog.component.mjs +0 -39
- package/esm2022/lib/utils/image.mjs +0 -82
- package/esm2022/lib/utils/inputrules.mjs +0 -70
- package/esm2022/lib/utils/items/cell-background-color-item.mjs +0 -55
- package/esm2022/lib/utils/items/class-item.mjs +0 -85
- package/esm2022/lib/utils/items/horizontal-rule-item.mjs +0 -24
- package/esm2022/lib/utils/items/id-item.mjs +0 -85
- package/esm2022/lib/utils/items/item.mjs +0 -40
- package/esm2022/lib/utils/items/link-item.mjs +0 -40
- package/esm2022/lib/utils/items/table-item.mjs +0 -43
- package/esm2022/lib/utils/items/text-align-item.mjs +0 -78
- package/esm2022/lib/utils/items/text-color-item.mjs +0 -56
- package/esm2022/lib/utils/items/utils.mjs +0 -55
- package/esm2022/lib/utils/items/wrap-list-item.mjs +0 -6
- package/esm2022/lib/utils/keymap.mjs +0 -115
- package/esm2022/lib/utils/menu.mjs +0 -111
- package/esm2022/lib/utils/schema/heading.mjs +0 -64
- package/esm2022/lib/utils/schema/paragraph-with-alignment.mjs +0 -50
- package/esm2022/lib/utils/schema/schema.mjs +0 -58
- package/esm2022/lib/utils/schema/table.mjs +0 -120
- package/esm2022/lib/utils/schema/text-color.mjs +0 -18
- package/esm2022/public-api.mjs +0 -7
|
@@ -21,5 +21,5 @@ export declare class ClassDialogComponent {
|
|
|
21
21
|
maybeConfirm(): void;
|
|
22
22
|
private confirm;
|
|
23
23
|
static ɵfac: i0.ɵɵFactoryDeclaration<ClassDialogComponent, never>;
|
|
24
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ClassDialogComponent, "
|
|
24
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ClassDialogComponent, "natural-editor-class-dialog", never, {}, {}, never, never, true, never>;
|
|
25
25
|
}
|
|
@@ -23,5 +23,5 @@ export declare class ColorDialogComponent {
|
|
|
23
23
|
private confirm;
|
|
24
24
|
selectColor(color: string): void;
|
|
25
25
|
static ɵfac: i0.ɵɵFactoryDeclaration<ColorDialogComponent, never>;
|
|
26
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ColorDialogComponent, "
|
|
26
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ColorDialogComponent, "natural-editor-color-dialog", never, {}, {}, never, never, true, never>;
|
|
27
27
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { OnDestroy, OnInit } from '@angular/core';
|
|
2
2
|
import { ControlValueAccessor } from '@angular/forms';
|
|
3
3
|
import { ImageUploader } from '../utils/image';
|
|
4
4
|
import { Key, MenuItems } from '../utils/menu';
|
|
5
|
+
import { Subject } from 'rxjs';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
/**
|
|
7
8
|
* Prosemirror component
|
|
@@ -18,8 +19,8 @@ export declare class NaturalEditorComponent implements OnInit, OnDestroy, Contro
|
|
|
18
19
|
private readonly dialog;
|
|
19
20
|
private readonly imagePlugin;
|
|
20
21
|
private view;
|
|
21
|
-
private editor;
|
|
22
|
-
readonly contentChange:
|
|
22
|
+
private readonly editor;
|
|
23
|
+
readonly contentChange: import("@angular/core").OutputEmitterRef<string>;
|
|
23
24
|
/**
|
|
24
25
|
* Callback to upload an image.
|
|
25
26
|
*
|
|
@@ -45,10 +46,11 @@ export declare class NaturalEditorComponent implements OnInit, OnDestroy, Contro
|
|
|
45
46
|
*/
|
|
46
47
|
private content;
|
|
47
48
|
menu: MenuItems | null;
|
|
49
|
+
protected readonly save$: Subject<void>;
|
|
48
50
|
/**
|
|
49
51
|
* If subscribed to, then the save button will be shown and click events forwarded
|
|
50
52
|
*/
|
|
51
|
-
readonly save:
|
|
53
|
+
readonly save: import("@angular/core").OutputRef<void>;
|
|
52
54
|
disabled: boolean;
|
|
53
55
|
constructor();
|
|
54
56
|
ngOnInit(): void;
|
|
@@ -21,5 +21,5 @@ export declare class IdDialogComponent {
|
|
|
21
21
|
maybeConfirm(): void;
|
|
22
22
|
private confirm;
|
|
23
23
|
static ɵfac: i0.ɵɵFactoryDeclaration<IdDialogComponent, never>;
|
|
24
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<IdDialogComponent, "
|
|
24
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<IdDialogComponent, "natural-editor-id-dialog", never, {}, {}, never, never, true, never>;
|
|
25
25
|
}
|
|
@@ -16,5 +16,5 @@ export declare class LinkDialogComponent {
|
|
|
16
16
|
maybeConfirm(): void;
|
|
17
17
|
private confirm;
|
|
18
18
|
static ɵfac: i0.ɵɵFactoryDeclaration<LinkDialogComponent, never>;
|
|
19
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<LinkDialogComponent, "
|
|
19
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LinkDialogComponent, "natural-editor-link-dialog", never, {}, {}, never, never, true, never>;
|
|
20
20
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ecodev/natural-editor",
|
|
3
|
-
"version": "62.
|
|
3
|
+
"version": "62.3.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": "github:Ecodev/natural",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -8,8 +8,6 @@
|
|
|
8
8
|
".": {
|
|
9
9
|
"sass": "./theming/_natural-editor.theme.scss",
|
|
10
10
|
"types": "./index.d.ts",
|
|
11
|
-
"esm2022": "./esm2022/ecodev-natural-editor.mjs",
|
|
12
|
-
"esm": "./esm2022/ecodev-natural-editor.mjs",
|
|
13
11
|
"default": "./fesm2022/ecodev-natural-editor.mjs"
|
|
14
12
|
},
|
|
15
13
|
"./package.json": {
|
|
@@ -30,13 +28,13 @@
|
|
|
30
28
|
"prosemirror-state": "^1.4.3",
|
|
31
29
|
"prosemirror-tables": "^1.3.4",
|
|
32
30
|
"prosemirror-view": "^1.31.5",
|
|
33
|
-
"tslib": "^2.
|
|
31
|
+
"tslib": "^2.8.1"
|
|
34
32
|
},
|
|
35
33
|
"peerDependencies": {
|
|
36
|
-
"@angular/common": "^
|
|
37
|
-
"@angular/core": "^
|
|
38
|
-
"@angular/forms": "^
|
|
39
|
-
"@angular/material": "^
|
|
34
|
+
"@angular/common": "^19.2.0",
|
|
35
|
+
"@angular/core": "^19.2.0",
|
|
36
|
+
"@angular/forms": "^19.2.0",
|
|
37
|
+
"@angular/material": "^19.2.0",
|
|
40
38
|
"@ecodev/natural": ">50.0"
|
|
41
39
|
},
|
|
42
40
|
"module": "fesm2022/ecodev-natural-editor.mjs",
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './public-api';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNvZGV2LW5hdHVyYWwtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC1lZGl0b3Ivc3JjL2Vjb2Rldi1uYXR1cmFsLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { Component, inject } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
|
3
|
-
import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
4
|
-
import { ifValid } from '@ecodev/natural';
|
|
5
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
-
import { MatInputModule } from '@angular/material/input';
|
|
7
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/material/dialog";
|
|
10
|
-
import * as i2 from "@angular/forms";
|
|
11
|
-
import * as i3 from "@angular/material/form-field";
|
|
12
|
-
import * as i4 from "@angular/material/input";
|
|
13
|
-
import * as i5 from "@angular/material/button";
|
|
14
|
-
export class ClassDialogComponent {
|
|
15
|
-
dialogRef = inject(MatDialogRef);
|
|
16
|
-
classControl = new FormControl('', {
|
|
17
|
-
validators: Validators.pattern(/(^\s*(-?[_a-zA-Z]+[_a-zA-Z0-9-]*\s*)+)/),
|
|
18
|
-
nonNullable: true,
|
|
19
|
-
});
|
|
20
|
-
form = new FormGroup({
|
|
21
|
-
class: this.classControl,
|
|
22
|
-
});
|
|
23
|
-
constructor() {
|
|
24
|
-
const data = inject(MAT_DIALOG_DATA);
|
|
25
|
-
this.form.setValue(data);
|
|
26
|
-
}
|
|
27
|
-
maybeConfirm() {
|
|
28
|
-
ifValid(this.form).subscribe(() => this.confirm());
|
|
29
|
-
}
|
|
30
|
-
confirm() {
|
|
31
|
-
this.dialogRef.close(this.form.getRawValue());
|
|
32
|
-
}
|
|
33
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ClassDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
34
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: ClassDialogComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<h2 i18n mat-dialog-title>Saisir les classes CSS</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <mat-form-field>\n <mat-label i18n>Classes CSS</mat-label>\n <input matInput [formControl]=\"classControl\" (keydown.enter)=\"maybeConfirm()\" cdkFocusInitial />\n @if (classControl.hasError('pattern')) {\n <mat-error i18n>Doit \u00EAtre un ou plusieurs nom de classe CSS</mat-error>\n }\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-content{display:grid;width:70vw;max-width:30em}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] });
|
|
35
|
-
}
|
|
36
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ClassDialogComponent, decorators: [{
|
|
37
|
-
type: Component,
|
|
38
|
-
args: [{ standalone: true, imports: [MatDialogModule, FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule], template: "<h2 i18n mat-dialog-title>Saisir les classes CSS</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <mat-form-field>\n <mat-label i18n>Classes CSS</mat-label>\n <input matInput [formControl]=\"classControl\" (keydown.enter)=\"maybeConfirm()\" cdkFocusInitial />\n @if (classControl.hasError('pattern')) {\n <mat-error i18n>Doit \u00EAtre un ou plusieurs nom de classe CSS</mat-error>\n }\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-content{display:grid;width:70vw;max-width:30em}\n"] }]
|
|
39
|
-
}], ctorParameters: () => [] });
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwtZWRpdG9yL3NyYy9saWIvY2xhc3MtZGlhbG9nL2NsYXNzLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsLWVkaXRvci9zcmMvbGliL2NsYXNzLWRpYWxvZy9jbGFzcy1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDeEYsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN4QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7O0FBb0JoRSxNQUFNLE9BQU8sb0JBQW9CO0lBQ3JCLFNBQVMsR0FBRyxNQUFNLENBQXNELFlBQVksQ0FBQyxDQUFDO0lBRTlFLFlBQVksR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUU7UUFDL0MsVUFBVSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsd0NBQXdDLENBQUM7UUFDeEUsV0FBVyxFQUFFLElBQUk7S0FDcEIsQ0FBQyxDQUFDO0lBQ2EsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDO1FBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtLQUMzQixDQUFDLENBQUM7SUFFSDtRQUNJLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBa0IsZUFBZSxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVNLFlBQVk7UUFDZixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sT0FBTztRQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO3VHQXZCUSxvQkFBb0I7MkZBQXBCLG9CQUFvQix3RUMxQmpDLHF0QkFnQkEscUhEUWMsZUFBZSwrbkJBQUUsV0FBVyxrakJBQUUsbUJBQW1CLGtXQUFFLGtCQUFrQix1WUFBRSxjQUFjLDBXQUFFLGVBQWU7OzJGQUV2RyxvQkFBb0I7a0JBTmhDLFNBQVM7aUNBR00sSUFBSSxXQUNQLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIGluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nTW9kdWxlLCBNYXREaWFsb2dSZWZ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2lmVmFsaWR9IGZyb20gJ0BlY29kZXYvbmF0dXJhbCc7XG5pbXBvcnQge01hdEJ1dHRvbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7TWF0SW5wdXRNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7TWF0Rm9ybUZpZWxkTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcblxuZXhwb3J0IHR5cGUgQ2xhc3NEaWFsb2dEYXRhID0ge1xuICAgIC8qKlxuICAgICAqIENTUyBjbGFzcyBuYW1lc1xuICAgICAqXG4gICAgICogRWc6XG4gICAgICpcbiAgICAgKiAtIGBcIlwiYFxuICAgICAqIC0gYFwibXktY2xhc3MgbXktb3RoZXItY2xhc3NcImBcbiAgICAgKi9cbiAgICBjbGFzczogc3RyaW5nO1xufTtcblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGVVcmw6ICcuL2NsYXNzLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2NsYXNzLWRpYWxvZy5jb21wb25lbnQuc2NzcycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTWF0RGlhbG9nTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xhc3NEaWFsb2dDb21wb25lbnQge1xuICAgIHByaXZhdGUgZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxDbGFzc0RpYWxvZ0NvbXBvbmVudCwgQ2xhc3NEaWFsb2dEYXRhPj4oTWF0RGlhbG9nUmVmKTtcblxuICAgIHB1YmxpYyByZWFkb25seSBjbGFzc0NvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHtcbiAgICAgICAgdmFsaWRhdG9yczogVmFsaWRhdG9ycy5wYXR0ZXJuKC8oXlxccyooLT9bX2EtekEtWl0rW19hLXpBLVowLTktXSpcXHMqKSspLyksXG4gICAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIHB1YmxpYyByZWFkb25seSBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIGNsYXNzOiB0aGlzLmNsYXNzQ29udHJvbCxcbiAgICB9KTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGluamVjdDxDbGFzc0RpYWxvZ0RhdGE+KE1BVF9ESUFMT0dfREFUQSk7XG5cbiAgICAgICAgdGhpcy5mb3JtLnNldFZhbHVlKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXliZUNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIGlmVmFsaWQodGhpcy5mb3JtKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jb25maXJtKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlybSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5mb3JtLmdldFJhd1ZhbHVlKCkpO1xuICAgIH1cbn1cbiIsIjxoMiBpMThuIG1hdC1kaWFsb2ctdGl0bGU+U2Fpc2lyIGxlcyBjbGFzc2VzIENTUzwvaDI+XG5cbjxtYXQtZGlhbG9nLWNvbnRlbnQgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsIGkxOG4+Q2xhc3NlcyBDU1M8L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJjbGFzc0NvbnRyb2xcIiAoa2V5ZG93bi5lbnRlcik9XCJtYXliZUNvbmZpcm0oKVwiIGNka0ZvY3VzSW5pdGlhbCAvPlxuICAgICAgICBAaWYgKGNsYXNzQ29udHJvbC5oYXNFcnJvcigncGF0dGVybicpKSB7XG4gICAgICAgICAgICA8bWF0LWVycm9yIGkxOG4+RG9pdCDDqnRyZSB1biBvdSBwbHVzaWV1cnMgbm9tIGRlIGNsYXNzZSBDU1M8L21hdC1lcnJvcj5cbiAgICAgICAgfVxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucyBhbGlnbj1cImVuZFwiPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlIGkxOG4+QW5udWxlcjwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJtYXliZUNvbmZpcm0oKVwiIFtkaXNhYmxlZF09XCIhZm9ybS52YWxpZFwiPjxzcGFuIGkxOG4+VmFsaWRlcjwvc3Bhbj48L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuIl19
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import { Component, inject } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
|
3
|
-
import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
4
|
-
import { ifValid, NaturalIconDirective } from '@ecodev/natural';
|
|
5
|
-
import { MatInputModule } from '@angular/material/input';
|
|
6
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
7
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/material/dialog";
|
|
11
|
-
import * as i2 from "@angular/forms";
|
|
12
|
-
import * as i3 from "@angular/material/button";
|
|
13
|
-
import * as i4 from "@angular/material/icon";
|
|
14
|
-
import * as i5 from "@angular/material/form-field";
|
|
15
|
-
import * as i6 from "@angular/material/input";
|
|
16
|
-
export class ColorDialogComponent {
|
|
17
|
-
dialogRef = inject(MatDialogRef);
|
|
18
|
-
colors = [
|
|
19
|
-
[
|
|
20
|
-
'#000000',
|
|
21
|
-
'#111111',
|
|
22
|
-
'#1c1c1c',
|
|
23
|
-
'#333333',
|
|
24
|
-
'#666666',
|
|
25
|
-
'#808080',
|
|
26
|
-
'#999999',
|
|
27
|
-
'#b2b2b2',
|
|
28
|
-
'#cccccc',
|
|
29
|
-
'#dddddd',
|
|
30
|
-
'#eeeeee',
|
|
31
|
-
'#ffffff',
|
|
32
|
-
],
|
|
33
|
-
[
|
|
34
|
-
'#ffff00',
|
|
35
|
-
'#ffbf00',
|
|
36
|
-
'#ff8000',
|
|
37
|
-
'#ff4000',
|
|
38
|
-
'#ff0000',
|
|
39
|
-
'#bf0041',
|
|
40
|
-
'#800080',
|
|
41
|
-
'#55308d',
|
|
42
|
-
'#2a6099',
|
|
43
|
-
'#158466',
|
|
44
|
-
'#00a933',
|
|
45
|
-
'#81d41a',
|
|
46
|
-
],
|
|
47
|
-
[
|
|
48
|
-
'#ffffd7',
|
|
49
|
-
'#fff5ce',
|
|
50
|
-
'#ffdbb6',
|
|
51
|
-
'#ffd8ce',
|
|
52
|
-
'#ffd7d7',
|
|
53
|
-
'#f7d1d5',
|
|
54
|
-
'#e0c2cd',
|
|
55
|
-
'#dedce6',
|
|
56
|
-
'#dee6ef',
|
|
57
|
-
'#dee7e5',
|
|
58
|
-
'#dde8cb',
|
|
59
|
-
'#f6f9d4',
|
|
60
|
-
],
|
|
61
|
-
[
|
|
62
|
-
'#ffffa6',
|
|
63
|
-
'#ffe994',
|
|
64
|
-
'#ffb66c',
|
|
65
|
-
'#ffaa95',
|
|
66
|
-
'#ffa6a6',
|
|
67
|
-
'#ec9ba4',
|
|
68
|
-
'#bf819e',
|
|
69
|
-
'#b7b3ca',
|
|
70
|
-
'#b4c7dc',
|
|
71
|
-
'#b3cac7',
|
|
72
|
-
'#afd095',
|
|
73
|
-
'#e8f2a1',
|
|
74
|
-
],
|
|
75
|
-
[
|
|
76
|
-
'#ffff6d',
|
|
77
|
-
'#ffde59',
|
|
78
|
-
'#ff972f',
|
|
79
|
-
'#ff7b59',
|
|
80
|
-
'#ff6d6d',
|
|
81
|
-
'#e16173',
|
|
82
|
-
'#a1467e',
|
|
83
|
-
'#8e86ae',
|
|
84
|
-
'#729fcf',
|
|
85
|
-
'#81aca6',
|
|
86
|
-
'#77bc65',
|
|
87
|
-
'#d4ea6b',
|
|
88
|
-
],
|
|
89
|
-
[
|
|
90
|
-
'#ffff38',
|
|
91
|
-
'#ffd428',
|
|
92
|
-
'#ff860d',
|
|
93
|
-
'#ff5429',
|
|
94
|
-
'#ff3838',
|
|
95
|
-
'#d62e4e',
|
|
96
|
-
'#8d1d75',
|
|
97
|
-
'#6b5e9b',
|
|
98
|
-
'#5983b0',
|
|
99
|
-
'#50938a',
|
|
100
|
-
'#3faf46',
|
|
101
|
-
'#bbe33d',
|
|
102
|
-
],
|
|
103
|
-
[
|
|
104
|
-
'#e6e905',
|
|
105
|
-
'#e8a202',
|
|
106
|
-
'#ea7500',
|
|
107
|
-
'#ed4c05',
|
|
108
|
-
'#f10d0c',
|
|
109
|
-
'#a7074b',
|
|
110
|
-
'#780373',
|
|
111
|
-
'#5b277d',
|
|
112
|
-
'#3465a4',
|
|
113
|
-
'#168253',
|
|
114
|
-
'#069a2e',
|
|
115
|
-
'#5eb91e',
|
|
116
|
-
],
|
|
117
|
-
[
|
|
118
|
-
'#acb20c',
|
|
119
|
-
'#b47804',
|
|
120
|
-
'#b85c00',
|
|
121
|
-
'#be480a',
|
|
122
|
-
'#c9211e',
|
|
123
|
-
'#861141',
|
|
124
|
-
'#650953',
|
|
125
|
-
'#55215b',
|
|
126
|
-
'#355269',
|
|
127
|
-
'#1e6a39',
|
|
128
|
-
'#127622',
|
|
129
|
-
'#468a1a',
|
|
130
|
-
],
|
|
131
|
-
[
|
|
132
|
-
'#706e0c',
|
|
133
|
-
'#784b04',
|
|
134
|
-
'#7b3d00',
|
|
135
|
-
'#813709',
|
|
136
|
-
'#8d281e',
|
|
137
|
-
'#611729',
|
|
138
|
-
'#4e102d',
|
|
139
|
-
'#481d32',
|
|
140
|
-
'#383d3c',
|
|
141
|
-
'#28471f',
|
|
142
|
-
'#224b12',
|
|
143
|
-
'#395511',
|
|
144
|
-
],
|
|
145
|
-
[
|
|
146
|
-
'#443205',
|
|
147
|
-
'#472702',
|
|
148
|
-
'#492300',
|
|
149
|
-
'#4b2204',
|
|
150
|
-
'#50200c',
|
|
151
|
-
'#41190d',
|
|
152
|
-
'#3b160e',
|
|
153
|
-
'#3a1a0f',
|
|
154
|
-
'#362413',
|
|
155
|
-
'#302709',
|
|
156
|
-
'#2e2706',
|
|
157
|
-
'#342a06',
|
|
158
|
-
],
|
|
159
|
-
];
|
|
160
|
-
colorControl = new FormControl('', {
|
|
161
|
-
validators: Validators.pattern(/^#\p{Hex_Digit}{6}/u),
|
|
162
|
-
nonNullable: true,
|
|
163
|
-
});
|
|
164
|
-
form = new FormGroup({
|
|
165
|
-
color: this.colorControl,
|
|
166
|
-
});
|
|
167
|
-
constructor() {
|
|
168
|
-
const data = inject(MAT_DIALOG_DATA);
|
|
169
|
-
this.form.setValue(data);
|
|
170
|
-
}
|
|
171
|
-
maybeConfirm() {
|
|
172
|
-
ifValid(this.form).subscribe(() => this.confirm());
|
|
173
|
-
}
|
|
174
|
-
confirm() {
|
|
175
|
-
this.dialogRef.close(this.form.getRawValue());
|
|
176
|
-
}
|
|
177
|
-
selectColor(color) {
|
|
178
|
-
this.colorControl.setValue(color);
|
|
179
|
-
this.maybeConfirm();
|
|
180
|
-
}
|
|
181
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ColorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
182
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: ColorDialogComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<h2 i18n mat-dialog-title>S\u00E9lectionner une couleur</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <div>\n @for (row of colors; track row) {\n <div>\n @for (color of row; track color) {\n <div class=\"color\" [style]=\"{backgroundColor: color}\" (click)=\"selectColor(color)\"> </div>\n }\n </div>\n }\n </div>\n\n <div>\n <button mat-button (click)=\"selectColor('')\">\n <mat-icon naturalIcon=\"format_color_reset\" />\n <span i18n>Transparent</span></button\n >\n </div>\n\n <mat-form-field>\n <mat-label i18n>Couleur</mat-label>\n <input matInput [formControl]=\"colorControl\" (keydown.enter)=\"maybeConfirm()\" cdkFocusInitial />\n <div\n class=\"sample\"\n matTextSuffix\n [style]=\"{backgroundColor: colorControl.valid ? colorControl.value : ''}\"\n ></div>\n @if (colorControl.hasError('pattern')) {\n <mat-error i18n>Doit \u00EAtre le format hexadecimal. Par exemple: #ff4000 </mat-error>\n }\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-content{display:grid;row-gap:25px;justify-content:center;width:70vw;max-width:30em}.color{display:inline-block;cursor:pointer;margin:3px;width:25px;height:25px}.color:hover{margin:0;padding:3px}.sample{width:27px;height:27px}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NaturalIconDirective, selector: "mat-icon[naturalIcon]", inputs: ["naturalIcon", "size"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }] });
|
|
183
|
-
}
|
|
184
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ColorDialogComponent, decorators: [{
|
|
185
|
-
type: Component,
|
|
186
|
-
args: [{ standalone: true, imports: [
|
|
187
|
-
MatDialogModule,
|
|
188
|
-
FormsModule,
|
|
189
|
-
ReactiveFormsModule,
|
|
190
|
-
MatButtonModule,
|
|
191
|
-
MatIconModule,
|
|
192
|
-
NaturalIconDirective,
|
|
193
|
-
MatFormFieldModule,
|
|
194
|
-
MatInputModule,
|
|
195
|
-
], template: "<h2 i18n mat-dialog-title>S\u00E9lectionner une couleur</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <div>\n @for (row of colors; track row) {\n <div>\n @for (color of row; track color) {\n <div class=\"color\" [style]=\"{backgroundColor: color}\" (click)=\"selectColor(color)\"> </div>\n }\n </div>\n }\n </div>\n\n <div>\n <button mat-button (click)=\"selectColor('')\">\n <mat-icon naturalIcon=\"format_color_reset\" />\n <span i18n>Transparent</span></button\n >\n </div>\n\n <mat-form-field>\n <mat-label i18n>Couleur</mat-label>\n <input matInput [formControl]=\"colorControl\" (keydown.enter)=\"maybeConfirm()\" cdkFocusInitial />\n <div\n class=\"sample\"\n matTextSuffix\n [style]=\"{backgroundColor: colorControl.valid ? colorControl.value : ''}\"\n ></div>\n @if (colorControl.hasError('pattern')) {\n <mat-error i18n>Doit \u00EAtre le format hexadecimal. Par exemple: #ff4000 </mat-error>\n }\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-content{display:grid;row-gap:25px;justify-content:center;width:70vw;max-width:30em}.color{display:inline-block;cursor:pointer;margin:3px;width:25px;height:25px}.color:hover{margin:0;padding:3px}.sample{width:27px;height:27px}\n"] }]
|
|
196
|
-
}], ctorParameters: () => [] });
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwtZWRpdG9yL3NyYy9saWIvY29sb3ItZGlhbG9nL2NvbG9yLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsLWVkaXRvci9zcmMvbGliL2NvbG9yLWRpYWxvZy9jb2xvci1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDeEYsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7QUE2QnpELE1BQU0sT0FBTyxvQkFBb0I7SUFDckIsU0FBUyxHQUFHLE1BQU0sQ0FBc0QsWUFBWSxDQUFDLENBQUM7SUFFOUUsTUFBTSxHQUFlO1FBQ2pDO1lBQ0ksU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1NBQ1o7UUFDRDtZQUNJLFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztTQUNaO1FBQ0Q7WUFDSSxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7U0FDWjtRQUNEO1lBQ0ksU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1NBQ1o7UUFDRDtZQUNJLFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztTQUNaO1FBQ0Q7WUFDSSxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7U0FDWjtRQUNEO1lBQ0ksU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1NBQ1o7UUFDRDtZQUNJLFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztTQUNaO1FBQ0Q7WUFDSSxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7U0FDWjtRQUNEO1lBQ0ksU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1NBQ1o7S0FDSixDQUFDO0lBRWMsWUFBWSxHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRTtRQUMvQyxVQUFVLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztRQUNyRCxXQUFXLEVBQUUsSUFBSTtLQUNwQixDQUFDLENBQUM7SUFDYSxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUM7UUFDakMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZO0tBQzNCLENBQUMsQ0FBQztJQUVIO1FBQ0ksTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFrQixlQUFlLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU0sWUFBWTtRQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyxPQUFPO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxXQUFXLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEIsQ0FBQzt1R0EzS1Esb0JBQW9COzJGQUFwQixvQkFBb0Isd0VDcENqQyxvNUNBc0NBLHVTRFpRLGVBQWUsK25CQUNmLFdBQVcsa2pCQUNYLG1CQUFtQixrV0FDbkIsZUFBZSwyTkFDZixhQUFhLG9MQUNiLG9CQUFvQixrR0FDcEIsa0JBQWtCLHdnQkFDbEIsY0FBYzs7MkZBR1Qsb0JBQW9CO2tCQWZoQyxTQUFTO2lDQUdNLElBQUksV0FDUDt3QkFDTCxlQUFlO3dCQUNmLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLGFBQWE7d0JBQ2Isb0JBQW9CO3dCQUNwQixrQkFBa0I7d0JBQ2xCLGNBQWM7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIGluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nTW9kdWxlLCBNYXREaWFsb2dSZWZ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2lmVmFsaWQsIE5hdHVyYWxJY29uRGlyZWN0aXZlfSBmcm9tICdAZWNvZGV2L25hdHVyYWwnO1xuaW1wb3J0IHtNYXRJbnB1dE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHtNYXRGb3JtRmllbGRNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHtNYXRJY29uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7TWF0QnV0dG9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuXG5leHBvcnQgdHlwZSBDb2xvckRpYWxvZ0RhdGEgPSB7XG4gICAgLyoqXG4gICAgICogRW1wdHkgc3RyaW5nIG1lYW5zIG5vIGNvbG9yIHNldCBhdCBhbGwuIEFueXRoaW5nIGVsc2UgbXVzdCBiZSBhIHZhbGlkIENTUyBjb2xvciBpbiBoZXhhIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIEVnOlxuICAgICAqXG4gICAgICogLSBgXCJcImBcbiAgICAgKiAtIGBcIiNmZjQwMDBcImBcbiAgICAgKi9cbiAgICBjb2xvcjogc3RyaW5nO1xufTtcblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbG9yLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2NvbG9yLWRpYWxvZy5jb21wb25lbnQuc2NzcycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE1hdERpYWxvZ01vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcbiAgICAgICAgTmF0dXJhbEljb25EaXJlY3RpdmUsXG4gICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICAgICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29sb3JEaWFsb2dDb21wb25lbnQge1xuICAgIHByaXZhdGUgZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxDb2xvckRpYWxvZ0NvbXBvbmVudCwgQ29sb3JEaWFsb2dEYXRhPj4oTWF0RGlhbG9nUmVmKTtcblxuICAgIHB1YmxpYyByZWFkb25seSBjb2xvcnM6IHN0cmluZ1tdW10gPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAgICcjMDAwMDAwJyxcbiAgICAgICAgICAgICcjMTExMTExJyxcbiAgICAgICAgICAgICcjMWMxYzFjJyxcbiAgICAgICAgICAgICcjMzMzMzMzJyxcbiAgICAgICAgICAgICcjNjY2NjY2JyxcbiAgICAgICAgICAgICcjODA4MDgwJyxcbiAgICAgICAgICAgICcjOTk5OTk5JyxcbiAgICAgICAgICAgICcjYjJiMmIyJyxcbiAgICAgICAgICAgICcjY2NjY2NjJyxcbiAgICAgICAgICAgICcjZGRkZGRkJyxcbiAgICAgICAgICAgICcjZWVlZWVlJyxcbiAgICAgICAgICAgICcjZmZmZmZmJyxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgJyNmZmZmMDAnLFxuICAgICAgICAgICAgJyNmZmJmMDAnLFxuICAgICAgICAgICAgJyNmZjgwMDAnLFxuICAgICAgICAgICAgJyNmZjQwMDAnLFxuICAgICAgICAgICAgJyNmZjAwMDAnLFxuICAgICAgICAgICAgJyNiZjAwNDEnLFxuICAgICAgICAgICAgJyM4MDAwODAnLFxuICAgICAgICAgICAgJyM1NTMwOGQnLFxuICAgICAgICAgICAgJyMyYTYwOTknLFxuICAgICAgICAgICAgJyMxNTg0NjYnLFxuICAgICAgICAgICAgJyMwMGE5MzMnLFxuICAgICAgICAgICAgJyM4MWQ0MWEnLFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICAnI2ZmZmZkNycsXG4gICAgICAgICAgICAnI2ZmZjVjZScsXG4gICAgICAgICAgICAnI2ZmZGJiNicsXG4gICAgICAgICAgICAnI2ZmZDhjZScsXG4gICAgICAgICAgICAnI2ZmZDdkNycsXG4gICAgICAgICAgICAnI2Y3ZDFkNScsXG4gICAgICAgICAgICAnI2UwYzJjZCcsXG4gICAgICAgICAgICAnI2RlZGNlNicsXG4gICAgICAgICAgICAnI2RlZTZlZicsXG4gICAgICAgICAgICAnI2RlZTdlNScsXG4gICAgICAgICAgICAnI2RkZThjYicsXG4gICAgICAgICAgICAnI2Y2ZjlkNCcsXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgICcjZmZmZmE2JyxcbiAgICAgICAgICAgICcjZmZlOTk0JyxcbiAgICAgICAgICAgICcjZmZiNjZjJyxcbiAgICAgICAgICAgICcjZmZhYTk1JyxcbiAgICAgICAgICAgICcjZmZhNmE2JyxcbiAgICAgICAgICAgICcjZWM5YmE0JyxcbiAgICAgICAgICAgICcjYmY4MTllJyxcbiAgICAgICAgICAgICcjYjdiM2NhJyxcbiAgICAgICAgICAgICcjYjRjN2RjJyxcbiAgICAgICAgICAgICcjYjNjYWM3JyxcbiAgICAgICAgICAgICcjYWZkMDk1JyxcbiAgICAgICAgICAgICcjZThmMmExJyxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgJyNmZmZmNmQnLFxuICAgICAgICAgICAgJyNmZmRlNTknLFxuICAgICAgICAgICAgJyNmZjk3MmYnLFxuICAgICAgICAgICAgJyNmZjdiNTknLFxuICAgICAgICAgICAgJyNmZjZkNmQnLFxuICAgICAgICAgICAgJyNlMTYxNzMnLFxuICAgICAgICAgICAgJyNhMTQ2N2UnLFxuICAgICAgICAgICAgJyM4ZTg2YWUnLFxuICAgICAgICAgICAgJyM3MjlmY2YnLFxuICAgICAgICAgICAgJyM4MWFjYTYnLFxuICAgICAgICAgICAgJyM3N2JjNjUnLFxuICAgICAgICAgICAgJyNkNGVhNmInLFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICAnI2ZmZmYzOCcsXG4gICAgICAgICAgICAnI2ZmZDQyOCcsXG4gICAgICAgICAgICAnI2ZmODYwZCcsXG4gICAgICAgICAgICAnI2ZmNTQyOScsXG4gICAgICAgICAgICAnI2ZmMzgzOCcsXG4gICAgICAgICAgICAnI2Q2MmU0ZScsXG4gICAgICAgICAgICAnIzhkMWQ3NScsXG4gICAgICAgICAgICAnIzZiNWU5YicsXG4gICAgICAgICAgICAnIzU5ODNiMCcsXG4gICAgICAgICAgICAnIzUwOTM4YScsXG4gICAgICAgICAgICAnIzNmYWY0NicsXG4gICAgICAgICAgICAnI2JiZTMzZCcsXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgICcjZTZlOTA1JyxcbiAgICAgICAgICAgICcjZThhMjAyJyxcbiAgICAgICAgICAgICcjZWE3NTAwJyxcbiAgICAgICAgICAgICcjZWQ0YzA1JyxcbiAgICAgICAgICAgICcjZjEwZDBjJyxcbiAgICAgICAgICAgICcjYTcwNzRiJyxcbiAgICAgICAgICAgICcjNzgwMzczJyxcbiAgICAgICAgICAgICcjNWIyNzdkJyxcbiAgICAgICAgICAgICcjMzQ2NWE0JyxcbiAgICAgICAgICAgICcjMTY4MjUzJyxcbiAgICAgICAgICAgICcjMDY5YTJlJyxcbiAgICAgICAgICAgICcjNWViOTFlJyxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgJyNhY2IyMGMnLFxuICAgICAgICAgICAgJyNiNDc4MDQnLFxuICAgICAgICAgICAgJyNiODVjMDAnLFxuICAgICAgICAgICAgJyNiZTQ4MGEnLFxuICAgICAgICAgICAgJyNjOTIxMWUnLFxuICAgICAgICAgICAgJyM4NjExNDEnLFxuICAgICAgICAgICAgJyM2NTA5NTMnLFxuICAgICAgICAgICAgJyM1NTIxNWInLFxuICAgICAgICAgICAgJyMzNTUyNjknLFxuICAgICAgICAgICAgJyMxZTZhMzknLFxuICAgICAgICAgICAgJyMxMjc2MjInLFxuICAgICAgICAgICAgJyM0NjhhMWEnLFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICAnIzcwNmUwYycsXG4gICAgICAgICAgICAnIzc4NGIwNCcsXG4gICAgICAgICAgICAnIzdiM2QwMCcsXG4gICAgICAgICAgICAnIzgxMzcwOScsXG4gICAgICAgICAgICAnIzhkMjgxZScsXG4gICAgICAgICAgICAnIzYxMTcyOScsXG4gICAgICAgICAgICAnIzRlMTAyZCcsXG4gICAgICAgICAgICAnIzQ4MWQzMicsXG4gICAgICAgICAgICAnIzM4M2QzYycsXG4gICAgICAgICAgICAnIzI4NDcxZicsXG4gICAgICAgICAgICAnIzIyNGIxMicsXG4gICAgICAgICAgICAnIzM5NTUxMScsXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgICcjNDQzMjA1JyxcbiAgICAgICAgICAgICcjNDcyNzAyJyxcbiAgICAgICAgICAgICcjNDkyMzAwJyxcbiAgICAgICAgICAgICcjNGIyMjA0JyxcbiAgICAgICAgICAgICcjNTAyMDBjJyxcbiAgICAgICAgICAgICcjNDExOTBkJyxcbiAgICAgICAgICAgICcjM2IxNjBlJyxcbiAgICAgICAgICAgICcjM2ExYTBmJyxcbiAgICAgICAgICAgICcjMzYyNDEzJyxcbiAgICAgICAgICAgICcjMzAyNzA5JyxcbiAgICAgICAgICAgICcjMmUyNzA2JyxcbiAgICAgICAgICAgICcjMzQyYTA2JyxcbiAgICAgICAgXSxcbiAgICBdO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbG9yQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywge1xuICAgICAgICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLnBhdHRlcm4oL14jXFxwe0hleF9EaWdpdH17Nn0vdSksXG4gICAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIHB1YmxpYyByZWFkb25seSBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yQ29udHJvbCxcbiAgICB9KTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGluamVjdDxDb2xvckRpYWxvZ0RhdGE+KE1BVF9ESUFMT0dfREFUQSk7XG5cbiAgICAgICAgdGhpcy5mb3JtLnNldFZhbHVlKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXliZUNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIGlmVmFsaWQodGhpcy5mb3JtKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jb25maXJtKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlybSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5mb3JtLmdldFJhd1ZhbHVlKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RDb2xvcihjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29sb3JDb250cm9sLnNldFZhbHVlKGNvbG9yKTtcbiAgICAgICAgdGhpcy5tYXliZUNvbmZpcm0oKTtcbiAgICB9XG59XG4iLCI8aDIgaTE4biBtYXQtZGlhbG9nLXRpdGxlPlPDqWxlY3Rpb25uZXIgdW5lIGNvdWxldXI8L2gyPlxuXG48bWF0LWRpYWxvZy1jb250ZW50IFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxkaXY+XG4gICAgICAgIEBmb3IgKHJvdyBvZiBjb2xvcnM7IHRyYWNrIHJvdykge1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2xvciBvZiByb3c7IHRyYWNrIGNvbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvclwiIFtzdHlsZV09XCJ7YmFja2dyb3VuZENvbG9yOiBjb2xvcn1cIiAoY2xpY2spPVwic2VsZWN0Q29sb3IoY29sb3IpXCI+IDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInNlbGVjdENvbG9yKCcnKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIG5hdHVyYWxJY29uPVwiZm9ybWF0X2NvbG9yX3Jlc2V0XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGkxOG4+VHJhbnNwYXJlbnQ8L3NwYW4+PC9idXR0b25cbiAgICAgICAgPlxuICAgIDwvZGl2PlxuXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsIGkxOG4+Q291bGV1cjwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImNvbG9yQ29udHJvbFwiIChrZXlkb3duLmVudGVyKT1cIm1heWJlQ29uZmlybSgpXCIgY2RrRm9jdXNJbml0aWFsIC8+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwic2FtcGxlXCJcbiAgICAgICAgICAgIG1hdFRleHRTdWZmaXhcbiAgICAgICAgICAgIFtzdHlsZV09XCJ7YmFja2dyb3VuZENvbG9yOiBjb2xvckNvbnRyb2wudmFsaWQgPyBjb2xvckNvbnRyb2wudmFsdWUgOiAnJ31cIlxuICAgICAgICA+PC9kaXY+XG4gICAgICAgIEBpZiAoY29sb3JDb250cm9sLmhhc0Vycm9yKCdwYXR0ZXJuJykpIHtcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgaTE4bj5Eb2l0IMOqdHJlIGxlIGZvcm1hdCBoZXhhZGVjaW1hbC4gUGFyIGV4ZW1wbGU6ICNmZjQwMDAgPC9tYXQtZXJyb3I+XG4gICAgICAgIH1cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbjxtYXQtZGlhbG9nLWFjdGlvbnMgYWxpZ249XCJlbmRcIj5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSBpMThuPkFubnVsZXI8L2J1dHRvbj5cbiAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwibWF5YmVDb25maXJtKClcIiBbZGlzYWJsZWRdPVwiIWZvcm0udmFsaWRcIj48c3BhbiBpMThuPlZhbGlkZXI8L3NwYW4+PC9idXR0b24+XG48L21hdC1kaWFsb2ctYWN0aW9ucz5cbiJdfQ==
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { Directive, HostBinding, inject, Input } from '@angular/core';
|
|
2
|
-
import { DOCUMENT } from '@angular/common';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* Prefix all CSS selectors with the given selector
|
|
6
|
-
*
|
|
7
|
-
* This is meant to be relatively simple and might not cover advanced CSS syntax
|
|
8
|
-
*/
|
|
9
|
-
export function prefixCss(prefix, css) {
|
|
10
|
-
prefix = '\n' + prefix + ' ';
|
|
11
|
-
return css
|
|
12
|
-
.replace(/([^{}]*){/gs, selectors => selectors
|
|
13
|
-
.split(',')
|
|
14
|
-
.map(selector => {
|
|
15
|
-
if (selector.trim().startsWith('@media')) {
|
|
16
|
-
return selector.trim();
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
return prefix + selector.trim();
|
|
20
|
-
}
|
|
21
|
-
})
|
|
22
|
-
.join(','))
|
|
23
|
-
.trim();
|
|
24
|
-
}
|
|
25
|
-
let uniqueId = 0;
|
|
26
|
-
let componentCount = 0;
|
|
27
|
-
/**
|
|
28
|
-
* Inject custom CSS into component and scope the CSS only to this component
|
|
29
|
-
*
|
|
30
|
-
* Usage :
|
|
31
|
-
*
|
|
32
|
-
* ```html
|
|
33
|
-
* <div [naturalCustomCss]=".my-class {background: red}">
|
|
34
|
-
* <p class="my-class">foo bar</p>
|
|
35
|
-
* </div>
|
|
36
|
-
* ```
|
|
37
|
-
*/
|
|
38
|
-
export class NaturalCustomCssDirective {
|
|
39
|
-
document = inject(DOCUMENT);
|
|
40
|
-
style = null;
|
|
41
|
-
id = 'n' + ++uniqueId;
|
|
42
|
-
set naturalCustomCss(value) {
|
|
43
|
-
if (value && !this.style) {
|
|
44
|
-
this.style = this.document.createElement('style');
|
|
45
|
-
this.document.head.appendChild(this.style);
|
|
46
|
-
}
|
|
47
|
-
if (this.style) {
|
|
48
|
-
this.style.innerHTML = value ? prefixCss(`[data-natural-id=${this.id}]`, value) : '';
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
ngOnDestroy() {
|
|
52
|
-
this.style?.remove();
|
|
53
|
-
// Reset uniqueId if we have no component alive anymore, so that we never reach max int
|
|
54
|
-
componentCount--;
|
|
55
|
-
if (componentCount <= 0) {
|
|
56
|
-
uniqueId = 0;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalCustomCssDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
60
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.3", type: NaturalCustomCssDirective, isStandalone: true, selector: "[naturalCustomCss]", inputs: { naturalCustomCss: "naturalCustomCss" }, host: { properties: { "attr.data-natural-id": "this.id" } }, ngImport: i0 });
|
|
61
|
-
}
|
|
62
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalCustomCssDirective, decorators: [{
|
|
63
|
-
type: Directive,
|
|
64
|
-
args: [{
|
|
65
|
-
selector: '[naturalCustomCss]',
|
|
66
|
-
standalone: true,
|
|
67
|
-
}]
|
|
68
|
-
}], propDecorators: { id: [{
|
|
69
|
-
type: HostBinding,
|
|
70
|
-
args: ['attr.data-natural-id']
|
|
71
|
-
}], naturalCustomCss: [{
|
|
72
|
-
type: Input,
|
|
73
|
-
args: [{ required: true }]
|
|
74
|
-
}] } });
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNzcy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsLWVkaXRvci9zcmMvbGliL2N1c3RvbS1jc3MvY3VzdG9tLWNzcy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7O0FBRXpDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQWMsRUFBRSxHQUFXO0lBQ2pELE1BQU0sR0FBRyxJQUFJLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUU3QixPQUFPLEdBQUc7U0FDTCxPQUFPLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQ2hDLFNBQVM7U0FDSixLQUFLLENBQUMsR0FBRyxDQUFDO1NBQ1YsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ1osSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEMsQ0FBQztJQUNMLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FDakI7U0FDQSxJQUFJLEVBQUUsQ0FBQztBQUNoQixDQUFDO0FBRUQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztBQUV2Qjs7Ozs7Ozs7OztHQVVHO0FBS0gsTUFBTSxPQUFPLHlCQUF5QjtJQUNqQixRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXJDLEtBQUssR0FBNEIsSUFBSSxDQUFDO0lBRVEsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQztJQUU1RSxJQUNXLGdCQUFnQixDQUFDLEtBQXlCO1FBQ2pELElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekYsQ0FBQztJQUNMLENBQUM7SUFFTSxXQUFXO1FBQ2QsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUVyQix1RkFBdUY7UUFDdkYsY0FBYyxFQUFFLENBQUM7UUFDakIsSUFBSSxjQUFjLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixDQUFDO0lBQ0wsQ0FBQzt1R0EzQlEseUJBQXlCOzJGQUF6Qix5QkFBeUI7OzJGQUF6Qix5QkFBeUI7a0JBSnJDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsVUFBVSxFQUFFLElBQUk7aUJBQ25COzhCQU15RCxFQUFFO3NCQUF2RCxXQUFXO3VCQUFDLHNCQUFzQjtnQkFHeEIsZ0JBQWdCO3NCQUQxQixLQUFLO3VCQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlLCBIb3N0QmluZGluZywgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8qKlxuICogUHJlZml4IGFsbCBDU1Mgc2VsZWN0b3JzIHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yXG4gKlxuICogVGhpcyBpcyBtZWFudCB0byBiZSByZWxhdGl2ZWx5IHNpbXBsZSBhbmQgbWlnaHQgbm90IGNvdmVyIGFkdmFuY2VkIENTUyBzeW50YXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeENzcyhwcmVmaXg6IHN0cmluZywgY3NzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHByZWZpeCA9ICdcXG4nICsgcHJlZml4ICsgJyAnO1xuXG4gICAgcmV0dXJuIGNzc1xuICAgICAgICAucmVwbGFjZSgvKFtee31dKil7L2dzLCBzZWxlY3RvcnMgPT5cbiAgICAgICAgICAgIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgICAgICAgLm1hcChzZWxlY3RvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci50cmltKCkuc3RhcnRzV2l0aCgnQG1lZGlhJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3Rvci50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgc2VsZWN0b3IudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuam9pbignLCcpLFxuICAgICAgICApXG4gICAgICAgIC50cmltKCk7XG59XG5cbmxldCB1bmlxdWVJZCA9IDA7XG5sZXQgY29tcG9uZW50Q291bnQgPSAwO1xuXG4vKipcbiAqIEluamVjdCBjdXN0b20gQ1NTIGludG8gY29tcG9uZW50IGFuZCBzY29wZSB0aGUgQ1NTIG9ubHkgdG8gdGhpcyBjb21wb25lbnRcbiAqXG4gKiBVc2FnZSA6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiBbbmF0dXJhbEN1c3RvbUNzc109XCIubXktY2xhc3Mge2JhY2tncm91bmQ6IHJlZH1cIj5cbiAqICAgICA8cCBjbGFzcz1cIm15LWNsYXNzXCI+Zm9vIGJhcjwvcD5cbiAqIDwvZGl2PlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW25hdHVyYWxDdXN0b21Dc3NdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsQ3VzdG9tQ3NzRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICAgIHByaXZhdGUgc3R5bGU6IEhUTUxTdHlsZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLW5hdHVyYWwtaWQnKSBwcml2YXRlIHJlYWRvbmx5IGlkID0gJ24nICsgKyt1bmlxdWVJZDtcblxuICAgIEBJbnB1dCh7cmVxdWlyZWQ6IHRydWV9KVxuICAgIHB1YmxpYyBzZXQgbmF0dXJhbEN1c3RvbUNzcyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdGhpcy5zdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLmlubmVySFRNTCA9IHZhbHVlID8gcHJlZml4Q3NzKGBbZGF0YS1uYXR1cmFsLWlkPSR7dGhpcy5pZH1dYCwgdmFsdWUpIDogJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3R5bGU/LnJlbW92ZSgpO1xuXG4gICAgICAgIC8vIFJlc2V0IHVuaXF1ZUlkIGlmIHdlIGhhdmUgbm8gY29tcG9uZW50IGFsaXZlIGFueW1vcmUsIHNvIHRoYXQgd2UgbmV2ZXIgcmVhY2ggbWF4IGludFxuICAgICAgICBjb21wb25lbnRDb3VudC0tO1xuICAgICAgICBpZiAoY29tcG9uZW50Q291bnQgPD0gMCkge1xuICAgICAgICAgICAgdW5pcXVlSWQgPSAwO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|