@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.
Files changed (36) hide show
  1. package/fesm2022/ecodev-natural-editor.mjs +40 -44
  2. package/fesm2022/ecodev-natural-editor.mjs.map +1 -1
  3. package/lib/class-dialog/class-dialog.component.d.ts +1 -1
  4. package/lib/color-dialog/color-dialog.component.d.ts +1 -1
  5. package/lib/editor/editor.component.d.ts +6 -4
  6. package/lib/id-dialog/id-dialog.component.d.ts +1 -1
  7. package/lib/link-dialog/link-dialog.component.d.ts +1 -1
  8. package/package.json +6 -8
  9. package/esm2022/ecodev-natural-editor.mjs +0 -5
  10. package/esm2022/lib/class-dialog/class-dialog.component.mjs +0 -40
  11. package/esm2022/lib/color-dialog/color-dialog.component.mjs +0 -197
  12. package/esm2022/lib/custom-css/custom-css.directive.mjs +0 -75
  13. package/esm2022/lib/editor/editor.component.mjs +0 -238
  14. package/esm2022/lib/id-dialog/id-dialog.component.mjs +0 -40
  15. package/esm2022/lib/link-dialog/link-dialog.component.mjs +0 -39
  16. package/esm2022/lib/utils/image.mjs +0 -82
  17. package/esm2022/lib/utils/inputrules.mjs +0 -70
  18. package/esm2022/lib/utils/items/cell-background-color-item.mjs +0 -55
  19. package/esm2022/lib/utils/items/class-item.mjs +0 -85
  20. package/esm2022/lib/utils/items/horizontal-rule-item.mjs +0 -24
  21. package/esm2022/lib/utils/items/id-item.mjs +0 -85
  22. package/esm2022/lib/utils/items/item.mjs +0 -40
  23. package/esm2022/lib/utils/items/link-item.mjs +0 -40
  24. package/esm2022/lib/utils/items/table-item.mjs +0 -43
  25. package/esm2022/lib/utils/items/text-align-item.mjs +0 -78
  26. package/esm2022/lib/utils/items/text-color-item.mjs +0 -56
  27. package/esm2022/lib/utils/items/utils.mjs +0 -55
  28. package/esm2022/lib/utils/items/wrap-list-item.mjs +0 -6
  29. package/esm2022/lib/utils/keymap.mjs +0 -115
  30. package/esm2022/lib/utils/menu.mjs +0 -111
  31. package/esm2022/lib/utils/schema/heading.mjs +0 -64
  32. package/esm2022/lib/utils/schema/paragraph-with-alignment.mjs +0 -50
  33. package/esm2022/lib/utils/schema/schema.mjs +0 -58
  34. package/esm2022/lib/utils/schema/table.mjs +0 -120
  35. package/esm2022/lib/utils/schema/text-color.mjs +0 -18
  36. 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, "ng-component", never, {}, {}, never, never, true, never>;
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, "ng-component", never, {}, {}, never, never, true, never>;
26
+ static ɵcmp: i0.ɵɵComponentDeclaration<ColorDialogComponent, "natural-editor-color-dialog", never, {}, {}, never, never, true, never>;
27
27
  }
@@ -1,7 +1,8 @@
1
- import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
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: EventEmitter<string>;
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: EventEmitter<void>;
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, "ng-component", never, {}, {}, never, never, true, never>;
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, "ng-component", never, {}, {}, never, never, true, never>;
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.1.2",
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.5.3"
31
+ "tslib": "^2.8.1"
34
32
  },
35
33
  "peerDependencies": {
36
- "@angular/common": "^18.1.0",
37
- "@angular/core": "^18.1.0",
38
- "@angular/forms": "^18.1.0",
39
- "@angular/material": "^18.1.0",
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