valtech-components 4.0.47 → 4.0.48

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.
@@ -56,7 +56,7 @@ import { BrowserMultiFormatReader } from '@zxing/browser';
56
56
  * Current version of valtech-components.
57
57
  * This is automatically updated during the publish process.
58
58
  */
59
- const VERSION = '4.0.47';
59
+ const VERSION = '4.0.48';
60
60
 
61
61
  // Control de estado de refresco (singleton a nivel de módulo)
62
62
  let isRefreshing = false;
@@ -2349,8 +2349,7 @@ class AuthStorageService {
2349
2349
  return;
2350
2350
  try {
2351
2351
  localStorage.setItem(this.keys.ACCESS_TOKEN, state.accessToken);
2352
- // H-05: el refresh token NO se persiste en localStorage — vive en una
2353
- // cookie HttpOnly que el backend emite. Así un XSS no puede exfiltrarlo.
2352
+ localStorage.setItem(this.keys.REFRESH_TOKEN, state.refreshToken);
2354
2353
  localStorage.setItem(this.keys.ROLES, JSON.stringify(state.roles));
2355
2354
  localStorage.setItem(this.keys.PERMISSIONS, JSON.stringify(state.permissions));
2356
2355
  localStorage.setItem(this.keys.IS_SUPER_ADMIN, String(state.isSuperAdmin));
@@ -2408,10 +2407,15 @@ class AuthStorageService {
2408
2407
  /**
2409
2408
  * Guarda el refresh token (token rotation).
2410
2409
  */
2411
- saveRefreshToken(_token) {
2412
- // H-05: no-op. El refresh token ya no se persiste en localStorage; lo
2413
- // transporta una cookie HttpOnly emitida por el backend. Se mantiene el
2414
- // método para no romper llamadores existentes durante la transición.
2410
+ saveRefreshToken(token) {
2411
+ if (!this.isBrowser)
2412
+ return;
2413
+ try {
2414
+ localStorage.setItem(this.keys.REFRESH_TOKEN, token);
2415
+ }
2416
+ catch (e) {
2417
+ console.warn('[ValtechAuth] Error guardando refresh token:', e);
2418
+ }
2415
2419
  }
2416
2420
  /**
2417
2421
  * Guarda los permisos actualizados.
@@ -6752,20 +6756,24 @@ class OAuthService {
6752
6756
  /**
6753
6757
  * Verifica que el callback traiga el nonce del flujo actual (M-07).
6754
6758
  *
6755
- * Estricto: si el opener generó un nonce (siempre, en clientes nuevos) exige
6756
- * que el callback lo traiga y coincida. Un payload forjado en localStorage por
6757
- * XSS no conoce el nonce (vive solo en memoria) se rechaza.
6758
- *
6759
- * ⚠️ Requiere que el backend ya eche `client_nonce` en el callback. Deploy:
6760
- * backend ANTES que el frontend, si no este check rechaza callbacks legítimos
6761
- * (sin nonce) durante la ventana de transición.
6759
+ * Tolerante a la transición: solo se EXIGE coincidencia cuando el callback
6760
+ * trae un nonce. Si no lo trae (backend aún sin M-07 desplegado, p.ej. dev), no
6761
+ * se bloquea el login. Cuando el backend echa `client_nonce` en todos lados, un
6762
+ * callback forjado con un nonce distinto sí se rechaza. Un payload forjado por
6763
+ * XSS que OMITA el nonce no se frena por acá, pero igual pasa por las
6764
+ * validaciones de tipo/forma de `checkLocalStorageFallback`.
6762
6765
  */
6763
6766
  isNonceValid(data) {
6767
+ // No hay flujo con nonce activo (legacy / link flow) → no bloquear.
6764
6768
  if (!this.expectedNonce) {
6765
- // No hay flujo con nonce activo (caso legacy / link flow) → no bloquear.
6766
6769
  return true;
6767
6770
  }
6768
- return data?.nonce === this.expectedNonce;
6771
+ // El callback no trae nonce (backend sin M-07) → no bloquear (transición).
6772
+ if (!data?.nonce) {
6773
+ return true;
6774
+ }
6775
+ // Nonce presente → debe coincidir con el del flujo.
6776
+ return data.nonce === this.expectedNonce;
6769
6777
  }
6770
6778
  /**
6771
6779
  * Valida la forma del payload del callback (M-07): debe ser un error o tokens
@@ -8193,12 +8201,8 @@ class AuthService {
8193
8201
  this.setupFirestoreRBACSync(claims.uid);
8194
8202
  }
8195
8203
  }
8196
- else if (storedState.accessToken) {
8197
- // 4. Token de acceso expirado. El refresh token vive en la cookie
8198
- // HttpOnly (H-05), no en storage — así que el disparador ya no es
8199
- // "hay refresh en storage" sino "había un access token" (sesión
8200
- // previa). El /refresh de fondo usa la cookie; si no es válida, falla
8201
- // y caemos a signOut (catch más abajo).
8204
+ else if (storedState.refreshToken) {
8205
+ // 4. Token expirado pero hay refresh token en storage.
8202
8206
  //
8203
8207
  // NO bloqueamos el bootstrap esperando la red: un /refresh en una
8204
8208
  // Lambda fría son 2-5s de pantalla en blanco (Angular no renderiza
@@ -8458,21 +8462,28 @@ class AuthService {
8458
8462
  * que el cliente debe guardar para el próximo refresh.
8459
8463
  */
8460
8464
  refreshAccessToken() {
8461
- // H-05: el refresh token vive en una cookie HttpOnly (no en storage). El
8462
- // gate ya NO exige tenerlo en memoria la cookie lo aporta. Durante la
8463
- // transición, si todavía hay un refresh en estado (sesión vieja), se manda
8464
- // en el body (el backend prioriza body sobre cookie). withCredentials hace
8465
- // que el browser envíe la cookie en la request cross-site.
8465
+ // Transición H-05: se envía el refresh token en el body (compat con el
8466
+ // backend actual, que lo exige) y se persiste el rotado. `withCredentials`
8467
+ // adjunta además la cookie HttpOnly cuando el backend ya soporta H-05 (que
8468
+ // prioriza el body). El paso "cookie-only" (dejar de guardar el refresh en
8469
+ // localStorage) se hace DESPUÉS de desplegar el backend con H-05 — hacerlo
8470
+ // antes rompe el /refresh contra el backend viejo (400 RefreshToken required).
8466
8471
  const refreshToken = this.state().refreshToken;
8467
- const body = refreshToken ? { refreshToken } : {};
8472
+ if (!refreshToken) {
8473
+ return throwError(() => ({
8474
+ code: 'NO_REFRESH_TOKEN',
8475
+ message: 'No hay token de refresco',
8476
+ }));
8477
+ }
8468
8478
  return this.http
8469
- .post(`${this.baseUrl}/refresh`, body, { withCredentials: true })
8479
+ .post(`${this.baseUrl}/refresh`, { refreshToken }, { withCredentials: true })
8470
8480
  .pipe(tap(response => {
8471
8481
  const expiresAt = Date.now() + response.expiresIn * 1000;
8472
- // Token rotation: el access token se guarda; el refresh rotado viaja en
8473
- // la cookie HttpOnly (NO se persiste en localStorage — H-05).
8482
+ // Token rotation: se guarda el access token Y el refresh rotado.
8474
8483
  this.stateService.updateAccessToken(response.accessToken, response.expiresIn);
8484
+ this.stateService.updateRefreshToken(response.refreshToken);
8475
8485
  this.storageService.saveAccessToken(response.accessToken, expiresAt);
8486
+ this.storageService.saveRefreshToken(response.refreshToken);
8476
8487
  if (this.config?.enableFirebaseIntegration && response.firebaseToken) {
8477
8488
  this.signInWithFirebase(response.firebaseToken);
8478
8489
  }
@@ -8548,16 +8559,15 @@ class AuthService {
8548
8559
  const refreshToken = this.state().refreshToken;
8549
8560
  // Eliminar dispositivo del backend antes de cerrar sesión
8550
8561
  await this.unregisterDevice();
8551
- // Notificar al backend (fire and forget). El refresh token va por la cookie
8552
- // HttpOnly (H-05); si aún hay uno en estado (sesión vieja) se manda en el
8553
- // body. El backend revoca la sesión y expira la cookie. withCredentials
8554
- // envía la cookie cross-site.
8555
- this.http
8556
- .post(`${this.baseUrl}/logout`, refreshToken ? { refreshToken } : {}, {
8557
- withCredentials: true,
8558
- })
8559
- .pipe(catchError(() => of(null)))
8560
- .subscribe();
8562
+ // Notificar al backend (fire and forget). Se manda el refresh token en el
8563
+ // body (compat con el backend actual); withCredentials adjunta la cookie
8564
+ // cuando el backend ya soporta H-05 (revoca + expira la cookie).
8565
+ if (refreshToken) {
8566
+ this.http
8567
+ .post(`${this.baseUrl}/logout`, { refreshToken }, { withCredentials: true })
8568
+ .pipe(catchError(() => of(null)))
8569
+ .subscribe();
8570
+ }
8561
8571
  // Cerrar sesión de Firebase si está integrado
8562
8572
  this.signOutFirebase();
8563
8573
  this.clearState();
@@ -9897,6 +9907,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9897
9907
  type: Output
9898
9908
  }] } });
9899
9909
 
9910
+ /**
9911
+ * `val-splash` — splash a pantalla completa reutilizable, idéntico al de arranque
9912
+ * de la app (`.app-splash` del `index.html`): logo centrado con pulse, fondo
9913
+ * claro/oscuro vía `prefers-color-scheme`. Para cargas fundamentales dentro de la
9914
+ * app (p.ej. el callback OAuth) que deben verse iguales al arranque, en vez de
9915
+ * un segundo loader casi-duplicado.
9916
+ *
9917
+ * El logo apunta por defecto a `assets/images/main-{light,dark}.svg` — los mismos
9918
+ * assets de la app consumer que usa el splash de `index.html` — y resuelven en
9919
+ * runtime contra la app. Override por inputs si hace falta. Fondo overridable con
9920
+ * las CSS vars `--val-splash-bg` / `--val-splash-bg-dark`.
9921
+ */
9922
+ class SplashComponent {
9923
+ constructor() {
9924
+ /** Logo para tema claro. Default = asset de la app (igual que index.html). */
9925
+ this.logoLight = input('assets/images/main-light.svg');
9926
+ /** Logo para tema oscuro (vía prefers-color-scheme). */
9927
+ this.logoDark = input('assets/images/main-dark.svg');
9928
+ /** Texto alternativo del logo. */
9929
+ this.alt = input('Valtech');
9930
+ }
9931
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SplashComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9932
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: SplashComponent, isStandalone: true, selector: "val-splash", inputs: { logoLight: { classPropertyName: "logoLight", publicName: "logoLight", isSignal: true, isRequired: false, transformFunction: null }, logoDark: { classPropertyName: "logoDark", publicName: "logoDark", isSignal: true, isRequired: false, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
9933
+ <div class="val-splash">
9934
+ <picture>
9935
+ <source media="(prefers-color-scheme: dark)" [srcset]="logoDark()" />
9936
+ <img class="val-splash__logo" [src]="logoLight()" [alt]="alt()" />
9937
+ </picture>
9938
+ </div>
9939
+ `, isInline: true, styles: [".val-splash{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:var(--val-splash-bg, #fbfbfb);z-index:9999;animation:val-splash-in .25s ease}.val-splash__logo{width:180px;max-width:50vw;animation:val-splash-pulse 1.8s ease-in-out infinite}@keyframes val-splash-in{0%{opacity:0}to{opacity:1}}@keyframes val-splash-pulse{0%,to{opacity:1}50%{opacity:.55}}@media (prefers-color-scheme: dark){.val-splash{background:var(--val-splash-bg-dark, #0e0420)}}\n"] }); }
9940
+ }
9941
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SplashComponent, decorators: [{
9942
+ type: Component,
9943
+ args: [{ selector: 'val-splash', standalone: true, template: `
9944
+ <div class="val-splash">
9945
+ <picture>
9946
+ <source media="(prefers-color-scheme: dark)" [srcset]="logoDark()" />
9947
+ <img class="val-splash__logo" [src]="logoLight()" [alt]="alt()" />
9948
+ </picture>
9949
+ </div>
9950
+ `, styles: [".val-splash{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:var(--val-splash-bg, #fbfbfb);z-index:9999;animation:val-splash-in .25s ease}.val-splash__logo{width:180px;max-width:50vw;animation:val-splash-pulse 1.8s ease-in-out infinite}@keyframes val-splash-in{0%{opacity:0}to{opacity:1}}@keyframes val-splash-pulse{0%,to{opacity:1}50%{opacity:.55}}@media (prefers-color-scheme: dark){.val-splash{background:var(--val-splash-bg-dark, #0e0420)}}\n"] }]
9951
+ }] });
9952
+
9900
9953
  const POSITION_MAP = {
9901
9954
  'top-left': '0% 0%',
9902
9955
  top: '50% 0%',
@@ -32981,7 +33034,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
32981
33034
  * `/auth/oauth/callback?error=INVALID_CODE&error_description=...`
32982
33035
  */
32983
33036
  class OAuthCallbackComponent {
32984
- constructor() {
33037
+ constructor(router, authService, config) {
33038
+ this.router = router;
33039
+ this.authService = authService;
33040
+ this.config = config;
32985
33041
  this.message = 'Procesando autenticación...';
32986
33042
  /**
32987
33043
  * Nonce que el opener generó y pasó por el flujo (round-trip backend). Se
@@ -32993,6 +33049,36 @@ class OAuthCallbackComponent {
32993
33049
  ngOnInit() {
32994
33050
  this.processCallback();
32995
33051
  }
33052
+ /**
33053
+ * Indica si este callback corre como la VENTANA PRINCIPAL (flujo redirect),
33054
+ * no como popup. El popup se abre con window.name 'oauth'/'oauth-link'
33055
+ * (OAuthService), nombre que persiste aunque COOP anule window.opener tras el
33056
+ * bounce cross-origin. En la ventana principal nadie consume el localStorage,
33057
+ * así que el callback debe instalar la sesión y navegar él mismo.
33058
+ */
33059
+ isMainWindow() {
33060
+ if (window.name === 'oauth' || window.name === 'oauth-link')
33061
+ return false;
33062
+ return !window.opener && window.parent === window;
33063
+ }
33064
+ /**
33065
+ * Completa el login en la ventana principal: instala la sesión desde los
33066
+ * tokens del callback y navega al home.
33067
+ */
33068
+ completeInMainWindow(result) {
33069
+ if (!this.authService)
33070
+ return false;
33071
+ this.authService.setExternalAuth({
33072
+ accessToken: result.accessToken,
33073
+ refreshToken: result.refreshToken,
33074
+ firebaseToken: result.firebaseToken,
33075
+ expiresIn: result.expiresIn,
33076
+ roles: result.roles,
33077
+ permissions: result.permissions,
33078
+ });
33079
+ this.router.navigateByUrl(this.config?.homeRoute || '/', { replaceUrl: true });
33080
+ return true;
33081
+ }
32996
33082
  processCallback() {
32997
33083
  const params = new URLSearchParams(window.location.search);
32998
33084
  this.clientNonce = params.get('client_nonce');
@@ -33090,6 +33176,11 @@ class OAuthCallbackComponent {
33090
33176
  type: 'oauth-callback',
33091
33177
  tokens: result,
33092
33178
  });
33179
+ // Flujo redirect (ventana principal, sin opener que consuma el localStorage):
33180
+ // instalar la sesión acá mismo y navegar al home, en vez de quedar pegado.
33181
+ if (this.isMainWindow() && this.completeInMainWindow(result)) {
33182
+ return;
33183
+ }
33093
33184
  this.message = 'Autenticación exitosa';
33094
33185
  this.closeAfterDelay();
33095
33186
  }
@@ -33135,23 +33226,27 @@ class OAuthCallbackComponent {
33135
33226
  }
33136
33227
  }, 500);
33137
33228
  }
33138
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OAuthCallbackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33139
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: OAuthCallbackComponent, isStandalone: true, selector: "val-oauth-callback", ngImport: i0, template: `
33140
- <div class="oauth-callback">
33141
- <div class="oauth-callback__spinner"></div>
33142
- <p class="oauth-callback__text">{{ message }}</p>
33143
- </div>
33144
- `, isInline: true, styles: [".oauth-callback{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.oauth-callback__spinner{width:40px;height:40px;border:3px solid #f3f3f3;border-top:3px solid #3498db;border-radius:50%;animation:spin 1s linear infinite;margin-bottom:16px}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.oauth-callback__text{color:#666;font-size:14px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
33229
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OAuthCallbackComponent, deps: [{ token: i1$4.Router }, { token: AuthService, optional: true }, { token: VALTECH_AUTH_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
33230
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: OAuthCallbackComponent, isStandalone: true, selector: "val-oauth-callback", ngImport: i0, template: `<val-splash />`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SplashComponent, selector: "val-splash", inputs: ["logoLight", "logoDark", "alt"] }] }); }
33145
33231
  }
33146
33232
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OAuthCallbackComponent, decorators: [{
33147
33233
  type: Component,
33148
- args: [{ selector: 'val-oauth-callback', standalone: true, imports: [CommonModule], template: `
33149
- <div class="oauth-callback">
33150
- <div class="oauth-callback__spinner"></div>
33151
- <p class="oauth-callback__text">{{ message }}</p>
33152
- </div>
33153
- `, styles: [".oauth-callback{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.oauth-callback__spinner{width:40px;height:40px;border:3px solid #f3f3f3;border-top:3px solid #3498db;border-radius:50%;animation:spin 1s linear infinite;margin-bottom:16px}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.oauth-callback__text{color:#666;font-size:14px}\n"] }]
33154
- }] });
33234
+ args: [{
33235
+ selector: 'val-oauth-callback',
33236
+ standalone: true,
33237
+ imports: [CommonModule, SplashComponent],
33238
+ // Mismo splash de arranque de la app (logo + pulse) en vez de un loader propio
33239
+ // casi-duplicado: el callback OAuth es una carga fundamental y debe verse igual.
33240
+ template: `<val-splash />`,
33241
+ }]
33242
+ }], ctorParameters: () => [{ type: i1$4.Router }, { type: AuthService, decorators: [{
33243
+ type: Optional
33244
+ }] }, { type: undefined, decorators: [{
33245
+ type: Optional
33246
+ }, {
33247
+ type: Inject,
33248
+ args: [VALTECH_AUTH_CONFIG]
33249
+ }] }] });
33155
33250
 
33156
33251
  /**
33157
33252
  * Name of the query param that carries the handoff token. Apps may override
@@ -67985,5 +68080,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
67985
68080
  * Generated bundle index. Do not edit.
67986
68081
  */
67987
68082
 
67988
- 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, 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_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, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, 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, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, 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, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, 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, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, 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, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketCardComponent, 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, 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, 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, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, selectableRequestTypes, storagePaths, superAdminGuard, toArticle };
68083
+ 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, 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_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, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, 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, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, 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, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, 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, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, 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, 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, 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, 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, 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, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, selectableRequestTypes, storagePaths, superAdminGuard, toArticle };
67989
68084
  //# sourceMappingURL=valtech-components.mjs.map