valtech-components 2.0.915 → 2.0.917

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.
@@ -54,7 +54,7 @@ import 'prismjs/components/prism-json';
54
54
  * Current version of valtech-components.
55
55
  * This is automatically updated during the publish process.
56
56
  */
57
- const VERSION = '2.0.915';
57
+ const VERSION = '2.0.917';
58
58
 
59
59
  /**
60
60
  * Servicio para gestionar presets de componentes.
@@ -4374,6 +4374,26 @@ const VALTECH_DEFAULT_CONTENT = {
4374
4374
  passwordChangedSuccess: '¡Contraseña actualizada!',
4375
4375
  errorCurrentPasswordWrong: 'La contraseña actual es incorrecta',
4376
4376
  errorSamePassword: 'La nueva contraseña debe ser diferente a la actual',
4377
+ // Change email (3 pasos)
4378
+ changeEmailTitle: 'Cambiar email',
4379
+ changeEmailStep1Description: 'Ingresa tu contraseña actual y el nuevo email.',
4380
+ changeEmailNewEmail: 'Nuevo email',
4381
+ changeEmailNewEmailInvalid: 'Ingresa un email válido',
4382
+ changeEmailInitiate: 'Continuar',
4383
+ changeEmailStep2Title: 'Verifica tu identidad',
4384
+ changeEmailStep2Description: 'Ingresa el código de 6 dígitos que enviamos a tu email actual.',
4385
+ changeEmailCodeCurrent: 'Código de verificación',
4386
+ changeEmailConfirm1: 'Confirmar',
4387
+ changeEmailStep3Title: 'Confirma el nuevo email',
4388
+ changeEmailStep3Description: 'Ingresa el código de 6 dígitos que enviamos a {email}.',
4389
+ changeEmailCodeNew: 'Código del nuevo email',
4390
+ changeEmailConfirm2: 'Cambiar email',
4391
+ changeEmailSuccess: '¡Email actualizado!',
4392
+ changeEmailNoPasswordTitle: 'Contraseña requerida',
4393
+ changeEmailNoPasswordHint: 'Para cambiar el email debes tener una contraseña. Primero configúrala desde "Cambiar contraseña".',
4394
+ errorEmailSameAsCurrent: 'El nuevo email es igual al actual',
4395
+ errorEmailAlreadyInUse: 'Este email ya está en uso',
4396
+ errorEmailChangePendingExpired: 'El flujo expiró. Comienza de nuevo.',
4377
4397
  // Set password (cuenta OAuth-only)
4378
4398
  setPasswordTitle: 'Crear contraseña',
4379
4399
  setPasswordDescription: 'Tu cuenta usa inicio de sesión social. Crea una contraseña para entrar también con tu correo.',
@@ -4537,6 +4557,26 @@ const VALTECH_DEFAULT_CONTENT = {
4537
4557
  passwordChangedSuccess: 'Password updated!',
4538
4558
  errorCurrentPasswordWrong: 'Current password is incorrect',
4539
4559
  errorSamePassword: 'New password must be different from the current one',
4560
+ // Change email (3 steps)
4561
+ changeEmailTitle: 'Change email',
4562
+ changeEmailStep1Description: 'Enter your current password and the new email.',
4563
+ changeEmailNewEmail: 'New email',
4564
+ changeEmailNewEmailInvalid: 'Enter a valid email',
4565
+ changeEmailInitiate: 'Continue',
4566
+ changeEmailStep2Title: 'Verify your identity',
4567
+ changeEmailStep2Description: 'Enter the 6-digit code we sent to your current email.',
4568
+ changeEmailCodeCurrent: 'Verification code',
4569
+ changeEmailConfirm1: 'Confirm',
4570
+ changeEmailStep3Title: 'Confirm new email',
4571
+ changeEmailStep3Description: 'Enter the 6-digit code we sent to {email}.',
4572
+ changeEmailCodeNew: 'New email code',
4573
+ changeEmailConfirm2: 'Change email',
4574
+ changeEmailSuccess: 'Email updated!',
4575
+ changeEmailNoPasswordTitle: 'Password required',
4576
+ changeEmailNoPasswordHint: 'You need a password to change your email. Set one first via "Change password".',
4577
+ errorEmailSameAsCurrent: 'The new email is the same as the current one',
4578
+ errorEmailAlreadyInUse: 'This email is already in use',
4579
+ errorEmailChangePendingExpired: 'The flow expired. Start again.',
4540
4580
  // Set password (OAuth-only account)
4541
4581
  setPasswordTitle: 'Create password',
4542
4582
  setPasswordDescription: 'Your account uses social sign-in. Create a password to also sign in with your email.',
@@ -25813,8 +25853,8 @@ class AuthService {
25813
25853
  /** Error actual */
25814
25854
  this.error = this.stateService.error;
25815
25855
  if (!this.config && isDevMode()) {
25816
- console.warn("[valtech-components] AuthService: provideValtechAuth() no está en main.ts. " +
25817
- "Login, registro y sesión no funcionarán.");
25856
+ console.warn('[valtech-components] AuthService: provideValtechAuth() no está en main.ts. ' +
25857
+ 'Login, registro y sesión no funcionarán.');
25818
25858
  }
25819
25859
  }
25820
25860
  // =============================================
@@ -26389,6 +26429,27 @@ class AuthService {
26389
26429
  .pipe(catchError(error => this.handleAuthError(error)));
26390
26430
  }
26391
26431
  // =============================================
26432
+ // CAMBIO DE EMAIL — flujo de 3 pasos
26433
+ // =============================================
26434
+ initiateEmailChange(currentPassword, newEmail) {
26435
+ const request = { currentPassword, newEmail };
26436
+ return this.http
26437
+ .post(`${this.baseUrl}/email/initiate`, request)
26438
+ .pipe(catchError(error => this.handleAuthError(error)));
26439
+ }
26440
+ confirmEmailChangeStep1(code) {
26441
+ const request = { code };
26442
+ return this.http
26443
+ .post(`${this.baseUrl}/email/confirm/1`, request)
26444
+ .pipe(catchError(error => this.handleAuthError(error)));
26445
+ }
26446
+ confirmEmailChangeStep2(code) {
26447
+ const request = { code };
26448
+ return this.http
26449
+ .post(`${this.baseUrl}/email/confirm/2`, request)
26450
+ .pipe(catchError(error => this.handleAuthError(error)));
26451
+ }
26452
+ // =============================================
26392
26453
  // ELIMINACIÓN DE CUENTA
26393
26454
  // =============================================
26394
26455
  /**
@@ -31286,6 +31347,287 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
31286
31347
  type: Output
31287
31348
  }] } });
31288
31349
 
31350
+ /**
31351
+ * `val-change-email-modal` — modal de cambio de email en 3 pasos.
31352
+ *
31353
+ * Paso 1: contraseña actual + nuevo email → `initiateEmailChange()`
31354
+ * Paso 2: código enviado al email actual → `confirmEmailChangeStep1()`
31355
+ * Paso 3: código enviado al nuevo email → `confirmEmailChangeStep2()`
31356
+ *
31357
+ * Si el user no tiene contraseña (cuenta OAuth-only), muestra aviso.
31358
+ *
31359
+ * @example
31360
+ * ```html
31361
+ * <val-change-email-modal
31362
+ * [isOpen]="isEmailModalOpen()"
31363
+ * (changed)="isEmailModalOpen.set(false)"
31364
+ * (dismissed)="isEmailModalOpen.set(false)"
31365
+ * />
31366
+ * ```
31367
+ */
31368
+ class ChangeEmailModalComponent {
31369
+ constructor() {
31370
+ this._isOpen = false;
31371
+ /** Emite al completar el cambio de email con éxito. El padre cierra el modal. */
31372
+ this.changed = new EventEmitter();
31373
+ /** Emite cuando el user cierra el modal. */
31374
+ this.dismissed = new EventEmitter();
31375
+ this.auth = inject(AuthService);
31376
+ this.toast = inject(ToastService);
31377
+ this.i18n = inject(I18nService);
31378
+ this.i18nHelper = inject(InputI18nHelper);
31379
+ this._step = signal('loading');
31380
+ this._pendingEmail = signal('');
31381
+ this._formState = signal(ComponentStates.ENABLED);
31382
+ this.noPasswordTitle = computed(() => this.t('changeEmailNoPasswordTitle'));
31383
+ this.noPasswordHint = computed(() => this.t('changeEmailNoPasswordHint'));
31384
+ this.step1Props = computed(() => this.i18nHelper.resolveForm({
31385
+ nameKey: 'changeEmailTitle',
31386
+ i18nNamespace: '_auth',
31387
+ sections: [
31388
+ {
31389
+ name: this.t('changeEmailStep1Description'),
31390
+ order: 0,
31391
+ fields: [
31392
+ {
31393
+ type: InputType.PASSWORD,
31394
+ name: 'currentPassword',
31395
+ token: 'change-email-password',
31396
+ labelKey: 'currentPassword',
31397
+ hint: '',
31398
+ placeholderKey: 'passwordPlaceholder',
31399
+ errorKeys: { required: 'currentPasswordRequired' },
31400
+ validators: [Validators.required],
31401
+ order: 0,
31402
+ state: ComponentStates.ENABLED,
31403
+ },
31404
+ {
31405
+ type: InputType.EMAIL,
31406
+ name: 'newEmail',
31407
+ token: 'change-email-new',
31408
+ labelKey: 'changeEmailNewEmail',
31409
+ hint: '',
31410
+ placeholderKey: 'emailPlaceholder',
31411
+ errorKeys: {
31412
+ required: 'emailRequired',
31413
+ email: 'changeEmailNewEmailInvalid',
31414
+ },
31415
+ validators: [Validators.required, Validators.email],
31416
+ order: 1,
31417
+ state: ComponentStates.ENABLED,
31418
+ },
31419
+ ],
31420
+ },
31421
+ ],
31422
+ actions: {
31423
+ ...SolidDefaultBlock('', 'submit'),
31424
+ token: 'change-email-initiate',
31425
+ textKey: 'changeEmailInitiate',
31426
+ },
31427
+ state: this._formState(),
31428
+ }));
31429
+ this.step2Props = computed(() => this.i18nHelper.resolveForm({
31430
+ nameKey: 'changeEmailStep2Title',
31431
+ i18nNamespace: '_auth',
31432
+ sections: [
31433
+ {
31434
+ name: this.t('changeEmailStep2Description'),
31435
+ order: 0,
31436
+ fields: [
31437
+ {
31438
+ type: InputType.PIN_CODE,
31439
+ name: 'code',
31440
+ token: 'change-email-code-current',
31441
+ labelKey: 'changeEmailCodeCurrent',
31442
+ hint: '',
31443
+ placeholderKey: '',
31444
+ errorKeys: { required: 'mfaCodeInvalid' },
31445
+ validators: [Validators.required],
31446
+ order: 0,
31447
+ state: ComponentStates.ENABLED,
31448
+ length: 6,
31449
+ allowNumbersOnly: true,
31450
+ autoFocus: true,
31451
+ },
31452
+ ],
31453
+ },
31454
+ ],
31455
+ actions: {
31456
+ ...SolidDefaultBlock('', 'submit'),
31457
+ token: 'change-email-confirm-1',
31458
+ textKey: 'changeEmailConfirm1',
31459
+ },
31460
+ state: this._formState(),
31461
+ }));
31462
+ this.step3Props = computed(() => {
31463
+ const email = this._pendingEmail();
31464
+ const desc = this.t('changeEmailStep3Description').replace('{email}', email);
31465
+ return this.i18nHelper.resolveForm({
31466
+ nameKey: 'changeEmailStep3Title',
31467
+ i18nNamespace: '_auth',
31468
+ sections: [
31469
+ {
31470
+ name: desc,
31471
+ order: 0,
31472
+ fields: [
31473
+ {
31474
+ type: InputType.PIN_CODE,
31475
+ name: 'code',
31476
+ token: 'change-email-code-new',
31477
+ labelKey: 'changeEmailCodeNew',
31478
+ hint: '',
31479
+ placeholderKey: '',
31480
+ errorKeys: { required: 'mfaCodeInvalid' },
31481
+ validators: [Validators.required],
31482
+ order: 0,
31483
+ state: ComponentStates.ENABLED,
31484
+ length: 6,
31485
+ allowNumbersOnly: true,
31486
+ autoFocus: true,
31487
+ },
31488
+ ],
31489
+ },
31490
+ ],
31491
+ actions: {
31492
+ ...SolidDefaultBlock('', 'submit'),
31493
+ token: 'change-email-confirm-2',
31494
+ textKey: 'changeEmailConfirm2',
31495
+ },
31496
+ state: this._formState(),
31497
+ });
31498
+ });
31499
+ }
31500
+ set isOpen(value) {
31501
+ const opening = value && !this._isOpen;
31502
+ this._isOpen = value;
31503
+ if (opening) {
31504
+ this.resolveMode();
31505
+ }
31506
+ }
31507
+ get isOpen() {
31508
+ return this._isOpen;
31509
+ }
31510
+ t(key) {
31511
+ return this.i18n.t(key, '_auth');
31512
+ }
31513
+ close() {
31514
+ this.dismissed.emit();
31515
+ }
31516
+ resolveMode() {
31517
+ this._step.set('loading');
31518
+ this._formState.set(ComponentStates.ENABLED);
31519
+ this._pendingEmail.set('');
31520
+ this.auth.checkHasPassword().subscribe({
31521
+ next: res => this._step.set(res.hasPassword ? 'step1' : 'no-password'),
31522
+ error: () => this._step.set('step1'),
31523
+ });
31524
+ }
31525
+ handleStep1(event) {
31526
+ const currentPassword = event.fields['currentPassword'];
31527
+ const newEmail = event.fields['newEmail'];
31528
+ if (!currentPassword || !newEmail) {
31529
+ this.showToast(this.t('completeAllFields'));
31530
+ return;
31531
+ }
31532
+ this._formState.set(ComponentStates.WORKING);
31533
+ this.auth.initiateEmailChange(currentPassword, newEmail).subscribe({
31534
+ next: res => {
31535
+ this._formState.set(ComponentStates.ENABLED);
31536
+ this._pendingEmail.set(res.pendingEmail);
31537
+ this._step.set('step2');
31538
+ },
31539
+ error: err => {
31540
+ this._formState.set(ComponentStates.ENABLED);
31541
+ this.showToast(this.resolveError(err));
31542
+ },
31543
+ });
31544
+ }
31545
+ handleStep2(event) {
31546
+ const code = event.fields['code'];
31547
+ if (!code) {
31548
+ this.showToast(this.t('mfaCodeInvalid'));
31549
+ return;
31550
+ }
31551
+ this._formState.set(ComponentStates.WORKING);
31552
+ this.auth.confirmEmailChangeStep1(code).subscribe({
31553
+ next: () => {
31554
+ this._formState.set(ComponentStates.ENABLED);
31555
+ this._step.set('step3');
31556
+ },
31557
+ error: err => {
31558
+ this._formState.set(ComponentStates.ENABLED);
31559
+ this.showToast(this.resolveError(err));
31560
+ },
31561
+ });
31562
+ }
31563
+ handleStep3(event) {
31564
+ const code = event.fields['code'];
31565
+ if (!code) {
31566
+ this.showToast(this.t('mfaCodeInvalid'));
31567
+ return;
31568
+ }
31569
+ this._formState.set(ComponentStates.WORKING);
31570
+ this.auth.confirmEmailChangeStep2(code).subscribe({
31571
+ next: () => {
31572
+ this._formState.set(ComponentStates.ENABLED);
31573
+ this.showToast(this.t('changeEmailSuccess'));
31574
+ this.changed.emit();
31575
+ },
31576
+ error: err => {
31577
+ this._formState.set(ComponentStates.ENABLED);
31578
+ this.showToast(this.resolveError(err));
31579
+ },
31580
+ });
31581
+ }
31582
+ resolveError(err) {
31583
+ const code = err?.code;
31584
+ switch (code) {
31585
+ case 'AUTHV2_INVALID_CURRENT_PASSWORD':
31586
+ return this.t('errorCurrentPasswordWrong');
31587
+ case 'AUTHV2_EMAIL_SAME_AS_CURRENT':
31588
+ return this.t('errorEmailSameAsCurrent');
31589
+ case 'AUTHV2_EMAIL_EXISTS':
31590
+ return this.t('errorEmailAlreadyInUse');
31591
+ case 'AUTHV2_EMAIL_CHANGE_PENDING_EXPIRED':
31592
+ return this.t('errorEmailChangePendingExpired');
31593
+ case 'AUTHV2_INVALID_CODE':
31594
+ return this.t('errorInvalidCode');
31595
+ case 'AUTHV2_EXPIRED_CODE':
31596
+ return this.t('errorExpiredCode');
31597
+ case 'AUTHV2_TOO_MANY_ATTEMPTS':
31598
+ return this.t('errorTooManyAttempts');
31599
+ default:
31600
+ return this.t('errorGeneric');
31601
+ }
31602
+ }
31603
+ showToast(message) {
31604
+ this.toast.show({ message, duration: 3500 });
31605
+ }
31606
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChangeEmailModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31607
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChangeEmailModalComponent, isStandalone: true, selector: "val-change-email-modal", inputs: { isOpen: "isOpen" }, outputs: { changed: "changed", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (_step() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else if (_step() === 'no-password') {\n <val-display [props]=\"{ content: noPasswordTitle(), size: 'small', color: 'dark' }\" />\n <val-text [props]=\"{ content: noPasswordHint(), size: 'medium', color: 'medium', bold: false }\" />\n } @else if (_step() === 'step1') {\n <val-form [props]=\"step1Props()\" (onSubmit)=\"handleStep1($event)\" />\n } @else if (_step() === 'step2') {\n <val-form [props]=\"step2Props()\" (onSubmit)=\"handleStep2($event)\" />\n } @else if (_step() === 'step3') {\n <val-form [props]=\"step3Props()\" (onSubmit)=\"handleStep3($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"], dependencies: [{ kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
31608
+ }
31609
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChangeEmailModalComponent, decorators: [{
31610
+ type: Component,
31611
+ args: [{ selector: 'val-change-email-modal', standalone: true, imports: [
31612
+ IonButton,
31613
+ IonButtons,
31614
+ IonContent,
31615
+ IonHeader,
31616
+ IonModal,
31617
+ IonSpinner,
31618
+ IonToolbar,
31619
+ FormComponent,
31620
+ DisplayComponent,
31621
+ TextComponent,
31622
+ ], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (_step() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else if (_step() === 'no-password') {\n <val-display [props]=\"{ content: noPasswordTitle(), size: 'small', color: 'dark' }\" />\n <val-text [props]=\"{ content: noPasswordHint(), size: 'medium', color: 'medium', bold: false }\" />\n } @else if (_step() === 'step1') {\n <val-form [props]=\"step1Props()\" (onSubmit)=\"handleStep1($event)\" />\n } @else if (_step() === 'step2') {\n <val-form [props]=\"step2Props()\" (onSubmit)=\"handleStep2($event)\" />\n } @else if (_step() === 'step3') {\n <val-form [props]=\"step3Props()\" (onSubmit)=\"handleStep3($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"] }]
31623
+ }], propDecorators: { isOpen: [{
31624
+ type: Input
31625
+ }], changed: [{
31626
+ type: Output
31627
+ }], dismissed: [{
31628
+ type: Output
31629
+ }] } });
31630
+
31289
31631
  /**
31290
31632
  * `val-cookie-banner` — bottom/top fixed banner asking the user to choose
31291
31633
  * a cookie consent option. Presentational only: emits events on each
@@ -35397,6 +35739,9 @@ class FunHeaderComponent {
35397
35739
  const style = {};
35398
35740
  const isDark = this.theme.IsDark;
35399
35741
  const background = isDark ? this.props.backgroundDark || this.props.background : this.props.background;
35742
+ if (this.props.paddingBottom) {
35743
+ style['paddingBottom'] = this.props.paddingBottom;
35744
+ }
35400
35745
  if (!background) {
35401
35746
  // Default gradient if no background specified
35402
35747
  style['background'] = isDark
@@ -35408,7 +35753,8 @@ class FunHeaderComponent {
35408
35753
  if (this.props.gradient) {
35409
35754
  const targetColor = this.resolveBackgroundColor(background);
35410
35755
  const gradientPercentage = isDark ? '80%' : '90%';
35411
- style['background'] = `linear-gradient(180deg, var(--ion-background-color) 12%, ${targetColor} ${gradientPercentage})`;
35756
+ style['background'] =
35757
+ `linear-gradient(180deg, var(--ion-background-color) 12%, ${targetColor} ${gradientPercentage})`;
35412
35758
  return style;
35413
35759
  }
35414
35760
  // Handle different background types
@@ -35508,7 +35854,7 @@ class FunHeaderComponent {
35508
35854
  <img
35509
35855
  [src]="getImageSrc()"
35510
35856
  [ngStyle]="{
35511
- content: isImageVariable(props.image) ? 'var(' + props.image + ')' : undefined
35857
+ content: isImageVariable(props.image) ? 'var(' + props.image + ')' : undefined,
35512
35858
  }"
35513
35859
  alt="header logo"
35514
35860
  />
@@ -35535,7 +35881,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
35535
35881
  <img
35536
35882
  [src]="getImageSrc()"
35537
35883
  [ngStyle]="{
35538
- content: isImageVariable(props.image) ? 'var(' + props.image + ')' : undefined
35884
+ content: isImageVariable(props.image) ? 'var(' + props.image + ')' : undefined,
35539
35885
  }"
35540
35886
  alt="header logo"
35541
35887
  />
@@ -49259,5 +49605,5 @@ function buildFooterLinks(links, t, resolver) {
49259
49605
  * Generated bundle index. Do not edit.
49260
49606
  */
49261
49607
 
49262
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CookieBannerComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DebugConsoleComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EmailInputComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SHAPE_KEYS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STROKE_KEYS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, SplashScreenService, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
49608
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CookieBannerComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DebugConsoleComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EmailInputComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SHAPE_KEYS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STROKE_KEYS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, SplashScreenService, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
49263
49609
  //# sourceMappingURL=valtech-components.mjs.map