valtech-components 4.0.204 → 4.0.205

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/esm2022/lib/components/molecules/load-more/load-more.component.mjs +11 -7
  2. package/esm2022/lib/components/molecules/reaction-bar/reaction-bar.component.mjs +326 -0
  3. package/esm2022/lib/components/molecules/reaction-bar/types.mjs +2 -0
  4. package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +4 -1
  5. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.component.mjs +3 -3
  6. package/esm2022/lib/components/organisms/toolbar/toolbar.component.mjs +3 -3
  7. package/esm2022/lib/services/auth/org-switch.service.mjs +11 -1
  8. package/esm2022/lib/services/reactions/config.mjs +22 -0
  9. package/esm2022/lib/services/reactions/index.mjs +3 -0
  10. package/esm2022/lib/services/reactions/reactions.service.mjs +89 -0
  11. package/esm2022/lib/services/reactions/types.mjs +2 -0
  12. package/esm2022/public-api.mjs +5 -3
  13. package/fesm2022/valtech-components.mjs +453 -66
  14. package/fesm2022/valtech-components.mjs.map +1 -1
  15. package/lib/components/molecules/reaction-bar/reaction-bar.component.d.ts +44 -0
  16. package/lib/components/molecules/reaction-bar/types.d.ts +55 -0
  17. package/lib/components/organisms/organization-view/organization-view.component.d.ts +1 -0
  18. package/lib/services/auth/org-switch.service.d.ts +9 -0
  19. package/lib/services/reactions/config.d.ts +20 -0
  20. package/lib/services/reactions/index.d.ts +3 -0
  21. package/lib/services/reactions/reactions.service.d.ts +42 -0
  22. package/lib/services/reactions/types.d.ts +48 -0
  23. package/package.json +1 -1
  24. package/public-api.d.ts +3 -2
  25. package/esm2022/lib/services/pdf/pdf.service.mjs +0 -59
  26. package/esm2022/lib/services/pdf/types.mjs +0 -2
  27. package/lib/services/pdf/pdf.service.d.ts +0 -27
  28. package/lib/services/pdf/types.d.ts +0 -31
  29. package/src/lib/services/firebase/firebase-messaging-sw.js +0 -145
@@ -3,7 +3,7 @@ import { inject, InjectionToken, makeEnvironmentProviders, APP_INITIALIZER, Erro
3
3
  import { BehaviorSubject, throwError, Subject, map, distinctUntilChanged, filter as filter$1, take as take$1, firstValueFrom, of, from, EMPTY, Observable, interval, debounceTime, switchMap as switchMap$1, catchError as catchError$1, takeUntil, isObservable, forkJoin, race, timer, shareReplay as shareReplay$1 } from 'rxjs';
4
4
  import { catchError, switchMap, finalize, filter, take, timeout, map as map$1, tap, shareReplay, distinctUntilChanged as distinctUntilChanged$1, retry, debounceTime as debounceTime$1, takeUntil as takeUntil$1 } from 'rxjs/operators';
5
5
  import * as i1$3 from '@angular/common/http';
6
- import { provideHttpClient, withInterceptors, HttpClient, HttpErrorResponse } from '@angular/common/http';
6
+ import { provideHttpClient, withInterceptors, HttpClient, HttpErrorResponse, HttpParams } from '@angular/common/http';
7
7
  import * as i1$1 from '@angular/fire/firestore';
8
8
  import { provideFirestore, getFirestore, connectFirestoreEmulator, enableMultiTabIndexedDbPersistence, doc, getDoc, collection, query as query$1, getDocs, getCountFromServer, limit, docData, collectionData, serverTimestamp, addDoc, setDoc, updateDoc, deleteDoc, writeBatch, arrayUnion, arrayRemove, increment, where, orderBy, startAfter, startAt, endBefore, endAt, Timestamp, onSnapshot, Firestore } from '@angular/fire/firestore';
9
9
  import * as i1$5 from '@angular/common';
@@ -21166,16 +21166,18 @@ class LoadMoreComponent {
21166
21166
  [shape]="shape()"
21167
21167
  [size]="size()"
21168
21168
  [disabled]="loading()"
21169
+ class="lm-btn"
21169
21170
  (click)="onButtonClick()"
21170
21171
  >
21171
21172
  @if (loading()) {
21172
- <ion-spinner name="crescent" slot="start" />
21173
+ <ion-spinner name="crescent" />
21174
+ } @else {
21175
+ {{ label() }}
21173
21176
  }
21174
- {{ label() }}
21175
21177
  </ion-button>
21176
21178
  </div>
21177
21179
  }
21178
- `, isInline: true, styles: [":host{display:block}.lm-wrap{display:flex;justify-content:center;padding:16px 0 8px}ion-button ion-spinner{--color: currentColor;width:1rem;height:1rem}\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: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }] }); }
21180
+ `, isInline: true, styles: [":host{display:block}.lm-wrap{display:flex;justify-content:center;padding:16px 0 8px}.lm-btn{min-width:120px}ion-button ion-spinner{--color: currentColor;width:1rem;height:1rem}\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: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }] }); }
21179
21181
  }
21180
21182
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LoadMoreComponent, decorators: [{
21181
21183
  type: Component,
@@ -21192,16 +21194,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
21192
21194
  [shape]="shape()"
21193
21195
  [size]="size()"
21194
21196
  [disabled]="loading()"
21197
+ class="lm-btn"
21195
21198
  (click)="onButtonClick()"
21196
21199
  >
21197
21200
  @if (loading()) {
21198
- <ion-spinner name="crescent" slot="start" />
21201
+ <ion-spinner name="crescent" />
21202
+ } @else {
21203
+ {{ label() }}
21199
21204
  }
21200
- {{ label() }}
21201
21205
  </ion-button>
21202
21206
  </div>
21203
21207
  }
21204
- `, styles: [":host{display:block}.lm-wrap{display:flex;justify-content:center;padding:16px 0 8px}ion-button ion-spinner{--color: currentColor;width:1rem;height:1rem}\n"] }]
21208
+ `, styles: [":host{display:block}.lm-wrap{display:flex;justify-content:center;padding:16px 0 8px}.lm-btn{min-width:120px}ion-button ion-spinner{--color: currentColor;width:1rem;height:1rem}\n"] }]
21205
21209
  }], ctorParameters: () => [], propDecorators: { loadMore: [{
21206
21210
  type: Output
21207
21211
  }] } });
@@ -34632,10 +34636,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
34632
34636
  * ```
34633
34637
  */
34634
34638
  class OrgSwitchService {
34639
+ /** Notify subscribers that the active org's data was updated. */
34640
+ notifyOrgDataUpdated(org) {
34641
+ this._orgDataUpdated.next(org);
34642
+ }
34635
34643
  constructor(auth) {
34636
34644
  this.auth = auth;
34637
34645
  this._switching = signal(false);
34638
34646
  this._orgChanged = new Subject();
34647
+ this._orgDataUpdated = new Subject();
34639
34648
  /**
34640
34649
  * `true` while a switch is in flight. UI should disable interactions
34641
34650
  * with org-scoped data and show a loading indicator.
@@ -34649,6 +34658,11 @@ class OrgSwitchService {
34649
34658
  * see the updated Firebase user / activeOrg claim.
34650
34659
  */
34651
34660
  this.orgChanged$ = this._orgChanged.asObservable();
34661
+ /**
34662
+ * Fires when org data (name, logoUrl, etc.) changes without a full org switch.
34663
+ * Subscribe in the app shell to keep the header org avatar up to date.
34664
+ */
34665
+ this.orgDataUpdated$ = this._orgDataUpdated.asObservable();
34652
34666
  }
34653
34667
  /**
34654
34668
  * Switch the user's active organization.
@@ -37155,7 +37169,7 @@ class ToolbarComponent {
37155
37169
  <!-- experimental -->
37156
37170
  <ng-content select="[toolbar-bottom]"></ng-content>
37157
37171
  </ion-toolbar>
37158
- `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif}.left-buttons{margin-left:-1rem}.background{background:var(--ion-background-color)}:host ion-title{--color: var(--ion-text-color)}:host ion-button{--color: var(--ion-text-color)}:host ion-icon{color:var(--ion-text-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { 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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }, { kind: "component", type: UserAvatarComponent, selector: "val-user-avatar", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: IonMenuButton, selector: "ion-menu-button", inputs: ["autoHide", "color", "disabled", "menu", "mode", "type"] }, { kind: "component", type: LanguageSelectorComponent, selector: "val-language-selector", inputs: ["props"], outputs: ["languageChange"] }, { kind: "component", type: FontSizeSelectorComponent, selector: "val-font-size-selector", inputs: ["props"] }] }); }
37172
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif}.left-buttons{margin-left:-1rem}.background{background:var(--ion-background-color)}:host ion-title{--color: var(--ion-text-color)}:host ion-button{--color: var(--ion-text-color)}:host ion-icon{color:var(--ion-text-color)}:host val-user-avatar+val-user-avatar{margin-left:6px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { 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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }, { kind: "component", type: UserAvatarComponent, selector: "val-user-avatar", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: IonMenuButton, selector: "ion-menu-button", inputs: ["autoHide", "color", "disabled", "menu", "mode", "type"] }, { kind: "component", type: LanguageSelectorComponent, selector: "val-language-selector", inputs: ["props"], outputs: ["languageChange"] }, { kind: "component", type: FontSizeSelectorComponent, selector: "val-font-size-selector", inputs: ["props"] }] }); }
37159
37173
  }
37160
37174
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolbarComponent, decorators: [{
37161
37175
  type: Component,
@@ -37280,7 +37294,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
37280
37294
  <!-- experimental -->
37281
37295
  <ng-content select="[toolbar-bottom]"></ng-content>
37282
37296
  </ion-toolbar>
37283
- `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif}.left-buttons{margin-left:-1rem}.background{background:var(--ion-background-color)}:host ion-title{--color: var(--ion-text-color)}:host ion-button{--color: var(--ion-text-color)}:host ion-icon{color:var(--ion-text-color)}\n"] }]
37297
+ `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif}.left-buttons{margin-left:-1rem}.background{background:var(--ion-background-color)}:host ion-title{--color: var(--ion-text-color)}:host ion-button{--color: var(--ion-text-color)}:host ion-icon{color:var(--ion-text-color)}:host val-user-avatar+val-user-avatar{margin-left:6px}\n"] }]
37284
37298
  }], ctorParameters: () => [{ type: IconService }], propDecorators: { props: [{
37285
37299
  type: Input
37286
37300
  }], onClick: [{
@@ -54165,7 +54179,7 @@ class SwitchOrgModalComponent {
54165
54179
  </div>
54166
54180
  }
54167
54181
  </ion-content>
54168
- `, isInline: true, styles: [".switch-section{margin-top:16px;display:flex;flex-direction:column;gap:12px}.switch-state{display:flex;justify-content:center;padding:24px 0}.orgs-list{display:flex;flex-direction:column;gap:8px}.org-row{display:flex;align-items:center;gap:12px;width:100%;padding:12px 14px;border:1px solid rgba(var(--ion-color-dark-rgb),.14);border-radius:12px;background:var(--ion-card-background, var(--ion-background-color));cursor:pointer;text-align:left;transition:border-color .15s ease,opacity .15s ease}.org-row:not(:disabled):active{opacity:.7}.org-row:disabled{cursor:default}.org-row--active{border-color:var(--ion-color-dark)}.org-row__icon{width:36px;height:36px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:18px;color:var(--ion-color-dark);background:rgba(var(--ion-color-dark-rgb),.08)}.org-row__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.org-row__name{font-weight:600;font-size:.95rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.org-row__type{font-size:.8rem;color:rgba(var(--ion-color-dark-rgb),.7)}.org-row__end{display:flex;align-items:center;gap:6px;flex-shrink:0}.org-row__current{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:rgba(var(--ion-color-dark-rgb),.7)}.org-row__check{font-size:1.1rem;color:var(--ion-color-dark)}.org-row__spinner{width:18px;height:18px;color:var(--ion-color-dark)}.org-row__icon img{width:100%;height:100%;object-fit:cover;border-radius:50%}.user-strip{display:flex;align-items:center;gap:12px;padding:12px 0 4px;margin-bottom:8px;border-bottom:1px solid rgba(var(--ion-color-dark-rgb),.1)}.user-strip__avatar{width:44px;height:44px;border-radius:50%;flex-shrink:0;overflow:hidden;background:rgba(var(--ion-color-dark-rgb),.1);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1rem;color:var(--ion-color-dark)}.user-strip__avatar img{width:100%;height:100%;object-fit:cover}.user-strip__info{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.user-strip__name{font-weight:600;font-size:.9rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-strip__email{font-size:.78rem;color:rgba(var(--ion-color-dark-rgb),.6);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.new-org-cta{margin-top:16px;padding-top:16px;border-top:1px solid rgba(var(--ion-color-dark-rgb),.1)}\n"], dependencies: [{ kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { 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: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: LoadMoreComponent, selector: "val-load-more", inputs: ["props"], outputs: ["loadMore"] }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["preset", "props"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
54182
+ `, isInline: true, styles: [".switch-section{margin-top:16px;display:flex;flex-direction:column;gap:12px}.switch-state{display:flex;justify-content:center;padding:24px 0}.orgs-list{display:flex;flex-direction:column;gap:8px}.org-row{display:flex;align-items:center;gap:12px;width:100%;padding:12px 14px;border:1px solid rgba(var(--ion-color-dark-rgb),.14);border-radius:12px;background:var(--ion-card-background, var(--ion-background-color));cursor:pointer;text-align:left;transition:border-color .15s ease,opacity .15s ease}.org-row:not(:disabled):active{opacity:.7}.org-row:disabled{cursor:default}.org-row--active{border-color:var(--ion-color-dark)}.org-row__icon{width:36px;height:36px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:18px;color:var(--ion-color-dark);background:rgba(var(--ion-color-dark-rgb),.08)}.org-row__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.org-row__name{font-weight:600;font-size:.95rem;line-height:1.3;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.org-row__type{font-size:.8rem;line-height:1.3;color:rgba(var(--ion-color-dark-rgb),.7)}.org-row__end{display:flex;align-items:center;gap:6px;flex-shrink:0}.org-row__current{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:rgba(var(--ion-color-dark-rgb),.7)}.org-row__check{font-size:1.1rem;color:var(--ion-color-dark)}.org-row__spinner{width:18px;height:18px;color:var(--ion-color-dark)}.org-row__icon img{width:100%;height:100%;object-fit:cover;border-radius:50%}.user-strip{display:flex;align-items:center;gap:12px;padding:12px 0 4px;margin-bottom:8px;border-bottom:1px solid rgba(var(--ion-color-dark-rgb),.1)}.user-strip__avatar{width:44px;height:44px;border-radius:50%;flex-shrink:0;overflow:hidden;background:rgba(var(--ion-color-dark-rgb),.1);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1rem;color:var(--ion-color-dark)}.user-strip__avatar img{width:100%;height:100%;object-fit:cover}.user-strip__info{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.user-strip__name{font-weight:600;font-size:.9rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-strip__email{font-size:.78rem;color:rgba(var(--ion-color-dark-rgb),.6);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.new-org-cta{margin-top:16px;padding-top:16px;border-top:1px solid rgba(var(--ion-color-dark-rgb),.1)}\n"], dependencies: [{ kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { 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: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: LoadMoreComponent, selector: "val-load-more", inputs: ["props"], outputs: ["loadMore"] }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["preset", "props"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
54169
54183
  }
54170
54184
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SwitchOrgModalComponent, decorators: [{
54171
54185
  type: Component,
@@ -54298,7 +54312,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
54298
54312
  </div>
54299
54313
  }
54300
54314
  </ion-content>
54301
- `, styles: [".switch-section{margin-top:16px;display:flex;flex-direction:column;gap:12px}.switch-state{display:flex;justify-content:center;padding:24px 0}.orgs-list{display:flex;flex-direction:column;gap:8px}.org-row{display:flex;align-items:center;gap:12px;width:100%;padding:12px 14px;border:1px solid rgba(var(--ion-color-dark-rgb),.14);border-radius:12px;background:var(--ion-card-background, var(--ion-background-color));cursor:pointer;text-align:left;transition:border-color .15s ease,opacity .15s ease}.org-row:not(:disabled):active{opacity:.7}.org-row:disabled{cursor:default}.org-row--active{border-color:var(--ion-color-dark)}.org-row__icon{width:36px;height:36px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:18px;color:var(--ion-color-dark);background:rgba(var(--ion-color-dark-rgb),.08)}.org-row__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.org-row__name{font-weight:600;font-size:.95rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.org-row__type{font-size:.8rem;color:rgba(var(--ion-color-dark-rgb),.7)}.org-row__end{display:flex;align-items:center;gap:6px;flex-shrink:0}.org-row__current{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:rgba(var(--ion-color-dark-rgb),.7)}.org-row__check{font-size:1.1rem;color:var(--ion-color-dark)}.org-row__spinner{width:18px;height:18px;color:var(--ion-color-dark)}.org-row__icon img{width:100%;height:100%;object-fit:cover;border-radius:50%}.user-strip{display:flex;align-items:center;gap:12px;padding:12px 0 4px;margin-bottom:8px;border-bottom:1px solid rgba(var(--ion-color-dark-rgb),.1)}.user-strip__avatar{width:44px;height:44px;border-radius:50%;flex-shrink:0;overflow:hidden;background:rgba(var(--ion-color-dark-rgb),.1);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1rem;color:var(--ion-color-dark)}.user-strip__avatar img{width:100%;height:100%;object-fit:cover}.user-strip__info{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.user-strip__name{font-weight:600;font-size:.9rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-strip__email{font-size:.78rem;color:rgba(var(--ion-color-dark-rgb),.6);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.new-org-cta{margin-top:16px;padding-top:16px;border-top:1px solid rgba(var(--ion-color-dark-rgb),.1)}\n"] }]
54315
+ `, styles: [".switch-section{margin-top:16px;display:flex;flex-direction:column;gap:12px}.switch-state{display:flex;justify-content:center;padding:24px 0}.orgs-list{display:flex;flex-direction:column;gap:8px}.org-row{display:flex;align-items:center;gap:12px;width:100%;padding:12px 14px;border:1px solid rgba(var(--ion-color-dark-rgb),.14);border-radius:12px;background:var(--ion-card-background, var(--ion-background-color));cursor:pointer;text-align:left;transition:border-color .15s ease,opacity .15s ease}.org-row:not(:disabled):active{opacity:.7}.org-row:disabled{cursor:default}.org-row--active{border-color:var(--ion-color-dark)}.org-row__icon{width:36px;height:36px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:18px;color:var(--ion-color-dark);background:rgba(var(--ion-color-dark-rgb),.08)}.org-row__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.org-row__name{font-weight:600;font-size:.95rem;line-height:1.3;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.org-row__type{font-size:.8rem;line-height:1.3;color:rgba(var(--ion-color-dark-rgb),.7)}.org-row__end{display:flex;align-items:center;gap:6px;flex-shrink:0}.org-row__current{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:rgba(var(--ion-color-dark-rgb),.7)}.org-row__check{font-size:1.1rem;color:var(--ion-color-dark)}.org-row__spinner{width:18px;height:18px;color:var(--ion-color-dark)}.org-row__icon img{width:100%;height:100%;object-fit:cover;border-radius:50%}.user-strip{display:flex;align-items:center;gap:12px;padding:12px 0 4px;margin-bottom:8px;border-bottom:1px solid rgba(var(--ion-color-dark-rgb),.1)}.user-strip__avatar{width:44px;height:44px;border-radius:50%;flex-shrink:0;overflow:hidden;background:rgba(var(--ion-color-dark-rgb),.1);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1rem;color:var(--ion-color-dark)}.user-strip__avatar img{width:100%;height:100%;object-fit:cover}.user-strip__info{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.user-strip__name{font-weight:600;font-size:.9rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-strip__email{font-size:.78rem;color:rgba(var(--ion-color-dark-rgb),.6);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.new-org-cta{margin-top:16px;padding-top:16px;border-top:1px solid rgba(var(--ion-color-dark-rgb),.1)}\n"] }]
54302
54316
  }], ctorParameters: () => [], propDecorators: { _modalRef: [{
54303
54317
  type: Input
54304
54318
  }], onSuccess: [{
@@ -54562,6 +54576,7 @@ class OrganizationViewComponent {
54562
54576
  this.nav = inject(NavigationService);
54563
54577
  this.i18n = inject(I18nService);
54564
54578
  this.auth = inject(AuthService);
54579
+ this.orgSwitch = inject(OrgSwitchService);
54565
54580
  this.orgService = inject(OrgService);
54566
54581
  this.toast = inject(ToastService);
54567
54582
  this.errors = inject(ValtechErrorService);
@@ -54815,6 +54830,7 @@ class OrganizationViewComponent {
54815
54830
  org: this.org(),
54816
54831
  onSuccess: (updated) => {
54817
54832
  this.org.set(updated);
54833
+ this.orgSwitch.notifyOrgDataUpdated(updated);
54818
54834
  this.resolvedConfig().onOrgEdited?.();
54819
54835
  },
54820
54836
  },
@@ -61610,60 +61626,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
61610
61626
  type: Input
61611
61627
  }] } });
61612
61628
 
61613
- /**
61614
- * Servicio para generación de PDFs via el PDF Lambda (/v2/pdf/generate).
61615
- *
61616
- * El JWT del usuario se inyecta automáticamente por el authInterceptor
61617
- * (configurado vía provideValtechAuth). El app-id se toma de ValtechAuthConfig.
61618
- *
61619
- * Modos de uso:
61620
- * - source.template → renderiza una plantilla desde DynamoDB
61621
- * - source.html → HTML arbitrario provisto por el caller
61622
- * - source.url → URL pública (Puppeteer la carga)
61623
- */
61624
- class PdfService {
61625
- constructor(config) {
61626
- this.config = config;
61627
- this.http = inject(HttpClient);
61628
- }
61629
- get baseUrl() {
61630
- return `${this.config?.apiUrl ?? ''}/v2/pdf`;
61631
- }
61632
- get appIdHeader() {
61633
- const appId = this.config?.appId;
61634
- return appId ? { 'x-app-id': appId } : {};
61635
- }
61636
- generate(req) {
61637
- return this.http.post(`${this.baseUrl}/generate`, req, {
61638
- headers: this.appIdHeader,
61639
- });
61640
- }
61641
- generateAndDownload(req, filename = 'documento.pdf') {
61642
- return this.generate(req).pipe(switchMap$1(result => from(this._download(result.url, filename))));
61643
- }
61644
- async _download(url, filename) {
61645
- const res = await fetch(url);
61646
- const blob = await res.blob();
61647
- const objUrl = URL.createObjectURL(blob);
61648
- const a = document.createElement('a');
61649
- a.href = objUrl;
61650
- a.download = filename;
61651
- a.click();
61652
- URL.revokeObjectURL(objUrl);
61653
- }
61654
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PdfService, deps: [{ token: VALTECH_AUTH_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
61655
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PdfService, providedIn: 'root' }); }
61656
- }
61657
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PdfService, decorators: [{
61658
- type: Injectable,
61659
- args: [{ providedIn: 'root' }]
61660
- }], ctorParameters: () => [{ type: undefined, decorators: [{
61661
- type: Optional
61662
- }, {
61663
- type: Inject,
61664
- args: [VALTECH_AUTH_CONFIG]
61665
- }] }] });
61666
-
61667
61629
  /**
61668
61630
  * Clave para persistir el idioma en localStorage
61669
61631
  */
@@ -66874,6 +66836,431 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
66874
66836
  type: Output
66875
66837
  }] } });
66876
66838
 
66839
+ /**
66840
+ * Token de inyeccion para la configuracion del servicio de Reactions.
66841
+ */
66842
+ const VALTECH_REACTIONS_CONFIG = new InjectionToken('ValtechReactionsConfig');
66843
+ /**
66844
+ * Provee el servicio de reactions a la aplicacion Angular.
66845
+ *
66846
+ * @param config - Configuracion de reactions
66847
+ * @returns EnvironmentProviders para usar en bootstrapApplication
66848
+ *
66849
+ * @example
66850
+ * bootstrapApplication(AppComponent, {
66851
+ * providers: [
66852
+ * provideValtechReactions({ apiUrl: environment.apiUrl, appId: 'my-app' }),
66853
+ * ],
66854
+ * });
66855
+ */
66856
+ function provideValtechReactions(config) {
66857
+ return makeEnvironmentProviders([{ provide: VALTECH_REACTIONS_CONFIG, useValue: config }]);
66858
+ }
66859
+
66860
+ /**
66861
+ * Servicio para gestionar reacciones emoji configurables por contexto.
66862
+ *
66863
+ * Requiere provideValtechReactions() en el bootstrap de la app.
66864
+ *
66865
+ * @example
66866
+ * const svc = inject(ReactionsService);
66867
+ * svc.react({ entityRef: { entityType: 'post', entityId: '1' }, token: 'heart', appId: 'app' })
66868
+ * .subscribe(res => console.log(res.counts));
66869
+ */
66870
+ class ReactionsService {
66871
+ constructor() {
66872
+ this.http = inject(HttpClient);
66873
+ this.config = inject(VALTECH_REACTIONS_CONFIG, { optional: true });
66874
+ if (!this.config && isDevMode()) {
66875
+ console.warn('[valtech-components] ReactionsService: provideValtechReactions() no esta en main.ts. ' +
66876
+ 'Las reacciones no funcionaran.');
66877
+ }
66878
+ }
66879
+ get apiUrl() {
66880
+ return this.config?.apiUrl ?? '';
66881
+ }
66882
+ get baseUrl() {
66883
+ return `${this.apiUrl}/v2/reactions`;
66884
+ }
66885
+ /**
66886
+ * Toggle reaccion — retorna estado nuevo + conteos actualizados.
66887
+ */
66888
+ react(req) {
66889
+ if (!this.config)
66890
+ return EMPTY;
66891
+ return this.http.post(this.baseUrl, req);
66892
+ }
66893
+ /**
66894
+ * Conteos + reacciones del usuario para una entidad.
66895
+ */
66896
+ getCounts(appId, entityType, entityId) {
66897
+ if (!this.config)
66898
+ return EMPTY;
66899
+ const params = new HttpParams()
66900
+ .set('appId', appId)
66901
+ .set('entityType', entityType)
66902
+ .set('entityId', entityId);
66903
+ return this.http.get(`${this.baseUrl}/counts`, { params });
66904
+ }
66905
+ /**
66906
+ * Solo mis tokens activos para una entidad.
66907
+ */
66908
+ getMyReactions(appId, entityType, entityId) {
66909
+ if (!this.config)
66910
+ return EMPTY;
66911
+ const params = new HttpParams()
66912
+ .set('appId', appId)
66913
+ .set('entityType', entityType)
66914
+ .set('entityId', entityId);
66915
+ return this.http
66916
+ .get(`${this.baseUrl}/mine`, { params })
66917
+ .pipe(map(res => res.tokens));
66918
+ }
66919
+ /**
66920
+ * Obtener un set de reacciones por ID.
66921
+ */
66922
+ getSet(setId) {
66923
+ if (!this.config)
66924
+ return EMPTY;
66925
+ return this.http.get(`${this.baseUrl}/sets/${setId}`);
66926
+ }
66927
+ /**
66928
+ * Listar todos los sets disponibles para una app.
66929
+ */
66930
+ listSets(appId) {
66931
+ if (!this.config)
66932
+ return EMPTY;
66933
+ const params = new HttpParams().set('appId', appId);
66934
+ return this.http.get(`${this.baseUrl}/sets`, { params });
66935
+ }
66936
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReactionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
66937
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReactionsService, providedIn: 'root' }); }
66938
+ }
66939
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReactionsService, decorators: [{
66940
+ type: Injectable,
66941
+ args: [{ providedIn: 'root' }]
66942
+ }], ctorParameters: () => [] });
66943
+
66944
+ const REACTION_BAR_I18N = {
66945
+ es: {
66946
+ loading: 'Cargando reacciones...',
66947
+ addReaction: 'Agregar reaccion',
66948
+ close: 'Cerrar',
66949
+ errorLoading: 'Error al cargar reacciones.',
66950
+ },
66951
+ en: {
66952
+ loading: 'Loading reactions...',
66953
+ addReaction: 'Add reaction',
66954
+ close: 'Close',
66955
+ errorLoading: 'Failed to load reactions.',
66956
+ },
66957
+ };
66958
+ /**
66959
+ * Barra de reacciones emoji configurables por contexto.
66960
+ *
66961
+ * Muestra un set de emojis y permite al usuario reaccionar a una entidad.
66962
+ * Soporta conteos, multiples reacciones y modo picker (popup).
66963
+ *
66964
+ * @example
66965
+ * html
66966
+ * <val-reaction-bar
66967
+ * [props]="{
66968
+ * entityRef: { entityType: 'post', entityId: 'p1' },
66969
+ * reactionSet: mySet,
66970
+ * showCounts: true
66971
+ * }"
66972
+ * (reactionChange)="onReaction($event)"
66973
+ * />
66974
+ */
66975
+ class ReactionBarComponent {
66976
+ constructor() {
66977
+ this.reactionChange = new EventEmitter();
66978
+ this.reactionsService = inject(ReactionsService);
66979
+ this.i18n = inject(I18nService);
66980
+ this.reactionSet = signal(null);
66981
+ this.myReactions = signal([]);
66982
+ this.counts = signal({});
66983
+ this.isLoading = signal(true);
66984
+ this.pickerOpen = signal(false);
66985
+ this.enrichedReactions = computed(() => {
66986
+ const set = this.reactionSet();
66987
+ if (!set)
66988
+ return [];
66989
+ const my = this.myReactions();
66990
+ const c = this.counts();
66991
+ return [...set.reactions]
66992
+ .sort((a, b) => a.order - b.order)
66993
+ .map(r => ({
66994
+ ...r,
66995
+ count: c[r.token] ?? 0,
66996
+ active: my.includes(r.token),
66997
+ }));
66998
+ });
66999
+ this.i18n.registerDefaults('ReactionBar', REACTION_BAR_I18N);
67000
+ }
67001
+ ngOnInit() {
67002
+ if (this.props.initialCounts) {
67003
+ this.counts.set(this.props.initialCounts);
67004
+ }
67005
+ if (this.props.initialMyReactions) {
67006
+ this.myReactions.set(this.props.initialMyReactions);
67007
+ }
67008
+ if (this.props.reactionSet) {
67009
+ this.reactionSet.set(this.props.reactionSet);
67010
+ this.isLoading.set(false);
67011
+ if (!this.props.skipInitialLoad && !this.props.initialCounts) {
67012
+ void this.loadCounts();
67013
+ }
67014
+ return;
67015
+ }
67016
+ if (this.props.reactionSetId) {
67017
+ void this.loadSetAndCounts(this.props.reactionSetId);
67018
+ return;
67019
+ }
67020
+ this.isLoading.set(false);
67021
+ }
67022
+ async loadSetAndCounts(setId) {
67023
+ this.isLoading.set(true);
67024
+ try {
67025
+ const set = await firstValueFrom(this.reactionsService.getSet(setId));
67026
+ this.reactionSet.set(set);
67027
+ if (!this.props.skipInitialLoad && !this.props.initialCounts) {
67028
+ await this.loadCounts();
67029
+ }
67030
+ }
67031
+ catch (err) {
67032
+ console.error('[ReactionBarComponent] Error loading reaction set:', err);
67033
+ }
67034
+ finally {
67035
+ this.isLoading.set(false);
67036
+ }
67037
+ }
67038
+ async loadCounts() {
67039
+ const appId = this.props.appId ?? '';
67040
+ const { entityType, entityId } = this.props.entityRef;
67041
+ try {
67042
+ const res = await firstValueFrom(this.reactionsService.getCounts(appId, entityType, entityId));
67043
+ this.counts.set(res.counts);
67044
+ if (!this.props.initialMyReactions) {
67045
+ this.myReactions.set(res.myReactions);
67046
+ }
67047
+ }
67048
+ catch (err) {
67049
+ console.error('[ReactionBarComponent] Error loading counts:', err);
67050
+ }
67051
+ }
67052
+ onReact(token) {
67053
+ if (this.props.readonly)
67054
+ return;
67055
+ void this.handleReact(token);
67056
+ }
67057
+ onReactAndClosePicker(token) {
67058
+ this.pickerOpen.set(false);
67059
+ this.onReact(token);
67060
+ }
67061
+ togglePicker() {
67062
+ this.pickerOpen.update(v => !v);
67063
+ }
67064
+ async handleReact(token) {
67065
+ const appId = this.props.appId ?? '';
67066
+ const { entityType, entityId } = this.props.entityRef;
67067
+ const maxReactions = this.props.maxReactions ?? 1;
67068
+ const currentMy = this.myReactions();
67069
+ const isActive = currentMy.includes(token);
67070
+ let newMyReactions;
67071
+ if (isActive) {
67072
+ newMyReactions = currentMy.filter(t => t !== token);
67073
+ }
67074
+ else if (maxReactions === 1) {
67075
+ newMyReactions = [token];
67076
+ }
67077
+ else if (maxReactions === 0 || currentMy.length < maxReactions) {
67078
+ newMyReactions = [...currentMy, token];
67079
+ }
67080
+ else {
67081
+ newMyReactions = currentMy;
67082
+ }
67083
+ const prevCounts = this.counts();
67084
+ const optimisticCounts = { ...prevCounts };
67085
+ if (isActive) {
67086
+ optimisticCounts[token] = Math.max(0, (optimisticCounts[token] ?? 1) - 1);
67087
+ }
67088
+ else {
67089
+ optimisticCounts[token] = (optimisticCounts[token] ?? 0) + 1;
67090
+ if (maxReactions === 1 && currentMy.length > 0) {
67091
+ const removed = currentMy[0];
67092
+ optimisticCounts[removed] = Math.max(0, (optimisticCounts[removed] ?? 1) - 1);
67093
+ }
67094
+ }
67095
+ this.myReactions.set(newMyReactions);
67096
+ this.counts.set(optimisticCounts);
67097
+ try {
67098
+ const res = await firstValueFrom(this.reactionsService.react({ entityRef: { entityType, entityId }, token, appId }));
67099
+ this.counts.set(res.counts);
67100
+ if (!res.active) {
67101
+ this.myReactions.set(this.myReactions().filter(t => t !== token));
67102
+ }
67103
+ else if (!this.myReactions().includes(token)) {
67104
+ this.myReactions.update(arr => [...arr, token]);
67105
+ }
67106
+ this.reactionChange.emit({
67107
+ token,
67108
+ active: res.active,
67109
+ entityRef: { entityType, entityId },
67110
+ counts: res.counts,
67111
+ });
67112
+ }
67113
+ catch (err) {
67114
+ console.error('[ReactionBarComponent] Error reacting:', err);
67115
+ this.myReactions.set(currentMy);
67116
+ this.counts.set(prevCounts);
67117
+ }
67118
+ }
67119
+ t(key) {
67120
+ return this.i18n.t(key, 'ReactionBar') || key;
67121
+ }
67122
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReactionBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
67123
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReactionBarComponent, isStandalone: true, selector: "val-reaction-bar", inputs: { props: "props" }, outputs: { reactionChange: "reactionChange" }, ngImport: i0, template: `
67124
+ <div class="reaction-bar" [class.layout-picker]="props.layout === 'picker'" [attr.aria-label]="t('addReaction')">
67125
+ @if (isLoading()) {
67126
+ <div class="reaction-skeleton" aria-hidden="true">
67127
+ <span class="skeleton-circle"></span>
67128
+ <span class="skeleton-circle"></span>
67129
+ <span class="skeleton-circle"></span>
67130
+ </div>
67131
+ } @else {
67132
+ @for (r of enrichedReactions(); track r.token) {
67133
+ <button
67134
+ type="button"
67135
+ class="reaction-btn"
67136
+ [class.active]="r.active"
67137
+ [disabled]="props.readonly"
67138
+ [attr.aria-label]="r.label"
67139
+ [attr.aria-pressed]="r.active"
67140
+ (click)="onReact(r.token)"
67141
+ >
67142
+ <span class="emoji">{{ r.emoji }}</span>
67143
+ @if (props.showCounts && r.count > 0) {
67144
+ <span class="count">{{ r.count }}</span>
67145
+ }
67146
+ </button>
67147
+ }
67148
+ @if (props.layout === 'picker' && !pickerOpen()) {
67149
+ <button
67150
+ type="button"
67151
+ class="reaction-btn reaction-btn--add"
67152
+ [disabled]="props.readonly"
67153
+ [attr.aria-label]="t('addReaction')"
67154
+ (click)="togglePicker()"
67155
+ >
67156
+ <span class="emoji">+</span>
67157
+ </button>
67158
+ }
67159
+ @if (props.layout === 'picker' && pickerOpen()) {
67160
+ <div class="picker-popover" role="dialog" [attr.aria-label]="t('addReaction')">
67161
+ @for (r of enrichedReactions(); track r.token) {
67162
+ <button
67163
+ type="button"
67164
+ class="reaction-btn"
67165
+ [class.active]="r.active"
67166
+ [attr.aria-label]="r.label"
67167
+ [attr.aria-pressed]="r.active"
67168
+ (click)="onReactAndClosePicker(r.token)"
67169
+ >
67170
+ <span class="emoji">{{ r.emoji }}</span>
67171
+ @if (props.showCounts && r.count > 0) {
67172
+ <span class="count">{{ r.count }}</span>
67173
+ }
67174
+ </button>
67175
+ }
67176
+ <button
67177
+ type="button"
67178
+ class="reaction-btn reaction-btn--close"
67179
+ [attr.aria-label]="t('close')"
67180
+ (click)="togglePicker()"
67181
+ >
67182
+ <span class="emoji">x</span>
67183
+ </button>
67184
+ </div>
67185
+ }
67186
+ }
67187
+ </div>
67188
+ `, isInline: true, styles: [":host{display:block}.reaction-bar{display:flex;flex-wrap:wrap;gap:4px;align-items:center;position:relative}.reaction-btn{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;border-radius:16px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));cursor:pointer;transition:all .15s ease;font-size:1rem;font-family:inherit;line-height:1}.reaction-btn:hover:not(:disabled){background:var(--ion-color-light, #f4f5f8)}.reaction-btn.active{background:var(--ion-color-primary-tint, rgba(76, 141, 255, .1));border-color:var(--ion-color-primary, #3880ff)}.reaction-btn:disabled{opacity:.6;cursor:default}.reaction-btn--add{border-style:dashed}.reaction-btn--close{border-color:var(--ion-color-medium, #92949c)}.emoji{font-size:1.1em;line-height:1}.count{font-size:.75rem;font-weight:600;color:var(--ion-color-medium, #92949c)}.active .count{color:var(--ion-color-primary, #3880ff)}.reaction-skeleton{display:flex;gap:4px;align-items:center}.skeleton-circle{display:inline-block;width:36px;height:28px;border-radius:16px;background:var(--ion-color-light, #f4f5f8);animation:skeleton-pulse 1.4s ease-in-out infinite}.skeleton-circle:nth-child(2){animation-delay:.2s}.skeleton-circle:nth-child(3){animation-delay:.4s}@keyframes skeleton-pulse{0%,to{opacity:1}50%{opacity:.4}}.picker-popover{display:flex;flex-wrap:wrap;gap:4px;align-items:center;padding:6px 8px;border-radius:20px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));box-shadow:0 4px 12px #0000001f;position:absolute;bottom:calc(100% + 8px);left:0;z-index:100}:host(.sm) .reaction-btn{padding:2px 6px;font-size:.875rem}:host(.lg) .reaction-btn{padding:6px 12px;font-size:1.2rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
67189
+ }
67190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReactionBarComponent, decorators: [{
67191
+ type: Component,
67192
+ args: [{ selector: 'val-reaction-bar', standalone: true, imports: [CommonModule], template: `
67193
+ <div class="reaction-bar" [class.layout-picker]="props.layout === 'picker'" [attr.aria-label]="t('addReaction')">
67194
+ @if (isLoading()) {
67195
+ <div class="reaction-skeleton" aria-hidden="true">
67196
+ <span class="skeleton-circle"></span>
67197
+ <span class="skeleton-circle"></span>
67198
+ <span class="skeleton-circle"></span>
67199
+ </div>
67200
+ } @else {
67201
+ @for (r of enrichedReactions(); track r.token) {
67202
+ <button
67203
+ type="button"
67204
+ class="reaction-btn"
67205
+ [class.active]="r.active"
67206
+ [disabled]="props.readonly"
67207
+ [attr.aria-label]="r.label"
67208
+ [attr.aria-pressed]="r.active"
67209
+ (click)="onReact(r.token)"
67210
+ >
67211
+ <span class="emoji">{{ r.emoji }}</span>
67212
+ @if (props.showCounts && r.count > 0) {
67213
+ <span class="count">{{ r.count }}</span>
67214
+ }
67215
+ </button>
67216
+ }
67217
+ @if (props.layout === 'picker' && !pickerOpen()) {
67218
+ <button
67219
+ type="button"
67220
+ class="reaction-btn reaction-btn--add"
67221
+ [disabled]="props.readonly"
67222
+ [attr.aria-label]="t('addReaction')"
67223
+ (click)="togglePicker()"
67224
+ >
67225
+ <span class="emoji">+</span>
67226
+ </button>
67227
+ }
67228
+ @if (props.layout === 'picker' && pickerOpen()) {
67229
+ <div class="picker-popover" role="dialog" [attr.aria-label]="t('addReaction')">
67230
+ @for (r of enrichedReactions(); track r.token) {
67231
+ <button
67232
+ type="button"
67233
+ class="reaction-btn"
67234
+ [class.active]="r.active"
67235
+ [attr.aria-label]="r.label"
67236
+ [attr.aria-pressed]="r.active"
67237
+ (click)="onReactAndClosePicker(r.token)"
67238
+ >
67239
+ <span class="emoji">{{ r.emoji }}</span>
67240
+ @if (props.showCounts && r.count > 0) {
67241
+ <span class="count">{{ r.count }}</span>
67242
+ }
67243
+ </button>
67244
+ }
67245
+ <button
67246
+ type="button"
67247
+ class="reaction-btn reaction-btn--close"
67248
+ [attr.aria-label]="t('close')"
67249
+ (click)="togglePicker()"
67250
+ >
67251
+ <span class="emoji">x</span>
67252
+ </button>
67253
+ </div>
67254
+ }
67255
+ }
67256
+ </div>
67257
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.reaction-bar{display:flex;flex-wrap:wrap;gap:4px;align-items:center;position:relative}.reaction-btn{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;border-radius:16px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));cursor:pointer;transition:all .15s ease;font-size:1rem;font-family:inherit;line-height:1}.reaction-btn:hover:not(:disabled){background:var(--ion-color-light, #f4f5f8)}.reaction-btn.active{background:var(--ion-color-primary-tint, rgba(76, 141, 255, .1));border-color:var(--ion-color-primary, #3880ff)}.reaction-btn:disabled{opacity:.6;cursor:default}.reaction-btn--add{border-style:dashed}.reaction-btn--close{border-color:var(--ion-color-medium, #92949c)}.emoji{font-size:1.1em;line-height:1}.count{font-size:.75rem;font-weight:600;color:var(--ion-color-medium, #92949c)}.active .count{color:var(--ion-color-primary, #3880ff)}.reaction-skeleton{display:flex;gap:4px;align-items:center}.skeleton-circle{display:inline-block;width:36px;height:28px;border-radius:16px;background:var(--ion-color-light, #f4f5f8);animation:skeleton-pulse 1.4s ease-in-out infinite}.skeleton-circle:nth-child(2){animation-delay:.2s}.skeleton-circle:nth-child(3){animation-delay:.4s}@keyframes skeleton-pulse{0%,to{opacity:1}50%{opacity:.4}}.picker-popover{display:flex;flex-wrap:wrap;gap:4px;align-items:center;padding:6px 8px;border-radius:20px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));box-shadow:0 4px 12px #0000001f;position:absolute;bottom:calc(100% + 8px);left:0;z-index:100}:host(.sm) .reaction-btn{padding:2px 6px;font-size:.875rem}:host(.lg) .reaction-btn{padding:6px 12px;font-size:1.2rem}\n"] }]
67258
+ }], ctorParameters: () => [], propDecorators: { props: [{
67259
+ type: Input
67260
+ }], reactionChange: [{
67261
+ type: Output
67262
+ }] } });
67263
+
66877
67264
  const DEFAULT_SPLASH_SCREEN_CONFIG = {
66878
67265
  fadeOutDuration: 300,
66879
67266
  };
@@ -71295,5 +71682,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
71295
71682
  * Generated bundle index. Do not edit.
71296
71683
  */
71297
71684
 
71298
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CookieSettingsComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, 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_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_POST_UPDATE_GRACE_MS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HapticsService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, HtmlViewerModalComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadMoreComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OptionCardsComponent, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PdfService, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, 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_CONTENT_CONFIG, 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_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VERSION, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, button, canSubmitRequestType, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, query, rbacGuard, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, selectableRequestTypes, storagePaths, superAdminGuard, toArticle };
71685
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CookieSettingsComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, 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_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_POST_UPDATE_GRACE_MS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HapticsService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, HtmlViewerModalComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadMoreComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OptionCardsComponent, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, ReactionBarComponent, ReactionsService, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, 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_CONTENT_CONFIG, 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_REACTIONS_CONFIG, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VERSION, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, button, canSubmitRequestType, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechReactions, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, query, rbacGuard, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, selectableRequestTypes, storagePaths, superAdminGuard, toArticle };
71299
71686
  //# sourceMappingURL=valtech-components.mjs.map