@myrmidon/gve-core 0.0.6 → 1.0.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/myrmidon-gve-core.mjs +134 -136
- package/fesm2022/myrmidon-gve-core.mjs.map +1 -1
- package/lib/components/feature-editor/feature-editor.component.d.ts +1 -1
- package/package.json +6 -8
- package/esm2022/lib/components/animation-timeline/animation-timeline.component.mjs +0 -207
- package/esm2022/lib/components/animation-timeline-set/animation-timeline-set.component.mjs +0 -154
- package/esm2022/lib/components/animation-tween/animation-tween.component.mjs +0 -184
- package/esm2022/lib/components/base-text-char/base-text-char.component.mjs +0 -46
- package/esm2022/lib/components/base-text-editor/base-text-editor.component.mjs +0 -115
- package/esm2022/lib/components/base-text-view/base-text-view.component.mjs +0 -159
- package/esm2022/lib/components/batch-operation-editor/batch-operation-editor.component.mjs +0 -111
- package/esm2022/lib/components/chain-operation-editor/chain-operation-editor.component.mjs +0 -570
- package/esm2022/lib/components/chain-result-view/chain-result-view.component.mjs +0 -225
- package/esm2022/lib/components/feature-editor/feature-editor.component.mjs +0 -200
- package/esm2022/lib/components/feature-set-editor/feature-set-editor.component.mjs +0 -175
- package/esm2022/lib/components/feature-set-view/feature-set-view.component.mjs +0 -100
- package/esm2022/lib/components/ln-heights-editor/ln-heights-editor.component.mjs +0 -126
- package/esm2022/lib/components/operation-source-editor/operation-source-editor.component.mjs +0 -131
- package/esm2022/lib/components/simple-tree/simple-tree.component.mjs +0 -72
- package/esm2022/lib/components/snapshot-editor/snapshot-editor.component.mjs +0 -870
- package/esm2022/lib/components/steps-map/steps-map.component.mjs +0 -83
- package/esm2022/lib/models.mjs +0 -2
- package/esm2022/lib/services/gve-api.service.mjs +0 -65
- package/esm2022/lib/services/settings.service.mjs +0 -87
- package/esm2022/lib/validators/svg-validators.mjs +0 -34
- package/esm2022/myrmidon-gve-core.mjs +0 -5
- package/esm2022/public-api.mjs +0 -23
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
2
|
-
import { ReactiveFormsModule, Validators, } from '@angular/forms';
|
|
3
|
-
import { debounceTime, distinctUntilChanged } from 'rxjs';
|
|
4
|
-
import { CommonModule } from '@angular/common';
|
|
5
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
-
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
7
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
8
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
9
|
-
import { MatInputModule } from '@angular/material/input';
|
|
10
|
-
import { MatSelectModule } from '@angular/material/select';
|
|
11
|
-
import { MatTabsModule } from '@angular/material/tabs';
|
|
12
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@angular/forms";
|
|
15
|
-
import * as i2 from "@angular/common";
|
|
16
|
-
import * as i3 from "@angular/material/button";
|
|
17
|
-
import * as i4 from "@angular/material/form-field";
|
|
18
|
-
import * as i5 from "@angular/material/icon";
|
|
19
|
-
import * as i6 from "@angular/material/input";
|
|
20
|
-
import * as i7 from "@angular/material/select";
|
|
21
|
-
import * as i8 from "@angular/material/core";
|
|
22
|
-
import * as i9 from "@angular/material/tooltip";
|
|
23
|
-
/**
|
|
24
|
-
* 🔑 `gve-animation-tween`
|
|
25
|
-
*
|
|
26
|
-
* A component to edit an animation tween.
|
|
27
|
-
* Used by the `gve-animation-timeline` component.
|
|
28
|
-
*
|
|
29
|
-
* - ▶️ `tween` (`GveAnimationTween`): the tween to edit.
|
|
30
|
-
* - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected by the tween.
|
|
31
|
-
* - 🔥 `tweenChange` (`GveAnimationTween`): emitted when the tween is changed.
|
|
32
|
-
* - 🔥 `tweenCancel` (`void`): emitted when the user cancels the edit.
|
|
33
|
-
*/
|
|
34
|
-
export class AnimationTweenComponent {
|
|
35
|
-
/**
|
|
36
|
-
* The tween to edit.
|
|
37
|
-
*/
|
|
38
|
-
get tween() {
|
|
39
|
-
return this._tween;
|
|
40
|
-
}
|
|
41
|
-
set tween(value) {
|
|
42
|
-
if (this._tween === value) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
this._tween = value || undefined;
|
|
46
|
-
this.updateForm(this._tween);
|
|
47
|
-
}
|
|
48
|
-
constructor(formBuilder) {
|
|
49
|
-
/**
|
|
50
|
-
* Emitted when the tween is changed.
|
|
51
|
-
*/
|
|
52
|
-
this.tweenChange = new EventEmitter();
|
|
53
|
-
/**
|
|
54
|
-
* Emitted when the user cancels the edit.
|
|
55
|
-
*/
|
|
56
|
-
this.tweenCancel = new EventEmitter();
|
|
57
|
-
this.types = ['to', 'from', 'fromTo', 'set'];
|
|
58
|
-
this.label = formBuilder.control('', {
|
|
59
|
-
nonNullable: true,
|
|
60
|
-
validators: [Validators.required, Validators.maxLength(100)],
|
|
61
|
-
});
|
|
62
|
-
this.note = formBuilder.control(null);
|
|
63
|
-
this.type = formBuilder.control('to', { nonNullable: true });
|
|
64
|
-
this.selector = formBuilder.control('', {
|
|
65
|
-
nonNullable: true,
|
|
66
|
-
validators: [Validators.required, Validators.maxLength(200)],
|
|
67
|
-
});
|
|
68
|
-
this.vars = formBuilder.control('{}', {
|
|
69
|
-
nonNullable: true,
|
|
70
|
-
validators: [Validators.required, this.jsonValidator],
|
|
71
|
-
});
|
|
72
|
-
this.vars2 = formBuilder.control(null, this.jsonValidator);
|
|
73
|
-
this.position = formBuilder.control(null, Validators.maxLength(100));
|
|
74
|
-
this.form = formBuilder.group({
|
|
75
|
-
label: this.label,
|
|
76
|
-
note: this.note,
|
|
77
|
-
type: this.type,
|
|
78
|
-
selector: this.selector,
|
|
79
|
-
vars: this.vars,
|
|
80
|
-
vars2: this.vars2,
|
|
81
|
-
position: this.position,
|
|
82
|
-
});
|
|
83
|
-
this.elementId = formBuilder.control(null);
|
|
84
|
-
}
|
|
85
|
-
ngOnInit() {
|
|
86
|
-
// set selector when elementId changes
|
|
87
|
-
this._sub = this.elementId.valueChanges
|
|
88
|
-
.pipe(debounceTime(200), distinctUntilChanged())
|
|
89
|
-
.subscribe((elementId) => {
|
|
90
|
-
if (elementId) {
|
|
91
|
-
this.selector.setValue('#' + elementId);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
ngOnDestroy() {
|
|
96
|
-
this._sub?.unsubscribe();
|
|
97
|
-
}
|
|
98
|
-
onVarsChange(vars) {
|
|
99
|
-
this.vars.setValue(vars);
|
|
100
|
-
this.vars.markAsDirty();
|
|
101
|
-
this.vars.updateValueAndValidity();
|
|
102
|
-
}
|
|
103
|
-
onVars2Change(vars) {
|
|
104
|
-
this.vars2.setValue(vars);
|
|
105
|
-
this.vars2.markAsDirty();
|
|
106
|
-
this.vars2.updateValueAndValidity();
|
|
107
|
-
}
|
|
108
|
-
close() {
|
|
109
|
-
this.tweenCancel.emit();
|
|
110
|
-
}
|
|
111
|
-
jsonValidator(control) {
|
|
112
|
-
if (!control.value) {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
try {
|
|
116
|
-
JSON.parse(control.value);
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
catch (e) {
|
|
120
|
-
return { json: true };
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
updateForm(tween) {
|
|
124
|
-
if (!tween) {
|
|
125
|
-
this.form.reset();
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
this.label.setValue(tween.label);
|
|
129
|
-
this.note.setValue(tween.note || null);
|
|
130
|
-
this.type.setValue(tween.type);
|
|
131
|
-
this.selector.setValue(tween.selector);
|
|
132
|
-
this.vars.setValue(tween.vars || '{}');
|
|
133
|
-
this.vars2.setValue(tween.vars2 || null);
|
|
134
|
-
this.position.setValue(tween.position || null);
|
|
135
|
-
this.form.markAsPristine();
|
|
136
|
-
}
|
|
137
|
-
getTween() {
|
|
138
|
-
return {
|
|
139
|
-
label: this.label.value,
|
|
140
|
-
note: this.note.value?.trim() || undefined,
|
|
141
|
-
type: this.type.value,
|
|
142
|
-
selector: this.selector.value.trim(),
|
|
143
|
-
vars: this.vars.value,
|
|
144
|
-
vars2: this.vars2.value || undefined,
|
|
145
|
-
position: this.position.value?.trim() || undefined,
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
openUrl(url) {
|
|
149
|
-
window.open(url, '_blank');
|
|
150
|
-
}
|
|
151
|
-
save() {
|
|
152
|
-
if (!this.form.valid) {
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
this._tween = this.getTween();
|
|
156
|
-
this.tweenChange.emit(this._tween);
|
|
157
|
-
}
|
|
158
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AnimationTweenComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
159
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: AnimationTweenComponent, isStandalone: true, selector: "gve-animation-tween", inputs: { tween: "tween", elementIds: "elementIds" }, outputs: { tweenChange: "tweenChange", tweenCancel: "tweenCancel" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <mat-form-field>\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.required && (label.dirty || label.touched)\"\r\n >label required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.maxLength && (label.dirty || label.touched)\"\r\n >label too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option *ngFor=\"let t of types\" [value]=\"t\">{{ t }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- position -->\r\n <mat-form-field>\r\n <mat-label>position</mat-label>\r\n <input matInput [formControl]=\"position\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n [attr.aria-label]=\"'Information about position'\"\r\n (click)=\"\r\n openUrl(\r\n 'https://gsap.com/docs/v3/GSAP/Timeline/#positioning-animations-in-a-timeline'\r\n )\r\n \"\r\n >\r\n <mat-icon>info</mat-icon>\r\n </button>\r\n <mat-hint>time label < > += -=</mat-hint>\r\n <mat-error\r\n *ngIf=\"\r\n $any(position).errors?.maxLength &&\r\n (position.dirty || position.touched)\r\n \"\r\n >position too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- selector -->\r\n <mat-form-field>\r\n <mat-label>selector</mat-label>\r\n <input matInput [formControl]=\"selector\" />\r\n <mat-hint>CSS selector</mat-hint>\r\n <mat-error\r\n *ngIf=\"\r\n $any(selector).errors?.required &&\r\n (selector.dirty || selector.touched)\r\n \"\r\n >selector required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(selector).errors?.maxLength &&\r\n (selector.dirty || selector.touched)\r\n \"\r\n >selector too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- element id -->\r\n @if (elementIds?.length) {\r\n <mat-form-field>\r\n <mat-label>element ID</mat-label>\r\n <mat-select [formControl]=\"elementId\">\r\n <mat-option *ngFor=\"let id of elementIds\" [value]=\"id\">{{\r\n id\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- note -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"2\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error\r\n *ngIf=\"$any(vars).errors?.required && (vars.dirty || vars.touched)\"\r\n >vars required</mat-error\r\n >\r\n <mat-error *ngIf=\"$any(vars).errors?.json && (vars.dirty || vars.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars2 only when type is fromTo -->\r\n @if (type.value === 'fromTo') {\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>2nd vars</mat-label>\r\n <textarea matInput [formControl]=\"vars2\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error\r\n *ngIf=\"$any(vars2).errors?.required && (vars2.dirty || vars2.touched)\"\r\n >vars required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(vars2).errors?.json && (vars2.dirty || vars2.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close tween\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-icon-button\r\n matTooltip=\"Save tween\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.long-text{width:100%;max-width:800px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
|
|
160
|
-
}
|
|
161
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AnimationTweenComponent, decorators: [{
|
|
162
|
-
type: Component,
|
|
163
|
-
args: [{ selector: 'gve-animation-tween', standalone: true, imports: [
|
|
164
|
-
CommonModule,
|
|
165
|
-
ReactiveFormsModule,
|
|
166
|
-
MatButtonModule,
|
|
167
|
-
MatCheckboxModule,
|
|
168
|
-
MatFormFieldModule,
|
|
169
|
-
MatIconModule,
|
|
170
|
-
MatInputModule,
|
|
171
|
-
MatSelectModule,
|
|
172
|
-
MatTabsModule,
|
|
173
|
-
MatTooltipModule,
|
|
174
|
-
], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <mat-form-field>\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.required && (label.dirty || label.touched)\"\r\n >label required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.maxLength && (label.dirty || label.touched)\"\r\n >label too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option *ngFor=\"let t of types\" [value]=\"t\">{{ t }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- position -->\r\n <mat-form-field>\r\n <mat-label>position</mat-label>\r\n <input matInput [formControl]=\"position\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n [attr.aria-label]=\"'Information about position'\"\r\n (click)=\"\r\n openUrl(\r\n 'https://gsap.com/docs/v3/GSAP/Timeline/#positioning-animations-in-a-timeline'\r\n )\r\n \"\r\n >\r\n <mat-icon>info</mat-icon>\r\n </button>\r\n <mat-hint>time label < > += -=</mat-hint>\r\n <mat-error\r\n *ngIf=\"\r\n $any(position).errors?.maxLength &&\r\n (position.dirty || position.touched)\r\n \"\r\n >position too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- selector -->\r\n <mat-form-field>\r\n <mat-label>selector</mat-label>\r\n <input matInput [formControl]=\"selector\" />\r\n <mat-hint>CSS selector</mat-hint>\r\n <mat-error\r\n *ngIf=\"\r\n $any(selector).errors?.required &&\r\n (selector.dirty || selector.touched)\r\n \"\r\n >selector required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(selector).errors?.maxLength &&\r\n (selector.dirty || selector.touched)\r\n \"\r\n >selector too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- element id -->\r\n @if (elementIds?.length) {\r\n <mat-form-field>\r\n <mat-label>element ID</mat-label>\r\n <mat-select [formControl]=\"elementId\">\r\n <mat-option *ngFor=\"let id of elementIds\" [value]=\"id\">{{\r\n id\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- note -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"2\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error\r\n *ngIf=\"$any(vars).errors?.required && (vars.dirty || vars.touched)\"\r\n >vars required</mat-error\r\n >\r\n <mat-error *ngIf=\"$any(vars).errors?.json && (vars.dirty || vars.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars2 only when type is fromTo -->\r\n @if (type.value === 'fromTo') {\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>2nd vars</mat-label>\r\n <textarea matInput [formControl]=\"vars2\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error\r\n *ngIf=\"$any(vars2).errors?.required && (vars2.dirty || vars2.touched)\"\r\n >vars required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(vars2).errors?.json && (vars2.dirty || vars2.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close tween\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-icon-button\r\n matTooltip=\"Save tween\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.long-text{width:100%;max-width:800px}\n"] }]
|
|
175
|
-
}], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { tween: [{
|
|
176
|
-
type: Input
|
|
177
|
-
}], elementIds: [{
|
|
178
|
-
type: Input
|
|
179
|
-
}], tweenChange: [{
|
|
180
|
-
type: Output
|
|
181
|
-
}], tweenCancel: [{
|
|
182
|
-
type: Output
|
|
183
|
-
}] } });
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0aW9uLXR3ZWVuLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9hbmltYXRpb24tdHdlZW4vYW5pbWF0aW9uLXR3ZWVuLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9hbmltYXRpb24tdHdlZW4vYW5pbWF0aW9uLXR3ZWVuLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUtMLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQWdCLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIs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bmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1Hcm91cCxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTWF0VGFic01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcblxyXG5pbXBvcnQgeyBHdmVBbmltYXRpb25Ud2VlbiwgVHdlZW5UeXBlIH0gZnJvbSAnQG15cm1pZG9uL2d2ZS1zbmFwc2hvdC12aWV3JztcclxuXHJcbi8qKlxyXG4gKiDwn5SRIGBndmUtYW5pbWF0aW9uLXR3ZWVuYFxyXG4gKlxyXG4gKiBBIGNvbXBvbmVudCB0byBlZGl0IGFuIGFuaW1hdGlvbiB0d2Vlbi5cclxuICogVXNlZCBieSB0aGUgYGd2ZS1hbmltYXRpb24tdGltZWxpbmVgIGNvbXBvbmVudC5cclxuICpcclxuICogLSDilrbvuI8gYHR3ZWVuYCAoYEd2ZUFuaW1hdGlvblR3ZWVuYCk6IHRoZSB0d2VlbiB0byBlZGl0LlxyXG4gKiAtIOKWtu+4jyBgZWxlbWVudElkc2AgKGBzdHJpbmdbXWApOiB0aGUgSURzIG9mIHRoZSBlbGVtZW50cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCBieSB0aGUgdHdlZW4uXHJcbiAqIC0g8J+UpSBgdHdlZW5DaGFuZ2VgIChgR3ZlQW5pbWF0aW9uVHdlZW5gKTogZW1pdHRlZCB3aGVuIHRoZSB0d2VlbiBpcyBjaGFuZ2VkLlxyXG4gKiAtIPCflKUgYHR3ZWVuQ2FuY2VsYCAoYHZvaWRgKTogZW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGVkaXQuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2d2ZS1hbmltYXRpb24tdHdlZW4nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0VGFic01vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYW5pbWF0aW9uLXR3ZWVuLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYW5pbWF0aW9uLXR3ZWVuLmNvbXBvbmVudC5jc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uVHdlZW5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBfc3ViPzogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgX3R3ZWVuPzogR3ZlQW5pbWF0aW9uVHdlZW47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0d2VlbiB0byBlZGl0LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCB0d2VlbigpOiBHdmVBbmltYXRpb25Ud2VlbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHdlZW47XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgdHdlZW4odmFsdWU6IEd2ZUFuaW1hdGlvblR3ZWVuIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xyXG4gICAgaWYgKHRoaXMuX3R3ZWVuID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl90d2VlbiA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudXBkYXRlRm9ybSh0aGlzLl90d2Vlbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgSURzIG9mIHRoZSBlbGVtZW50cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCBieSB0aGUgdHdlZW4uXHJcbiAgICogVGhpcyBsaXN0IGlzIHVzZWQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IGFuIGVsZW1lbnQgZnJvbSBhIGRyb3Bkb3duLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGVsZW1lbnRJZHM/OiBzdHJpbmdbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB0d2VlbiBpcyBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSB0d2VlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3ZlQW5pbWF0aW9uVHdlZW4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjYW5jZWxzIHRoZSBlZGl0LlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSB0d2VlbkNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHR5cGVzID0gWyd0bycsICdmcm9tJywgJ2Zyb21UbycsICdzZXQnXTtcclxuXHJcbiAgcHVibGljIGxhYmVsOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xyXG4gIHB1YmxpYyBub3RlOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgdHlwZTogRm9ybUNvbnRyb2w8VHdlZW5UeXBlPjtcclxuICBwdWJsaWMgc2VsZWN0b3I6IEZvcm1Db250cm9sPHN0cmluZz47XHJcbiAgcHVibGljIHZhcnM6IEZvcm1Db250cm9sPHN0cmluZz47XHJcbiAgcHVibGljIHZhcnMyOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgcG9zaXRpb246IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIHB1YmxpYyBlbGVtZW50SWQ6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIpIHtcclxuICAgIHRoaXMubGFiZWwgPSBmb3JtQnVpbGRlci5jb250cm9sKCcnLCB7XHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKV0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMubm90ZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCk7XHJcbiAgICB0aGlzLnR5cGUgPSBmb3JtQnVpbGRlci5jb250cm9sKCd0bycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLnNlbGVjdG9yID0gZm9ybUJ1aWxkZXIuY29udHJvbCgnJywge1xyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDIwMCldLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnZhcnMgPSBmb3JtQnVpbGRlci5jb250cm9sKCd7fScsIHtcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmpzb25WYWxpZGF0b3JdLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnZhcnMyID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCB0aGlzLmpzb25WYWxpZGF0b3IpO1xyXG4gICAgdGhpcy5wb3NpdGlvbiA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKSk7XHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsLFxyXG4gICAgICBub3RlOiB0aGlzLm5vdGUsXHJcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcclxuICAgICAgc2VsZWN0b3I6IHRoaXMuc2VsZWN0b3IsXHJcbiAgICAgIHZhcnM6IHRoaXMudmFycyxcclxuICAgICAgdmFyczI6IHRoaXMudmFyczIsXHJcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50SWQgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gc2V0IHNlbGVjdG9yIHdoZW4gZWxlbWVudElkIGNoYW5nZXNcclxuICAgIHRoaXMuX3N1YiA9IHRoaXMuZWxlbWVudElkLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMjAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcclxuICAgICAgLnN1YnNjcmliZSgoZWxlbWVudElkKSA9PiB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnRJZCkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rvci5zZXRWYWx1ZSgnIycgKyBlbGVtZW50SWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25WYXJzQ2hhbmdlKHZhcnM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy52YXJzLnNldFZhbHVlKHZhcnMpO1xyXG4gICAgdGhpcy52YXJzLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLnZhcnMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVmFyczJDaGFuZ2UodmFyczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhcnMyLnNldFZhbHVlKHZhcnMpO1xyXG4gICAgdGhpcy52YXJzMi5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy52YXJzMi51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnR3ZWVuQ2FuY2VsLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUganNvblZhbGlkYXRvcihcclxuICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxyXG4gICk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsIHtcclxuICAgIGlmICghY29udHJvbC52YWx1ZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIEpTT04ucGFyc2UoY29udHJvbC52YWx1ZSk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICByZXR1cm4geyBqc29uOiB0cnVlIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZvcm0odHdlZW4/OiBHdmVBbmltYXRpb25Ud2Vlbik6IHZvaWQge1xyXG4gICAgaWYgKCF0d2Vlbikge1xyXG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sYWJlbC5zZXRWYWx1ZSh0d2Vlbi5sYWJlbCk7XHJcbiAgICB0aGlzLm5vdGUuc2V0VmFsdWUodHdlZW4ubm90ZSB8fCBudWxsKTtcclxuICAgIHRoaXMudHlwZS5zZXRWYWx1ZSh0d2Vlbi50eXBlKTtcclxuICAgIHRoaXMuc2VsZWN0b3Iuc2V0VmFsdWUodHdlZW4uc2VsZWN0b3IpO1xyXG4gICAgdGhpcy52YXJzLnNldFZhbHVlKHR3ZWVuLnZhcnMgfHwgJ3t9Jyk7XHJcbiAgICB0aGlzLnZhcnMyLnNldFZhbHVlKHR3ZWVuLnZhcnMyIHx8IG51bGwpO1xyXG4gICAgdGhpcy5wb3NpdGlvbi5zZXRWYWx1ZSh0d2Vlbi5wb3NpdGlvbiB8fCBudWxsKTtcclxuICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUd2VlbigpOiBHdmVBbmltYXRpb25Ud2VlbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsYWJlbDogdGhpcy5sYWJlbC52YWx1ZSxcclxuICAgICAgbm90ZTogdGhpcy5ub3RlLnZhbHVlPy50cmltKCkgfHwgdW5kZWZpbmVkLFxyXG4gICAgICB0eXBlOiB0aGlzLnR5cGUudmFsdWUsXHJcbiAgICAgIHNlbGVjdG9yOiB0aGlzLnNlbGVjdG9yLnZhbHVlLnRyaW0oKSxcclxuICAgICAgdmFyczogdGhpcy52YXJzLnZhbHVlLFxyXG4gICAgICB2YXJzMjogdGhpcy52YXJzMi52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uLnZhbHVlPy50cmltKCkgfHwgdW5kZWZpbmVkLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuVXJsKHVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdHdlZW4gPSB0aGlzLmdldFR3ZWVuKCk7XHJcbiAgICB0aGlzLnR3ZWVuQ2hhbmdlLmVtaXQodGhpcy5fdHdlZW4pO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgPCEtLSBsYWJlbCAtLT5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD5sYWJlbDwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImxhYmVsXCIgLz5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiJGFueShsYWJlbCkuZXJyb3JzPy5yZXF1aXJlZCAmJiAobGFiZWwuZGlydHkgfHwgbGFiZWwudG91Y2hlZClcIlxyXG4gICAgICAgID5sYWJlbCByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgID5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiJGFueShsYWJlbCkuZXJyb3JzPy5tYXhMZW5ndGggJiYgKGxhYmVsLmRpcnR5IHx8IGxhYmVsLnRvdWNoZWQpXCJcclxuICAgICAgICA+bGFiZWwgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICA+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDwhLS0gdHlwZSAtLT5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD50eXBlPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJ0eXBlXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHQgb2YgdHlwZXNcIiBbdmFsdWVdPVwidFwiPnt7IHQgfX08L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPCEtLSBwb3NpdGlvbiAtLT5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD5wb3NpdGlvbjwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInBvc2l0aW9uXCIgLz5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0luZm9ybWF0aW9uIGFib3V0IHBvc2l0aW9uJ1wiXHJcbiAgICAgICAgKGNsaWNrKT1cIlxyXG4gICAgICAgICAgb3BlblVybChcclxuICAgICAgICAgICAgJ2h0dHBzOi8vZ3NhcC5jb20vZG9jcy92My9HU0FQL1RpbWVsaW5lLyNwb3NpdGlvbmluZy1hbmltYXRpb25zLWluLWEtdGltZWxpbmUnXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxtYXQtaGludD50aW1lIGxhYmVsICZsdDsgJmd0OyArPSAtPTwvbWF0LWhpbnQ+XHJcbiAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgJGFueShwb3NpdGlvbikuZXJyb3JzPy5tYXhMZW5ndGggJiZcclxuICAgICAgICAgIChwb3NpdGlvbi5kaXJ0eSB8fCBwb3NpdGlvbi50b3VjaGVkKVxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgPnBvc2l0aW9uIHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICA8IS0tIHNlbGVjdG9yIC0tPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnNlbGVjdG9yPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwic2VsZWN0b3JcIiAvPlxyXG4gICAgICA8bWF0LWhpbnQ+Q1NTIHNlbGVjdG9yPC9tYXQtaGludD5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAkYW55KHNlbGVjdG9yKS5lcnJvcnM/LnJlcXVpcmVkICYmXHJcbiAgICAgICAgICAoc2VsZWN0b3IuZGlydHkgfHwgc2VsZWN0b3IudG91Y2hlZClcclxuICAgICAgICBcIlxyXG4gICAgICAgID5zZWxlY3RvciByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgID5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAkYW55KHNlbGVjdG9yKS5lcnJvcnM/Lm1heExlbmd0aCAmJlxyXG4gICAgICAgICAgKHNlbGVjdG9yLmRpcnR5IHx8IHNlbGVjdG9yLnRvdWNoZWQpXHJcbiAgICAgICAgXCJcclxuICAgICAgICA+c2VsZWN0b3IgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICA+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDwhLS0gZWxlbWVudCBpZCAtLT5cclxuICAgIEBpZiAoZWxlbWVudElkcz8ubGVuZ3RoKSB7XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+ZWxlbWVudCBJRDwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwiZWxlbWVudElkXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGlkIG9mIGVsZW1lbnRJZHNcIiBbdmFsdWVdPVwiaWRcIj57e1xyXG4gICAgICAgICAgaWRcclxuICAgICAgICB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBub3RlIC0tPlxyXG4gIDxkaXY+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJsb25nLXRleHRcIj5cclxuICAgICAgPG1hdC1sYWJlbD5ub3RlPC9tYXQtbGFiZWw+XHJcbiAgICAgIDx0ZXh0YXJlYSByb3dzPVwiMlwiIG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJub3RlXCI+PC90ZXh0YXJlYT5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiJGFueShub3RlKS5lcnJvcnM/Lm1heExlbmd0aCAmJiAobm90ZS5kaXJ0eSB8fCBub3RlLnRvdWNoZWQpXCJcclxuICAgICAgICA+bm90ZSB0b28gbG9uZzwvbWF0LWVycm9yXHJcbiAgICAgID5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gdmFycyAtLT5cclxuICA8ZGl2PlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibG9uZy10ZXh0XCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+dmFyczwvbWF0LWxhYmVsPlxyXG4gICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInZhcnNcIj48L3RleHRhcmVhPlxyXG4gICAgICA8bWF0LWhpbnQ+SlNPTiBvYmplY3Q8L21hdC1oaW50PlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCIkYW55KHZhcnMpLmVycm9ycz8ucmVxdWlyZWQgJiYgKHZhcnMuZGlydHkgfHwgdmFycy50b3VjaGVkKVwiXHJcbiAgICAgICAgPnZhcnMgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICA+XHJcbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCIkYW55KHZhcnMpLmVycm9ycz8uanNvbiAmJiAodmFycy5kaXJ0eSB8fCB2YXJzLnRvdWNoZWQpXCJcclxuICAgICAgICA+aW52YWxpZCBKU09OPC9tYXQtZXJyb3JcclxuICAgICAgPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSB2YXJzMiBvbmx5IHdoZW4gdHlwZSBpcyBmcm9tVG8gLS0+XHJcbiAgQGlmICh0eXBlLnZhbHVlID09PSAnZnJvbVRvJykge1xyXG4gIDxkaXY+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJsb25nLXRleHRcIj5cclxuICAgICAgPG1hdC1sYWJlbD4ybmQgdmFyczwvbWF0LWxhYmVsPlxyXG4gICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInZhcnMyXCI+PC90ZXh0YXJlYT5cclxuICAgICAgPG1hdC1oaW50PkpTT04gb2JqZWN0PC9tYXQtaGludD5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiJGFueSh2YXJzMikuZXJyb3JzPy5yZXF1aXJlZCAmJiAodmFyczIuZGlydHkgfHwgdmFyczIudG91Y2hlZClcIlxyXG4gICAgICAgID52YXJzIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgPlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCIkYW55KHZhcnMyKS5lcnJvcnM/Lmpzb24gJiYgKHZhcnMyLmRpcnR5IHx8IHZhcnMyLnRvdWNoZWQpXCJcclxuICAgICAgICA+aW52YWxpZCBKU09OPC9tYXQtZXJyb3JcclxuICAgICAgPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Rpdj5cclxuICB9XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJtYXQtd2FyblwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiQ2xvc2UgdHdlZW5cIlxyXG4gICAgICAoY2xpY2spPVwiY2xvc2UoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC13YXJuXCI+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJTYXZlIHR3ZWVuXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZCB8fCBmb3JtLnByaXN0aW5lXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZm9ybT5cclxuIl19
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import { MatRippleModule } from '@angular/material/core';
|
|
3
|
-
import { NgToolsModule } from '@myrmidon/ng-tools';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/material/core";
|
|
6
|
-
import * as i2 from "@myrmidon/ng-tools";
|
|
7
|
-
/**
|
|
8
|
-
* 🔑 `gve-base-text-char`
|
|
9
|
-
*
|
|
10
|
-
* A component that displays a single character from a base text.
|
|
11
|
-
* Used by `gve-base-text-view`.
|
|
12
|
-
*/
|
|
13
|
-
export class BaseTextCharComponent {
|
|
14
|
-
constructor() {
|
|
15
|
-
this.defaultColor = '#D8D8D8';
|
|
16
|
-
this.defaultBorderColor = '#D8D8D8';
|
|
17
|
-
this.defaultEmSize = 1.5;
|
|
18
|
-
/**
|
|
19
|
-
* Emitted when the character is clicked.
|
|
20
|
-
*/
|
|
21
|
-
this.charPick = new EventEmitter();
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* The character to display.
|
|
25
|
-
*/
|
|
26
|
-
get char() {
|
|
27
|
-
return this._char;
|
|
28
|
-
}
|
|
29
|
-
set char(value) {
|
|
30
|
-
this._char = value || undefined;
|
|
31
|
-
}
|
|
32
|
-
onCharClick(event) {
|
|
33
|
-
this.charPick.emit({ char: this._char, event });
|
|
34
|
-
}
|
|
35
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: BaseTextCharComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
36
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: BaseTextCharComponent, isStandalone: true, selector: "gve-base-text-char", inputs: { char: "char" }, outputs: { charPick: "charPick" }, ngImport: i0, template: "@if (char) {\r\n<div matRipple id=\"container\" (click)=\"onCharClick($event)\">\r\n <div\r\n id=\"c-label\"\r\n [style.fontSize]=\"char.emSize + 'em'\"\r\n [style.borderColor]=\"char.borderColor\"\r\n >\r\n {{ char.label }}\r\n </div>\r\n <div\r\n id=\"c-id\"\r\n [style.fontSize]=\"char.emSize / 2 + 'em'\"\r\n [style.color]=\"char.color | colorToContrast\"\r\n [style.borderColor]=\"char.borderColor\"\r\n [style.backgroundColor]=\"char.color\"\r\n >\r\n {{ char.id }}\r\n </div>\r\n</div>\r\n}\r\n", styles: ["div#container{cursor:pointer;flex-direction:column;align-items:center}div#c-label{border:1px solid silver;border-radius:6px;padding:6px;height:1.5em;align-items:center;justify-content:center;text-align:center}div#c-id{margin-top:4px;margin-bottom:16px;border:1px solid silver;border-radius:6px;padding:6px;align-items:center;justify-content:center;text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i1.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: NgToolsModule }, { kind: "pipe", type: i2.ColorToContrastPipe, name: "colorToContrast" }] }); }
|
|
37
|
-
}
|
|
38
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: BaseTextCharComponent, decorators: [{
|
|
39
|
-
type: Component,
|
|
40
|
-
args: [{ selector: 'gve-base-text-char', standalone: true, imports: [MatRippleModule, NgToolsModule], template: "@if (char) {\r\n<div matRipple id=\"container\" (click)=\"onCharClick($event)\">\r\n <div\r\n id=\"c-label\"\r\n [style.fontSize]=\"char.emSize + 'em'\"\r\n [style.borderColor]=\"char.borderColor\"\r\n >\r\n {{ char.label }}\r\n </div>\r\n <div\r\n id=\"c-id\"\r\n [style.fontSize]=\"char.emSize / 2 + 'em'\"\r\n [style.color]=\"char.color | colorToContrast\"\r\n [style.borderColor]=\"char.borderColor\"\r\n [style.backgroundColor]=\"char.color\"\r\n >\r\n {{ char.id }}\r\n </div>\r\n</div>\r\n}\r\n", styles: ["div#container{cursor:pointer;flex-direction:column;align-items:center}div#c-label{border:1px solid silver;border-radius:6px;padding:6px;height:1.5em;align-items:center;justify-content:center;text-align:center}div#c-id{margin-top:4px;margin-bottom:16px;border:1px solid silver;border-radius:6px;padding:6px;align-items:center;justify-content:center;text-align:center}\n"] }]
|
|
41
|
-
}], propDecorators: { char: [{
|
|
42
|
-
type: Input
|
|
43
|
-
}], charPick: [{
|
|
44
|
-
type: Output
|
|
45
|
-
}] } });
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10ZXh0LWNoYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vZ3ZlLWNvcmUvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGV4dC1jaGFyL2Jhc2UtdGV4dC1jaGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9iYXNlLXRleHQtY2hhci9iYXNlLXRleHQtY2hhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7QUF1Qm5EOzs7OztHQUtHO0FBUUgsTUFBTSxPQUFPLHFCQUFxQjtJQVBsQztRQVVTLGlCQUFZLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLHVCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUMvQixrQkFBYSxHQUFHLEdBQUcsQ0FBQztRQWEzQjs7V0FFRztRQUVJLGFBQVEsR0FDYixJQUFJLFlBQVksRUFBcUIsQ0FBQztLQUt6QztJQXJCQzs7T0FFRztJQUNILElBQ1csSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFBVyxJQUFJLENBQUMsS0FBc0M7UUFDcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUksU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFTTSxXQUFXLENBQUMsS0FBaUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7K0dBM0JVLHFCQUFxQjttR0FBckIscUJBQXFCLDJJQ3ZDbEMsMmhCQW9CQSx5YURlWSxlQUFlLGtTQUFFLGFBQWE7OzRGQUk3QixxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUCxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUM7OEJBZTlCLElBQUk7c0JBRGQsS0FBSztnQkFZQyxRQUFRO3NCQURkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRSaXBwbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuXHJcbmltcG9ydCB7IE5nVG9vbHNNb2R1bGUgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5cclxuLyoqXHJcbiAqIEEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIGEgYmFzZSB0ZXh0LlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBCYXNlVGV4dENoYXIge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGNvbG9yOiBzdHJpbmc7XHJcbiAgYm9yZGVyQ29sb3I6IHN0cmluZztcclxuICBlbVNpemU6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEV2ZW50IGVtaXR0ZWQgYnkgdGhlIGJhc2UgdGV4dCBjaGFyYWN0ZXIgY29tcG9uZW50IHdoZW4gYSBjaGFyYWN0ZXJcclxuICogaXMgY2xpY2tlZC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVRleHRDaGFyRXZlbnQge1xyXG4gIGNoYXI6IEJhc2VUZXh0Q2hhcjtcclxuICBldmVudDogTW91c2VFdmVudDtcclxufVxyXG5cclxuLyoqXHJcbiAqIPCflJEgYGd2ZS1iYXNlLXRleHQtY2hhcmBcclxuICpcclxuICogQSBjb21wb25lbnQgdGhhdCBkaXNwbGF5cyBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBhIGJhc2UgdGV4dC5cclxuICogVXNlZCBieSBgZ3ZlLWJhc2UtdGV4dC12aWV3YC5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZ3ZlLWJhc2UtdGV4dC1jaGFyJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtNYXRSaXBwbGVNb2R1bGUsIE5nVG9vbHNNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9iYXNlLXRleHQtY2hhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2Jhc2UtdGV4dC1jaGFyLmNvbXBvbmVudC5jc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFzZVRleHRDaGFyQ29tcG9uZW50IHtcclxuICBwcml2YXRlIF9jaGFyOiBCYXNlVGV4dENoYXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHB1YmxpYyBkZWZhdWx0Q29sb3IgPSAnI0Q4RDhEOCc7XHJcbiAgcHVibGljIGRlZmF1bHRCb3JkZXJDb2xvciA9ICcjRDhEOEQ4JztcclxuICBwdWJsaWMgZGVmYXVsdEVtU2l6ZSA9IDEuNTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGNoYXJhY3RlciB0byBkaXNwbGF5LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBjaGFyKCk6IEJhc2VUZXh0Q2hhciB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hhcjtcclxuICB9XHJcbiAgcHVibGljIHNldCBjaGFyKHZhbHVlOiBCYXNlVGV4dENoYXIgfCB1bmRlZmluZWQgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9jaGFyID0gdmFsdWUgfHwgdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgY2xpY2tlZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgY2hhclBpY2s6IEV2ZW50RW1pdHRlcjxCYXNlVGV4dENoYXJFdmVudD4gPVxyXG4gICAgbmV3IEV2ZW50RW1pdHRlcjxCYXNlVGV4dENoYXJFdmVudD4oKTtcclxuXHJcbiAgcHVibGljIG9uQ2hhckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmNoYXJQaWNrLmVtaXQoeyBjaGFyOiB0aGlzLl9jaGFyISwgZXZlbnQgfSk7XHJcbiAgfVxyXG59XHJcbiIsIkBpZiAoY2hhcikge1xyXG48ZGl2IG1hdFJpcHBsZSBpZD1cImNvbnRhaW5lclwiIChjbGljayk9XCJvbkNoYXJDbGljaygkZXZlbnQpXCI+XHJcbiAgPGRpdlxyXG4gICAgaWQ9XCJjLWxhYmVsXCJcclxuICAgIFtzdHlsZS5mb250U2l6ZV09XCJjaGFyLmVtU2l6ZSArICdlbSdcIlxyXG4gICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImNoYXIuYm9yZGVyQ29sb3JcIlxyXG4gID5cclxuICAgIHt7IGNoYXIubGFiZWwgfX1cclxuICA8L2Rpdj5cclxuICA8ZGl2XHJcbiAgICBpZD1cImMtaWRcIlxyXG4gICAgW3N0eWxlLmZvbnRTaXplXT1cImNoYXIuZW1TaXplIC8gMiArICdlbSdcIlxyXG4gICAgW3N0eWxlLmNvbG9yXT1cImNoYXIuY29sb3IgfCBjb2xvclRvQ29udHJhc3RcIlxyXG4gICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImNoYXIuYm9yZGVyQ29sb3JcIlxyXG4gICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJjaGFyLmNvbG9yXCJcclxuICA+XHJcbiAgICB7eyBjaGFyLmlkIH19XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG59XHJcbiJdfQ==
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
3
|
-
import { ReactiveFormsModule, Validators, } from '@angular/forms';
|
|
4
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
5
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
6
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
7
|
-
import { MatInputModule } from '@angular/material/input';
|
|
8
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
9
|
-
import { SnapshotViewService, } from '@myrmidon/gve-snapshot-view';
|
|
10
|
-
import { BaseTextViewComponent, } from '../base-text-view/base-text-view.component';
|
|
11
|
-
import { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@angular/forms";
|
|
14
|
-
import * as i2 from "@myrmidon/ng-mat-tools";
|
|
15
|
-
import * as i3 from "@angular/common";
|
|
16
|
-
import * as i4 from "@angular/material/button";
|
|
17
|
-
import * as i5 from "@angular/material/form-field";
|
|
18
|
-
import * as i6 from "@angular/material/input";
|
|
19
|
-
import * as i7 from "@angular/material/tooltip";
|
|
20
|
-
/**
|
|
21
|
-
* 🔑 `gve-base-text-editor`
|
|
22
|
-
*
|
|
23
|
-
* Editor for snapshot's base text. This can receive a string or an array
|
|
24
|
-
* of `CharNode` objects, and lets the user edit the text, character by
|
|
25
|
-
* character, optionally also setting its features.
|
|
26
|
-
*
|
|
27
|
-
* Used by the `gve-snapshot-editor` component.
|
|
28
|
-
*/
|
|
29
|
-
export class BaseTextEditorComponent {
|
|
30
|
-
/**
|
|
31
|
-
* The text to edit. In input this can be a string, an array of `CharNode`
|
|
32
|
-
* objects. In output this will be an array of `CharNode` objects.
|
|
33
|
-
*/
|
|
34
|
-
get text() {
|
|
35
|
-
return this._text;
|
|
36
|
-
}
|
|
37
|
-
set text(value) {
|
|
38
|
-
this.resetSelectedChar();
|
|
39
|
-
if (this._text === value) {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
if (!value) {
|
|
43
|
-
this._text = [];
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
this._text = Array.isArray(value)
|
|
47
|
-
? value
|
|
48
|
-
: SnapshotViewService.stringToBaseChars(value);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
constructor(formBuilder, _dialogService) {
|
|
52
|
-
this._dialogService = _dialogService;
|
|
53
|
-
this._text = [];
|
|
54
|
-
/**
|
|
55
|
-
* Emitted for the edited text as an array of `CharNode`'s whenever it changes.
|
|
56
|
-
*/
|
|
57
|
-
this.textChange = new EventEmitter();
|
|
58
|
-
this.userText = formBuilder.control('', {
|
|
59
|
-
nonNullable: true,
|
|
60
|
-
validators: [Validators.required, Validators.maxLength(10000)],
|
|
61
|
-
});
|
|
62
|
-
this.form = formBuilder.group({
|
|
63
|
-
userText: this.userText,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
resetSelectedChar() {
|
|
67
|
-
this.selectedChar = undefined;
|
|
68
|
-
this.selectedCharLabel = undefined;
|
|
69
|
-
}
|
|
70
|
-
onSelectedChar(event) {
|
|
71
|
-
this.selectedChar = this._text.find((c) => c.id === event.char.id);
|
|
72
|
-
this.selectedCharLabel = event.char.label;
|
|
73
|
-
}
|
|
74
|
-
onFeaturesChange(features) {
|
|
75
|
-
this.selectedChar.features = features;
|
|
76
|
-
this.textChange.emit(this._text);
|
|
77
|
-
}
|
|
78
|
-
onRangePick(range) {
|
|
79
|
-
this.textRange = range;
|
|
80
|
-
}
|
|
81
|
-
patchTextFromUser() {
|
|
82
|
-
// TODO
|
|
83
|
-
}
|
|
84
|
-
setTextFromUser() {
|
|
85
|
-
this._dialogService
|
|
86
|
-
.confirm('Confirm', 'Reset text?')
|
|
87
|
-
.subscribe((yes) => {
|
|
88
|
-
if (yes) {
|
|
89
|
-
this.text = this.userText.value;
|
|
90
|
-
this.textChange.emit(this._text);
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: BaseTextEditorComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
95
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: BaseTextEditorComponent, isStandalone: true, selector: "gve-base-text-editor", inputs: { text: "text" }, outputs: { textChange: "textChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"setTextFromUser()\">\r\n <!-- text -->\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"5\"></textarea>\r\n <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.required &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >text required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.maxLength &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >text too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <!-- set -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-warn\"\r\n matTooltip=\"Reset characters to newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"setTextFromUser()\"\r\n >\r\n set\r\n </button>\r\n <!-- patch: TODO -->\r\n <!-- <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n matTooltip=\"Patch characters with newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"patchTextFromUser()\"\r\n >\r\n patch\r\n </button> -->\r\n </div>\r\n\r\n <!-- base text -->\r\n <div id=\"text-view\">\r\n <gve-base-text-view\r\n [text]=\"text\"\r\n (charPick)=\"onSelectedChar($event)\"\r\n (rangePick)=\"textRange = $event\"\r\n />\r\n\r\n <!-- text range -->\r\n @if (textRange) {\r\n <div id=\"text-range\">{{ textRange.at }} \u00D7 {{ textRange.run }}</div>\r\n }\r\n </div>\r\n\r\n <!-- char features -->\r\n @if (selectedChar) {\r\n <fieldset>\r\n <legend>features</legend>\r\n <gve-feature-set-editor\r\n [features]=\"selectedChar.features || []\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n }\r\n</form>\r\n", styles: [".full-width{width:100%}#text-view{margin:8px 0}fieldset{border:1px solid #ccc;padding:10px;margin:10px 0;border-radius:5px}legend{color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { 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: "ngmodule", type: MatIconModule }, { 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"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: BaseTextViewComponent, selector: "gve-base-text-view", inputs: ["defaultColor", "defaultBorderColor", "selectionColor", "hasLineNumber", "text"], outputs: ["charPick", "rangePick"] }, { kind: "component", type: FeatureSetEditorComponent, selector: "gve-feature-set-editor", inputs: ["isVar", "featNames", "featValues", "filterThreshold", "features"], outputs: ["featuresChange"] }] }); }
|
|
96
|
-
}
|
|
97
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: BaseTextEditorComponent, decorators: [{
|
|
98
|
-
type: Component,
|
|
99
|
-
args: [{ selector: 'gve-base-text-editor', standalone: true, imports: [
|
|
100
|
-
CommonModule,
|
|
101
|
-
ReactiveFormsModule,
|
|
102
|
-
MatButtonModule,
|
|
103
|
-
MatFormFieldModule,
|
|
104
|
-
MatIconModule,
|
|
105
|
-
MatInputModule,
|
|
106
|
-
MatTooltipModule,
|
|
107
|
-
BaseTextViewComponent,
|
|
108
|
-
FeatureSetEditorComponent,
|
|
109
|
-
], template: "<form [formGroup]=\"form\" (submit)=\"setTextFromUser()\">\r\n <!-- text -->\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"5\"></textarea>\r\n <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.required &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >text required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.maxLength &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >text too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <!-- set -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-warn\"\r\n matTooltip=\"Reset characters to newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"setTextFromUser()\"\r\n >\r\n set\r\n </button>\r\n <!-- patch: TODO -->\r\n <!-- <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n matTooltip=\"Patch characters with newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"patchTextFromUser()\"\r\n >\r\n patch\r\n </button> -->\r\n </div>\r\n\r\n <!-- base text -->\r\n <div id=\"text-view\">\r\n <gve-base-text-view\r\n [text]=\"text\"\r\n (charPick)=\"onSelectedChar($event)\"\r\n (rangePick)=\"textRange = $event\"\r\n />\r\n\r\n <!-- text range -->\r\n @if (textRange) {\r\n <div id=\"text-range\">{{ textRange.at }} \u00D7 {{ textRange.run }}</div>\r\n }\r\n </div>\r\n\r\n <!-- char features -->\r\n @if (selectedChar) {\r\n <fieldset>\r\n <legend>features</legend>\r\n <gve-feature-set-editor\r\n [features]=\"selectedChar.features || []\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n }\r\n</form>\r\n", styles: [".full-width{width:100%}#text-view{margin:8px 0}fieldset{border:1px solid #ccc;padding:10px;margin:10px 0;border-radius:5px}legend{color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
|
|
110
|
-
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.DialogService }], propDecorators: { text: [{
|
|
111
|
-
type: Input
|
|
112
|
-
}], textChange: [{
|
|
113
|
-
type: Output
|
|
114
|
-
}] } });
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10ZXh0LWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9ndmUtY29yZS9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS10ZXh0LWVkaXRvci9iYXNlLXRleHQtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9iYXNlLXRleHQtZWRpdG9yL2Jhc2UtdGV4dC1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUlMLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBR0wsbUJBQW1CLEdBQ3BCLE1BQU0sNkJBQTZCLENBQUM7QUFJckMsT0FBTyxFQUNMLHFCQUFxQixHQUV0QixNQUFNLDRDQUE0QyxDQUFDO0FBQ3BELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7Ozs7QUFFL0Y7Ozs7Ozs7O0dBUUc7QUFrQkgsTUFBTSxP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YUFBYSw4QkFDYixjQUFjLDBXQUNkLGdCQUFnQiw2VEFDaEIscUJBQXFCLDhMQUNyQix5QkFBeUI7OzRGQUtoQix1QkFBdUI7a0JBakJuQyxTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixxQkFBcUI7d0JBQ3JCLHlCQUF5QjtxQkFDMUI7NEdBWVUsSUFBSTtzQkFEZCxLQUFLO2dCQXNCVSxVQUFVO3NCQUR6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ2hhck5vZGUsXHJcbiAgRmVhdHVyZSxcclxuICBTbmFwc2hvdFZpZXdTZXJ2aWNlLFxyXG59IGZyb20gJ0BteXJtaWRvbi9ndmUtc25hcHNob3Qtdmlldyc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAbXlybWlkb24vbmctbWF0LXRvb2xzJztcclxuXHJcbmltcG9ydCB7IEJhc2VUZXh0Q2hhckV2ZW50IH0gZnJvbSAnLi4vYmFzZS10ZXh0LWNoYXIvYmFzZS10ZXh0LWNoYXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBCYXNlVGV4dFZpZXdDb21wb25lbnQsXHJcbiAgVmFyQmFzZVRleHRSYW5nZSxcclxufSBmcm9tICcuLi9iYXNlLXRleHQtdmlldy9iYXNlLXRleHQtdmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGZWF0dXJlU2V0RWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZmVhdHVyZS1zZXQtZWRpdG9yL2ZlYXR1cmUtc2V0LWVkaXRvci5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIPCflJEgYGd2ZS1iYXNlLXRleHQtZWRpdG9yYFxyXG4gKlxyXG4gKiBFZGl0b3IgZm9yIHNuYXBzaG90J3MgYmFzZSB0ZXh0LiBUaGlzIGNhbiByZWNlaXZlIGEgc3RyaW5nIG9yIGFuIGFycmF5XHJcbiAqIG9mIGBDaGFyTm9kZWAgb2JqZWN0cywgYW5kIGxldHMgdGhlIHVzZXIgZWRpdCB0aGUgdGV4dCwgY2hhcmFjdGVyIGJ5XHJcbiAqIGNoYXJhY3Rlciwgb3B0aW9uYWxseSBhbHNvIHNldHRpbmcgaXRzIGZlYXR1cmVzLlxyXG4gKlxyXG4gKiBVc2VkIGJ5IHRoZSBgZ3ZlLXNuYXBzaG90LWVkaXRvcmAgY29tcG9uZW50LlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdndmUtYmFzZS10ZXh0LWVkaXRvcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIEJhc2VUZXh0Vmlld0NvbXBvbmVudCxcclxuICAgIEZlYXR1cmVTZXRFZGl0b3JDb21wb25lbnQsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYmFzZS10ZXh0LWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2Jhc2UtdGV4dC1lZGl0b3IuY29tcG9uZW50LmNzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlVGV4dEVkaXRvckNvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSBfdGV4dDogQ2hhck5vZGVbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgdGV4dCB0byBlZGl0LiBJbiBpbnB1dCB0aGlzIGNhbiBiZSBhIHN0cmluZywgYW4gYXJyYXkgb2YgYENoYXJOb2RlYFxyXG4gICAqIG9iamVjdHMuIEluIG91dHB1dCB0aGlzIHdpbGwgYmUgYW4gYXJyYXkgb2YgYENoYXJOb2RlYCBvYmplY3RzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCB0ZXh0KCk6IENoYXJOb2RlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RleHQ7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nIHwgQ2hhck5vZGVbXSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcclxuICAgIHRoaXMucmVzZXRTZWxlY3RlZENoYXIoKTtcclxuICAgIGlmICh0aGlzLl90ZXh0ID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX3RleHQgPSBbXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3RleHQgPSBBcnJheS5pc0FycmF5KHZhbHVlKVxyXG4gICAgICAgID8gdmFsdWVcclxuICAgICAgICA6IFNuYXBzaG90Vmlld1NlcnZpY2Uuc3RyaW5nVG9CYXNlQ2hhcnModmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCBmb3IgdGhlIGVkaXRlZCB0ZXh0IGFzIGFuIGFycmF5IG9mIGBDaGFyTm9kZWAncyB3aGVuZXZlciBpdCBjaGFuZ2VzLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSB0ZXh0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFyTm9kZVtdPigpO1xyXG5cclxuICBwdWJsaWMgdXNlclRleHQ6IEZvcm1Db250cm9sPHN0cmluZz47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIHNlbGVjdGVkQ2hhcj86IENoYXJOb2RlO1xyXG4gIHB1YmxpYyBzZWxlY3RlZENoYXJMYWJlbD86IHN0cmluZztcclxuICBwdWJsaWMgdGV4dFJhbmdlPzogVmFyQmFzZVRleHRSYW5nZTtcclxuXHJcbiAgY29uc3RydWN0b3IoZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIF9kaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLnVzZXJUZXh0ID0gZm9ybUJ1aWxkZXIuY29udHJvbCgnJywge1xyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMDAwKV0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgdXNlclRleHQ6IHRoaXMudXNlclRleHQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRTZWxlY3RlZENoYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDaGFyTGFiZWwgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TZWxlY3RlZENoYXIoZXZlbnQ6IEJhc2VUZXh0Q2hhckV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hhciA9IHRoaXMuX3RleHQuZmluZCgoYykgPT4gYy5pZCA9PT0gZXZlbnQuY2hhci5pZCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hhckxhYmVsID0gZXZlbnQuY2hhci5sYWJlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkZlYXR1cmVzQ2hhbmdlKGZlYXR1cmVzOiBGZWF0dXJlW10pOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDaGFyIS5mZWF0dXJlcyA9IGZlYXR1cmVzO1xyXG4gICAgdGhpcy50ZXh0Q2hhbmdlLmVtaXQodGhpcy5fdGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25SYW5nZVBpY2socmFuZ2U6IFZhckJhc2VUZXh0UmFuZ2UpIHtcclxuICAgIHRoaXMudGV4dFJhbmdlID0gcmFuZ2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGF0Y2hUZXh0RnJvbVVzZXIoKTogdm9pZCB7XHJcbiAgICAvLyBUT0RPXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VGV4dEZyb21Vc2VyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGlhbG9nU2VydmljZVxyXG4gICAgICAuY29uZmlybSgnQ29uZmlybScsICdSZXNldCB0ZXh0PycpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHllczogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmICh5ZXMpIHtcclxuICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMudXNlclRleHQudmFsdWU7XHJcbiAgICAgICAgICB0aGlzLnRleHRDaGFuZ2UuZW1pdCh0aGlzLl90ZXh0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNldFRleHRGcm9tVXNlcigpXCI+XHJcbiAgPCEtLSB0ZXh0IC0tPlxyXG4gIDxkaXY+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+dGV4dDwvbWF0LWxhYmVsPlxyXG4gICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInVzZXJUZXh0XCIgcm93cz1cIjVcIj48L3RleHRhcmVhPlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICRhbnkodXNlclRleHQpLmVycm9ycz8ucmVxdWlyZWQgJiZcclxuICAgICAgICAgICh1c2VyVGV4dC5kaXJ0eSB8fCB1c2VyVGV4dC50b3VjaGVkKVxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgPnRleHQgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICA+XHJcbiAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgJGFueSh1c2VyVGV4dCkuZXJyb3JzPy5tYXhMZW5ndGggJiZcclxuICAgICAgICAgICh1c2VyVGV4dC5kaXJ0eSB8fCB1c2VyVGV4dC50b3VjaGVkKVxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgPnRleHQgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICA+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gYnV0dG9ucyAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgIDwhLS0gc2V0IC0tPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgIGNsYXNzPVwibWF0LXdhcm5cIlxyXG4gICAgICBtYXRUb29sdGlwPVwiUmVzZXQgY2hhcmFjdGVycyB0byBuZXdseSBlbnRlcmVkIHRleHRcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiIXVzZXJUZXh0LnZhbHVlXCJcclxuICAgICAgKGNsaWNrKT1cInNldFRleHRGcm9tVXNlcigpXCJcclxuICAgID5cclxuICAgICAgc2V0XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDwhLS0gcGF0Y2g6IFRPRE8gLS0+XHJcbiAgICA8IS0tIDxidXR0b25cclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcclxuICAgICAgbWF0VG9vbHRpcD1cIlBhdGNoIGNoYXJhY3RlcnMgd2l0aCBuZXdseSBlbnRlcmVkIHRleHRcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiIXVzZXJUZXh0LnZhbHVlXCJcclxuICAgICAgKGNsaWNrKT1cInBhdGNoVGV4dEZyb21Vc2VyKClcIlxyXG4gICAgPlxyXG4gICAgICBwYXRjaFxyXG4gICAgPC9idXR0b24+IC0tPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIGJhc2UgdGV4dCAtLT5cclxuICA8ZGl2IGlkPVwidGV4dC12aWV3XCI+XHJcbiAgICA8Z3ZlLWJhc2UtdGV4dC12aWV3XHJcbiAgICAgIFt0ZXh0XT1cInRleHRcIlxyXG4gICAgICAoY2hhclBpY2spPVwib25TZWxlY3RlZENoYXIoJGV2ZW50KVwiXHJcbiAgICAgIChyYW5nZVBpY2spPVwidGV4dFJhbmdlID0gJGV2ZW50XCJcclxuICAgIC8+XHJcblxyXG4gICAgPCEtLSB0ZXh0IHJhbmdlIC0tPlxyXG4gICAgQGlmICh0ZXh0UmFuZ2UpIHtcclxuICAgIDxkaXYgaWQ9XCJ0ZXh0LXJhbmdlXCI+e3sgdGV4dFJhbmdlLmF0IH19IMOXIHt7IHRleHRSYW5nZS5ydW4gfX08L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBjaGFyIGZlYXR1cmVzIC0tPlxyXG4gIEBpZiAoc2VsZWN0ZWRDaGFyKSB7XHJcbiAgPGZpZWxkc2V0PlxyXG4gICAgPGxlZ2VuZD5mZWF0dXJlczwvbGVnZW5kPlxyXG4gICAgPGd2ZS1mZWF0dXJlLXNldC1lZGl0b3JcclxuICAgICAgW2ZlYXR1cmVzXT1cInNlbGVjdGVkQ2hhci5mZWF0dXJlcyB8fCBbXVwiXHJcbiAgICAgIChmZWF0dXJlc0NoYW5nZSk9XCJvbkZlYXR1cmVzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgLz5cclxuICA8L2ZpZWxkc2V0PlxyXG4gIH1cclxuPC9mb3JtPlxyXG4iXX0=
|