@tilde-nlp/ngx-common 5.0.4 → 5.0.6

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.
@@ -10,6 +10,7 @@ import { TTS_I18N } from './translations/tts-i18n';
10
10
  import { MatTooltipModule } from '@angular/material/tooltip';
11
11
  import { MatSelectModule } from '@angular/material/select';
12
12
  import { MatFormFieldModule } from '@angular/material/form-field';
13
+ import { FlexLayoutModule } from '@ngbracket/ngx-layout';
13
14
  import * as i0 from "@angular/core";
14
15
  import * as i1 from "@angular/common";
15
16
  import * as i2 from "@angular/forms";
@@ -17,6 +18,7 @@ import * as i3 from "@angular/material/tooltip";
17
18
  import * as i4 from "@angular/material/form-field";
18
19
  import * as i5 from "@angular/material/select";
19
20
  import * as i6 from "@angular/material/core";
21
+ import * as i7 from "@ngbracket/ngx-layout/extended";
20
22
  function TextToSpeechComponent_mat_option_5_Template(rf, ctx) { if (rf & 1) {
21
23
  i0.ɵɵelementStart(0, "mat-option", 12);
22
24
  i0.ɵɵtext(1);
@@ -72,11 +74,19 @@ export class TextToSpeechComponent {
72
74
  }
73
75
  this.isLoading = true;
74
76
  const text = this.text.length > this.maxCharLength ? this.text.substring(0, this.maxCharLength) : this.text;
77
+ if ((this.audio && text === this.previousText) && (this.selectedVoice === this.previousVoice)) {
78
+ this.audio.play();
79
+ this.isPlaying = true;
80
+ this.isLoading = false;
81
+ return;
82
+ }
75
83
  this.#textPlayService
76
84
  .play(text, this.selectedVoice, this.xApiKey)
77
85
  .pipe(finalize(() => { this.isLoading = false; }))
78
86
  .subscribe({
79
87
  next: (res) => {
88
+ this.previousText = text;
89
+ this.previousVoice = this.selectedVoice;
80
90
  const audioUrl = URL.createObjectURL(res);
81
91
  this.audio = new Audio(audioUrl);
82
92
  this.audio.play();
@@ -91,6 +101,7 @@ export class TextToSpeechComponent {
91
101
  stop() {
92
102
  if (this.audio) {
93
103
  this.audio.pause();
104
+ this.audio.currentTime = 0;
94
105
  this.isPlaying = false;
95
106
  }
96
107
  }
@@ -117,7 +128,7 @@ export class TextToSpeechComponent {
117
128
  return document.querySelector('html').getAttribute(this.langAttributeKey).split('-')[0];
118
129
  }
119
130
  static { this.ɵfac = function TextToSpeechComponent_Factory(t) { return new (t || TextToSpeechComponent)(); }; }
120
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TextToSpeechComponent, selectors: [["lib-text-to-speech"]], inputs: { xApiKey: "xApiKey", language: "language", maxCharLength: "maxCharLength" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 15, vars: 14, consts: [[1, "text-to-speech-wrapper"], ["appearance", "outline", "color", "accent"], [3, "valueChange", "value"], [3, "value", 4, "ngFor", "ngForOf"], [1, "text-to-speech-textarea-wrapper"], [1, "text-to-speech-textarea", 3, "ngModelChange", "ngModel", "placeholder"], [1, "text-to-speech-characters"], [1, "text-to-speech-actions"], [3, "matTooltip"], ["mat-icon-button", "", 3, "click", "matTooltip", "disabled"], [4, "ngIf"], [3, "diameter", 4, "ngIf"], [3, "value"], [3, "diameter"]], template: function TextToSpeechComponent_Template(rf, ctx) { if (rf & 1) {
131
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TextToSpeechComponent, selectors: [["lib-text-to-speech"]], inputs: { xApiKey: "xApiKey", language: "language", maxCharLength: "maxCharLength" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 15, vars: 15, consts: [[1, "text-to-speech-wrapper", 3, "ngClass.lt-md"], ["appearance", "outline", "color", "accent"], [3, "valueChange", "value"], [3, "value", 4, "ngFor", "ngForOf"], [1, "text-to-speech-textarea-wrapper"], [1, "text-to-speech-textarea", 3, "ngModelChange", "ngModel", "placeholder"], [1, "text-to-speech-characters"], [1, "text-to-speech-actions"], [3, "matTooltip"], ["mat-icon-button", "", 3, "click", "matTooltip", "disabled"], [4, "ngIf"], [3, "diameter", 4, "ngIf"], [3, "value"], [3, "diameter"]], template: function TextToSpeechComponent_Template(rf, ctx) { if (rf & 1) {
121
132
  i0.ɵɵelementStart(0, "div", 0)(1, "mat-form-field", 1)(2, "mat-label");
122
133
  i0.ɵɵtext(3);
123
134
  i0.ɵɵelementEnd();
@@ -136,7 +147,8 @@ export class TextToSpeechComponent {
136
147
  i0.ɵɵtemplate(13, TextToSpeechComponent_mat_icon_13_Template, 2, 1, "mat-icon", 10)(14, TextToSpeechComponent_mat_spinner_14_Template, 1, 1, "mat-spinner", 11);
137
148
  i0.ɵɵelementEnd()()()();
138
149
  } if (rf & 2) {
139
- let tmp_6_0;
150
+ let tmp_7_0;
151
+ i0.ɵɵproperty("ngClass.lt-md", "mobile");
140
152
  i0.ɵɵadvance(3);
141
153
  i0.ɵɵtextInterpolate(ctx.translations.selectVoice);
142
154
  i0.ɵɵadvance();
@@ -149,7 +161,7 @@ export class TextToSpeechComponent {
149
161
  i0.ɵɵadvance();
150
162
  i0.ɵɵclassProp("text-overflow", ctx.hasOverflow);
151
163
  i0.ɵɵadvance();
152
- i0.ɵɵtextInterpolate2(" ", (tmp_6_0 = ctx.text == null ? null : ctx.text.length) !== null && tmp_6_0 !== undefined ? tmp_6_0 : 0, "/", ctx.maxCharLength, " ");
164
+ i0.ɵɵtextInterpolate2(" ", (tmp_7_0 = ctx.text == null ? null : ctx.text.length) !== null && tmp_7_0 !== undefined ? tmp_7_0 : 0, "/", ctx.maxCharLength, " ");
153
165
  i0.ɵɵadvance(2);
154
166
  i0.ɵɵproperty("matTooltip", !ctx.text ? ctx.translations.playDisabled : "");
155
167
  i0.ɵɵadvance();
@@ -161,7 +173,7 @@ export class TextToSpeechComponent {
161
173
  } }, dependencies: [CommonModule, i1.NgForOf, i1.NgIf, MatIconButton,
162
174
  MatIcon,
163
175
  FormsModule, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, MatProgressSpinner,
164
- MatTooltipModule, i3.MatTooltip, MatFormFieldModule, i4.MatFormField, i4.MatLabel, MatSelectModule, i5.MatSelect, i6.MatOption], styles: [".text-to-speech-wrapper[_ngcontent-%COMP%]{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%], .text-to-speech-textarea[_ngcontent-%COMP%]{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%]{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea[_ngcontent-%COMP%]{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions[_ngcontent-%COMP%]{position:absolute;bottom:-25px}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:#fff;background-color:var(--accent)}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled{background-color:var(--base-70)}.text-to-speech-characters[_ngcontent-%COMP%]{position:absolute;right:0;bottom:0;margin:5px;font-size:14px;color:var(--base-65)}.text-overflow[_ngcontent-%COMP%]{right:30px}"] }); }
176
+ MatTooltipModule, i3.MatTooltip, MatFormFieldModule, i4.MatFormField, i4.MatLabel, MatSelectModule, i5.MatSelect, i6.MatOption, FlexLayoutModule, i7.DefaultClassDirective], styles: [".text-to-speech-wrapper[_ngcontent-%COMP%]{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%], .text-to-speech-textarea[_ngcontent-%COMP%]{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%]{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea[_ngcontent-%COMP%]{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions[_ngcontent-%COMP%]{position:absolute;bottom:-25px}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:#fff;background-color:var(--accent)}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled{background-color:var(--base-70)}.text-to-speech-characters[_ngcontent-%COMP%]{position:absolute;right:10px;bottom:0;margin:5px;font-size:13px;color:var(--base-65)}.text-overflow[_ngcontent-%COMP%]{right:30px}.mobile[_ngcontent-%COMP%] .text-overflow[_ngcontent-%COMP%]{right:15px}"] }); }
165
177
  }
166
178
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TextToSpeechComponent, [{
167
179
  type: Component,
@@ -174,8 +186,9 @@ export class TextToSpeechComponent {
174
186
  MatProgressSpinner,
175
187
  MatTooltipModule,
176
188
  MatFormFieldModule,
177
- MatSelectModule
178
- ], template: "<div class=\"text-to-speech-wrapper\">\r\n <mat-form-field appearance=\"outline\" color=\"accent\">\r\n <mat-label>{{translations.selectVoice}}</mat-label>\r\n <mat-select [(value)]=\"selectedVoice\">\r\n <mat-option *ngFor=\"let voice of voiceList\" [value]=\"voice\">\r\n {{ translations.voiceList[voice] }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <div class=\"text-to-speech-textarea-wrapper\">\r\n <textarea [(ngModel)]=\"text\" class=\"text-to-speech-textarea\" [placeholder]=\"translations.placeholder\"></textarea>\r\n <div [class.text-overflow]=\"hasOverflow\" class=\"text-to-speech-characters\">\r\n {{text?.length ?? 0}}/{{maxCharLength}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-to-speech-actions\">\r\n <div [matTooltip]=\"!text ? translations.playDisabled : ''\">\r\n <button [matTooltip]=\"isPlaying ? translations.stop : translations.play\" [disabled]=\"!text || isLoading\" (click)=\"playText()\" mat-icon-button>\r\n <mat-icon *ngIf=\"!isLoading\"> {{ isPlaying ? 'stop' : 'volume_up' }} </mat-icon>\r\n <mat-spinner *ngIf=\"isLoading\" [diameter]=\"20\"></mat-spinner>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".text-to-speech-wrapper{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper mat-form-field{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper,.text-to-speech-textarea{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions{position:absolute;bottom:-25px}.text-to-speech-actions button{color:#fff;background-color:var(--accent)}.text-to-speech-actions button:disabled{background-color:var(--base-70)}.text-to-speech-characters{position:absolute;right:0;bottom:0;margin:5px;font-size:14px;color:var(--base-65)}.text-overflow{right:30px}\n"] }]
189
+ MatSelectModule,
190
+ FlexLayoutModule
191
+ ], template: "<div [ngClass.lt-md]=\"'mobile'\" class=\"text-to-speech-wrapper\">\r\n <mat-form-field appearance=\"outline\" color=\"accent\">\r\n <mat-label>{{translations.selectVoice}}</mat-label>\r\n <mat-select [(value)]=\"selectedVoice\">\r\n <mat-option *ngFor=\"let voice of voiceList\" [value]=\"voice\">\r\n {{ translations.voiceList[voice] }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <div class=\"text-to-speech-textarea-wrapper\">\r\n <textarea [(ngModel)]=\"text\" class=\"text-to-speech-textarea\" [placeholder]=\"translations.placeholder\"></textarea>\r\n <div [class.text-overflow]=\"hasOverflow\" class=\"text-to-speech-characters\">\r\n {{text?.length ?? 0}}/{{maxCharLength}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-to-speech-actions\">\r\n <div [matTooltip]=\"!text ? translations.playDisabled : ''\">\r\n <button [matTooltip]=\"isPlaying ? translations.stop : translations.play\" [disabled]=\"!text || isLoading\" (click)=\"playText()\" mat-icon-button>\r\n <mat-icon *ngIf=\"!isLoading\"> {{ isPlaying ? 'stop' : 'volume_up' }} </mat-icon>\r\n <mat-spinner *ngIf=\"isLoading\" [diameter]=\"20\"></mat-spinner>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".text-to-speech-wrapper{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper mat-form-field{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper,.text-to-speech-textarea{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions{position:absolute;bottom:-25px}.text-to-speech-actions button{color:#fff;background-color:var(--accent)}.text-to-speech-actions button:disabled{background-color:var(--base-70)}.text-to-speech-characters{position:absolute;right:10px;bottom:0;margin:5px;font-size:13px;color:var(--base-65)}.text-overflow{right:30px}.mobile .text-overflow{right:15px}\n"] }]
179
192
  }], null, { xApiKey: [{
180
193
  type: Input
181
194
  }], language: [{
@@ -183,5 +196,5 @@ export class TextToSpeechComponent {
183
196
  }], maxCharLength: [{
184
197
  type: Input
185
198
  }] }); })();
186
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TextToSpeechComponent, { className: "TextToSpeechComponent", filePath: "lib\\text-to-speech\\text-to-speech.component.ts", lineNumber: 31 }); })();
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC10by1zcGVlY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbW1vbi9zcmMvbGliL3RleHQtdG8tc3BlZWNoL3RleHQtdG8tc3BlZWNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi90ZXh0LXRvLXNwZWVjaC90ZXh0LXRvLXNwZWVjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7SUNQNUQsc0NBQTREO0lBQzFELFlBQ0Y7SUFBQSxpQkFBYTs7OztJQUYrQixnQ0FBZTtJQUN6RCxjQUNGO0lBREUsd0VBQ0Y7OztJQWNFLGdDQUE2QjtJQUFDLFlBQXdDO0lBQUEsaUJBQVc7OztJQUFuRCxjQUF3QztJQUF4Qyx3RUFBd0M7OztJQUN0RSxrQ0FBNkQ7O0lBQTlCLDZCQUFlOztBRFN0RCxNQUFNLE9BQU8scUJBQXFCO0lBakJsQztRQW9CVyxrQkFBYSxHQUFXLElBQUksQ0FBQztRQUVyQixxQkFBZ0IsR0FBRyxNQUFNLENBQUM7UUFDMUIsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFFL0IsY0FBUyxHQUFHLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBR2xELGtCQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQWtCekIscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0tBb0VyRDtJQWpGQyxJQUFJLFlBQVk7UUFDZCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQXdCLENBQUM7UUFDM0UsT0FBTyxRQUFRLEVBQUUsWUFBWSxHQUFHLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO0lBQ3ZFLENBQUM7SUFFUSxnQkFBZ0IsQ0FBMkI7SUFFcEQsUUFBUTtRQUNOLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUV0QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRTVHLElBQUksQ0FBQyxnQkFBZ0I7YUFDbEIsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hELFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBRWxCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUV0QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUU7b0JBQ3hCLEdBQUcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixDQUFDLENBQUM7WUFDSixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFTyw2QkFBNkI7UUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDM0IsQ0FBQztRQUVELE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxhQUErQixFQUFFLEVBQUU7WUFDaEUsS0FBSyxNQUFNLFFBQVEsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxRQUFRLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUN2RixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzdELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFnQixDQUFDO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQzlFLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsOERBQThEO1FBQzlELE9BQVEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25HLENBQUM7c0ZBaEdVLHFCQUFxQjtvRUFBckIscUJBQXFCO1lDNUI5QixBQURGLEFBREYsOEJBQW9DLHdCQUNrQixnQkFDdkM7WUFBQSxZQUE0QjtZQUFBLGlCQUFZO1lBQ25ELHFDQUFzQztZQUExQiwwTkFBeUI7WUFDbkMsb0ZBQTREO1lBSWhFLEFBREUsaUJBQWEsRUFDRTtZQUdmLEFBREYsOEJBQTZDLGtCQUMyRDtZQUE1RiwwTUFBa0I7WUFBMEUsaUJBQVc7WUFDakgsOEJBQTJFO1lBQ3pFLFlBQ0Y7WUFDRixBQURFLGlCQUFNLEVBQ0Y7WUFJRixBQURGLEFBREYsK0JBQW9DLGNBQ3lCLGlCQUNxRjtZQUFyQyxtR0FBUyxjQUFVLElBQUM7WUFFM0gsQUFEQSxtRkFBNkIsNEVBQ2tCO1lBSXZELEFBREUsQUFERSxBQURFLGlCQUFTLEVBQ0wsRUFDRixFQUNGOzs7WUF2QlMsZUFBNEI7WUFBNUIsa0RBQTRCO1lBQzNCLGNBQXlCO1lBQXpCLCtDQUF5QjtZQUNMLGNBQVk7WUFBWix1Q0FBWTtZQU9sQyxlQUFrQjtZQUFsQix3Q0FBa0I7WUFBaUMsMERBQXdDO1lBQ2hHLGNBQW1DO1lBQW5DLGdEQUFtQztZQUN0QyxjQUNGO1lBREUsOEpBQ0Y7WUFJSyxlQUFxRDtZQUFyRCwyRUFBcUQ7WUFDaEQsY0FBZ0U7WUFBQyxBQUFqRSwwRkFBZ0Usd0NBQWdDO1lBQzNGLGNBQWdCO1lBQWhCLHFDQUFnQjtZQUNiLGNBQWU7WUFBZixvQ0FBZTs0QkRKakMsWUFBWSx1QkFFWixhQUFhO1lBQ2IsT0FBTztZQUNQLFdBQVcsMkRBQ1gsa0JBQWtCO1lBQ2xCLGdCQUFnQixpQkFDaEIsa0JBQWtCLGdDQUNsQixlQUFlOztpRkFLTixxQkFBcUI7Y0FqQmpDLFNBQVM7MkJBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUDtvQkFDUCxZQUFZO29CQUNaLFNBQVM7b0JBQ1QsYUFBYTtvQkFDYixPQUFPO29CQUNQLFdBQVc7b0JBQ1gsa0JBQWtCO29CQUNsQixnQkFBZ0I7b0JBQ2hCLGtCQUFrQjtvQkFDbEIsZUFBZTtpQkFDaEI7Z0JBS1EsT0FBTztrQkFBZixLQUFLO1lBQ0csUUFBUTtrQkFBaEIsS0FBSztZQUNHLGFBQWE7a0JBQXJCLEtBQUs7O2tGQUhLLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b24sIE1hdEljb25CdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IFRleHRQbGF5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGV4dC1wbGF5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcclxuaW1wb3J0IHsgVFRTX0kxOE4gfSBmcm9tICcuL3RyYW5zbGF0aW9ucy90dHMtaTE4bic7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10ZXh0LXRvLXNwZWVjaCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBNYXRJY29uQnV0dG9uLFxyXG4gICAgTWF0SWNvbixcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0UHJvZ3Jlc3NTcGlubmVyLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZVxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RleHQtdG8tc3BlZWNoLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdGV4dC10by1zcGVlY2guY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGV4dFRvU3BlZWNoQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSB4QXBpS2V5ITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGxhbmd1YWdlITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG1heENoYXJMZW5ndGg6IG51bWJlciA9IDEwMDA7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbGFuZ0F0dHJpYnV0ZUtleSA9ICdsYW5nJztcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRMYW5ndWFnZSA9ICdsdic7XHJcblxyXG4gIHJlYWRvbmx5IHZvaWNlTGlzdCA9IFsnc2FuZHJhNCcsICdsdi1MVi1nZW5lcmFsJ107XHJcblxyXG4gIHRleHQhOiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRWb2ljZSA9IHRoaXMudm9pY2VMaXN0WzBdO1xyXG4gIGF1ZGlvITogSFRNTEF1ZGlvRWxlbWVudDtcclxuICBpc0xvYWRpbmchOiBib29sZWFuO1xyXG4gIGlzUGxheWluZyE6IGJvb2xlYW47XHJcblxyXG4gIGdldCB0cmFuc2xhdGlvbnMoKSB7XHJcbiAgICBpZiAoVFRTX0kxOE5bdGhpcy5sYW5ndWFnZV0pIHtcclxuICAgICAgcmV0dXJuIFRUU19JMThOW3RoaXMubGFuZ3VhZ2VdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBUVFNfSTE4Tlt0aGlzLmRlZmF1bHRMYW5ndWFnZV07XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzT3ZlcmZsb3coKSB7XHJcbiAgICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykgYXMgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICAgIHJldHVybiB0ZXh0YXJlYT8uY2xpZW50SGVpZ2h0IDwgdGV4dGFyZWE/LnNjcm9sbEhlaWdodCA/IHRydWUgOiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgcmVhZG9ubHkgI3RleHRQbGF5U2VydmljZSA9IGluamVjdChUZXh0UGxheVNlcnZpY2UpO1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMud2F0Y2hIdG1sTGFuZ0F0dHJpYnV0ZUNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHBsYXlUZXh0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7XHJcbiAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHQubGVuZ3RoID4gdGhpcy5tYXhDaGFyTGVuZ3RoID8gdGhpcy50ZXh0LnN1YnN0cmluZygwLCB0aGlzLm1heENoYXJMZW5ndGgpIDogdGhpcy50ZXh0O1xyXG5cclxuICAgIHRoaXMuI3RleHRQbGF5U2VydmljZVxyXG4gICAgICAucGxheSh0ZXh0LCB0aGlzLnNlbGVjdGVkVm9pY2UsIHRoaXMueEFwaUtleSlcclxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4geyB0aGlzLmlzTG9hZGluZyA9IGZhbHNlIH0pKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBhdWRpb1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwocmVzKTtcclxuICAgICAgICAgIHRoaXMuYXVkaW8gPSBuZXcgQXVkaW8oYXVkaW9VcmwpO1xyXG4gICAgICAgICAgdGhpcy5hdWRpby5wbGF5KCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIHRoaXMuYXVkaW8ub25lbmRlZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChhdWRpb1VybCk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RvcCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmF1ZGlvKSB7XHJcbiAgICAgIHRoaXMuYXVkaW8ucGF1c2UoKTtcclxuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgd2F0Y2hIdG1sTGFuZ0F0dHJpYnV0ZUNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuZ2V0SHRtbExhbmdBdHRyaWJ1dGUoKTtcclxuICAgIFxyXG4gICAgaWYgKCF0aGlzLmxhbmd1YWdlICYmIChsYW5ndWFnZSAhPT0gdGhpcy5kZWZhdWx0TGFuZ3VhZ2UpKSB7XHJcbiAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvbkxhbmdBdHRyaWJ1dGVDaGFuZ2UgPSAobXV0YXRpb25zTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xyXG4gICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uc0xpc3QpIHtcclxuICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PT0gJ2F0dHJpYnV0ZXMnICYmIG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09IHRoaXMubGFuZ0F0dHJpYnV0ZUtleSkge1xyXG4gICAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMuZ2V0SHRtbExhbmdBdHRyaWJ1dGUoKTtcclxuICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5nO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICBcclxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIob25MYW5nQXR0cmlidXRlQ2hhbmdlKTtcclxuICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3QgY29uZmlnID0geyBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFt0aGlzLmxhbmdBdHRyaWJ1dGVLZXldIH07XHJcbiAgICBvYnNlcnZlci5vYnNlcnZlKGh0bWxFbGVtZW50LCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIdG1sTGFuZ0F0dHJpYnV0ZSgpOiBzdHJpbmcge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIHJldHVybiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpIGFzIGFueSkuZ2V0QXR0cmlidXRlKHRoaXMubGFuZ0F0dHJpYnV0ZUtleSkuc3BsaXQoJy0nKVswXTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInRleHQtdG8tc3BlZWNoLXdyYXBwZXJcIj5cclxuICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjb2xvcj1cImFjY2VudFwiPlxyXG4gICAgPG1hdC1sYWJlbD57e3RyYW5zbGF0aW9ucy5zZWxlY3RWb2ljZX19PC9tYXQtbGFiZWw+XHJcbiAgICA8bWF0LXNlbGVjdCBbKHZhbHVlKV09XCJzZWxlY3RlZFZvaWNlXCI+XHJcbiAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB2b2ljZSBvZiB2b2ljZUxpc3RcIiBbdmFsdWVdPVwidm9pY2VcIj5cclxuICAgICAgICB7eyB0cmFuc2xhdGlvbnMudm9pY2VMaXN0W3ZvaWNlXSB9fVxyXG4gICAgICA8L21hdC1vcHRpb24+XHJcbiAgICA8L21hdC1zZWxlY3Q+XHJcbiAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInRleHQtdG8tc3BlZWNoLXRleHRhcmVhLXdyYXBwZXJcIj5cclxuICAgIDx0ZXh0YXJlYSBbKG5nTW9kZWwpXT1cInRleHRcIiBjbGFzcz1cInRleHQtdG8tc3BlZWNoLXRleHRhcmVhXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9ucy5wbGFjZWhvbGRlclwiPjwvdGV4dGFyZWE+XHJcbiAgICA8ZGl2IFtjbGFzcy50ZXh0LW92ZXJmbG93XT1cImhhc092ZXJmbG93XCIgY2xhc3M9XCJ0ZXh0LXRvLXNwZWVjaC1jaGFyYWN0ZXJzXCI+XHJcbiAgICAgIHt7dGV4dD8ubGVuZ3RoID8/IDB9fS97e21heENoYXJMZW5ndGh9fVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ0ZXh0LXRvLXNwZWVjaC1hY3Rpb25zXCI+XHJcbiAgICA8ZGl2IFttYXRUb29sdGlwXT1cIiF0ZXh0ID8gdHJhbnNsYXRpb25zLnBsYXlEaXNhYmxlZCA6ICcnXCI+XHJcbiAgICAgIDxidXR0b24gW21hdFRvb2x0aXBdPVwiaXNQbGF5aW5nID8gdHJhbnNsYXRpb25zLnN0b3AgOiB0cmFuc2xhdGlvbnMucGxheVwiIFtkaXNhYmxlZF09XCIhdGV4dCB8fCBpc0xvYWRpbmdcIiAoY2xpY2spPVwicGxheVRleHQoKVwiIG1hdC1pY29uLWJ1dHRvbj5cclxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhaXNMb2FkaW5nXCI+IHt7IGlzUGxheWluZyA/ICdzdG9wJyA6ICd2b2x1bWVfdXAnIH19ICA8L21hdC1pY29uPlxyXG4gICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImlzTG9hZGluZ1wiIFtkaWFtZXRlcl09XCIyMFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
199
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TextToSpeechComponent, { className: "TextToSpeechComponent", filePath: "lib\\text-to-speech\\text-to-speech.component.ts", lineNumber: 33 }); })();
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC10by1zcGVlY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbW1vbi9zcmMvbGliL3RleHQtdG8tc3BlZWNoL3RleHQtdG8tc3BlZWNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi90ZXh0LXRvLXNwZWVjaC90ZXh0LXRvLXNwZWVjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7O0lDUm5ELHNDQUE0RDtJQUMxRCxZ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LCtDQUF5QjtZQUNMLGNBQVk7WUFBWix1Q0FBWTtZQU9sQyxlQUFrQjtZQUFsQix3Q0FBa0I7WUFBaUMsMERBQXdDO1lBQ2hHLGNBQW1DO1lBQW5DLGdEQUFtQztZQUN0QyxjQUNGO1lBREUsOEpBQ0Y7WUFJSyxlQUFxRDtZQUFyRCwyRUFBcUQ7WUFDaEQsY0FBZ0U7WUFBQyxBQUFqRSwwRkFBZ0Usd0NBQWdDO1lBQzNGLGNBQWdCO1lBQWhCLHFDQUFnQjtZQUNiLGNBQWU7WUFBZixvQ0FBZTs0QkRIakMsWUFBWSx1QkFFWixhQUFhO1lBQ2IsT0FBTztZQUNQLFdBQVcsMkRBQ1gsa0JBQWtCO1lBQ2xCLGdCQUFnQixpQkFDaEIsa0JBQWtCLGdDQUNsQixlQUFlLDhCQUNmLGdCQUFnQjs7aUZBS1AscUJBQXFCO2NBbEJqQyxTQUFTOzJCQUNFLG9CQUFvQixjQUNsQixJQUFJLFdBQ1A7b0JBQ1AsWUFBWTtvQkFDWixTQUFTO29CQUNULGFBQWE7b0JBQ2IsT0FBTztvQkFDUCxXQUFXO29CQUNYLGtCQUFrQjtvQkFDbEIsZ0JBQWdCO29CQUNoQixrQkFBa0I7b0JBQ2xCLGVBQWU7b0JBQ2YsZ0JBQWdCO2lCQUNqQjtnQkFLUSxPQUFPO2tCQUFmLEtBQUs7WUFDRyxRQUFRO2tCQUFoQixLQUFLO1lBQ0csYUFBYTtrQkFBckIsS0FBSzs7a0ZBSEsscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbiwgTWF0SWNvbkJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgVGV4dFBsYXlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy90ZXh0LXBsYXkuc2VydmljZSc7XHJcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xyXG5pbXBvcnQgeyBUVFNfSTE4TiB9IGZyb20gJy4vdHJhbnNsYXRpb25zL3R0cy1pMThuJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgRmxleExheW91dE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10ZXh0LXRvLXNwZWVjaCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBNYXRJY29uQnV0dG9uLFxyXG4gICAgTWF0SWNvbixcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0UHJvZ3Jlc3NTcGlubmVyLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIEZsZXhMYXlvdXRNb2R1bGVcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXh0LXRvLXNwZWVjaC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3RleHQtdG8tc3BlZWNoLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRleHRUb1NwZWVjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgeEFwaUtleSE6IHN0cmluZztcclxuICBASW5wdXQoKSBsYW5ndWFnZSE6IHN0cmluZztcclxuICBASW5wdXQoKSBtYXhDaGFyTGVuZ3RoOiBudW1iZXIgPSAxMDAwO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGxhbmdBdHRyaWJ1dGVLZXkgPSAnbGFuZyc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0TGFuZ3VhZ2UgPSAnbHYnO1xyXG5cclxuICByZWFkb25seSB2b2ljZUxpc3QgPSBbJ3NhbmRyYTQnLCAnbHYtTFYtZ2VuZXJhbCddO1xyXG5cclxuICB0ZXh0ITogc3RyaW5nO1xyXG4gIHByZXZpb3VzVGV4dCE6IHN0cmluZztcclxuICBwcmV2aW91c1ZvaWNlITogc3RyaW5nO1xyXG4gIHNlbGVjdGVkVm9pY2UgPSB0aGlzLnZvaWNlTGlzdFswXTtcclxuICBhdWRpbyE6IEhUTUxBdWRpb0VsZW1lbnQ7XHJcbiAgaXNMb2FkaW5nITogYm9vbGVhbjtcclxuICBpc1BsYXlpbmchOiBib29sZWFuO1xyXG5cclxuICBnZXQgdHJhbnNsYXRpb25zKCkge1xyXG4gICAgaWYgKFRUU19JMThOW3RoaXMubGFuZ3VhZ2VdKSB7XHJcbiAgICAgIHJldHVybiBUVFNfSTE4Tlt0aGlzLmxhbmd1YWdlXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gVFRTX0kxOE5bdGhpcy5kZWZhdWx0TGFuZ3VhZ2VdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc092ZXJmbG93KCkge1xyXG4gICAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpIGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcbiAgICByZXR1cm4gdGV4dGFyZWE/LmNsaWVudEhlaWdodCA8IHRleHRhcmVhPy5zY3JvbGxIZWlnaHQgPyB0cnVlIDogZmFsc2VcclxuICB9XHJcblxyXG4gIHJlYWRvbmx5ICN0ZXh0UGxheVNlcnZpY2UgPSBpbmplY3QoVGV4dFBsYXlTZXJ2aWNlKTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLndhdGNoSHRtbExhbmdBdHRyaWJ1dGVDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwbGF5VGV4dCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzUGxheWluZykge1xyXG4gICAgICB0aGlzLnN0b3AoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0Lmxlbmd0aCA+IHRoaXMubWF4Q2hhckxlbmd0aCA/IHRoaXMudGV4dC5zdWJzdHJpbmcoMCwgdGhpcy5tYXhDaGFyTGVuZ3RoKSA6IHRoaXMudGV4dDtcclxuXHJcbiAgICBpZiAoKHRoaXMuYXVkaW8gJiYgdGV4dCA9PT0gdGhpcy5wcmV2aW91c1RleHQpICYmICh0aGlzLnNlbGVjdGVkVm9pY2UgPT09IHRoaXMucHJldmlvdXNWb2ljZSkpIHtcclxuICAgICAgdGhpcy5hdWRpby5wbGF5KCk7XHJcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuI3RleHRQbGF5U2VydmljZVxyXG4gICAgICAucGxheSh0ZXh0LCB0aGlzLnNlbGVjdGVkVm9pY2UsIHRoaXMueEFwaUtleSlcclxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4geyB0aGlzLmlzTG9hZGluZyA9IGZhbHNlIH0pKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzVGV4dCA9IHRleHQ7XHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzVm9pY2UgPSB0aGlzLnNlbGVjdGVkVm9pY2U7XHJcbiAgICAgICAgICBjb25zdCBhdWRpb1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwocmVzKTtcclxuICAgICAgICAgIHRoaXMuYXVkaW8gPSBuZXcgQXVkaW8oYXVkaW9VcmwpO1xyXG4gICAgICAgICAgdGhpcy5hdWRpby5wbGF5KCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIHRoaXMuYXVkaW8ub25lbmRlZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChhdWRpb1VybCk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RvcCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmF1ZGlvKSB7XHJcbiAgICAgIHRoaXMuYXVkaW8ucGF1c2UoKTtcclxuICAgICAgdGhpcy5hdWRpby5jdXJyZW50VGltZSA9IDA7XHJcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdhdGNoSHRtbExhbmdBdHRyaWJ1dGVDaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmdldEh0bWxMYW5nQXR0cmlidXRlKCk7XHJcbiAgICBcclxuICAgIGlmICghdGhpcy5sYW5ndWFnZSAmJiAobGFuZ3VhZ2UgIT09IHRoaXMuZGVmYXVsdExhbmd1YWdlKSkge1xyXG4gICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb25MYW5nQXR0cmlidXRlQ2hhbmdlID0gKG11dGF0aW9uc0xpc3Q6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcclxuICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnNMaXN0KSB7XHJcbiAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJyAmJiBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSB0aGlzLmxhbmdBdHRyaWJ1dGVLZXkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLmdldEh0bWxMYW5nQXR0cmlidXRlKCk7XHJcbiAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgXHJcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG9uTGFuZ0F0dHJpYnV0ZUNoYW5nZSk7XHJcbiAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbdGhpcy5sYW5nQXR0cmlidXRlS2V5XSB9O1xyXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShodG1sRWxlbWVudCwgY29uZmlnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SHRtbExhbmdBdHRyaWJ1dGUoKTogc3RyaW5nIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICByZXR1cm4gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKSBhcyBhbnkpLmdldEF0dHJpYnV0ZSh0aGlzLmxhbmdBdHRyaWJ1dGVLZXkpLnNwbGl0KCctJylbMF07XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgW25nQ2xhc3MubHQtbWRdPVwiJ21vYmlsZSdcIiBjbGFzcz1cInRleHQtdG8tc3BlZWNoLXdyYXBwZXJcIj5cclxuICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjb2xvcj1cImFjY2VudFwiPlxyXG4gICAgPG1hdC1sYWJlbD57e3RyYW5zbGF0aW9ucy5zZWxlY3RWb2ljZX19PC9tYXQtbGFiZWw+XHJcbiAgICA8bWF0LXNlbGVjdCBbKHZhbHVlKV09XCJzZWxlY3RlZFZvaWNlXCI+XHJcbiAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB2b2ljZSBvZiB2b2ljZUxpc3RcIiBbdmFsdWVdPVwidm9pY2VcIj5cclxuICAgICAgICB7eyB0cmFuc2xhdGlvbnMudm9pY2VMaXN0W3ZvaWNlXSB9fVxyXG4gICAgICA8L21hdC1vcHRpb24+XHJcbiAgICA8L21hdC1zZWxlY3Q+XHJcbiAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInRleHQtdG8tc3BlZWNoLXRleHRhcmVhLXdyYXBwZXJcIj5cclxuICAgIDx0ZXh0YXJlYSBbKG5nTW9kZWwpXT1cInRleHRcIiBjbGFzcz1cInRleHQtdG8tc3BlZWNoLXRleHRhcmVhXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9ucy5wbGFjZWhvbGRlclwiPjwvdGV4dGFyZWE+XHJcbiAgICA8ZGl2IFtjbGFzcy50ZXh0LW92ZXJmbG93XT1cImhhc092ZXJmbG93XCIgY2xhc3M9XCJ0ZXh0LXRvLXNwZWVjaC1jaGFyYWN0ZXJzXCI+XHJcbiAgICAgIHt7dGV4dD8ubGVuZ3RoID8/IDB9fS97e21heENoYXJMZW5ndGh9fVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ0ZXh0LXRvLXNwZWVjaC1hY3Rpb25zXCI+XHJcbiAgICA8ZGl2IFttYXRUb29sdGlwXT1cIiF0ZXh0ID8gdHJhbnNsYXRpb25zLnBsYXlEaXNhYmxlZCA6ICcnXCI+XHJcbiAgICAgIDxidXR0b24gW21hdFRvb2x0aXBdPVwiaXNQbGF5aW5nID8gdHJhbnNsYXRpb25zLnN0b3AgOiB0cmFuc2xhdGlvbnMucGxheVwiIFtkaXNhYmxlZF09XCIhdGV4dCB8fCBpc0xvYWRpbmdcIiAoY2xpY2spPVwicGxheVRleHQoKVwiIG1hdC1pY29uLWJ1dHRvbj5cclxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhaXNMb2FkaW5nXCI+IHt7IGlzUGxheWluZyA/ICdzdG9wJyA6ICd2b2x1bWVfdXAnIH19ICA8L21hdC1pY29uPlxyXG4gICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImlzTG9hZGluZ1wiIFtkaWFtZXRlcl09XCIyMFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -5759,11 +5759,19 @@ class TextToSpeechComponent {
5759
5759
  }
5760
5760
  this.isLoading = true;
5761
5761
  const text = this.text.length > this.maxCharLength ? this.text.substring(0, this.maxCharLength) : this.text;
5762
+ if ((this.audio && text === this.previousText) && (this.selectedVoice === this.previousVoice)) {
5763
+ this.audio.play();
5764
+ this.isPlaying = true;
5765
+ this.isLoading = false;
5766
+ return;
5767
+ }
5762
5768
  this.#textPlayService
5763
5769
  .play(text, this.selectedVoice, this.xApiKey)
5764
5770
  .pipe(finalize(() => { this.isLoading = false; }))
5765
5771
  .subscribe({
5766
5772
  next: (res) => {
5773
+ this.previousText = text;
5774
+ this.previousVoice = this.selectedVoice;
5767
5775
  const audioUrl = URL.createObjectURL(res);
5768
5776
  this.audio = new Audio(audioUrl);
5769
5777
  this.audio.play();
@@ -5778,6 +5786,7 @@ class TextToSpeechComponent {
5778
5786
  stop() {
5779
5787
  if (this.audio) {
5780
5788
  this.audio.pause();
5789
+ this.audio.currentTime = 0;
5781
5790
  this.isPlaying = false;
5782
5791
  }
5783
5792
  }
@@ -5804,7 +5813,7 @@ class TextToSpeechComponent {
5804
5813
  return document.querySelector('html').getAttribute(this.langAttributeKey).split('-')[0];
5805
5814
  }
5806
5815
  static { this.ɵfac = function TextToSpeechComponent_Factory(t) { return new (t || TextToSpeechComponent)(); }; }
5807
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TextToSpeechComponent, selectors: [["lib-text-to-speech"]], inputs: { xApiKey: "xApiKey", language: "language", maxCharLength: "maxCharLength" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 15, vars: 14, consts: [[1, "text-to-speech-wrapper"], ["appearance", "outline", "color", "accent"], [3, "valueChange", "value"], [3, "value", 4, "ngFor", "ngForOf"], [1, "text-to-speech-textarea-wrapper"], [1, "text-to-speech-textarea", 3, "ngModelChange", "ngModel", "placeholder"], [1, "text-to-speech-characters"], [1, "text-to-speech-actions"], [3, "matTooltip"], ["mat-icon-button", "", 3, "click", "matTooltip", "disabled"], [4, "ngIf"], [3, "diameter", 4, "ngIf"], [3, "value"], [3, "diameter"]], template: function TextToSpeechComponent_Template(rf, ctx) { if (rf & 1) {
5816
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TextToSpeechComponent, selectors: [["lib-text-to-speech"]], inputs: { xApiKey: "xApiKey", language: "language", maxCharLength: "maxCharLength" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 15, vars: 15, consts: [[1, "text-to-speech-wrapper", 3, "ngClass.lt-md"], ["appearance", "outline", "color", "accent"], [3, "valueChange", "value"], [3, "value", 4, "ngFor", "ngForOf"], [1, "text-to-speech-textarea-wrapper"], [1, "text-to-speech-textarea", 3, "ngModelChange", "ngModel", "placeholder"], [1, "text-to-speech-characters"], [1, "text-to-speech-actions"], [3, "matTooltip"], ["mat-icon-button", "", 3, "click", "matTooltip", "disabled"], [4, "ngIf"], [3, "diameter", 4, "ngIf"], [3, "value"], [3, "diameter"]], template: function TextToSpeechComponent_Template(rf, ctx) { if (rf & 1) {
5808
5817
  i0.ɵɵelementStart(0, "div", 0)(1, "mat-form-field", 1)(2, "mat-label");
5809
5818
  i0.ɵɵtext(3);
5810
5819
  i0.ɵɵelementEnd();
@@ -5823,7 +5832,8 @@ class TextToSpeechComponent {
5823
5832
  i0.ɵɵtemplate(13, TextToSpeechComponent_mat_icon_13_Template, 2, 1, "mat-icon", 10)(14, TextToSpeechComponent_mat_spinner_14_Template, 1, 1, "mat-spinner", 11);
5824
5833
  i0.ɵɵelementEnd()()()();
5825
5834
  } if (rf & 2) {
5826
- let tmp_6_0;
5835
+ let tmp_7_0;
5836
+ i0.ɵɵproperty("ngClass.lt-md", "mobile");
5827
5837
  i0.ɵɵadvance(3);
5828
5838
  i0.ɵɵtextInterpolate(ctx.translations.selectVoice);
5829
5839
  i0.ɵɵadvance();
@@ -5836,7 +5846,7 @@ class TextToSpeechComponent {
5836
5846
  i0.ɵɵadvance();
5837
5847
  i0.ɵɵclassProp("text-overflow", ctx.hasOverflow);
5838
5848
  i0.ɵɵadvance();
5839
- i0.ɵɵtextInterpolate2(" ", (tmp_6_0 = ctx.text == null ? null : ctx.text.length) !== null && tmp_6_0 !== undefined ? tmp_6_0 : 0, "/", ctx.maxCharLength, " ");
5849
+ i0.ɵɵtextInterpolate2(" ", (tmp_7_0 = ctx.text == null ? null : ctx.text.length) !== null && tmp_7_0 !== undefined ? tmp_7_0 : 0, "/", ctx.maxCharLength, " ");
5840
5850
  i0.ɵɵadvance(2);
5841
5851
  i0.ɵɵproperty("matTooltip", !ctx.text ? ctx.translations.playDisabled : "");
5842
5852
  i0.ɵɵadvance();
@@ -5848,7 +5858,7 @@ class TextToSpeechComponent {
5848
5858
  } }, dependencies: [CommonModule, i2$2.NgForOf, i2$2.NgIf, MatIconButton,
5849
5859
  MatIcon,
5850
5860
  FormsModule, i4$1.DefaultValueAccessor, i4$1.NgControlStatus, i4$1.NgModel, MatProgressSpinner,
5851
- MatTooltipModule, i2$1.MatTooltip, MatFormFieldModule, i4.MatFormField, i4.MatLabel, MatSelectModule, i7.MatSelect, i8.MatOption], styles: [".text-to-speech-wrapper[_ngcontent-%COMP%]{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%], .text-to-speech-textarea[_ngcontent-%COMP%]{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%]{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea[_ngcontent-%COMP%]{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions[_ngcontent-%COMP%]{position:absolute;bottom:-25px}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:#fff;background-color:var(--accent)}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled{background-color:var(--base-70)}.text-to-speech-characters[_ngcontent-%COMP%]{position:absolute;right:0;bottom:0;margin:5px;font-size:14px;color:var(--base-65)}.text-overflow[_ngcontent-%COMP%]{right:30px}"] }); }
5861
+ MatTooltipModule, i2$1.MatTooltip, MatFormFieldModule, i4.MatFormField, i4.MatLabel, MatSelectModule, i7.MatSelect, i8.MatOption, FlexLayoutModule, i6.DefaultClassDirective], styles: [".text-to-speech-wrapper[_ngcontent-%COMP%]{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%], .text-to-speech-textarea[_ngcontent-%COMP%]{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper[_ngcontent-%COMP%]{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea[_ngcontent-%COMP%]{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions[_ngcontent-%COMP%]{position:absolute;bottom:-25px}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:#fff;background-color:var(--accent)}.text-to-speech-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled{background-color:var(--base-70)}.text-to-speech-characters[_ngcontent-%COMP%]{position:absolute;right:10px;bottom:0;margin:5px;font-size:13px;color:var(--base-65)}.text-overflow[_ngcontent-%COMP%]{right:30px}.mobile[_ngcontent-%COMP%] .text-overflow[_ngcontent-%COMP%]{right:15px}"] }); }
5852
5862
  }
5853
5863
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TextToSpeechComponent, [{
5854
5864
  type: Component,
@@ -5861,8 +5871,9 @@ class TextToSpeechComponent {
5861
5871
  MatProgressSpinner,
5862
5872
  MatTooltipModule,
5863
5873
  MatFormFieldModule,
5864
- MatSelectModule
5865
- ], template: "<div class=\"text-to-speech-wrapper\">\r\n <mat-form-field appearance=\"outline\" color=\"accent\">\r\n <mat-label>{{translations.selectVoice}}</mat-label>\r\n <mat-select [(value)]=\"selectedVoice\">\r\n <mat-option *ngFor=\"let voice of voiceList\" [value]=\"voice\">\r\n {{ translations.voiceList[voice] }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <div class=\"text-to-speech-textarea-wrapper\">\r\n <textarea [(ngModel)]=\"text\" class=\"text-to-speech-textarea\" [placeholder]=\"translations.placeholder\"></textarea>\r\n <div [class.text-overflow]=\"hasOverflow\" class=\"text-to-speech-characters\">\r\n {{text?.length ?? 0}}/{{maxCharLength}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-to-speech-actions\">\r\n <div [matTooltip]=\"!text ? translations.playDisabled : ''\">\r\n <button [matTooltip]=\"isPlaying ? translations.stop : translations.play\" [disabled]=\"!text || isLoading\" (click)=\"playText()\" mat-icon-button>\r\n <mat-icon *ngIf=\"!isLoading\"> {{ isPlaying ? 'stop' : 'volume_up' }} </mat-icon>\r\n <mat-spinner *ngIf=\"isLoading\" [diameter]=\"20\"></mat-spinner>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".text-to-speech-wrapper{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper mat-form-field{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper,.text-to-speech-textarea{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions{position:absolute;bottom:-25px}.text-to-speech-actions button{color:#fff;background-color:var(--accent)}.text-to-speech-actions button:disabled{background-color:var(--base-70)}.text-to-speech-characters{position:absolute;right:0;bottom:0;margin:5px;font-size:14px;color:var(--base-65)}.text-overflow{right:30px}\n"] }]
5874
+ MatSelectModule,
5875
+ FlexLayoutModule
5876
+ ], template: "<div [ngClass.lt-md]=\"'mobile'\" class=\"text-to-speech-wrapper\">\r\n <mat-form-field appearance=\"outline\" color=\"accent\">\r\n <mat-label>{{translations.selectVoice}}</mat-label>\r\n <mat-select [(value)]=\"selectedVoice\">\r\n <mat-option *ngFor=\"let voice of voiceList\" [value]=\"voice\">\r\n {{ translations.voiceList[voice] }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <div class=\"text-to-speech-textarea-wrapper\">\r\n <textarea [(ngModel)]=\"text\" class=\"text-to-speech-textarea\" [placeholder]=\"translations.placeholder\"></textarea>\r\n <div [class.text-overflow]=\"hasOverflow\" class=\"text-to-speech-characters\">\r\n {{text?.length ?? 0}}/{{maxCharLength}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-to-speech-actions\">\r\n <div [matTooltip]=\"!text ? translations.playDisabled : ''\">\r\n <button [matTooltip]=\"isPlaying ? translations.stop : translations.play\" [disabled]=\"!text || isLoading\" (click)=\"playText()\" mat-icon-button>\r\n <mat-icon *ngIf=\"!isLoading\"> {{ isPlaying ? 'stop' : 'volume_up' }} </mat-icon>\r\n <mat-spinner *ngIf=\"isLoading\" [diameter]=\"20\"></mat-spinner>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".text-to-speech-wrapper{margin-top:5px;position:relative;display:flex;flex-direction:column;align-items:center}.text-to-speech-wrapper mat-form-field{max-width:900px!important;width:100%}.text-to-speech-textarea-wrapper,.text-to-speech-textarea{position:relative;width:100%;max-width:900px}.text-to-speech-textarea-wrapper{border:1px solid var(--base-70);padding:5px;border-radius:8px;box-shadow:0 0 16px #0000001a}.text-to-speech-textarea{margin:15px 0;padding:0 10px;min-height:120px;resize:none;outline:none;border:none}.text-to-speech-actions{position:absolute;bottom:-25px}.text-to-speech-actions button{color:#fff;background-color:var(--accent)}.text-to-speech-actions button:disabled{background-color:var(--base-70)}.text-to-speech-characters{position:absolute;right:10px;bottom:0;margin:5px;font-size:13px;color:var(--base-65)}.text-overflow{right:30px}.mobile .text-overflow{right:15px}\n"] }]
5866
5877
  }], null, { xApiKey: [{
5867
5878
  type: Input
5868
5879
  }], language: [{
@@ -5870,7 +5881,7 @@ class TextToSpeechComponent {
5870
5881
  }], maxCharLength: [{
5871
5882
  type: Input
5872
5883
  }] }); })();
5873
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TextToSpeechComponent, { className: "TextToSpeechComponent", filePath: "lib\\text-to-speech\\text-to-speech.component.ts", lineNumber: 31 }); })();
5884
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TextToSpeechComponent, { className: "TextToSpeechComponent", filePath: "lib\\text-to-speech\\text-to-speech.component.ts", lineNumber: 33 }); })();
5874
5885
 
5875
5886
  /*
5876
5887
  * Public API Surface of ngx-common