valtech-components 4.0.43 → 4.0.45

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 (30) hide show
  1. package/esm2022/lib/components/organisms/account-view/account-view.component.mjs +3 -3
  2. package/esm2022/lib/components/organisms/auth-cta/auth-cta.component.mjs +23 -7
  3. package/esm2022/lib/components/organisms/auth-cta/types.mjs +1 -1
  4. package/esm2022/lib/components/organisms/change-email-modal/change-email-modal.component.mjs +3 -3
  5. package/esm2022/lib/components/organisms/change-password-modal/change-password-modal.component.mjs +3 -3
  6. package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.component.mjs +3 -3
  7. package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +3 -3
  8. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.component.mjs +30 -6
  9. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.i18n.mjs +3 -1
  10. package/esm2022/lib/services/auth/auth.service.mjs +26 -28
  11. package/esm2022/lib/services/auth/oauth-callback.component.mjs +17 -63
  12. package/esm2022/lib/services/auth/oauth.service.mjs +10 -14
  13. package/esm2022/lib/services/auth/storage.service.mjs +7 -11
  14. package/esm2022/lib/services/firebase/config.mjs +5 -5
  15. package/esm2022/lib/services/theme.service.mjs +1 -3
  16. package/esm2022/lib/version.mjs +2 -2
  17. package/esm2022/public-api.mjs +1 -2
  18. package/fesm2022/valtech-components.mjs +122 -177
  19. package/fesm2022/valtech-components.mjs.map +1 -1
  20. package/lib/components/organisms/auth-cta/types.d.ts +5 -1
  21. package/lib/components/organisms/switch-org-modal/switch-org-modal.component.d.ts +4 -1
  22. package/lib/services/auth/oauth-callback.component.d.ts +1 -21
  23. package/lib/services/auth/oauth.service.d.ts +7 -6
  24. package/lib/services/auth/storage.service.d.ts +1 -1
  25. package/lib/version.d.ts +1 -1
  26. package/package.json +1 -1
  27. package/public-api.d.ts +0 -1
  28. package/src/lib/services/firebase/firebase-messaging-sw.js +145 -0
  29. package/esm2022/lib/components/atoms/splash/splash.component.mjs +0 -45
  30. package/lib/components/atoms/splash/splash.component.d.ts +0 -23
@@ -5,7 +5,7 @@ import { catchError, switchMap, finalize, filter, take, map as map$1, tap, disti
5
5
  import * as i1$3 from '@angular/common/http';
6
6
  import { provideHttpClient, withInterceptors, HttpClient, HttpErrorResponse } from '@angular/common/http';
7
7
  import * as i1$1 from '@angular/fire/firestore';
8
- import { provideFirestore, getFirestore, connectFirestoreEmulator, enableIndexedDbPersistence, 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';
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';
10
10
  import { isPlatformBrowser, CommonModule, NgStyle, NgFor, DOCUMENT, NgClass, TitleCasePipe } from '@angular/common';
11
11
  import { provideAnalytics, getAnalytics, Analytics, logEvent, setUserId, setUserProperties } from '@angular/fire/analytics';
@@ -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.43';
59
+ const VERSION = '4.0.45';
60
60
 
61
61
  // Control de estado de refresco (singleton a nivel de módulo)
62
62
  let isRefreshing = false;
@@ -668,9 +668,9 @@ function provideValtechFirebase(config) {
668
668
  connectFirestoreEmulator(firestore, config.emulator.firestore.host, config.emulator.firestore.port);
669
669
  }
670
670
  // Habilitar persistencia offline si está configurada (browser-only:
671
- // enableIndexedDbPersistence requiere IndexedDB, no existe en Node).
671
+ // enableMultiTabIndexedDbPersistence requiere IndexedDB, no existe en Node).
672
672
  if (config.persistence && isBrowser) {
673
- enableIndexedDbPersistence(firestore).catch((err) => {
673
+ enableMultiTabIndexedDbPersistence(firestore).catch(err => {
674
674
  if (err.code === 'failed-precondition') {
675
675
  console.warn('[ValtechFirebase] Persistencia no disponible: múltiples pestañas abiertas');
676
676
  }
@@ -2349,7 +2349,8 @@ class AuthStorageService {
2349
2349
  return;
2350
2350
  try {
2351
2351
  localStorage.setItem(this.keys.ACCESS_TOKEN, state.accessToken);
2352
- localStorage.setItem(this.keys.REFRESH_TOKEN, state.refreshToken);
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.
2353
2354
  localStorage.setItem(this.keys.ROLES, JSON.stringify(state.roles));
2354
2355
  localStorage.setItem(this.keys.PERMISSIONS, JSON.stringify(state.permissions));
2355
2356
  localStorage.setItem(this.keys.IS_SUPER_ADMIN, String(state.isSuperAdmin));
@@ -2407,15 +2408,10 @@ class AuthStorageService {
2407
2408
  /**
2408
2409
  * Guarda el refresh token (token rotation).
2409
2410
  */
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
- }
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.
2419
2415
  }
2420
2416
  /**
2421
2417
  * Guarda los permisos actualizados.
@@ -6756,24 +6752,20 @@ class OAuthService {
6756
6752
  /**
6757
6753
  * Verifica que el callback traiga el nonce del flujo actual (M-07).
6758
6754
  *
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`.
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.
6765
6762
  */
6766
6763
  isNonceValid(data) {
6767
- // No hay flujo con nonce activo (legacy / link flow) → no bloquear.
6768
6764
  if (!this.expectedNonce) {
6765
+ // No hay flujo con nonce activo (caso legacy / link flow) → no bloquear.
6769
6766
  return true;
6770
6767
  }
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;
6768
+ return data?.nonce === this.expectedNonce;
6777
6769
  }
6778
6770
  /**
6779
6771
  * Valida la forma del payload del callback (M-07): debe ser un error o tokens
@@ -8201,8 +8193,12 @@ class AuthService {
8201
8193
  this.setupFirestoreRBACSync(claims.uid);
8202
8194
  }
8203
8195
  }
8204
- else if (storedState.refreshToken) {
8205
- // 4. Token expirado pero hay refresh token en storage.
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).
8206
8202
  //
8207
8203
  // NO bloqueamos el bootstrap esperando la red: un /refresh en una
8208
8204
  // Lambda fría son 2-5s de pantalla en blanco (Angular no renderiza
@@ -8462,28 +8458,21 @@ class AuthService {
8462
8458
  * que el cliente debe guardar para el próximo refresh.
8463
8459
  */
8464
8460
  refreshAccessToken() {
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).
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.
8471
8466
  const refreshToken = this.state().refreshToken;
8472
- if (!refreshToken) {
8473
- return throwError(() => ({
8474
- code: 'NO_REFRESH_TOKEN',
8475
- message: 'No hay token de refresco',
8476
- }));
8477
- }
8467
+ const body = refreshToken ? { refreshToken } : {};
8478
8468
  return this.http
8479
- .post(`${this.baseUrl}/refresh`, { refreshToken }, { withCredentials: true })
8469
+ .post(`${this.baseUrl}/refresh`, body, { withCredentials: true })
8480
8470
  .pipe(tap(response => {
8481
8471
  const expiresAt = Date.now() + response.expiresIn * 1000;
8482
- // Token rotation: se guarda el access token Y el refresh rotado.
8472
+ // Token rotation: el access token se guarda; el refresh rotado viaja en
8473
+ // la cookie HttpOnly (NO se persiste en localStorage — H-05).
8483
8474
  this.stateService.updateAccessToken(response.accessToken, response.expiresIn);
8484
- this.stateService.updateRefreshToken(response.refreshToken);
8485
8475
  this.storageService.saveAccessToken(response.accessToken, expiresAt);
8486
- this.storageService.saveRefreshToken(response.refreshToken);
8487
8476
  if (this.config?.enableFirebaseIntegration && response.firebaseToken) {
8488
8477
  this.signInWithFirebase(response.firebaseToken);
8489
8478
  }
@@ -8559,15 +8548,16 @@ class AuthService {
8559
8548
  const refreshToken = this.state().refreshToken;
8560
8549
  // Eliminar dispositivo del backend antes de cerrar sesión
8561
8550
  await this.unregisterDevice();
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
- }
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();
8571
8561
  // Cerrar sesión de Firebase si está integrado
8572
8562
  this.signOutFirebase();
8573
8563
  this.clearState();
@@ -9907,49 +9897,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9907
9897
  type: Output
9908
9898
  }] } });
9909
9899
 
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
-
9953
9900
  const POSITION_MAP = {
9954
9901
  'top-left': '0% 0%',
9955
9902
  top: '50% 0%',
@@ -17162,11 +17109,9 @@ class ThemeService {
17162
17109
  }
17163
17110
  handleAutoConfiguration() {
17164
17111
  if (this.prefersDark && this.currentOption === ThemeOption.AUTO) {
17165
- console.log('💡 ThemeConfig prefersDark::: ', this.prefersDark);
17166
17112
  this.toggleUserPreference(ThemeOption.AUTO);
17167
17113
  }
17168
17114
  if (!this.prefersDark && this.currentOption === ThemeOption.AUTO) {
17169
- console.log('💡 ThemeConfig prefersDark::: ', this.prefersDark);
17170
17115
  this.toggleUserPreference(ThemeOption.AUTO);
17171
17116
  }
17172
17117
  }
@@ -33036,10 +32981,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
33036
32981
  * `/auth/oauth/callback?error=INVALID_CODE&error_description=...`
33037
32982
  */
33038
32983
  class OAuthCallbackComponent {
33039
- constructor(router, authService, config) {
33040
- this.router = router;
33041
- this.authService = authService;
33042
- this.config = config;
32984
+ constructor() {
33043
32985
  this.message = 'Procesando autenticación...';
33044
32986
  /**
33045
32987
  * Nonce que el opener generó y pasó por el flujo (round-trip backend). Se
@@ -33051,36 +32993,6 @@ class OAuthCallbackComponent {
33051
32993
  ngOnInit() {
33052
32994
  this.processCallback();
33053
32995
  }
33054
- /**
33055
- * Indica si este callback corre como la VENTANA PRINCIPAL (flujo redirect),
33056
- * no como popup. El popup se abre con window.name 'oauth'/'oauth-link'
33057
- * (OAuthService), nombre que persiste aunque COOP anule window.opener tras el
33058
- * bounce cross-origin. En la ventana principal nadie consume el localStorage,
33059
- * así que el callback debe instalar la sesión y navegar él mismo.
33060
- */
33061
- isMainWindow() {
33062
- if (window.name === 'oauth' || window.name === 'oauth-link')
33063
- return false;
33064
- return !window.opener && window.parent === window;
33065
- }
33066
- /**
33067
- * Completa el login en la ventana principal: instala la sesión desde los
33068
- * tokens del callback y navega al home.
33069
- */
33070
- completeInMainWindow(result) {
33071
- if (!this.authService)
33072
- return false;
33073
- this.authService.setExternalAuth({
33074
- accessToken: result.accessToken,
33075
- refreshToken: result.refreshToken,
33076
- firebaseToken: result.firebaseToken,
33077
- expiresIn: result.expiresIn,
33078
- roles: result.roles,
33079
- permissions: result.permissions,
33080
- });
33081
- this.router.navigateByUrl(this.config?.homeRoute || '/', { replaceUrl: true });
33082
- return true;
33083
- }
33084
32996
  processCallback() {
33085
32997
  const params = new URLSearchParams(window.location.search);
33086
32998
  this.clientNonce = params.get('client_nonce');
@@ -33178,11 +33090,6 @@ class OAuthCallbackComponent {
33178
33090
  type: 'oauth-callback',
33179
33091
  tokens: result,
33180
33092
  });
33181
- // Flujo redirect (ventana principal, sin opener que consuma el localStorage):
33182
- // instalar la sesión acá mismo y navegar al home, en vez de quedar pegado.
33183
- if (this.isMainWindow() && this.completeInMainWindow(result)) {
33184
- return;
33185
- }
33186
33093
  this.message = 'Autenticación exitosa';
33187
33094
  this.closeAfterDelay();
33188
33095
  }
@@ -33228,27 +33135,23 @@ class OAuthCallbackComponent {
33228
33135
  }
33229
33136
  }, 500);
33230
33137
  }
33231
- 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 }); }
33232
- 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"] }] }); }
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 }] }); }
33233
33145
  }
33234
33146
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OAuthCallbackComponent, decorators: [{
33235
33147
  type: Component,
33236
- args: [{
33237
- selector: 'val-oauth-callback',
33238
- standalone: true,
33239
- imports: [CommonModule, SplashComponent],
33240
- // Mismo splash de arranque de la app (logo + pulse) en vez de un loader propio
33241
- // casi-duplicado: el callback OAuth es una carga fundamental y debe verse igual.
33242
- template: `<val-splash />`,
33243
- }]
33244
- }], ctorParameters: () => [{ type: i1$4.Router }, { type: AuthService, decorators: [{
33245
- type: Optional
33246
- }] }, { type: undefined, decorators: [{
33247
- type: Optional
33248
- }, {
33249
- type: Inject,
33250
- args: [VALTECH_AUTH_CONFIG]
33251
- }] }] });
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
+ }] });
33252
33155
 
33253
33156
  /**
33254
33157
  * Name of the query param that carries the handoff token. Apps may override
@@ -33937,11 +33840,11 @@ class ChangePasswordModalComponent {
33937
33840
  this.toast.show({ message, duration: 3500 });
33938
33841
  }
33939
33842
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChangePasswordModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33940
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChangePasswordModalComponent, isStandalone: true, selector: "val-change-password-modal", inputs: { isOpen: "isOpen" }, outputs: { changed: "changed", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (mode() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <val-form [props]=\"formProps()\" (onSubmit)=\"submitHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"], dependencies: [{ kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }] }); }
33843
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChangePasswordModalComponent, isStandalone: true, selector: "val-change-password-modal", inputs: { isOpen: "isOpen" }, outputs: { changed: "changed", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (mode() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <val-form [props]=\"formProps()\" (onSubmit)=\"submitHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"], dependencies: [{ kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }] }); }
33941
33844
  }
33942
33845
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChangePasswordModalComponent, decorators: [{
33943
33846
  type: Component,
33944
- args: [{ selector: 'val-change-password-modal', standalone: true, imports: [IonButton, IonButtons, IonContent, IonHeader, IonModal, IonSpinner, IonToolbar, FormComponent], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (mode() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <val-form [props]=\"formProps()\" (onSubmit)=\"submitHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"] }]
33847
+ args: [{ selector: 'val-change-password-modal', standalone: true, imports: [IonButton, IonButtons, IonContent, IonHeader, IonModal, IonSpinner, IonToolbar, FormComponent], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (mode() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <val-form [props]=\"formProps()\" (onSubmit)=\"submitHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"] }]
33945
33848
  }], propDecorators: { isOpen: [{
33946
33849
  type: Input
33947
33850
  }], changed: [{
@@ -34207,7 +34110,7 @@ class ChangeEmailModalComponent {
34207
34110
  this.toast.show({ message, duration: 3500 });
34208
34111
  }
34209
34112
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChangeEmailModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34210
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChangeEmailModalComponent, isStandalone: true, selector: "val-change-email-modal", inputs: { isOpen: "isOpen" }, outputs: { changed: "changed", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (_step() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else if (_step() === 'no-password') {\n <val-display [props]=\"{ content: noPasswordTitle(), size: 'small', color: 'dark' }\" />\n <val-title [props]=\"{ content: noPasswordHint(), size: 'large', color: 'dark', bold: false }\" />\n <ion-button expand=\"block\" fill=\"solid\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n } @else if (_step() === 'step1') {\n <val-form [props]=\"step1Props()\" (onSubmit)=\"handleStep1($event)\" />\n } @else if (_step() === 'step2') {\n <val-form [props]=\"step2Props()\" (onSubmit)=\"handleStep2($event)\" />\n } @else if (_step() === 'step3') {\n <val-form [props]=\"step3Props()\" (onSubmit)=\"handleStep3($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"], dependencies: [{ kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
34113
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChangeEmailModalComponent, isStandalone: true, selector: "val-change-email-modal", inputs: { isOpen: "isOpen" }, outputs: { changed: "changed", dismissed: "dismissed" }, ngImport: i0, template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (_step() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else if (_step() === 'no-password') {\n <val-display [props]=\"{ content: noPasswordTitle(), size: 'small', color: 'dark' }\" />\n <val-title [props]=\"{ content: noPasswordHint(), size: 'large', color: 'dark', bold: false }\" />\n <ion-button expand=\"block\" fill=\"solid\" color=\"dark\" shape=\"round\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n } @else if (_step() === 'step1') {\n <val-form [props]=\"step1Props()\" (onSubmit)=\"handleStep1($event)\" />\n } @else if (_step() === 'step2') {\n <val-form [props]=\"step2Props()\" (onSubmit)=\"handleStep2($event)\" />\n } @else if (_step() === 'step3') {\n <val-form [props]=\"step3Props()\" (onSubmit)=\"handleStep3($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"], dependencies: [{ kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
34211
34114
  }
34212
34115
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChangeEmailModalComponent, decorators: [{
34213
34116
  type: Component,
@@ -34223,7 +34126,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
34223
34126
  DisplayComponent,
34224
34127
  TextComponent,
34225
34128
  TitleComponent,
34226
- ], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (_step() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else if (_step() === 'no-password') {\n <val-display [props]=\"{ content: noPasswordTitle(), size: 'small', color: 'dark' }\" />\n <val-title [props]=\"{ content: noPasswordHint(), size: 'large', color: 'dark', bold: false }\" />\n <ion-button expand=\"block\" fill=\"solid\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n } @else if (_step() === 'step1') {\n <val-form [props]=\"step1Props()\" (onSubmit)=\"handleStep1($event)\" />\n } @else if (_step() === 'step2') {\n <val-form [props]=\"step2Props()\" (onSubmit)=\"handleStep2($event)\" />\n } @else if (_step() === 'step3') {\n <val-form [props]=\"step3Props()\" (onSubmit)=\"handleStep3($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"] }]
34129
+ ], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\" cssClass=\"val-modal-adaptive\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (_step() === 'loading') {\n <div class=\"modal-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else if (_step() === 'no-password') {\n <val-display [props]=\"{ content: noPasswordTitle(), size: 'small', color: 'dark' }\" />\n <val-title [props]=\"{ content: noPasswordHint(), size: 'large', color: 'dark', bold: false }\" />\n <ion-button expand=\"block\" fill=\"solid\" color=\"dark\" shape=\"round\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n } @else if (_step() === 'step1') {\n <val-form [props]=\"step1Props()\" (onSubmit)=\"handleStep1($event)\" />\n } @else if (_step() === 'step2') {\n <val-form [props]=\"step2Props()\" (onSubmit)=\"handleStep2($event)\" />\n } @else if (_step() === 'step3') {\n <val-form [props]=\"step3Props()\" (onSubmit)=\"handleStep3($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;padding-top:8px}.modal-loading{display:flex;justify-content:center;padding:40px 0}\n"] }]
34227
34130
  }], propDecorators: { isOpen: [{
34228
34131
  type: Input
34229
34132
  }], changed: [{
@@ -47564,7 +47467,7 @@ class DeleteAccountModalComponent {
47564
47467
  </ion-content>
47565
47468
  </ng-template>
47566
47469
  </ion-modal>
47567
- `, isInline: true, styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.resend-row{display:flex;justify-content:center;margin-top:-8px}.spinner-center{display:flex;justify-content:center;padding-top:32px}\n"], dependencies: [{ kind: "component", type: IonModal, selector: "ion-modal" }, { 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: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }] }); }
47470
+ `, isInline: true, styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;padding-top:8px}.resend-row{display:flex;justify-content:center;margin-top:-8px}.spinner-center{display:flex;justify-content:center;padding-top:32px}\n"], dependencies: [{ kind: "component", type: IonModal, selector: "ion-modal" }, { 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: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }] }); }
47568
47471
  }
47569
47472
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DeleteAccountModalComponent, decorators: [{
47570
47473
  type: Component,
@@ -47609,7 +47512,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
47609
47512
  </ion-content>
47610
47513
  </ng-template>
47611
47514
  </ion-modal>
47612
- `, styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.resend-row{display:flex;justify-content:center;margin-top:-8px}.spinner-center{display:flex;justify-content:center;padding-top:32px}\n"] }]
47515
+ `, styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;padding-top:8px}.resend-row{display:flex;justify-content:center;margin-top:-8px}.spinner-center{display:flex;justify-content:center;padding-top:32px}\n"] }]
47613
47516
  }], ctorParameters: () => [], propDecorators: { i18nNamespace: [{
47614
47517
  type: Input
47615
47518
  }], isOpen: [{
@@ -47863,6 +47766,7 @@ const SWITCH_ORG_MODAL_I18N = {
47863
47766
  close: 'Cerrar',
47864
47767
  switchError: 'No se pudo cambiar de organización.',
47865
47768
  profile: 'Mi perfil',
47769
+ newOrg: 'Nueva organización',
47866
47770
  },
47867
47771
  en: {
47868
47772
  title: 'Switch account',
@@ -47873,11 +47777,12 @@ const SWITCH_ORG_MODAL_I18N = {
47873
47777
  close: 'Close',
47874
47778
  switchError: 'Could not switch organization.',
47875
47779
  profile: 'My profile',
47780
+ newOrg: 'New organization',
47876
47781
  },
47877
47782
  };
47878
47783
 
47879
47784
  const DEFAULT_NAMESPACE$e = 'Settings.SwitchOrg';
47880
- addIcons({ businessOutline, checkmarkCircleOutline });
47785
+ addIcons({ addOutline, businessOutline, checkmarkCircleOutline });
47881
47786
  /**
47882
47787
  * `val-switch-org-modal` — modal de cambio de organización activa (organism
47883
47788
  * compartido). Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por
@@ -47976,6 +47881,10 @@ class SwitchOrgModalComponent {
47976
47881
  this.dismiss();
47977
47882
  this.onProfileClick?.();
47978
47883
  }
47884
+ onCreateNew() {
47885
+ this.dismiss();
47886
+ this.onCreateOrg?.();
47887
+ }
47979
47888
  dismiss() {
47980
47889
  this._modalRef?.dismiss(null, 'cancel');
47981
47890
  }
@@ -47983,7 +47892,7 @@ class SwitchOrgModalComponent {
47983
47892
  return this.i18n.t(key, this.i18nNamespace);
47984
47893
  }
47985
47894
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SwitchOrgModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
47986
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SwitchOrgModalComponent, isStandalone: true, selector: "val-switch-org-modal", inputs: { _modalRef: "_modalRef", onSuccess: "onSuccess", onProfileClick: "onProfileClick", i18nNamespace: "i18nNamespace" }, ngImport: i0, template: `
47895
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SwitchOrgModalComponent, isStandalone: true, selector: "val-switch-org-modal", inputs: { _modalRef: "_modalRef", onSuccess: "onSuccess", onProfileClick: "onProfileClick", onCreateOrg: "onCreateOrg", i18nNamespace: "i18nNamespace" }, ngImport: i0, template: `
47987
47896
  <ion-header>
47988
47897
  <ion-toolbar>
47989
47898
  <ion-buttons slot="end">
@@ -48078,8 +47987,17 @@ class SwitchOrgModalComponent {
48078
47987
  </div>
48079
47988
  }
48080
47989
  </div>
47990
+
47991
+ @if (onCreateOrg) {
47992
+ <div class="new-org-cta">
47993
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="onCreateNew()">
47994
+ <ion-icon slot="start" name="add-outline" />
47995
+ {{ t('newOrg') }}
47996
+ </ion-button>
47997
+ </div>
47998
+ }
48081
47999
  </ion-content>
48082
- `, 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:2px}.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}.user-strip__profile-btn{background:none;border:none;padding:6px 0;font-size:.82rem;font-weight:600;color:var(--ion-color-dark);cursor:pointer;white-space:nowrap;text-decoration:underline;text-underline-offset:3px}\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: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["preset", "props"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
48000
+ `, 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:2px}.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}.user-strip__profile-btn{background:none;border:none;padding:6px 0;font-size:.82rem;font-weight:600;color:var(--ion-color-dark);cursor:pointer;white-space:nowrap;text-decoration:underline;text-underline-offset:3px}.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: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["preset", "props"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
48083
48001
  }
48084
48002
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SwitchOrgModalComponent, decorators: [{
48085
48003
  type: Component,
@@ -48190,14 +48108,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
48190
48108
  </div>
48191
48109
  }
48192
48110
  </div>
48111
+
48112
+ @if (onCreateOrg) {
48113
+ <div class="new-org-cta">
48114
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="onCreateNew()">
48115
+ <ion-icon slot="start" name="add-outline" />
48116
+ {{ t('newOrg') }}
48117
+ </ion-button>
48118
+ </div>
48119
+ }
48193
48120
  </ion-content>
48194
- `, 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:2px}.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}.user-strip__profile-btn{background:none;border:none;padding:6px 0;font-size:.82rem;font-weight:600;color:var(--ion-color-dark);cursor:pointer;white-space:nowrap;text-decoration:underline;text-underline-offset:3px}\n"] }]
48121
+ `, 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:2px}.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}.user-strip__profile-btn{background:none;border:none;padding:6px 0;font-size:.82rem;font-weight:600;color:var(--ion-color-dark);cursor:pointer;white-space:nowrap;text-decoration:underline;text-underline-offset:3px}.new-org-cta{margin-top:16px;padding-top:16px;border-top:1px solid rgba(var(--ion-color-dark-rgb),.1)}\n"] }]
48195
48122
  }], ctorParameters: () => [], propDecorators: { _modalRef: [{
48196
48123
  type: Input
48197
48124
  }], onSuccess: [{
48198
48125
  type: Input
48199
48126
  }], onProfileClick: [{
48200
48127
  type: Input
48128
+ }], onCreateOrg: [{
48129
+ type: Input
48201
48130
  }], i18nNamespace: [{
48202
48131
  type: Input
48203
48132
  }] } });
@@ -48803,7 +48732,7 @@ class AccountViewComponent {
48803
48732
  (dismissed)="deleteAccountOpen.set(false)"
48804
48733
  />
48805
48734
  </div>
48806
- `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.settings-section val-title{display:block;margin-bottom:12px}.section-body{display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.row-actions--gap{display:flex;flex-wrap:wrap;gap:8px}.section-header-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.org-new-cta-card{display:block;margin-top:12px}.orgs-empty-card{background:var(--ion-color-secondary-tint, rgba(var(--ion-color-secondary-rgb, 130, 101, 208), .2));border-radius:18px;padding:18px 16px 12px;display:flex;flex-direction:column;gap:8px}.orgs-empty-card__main{display:flex;align-items:center;gap:10px}.orgs-empty-card__icon{font-size:20px;flex-shrink:0;color:var(--ion-color-dark)}.orgs-empty-card__text{font-size:.875rem;color:var(--ion-color-dark)}.orgs-empty-card__link{background:none;border:none;padding:0;cursor:pointer;font-size:.8125rem;color:var(--ion-color-primary);text-align:left;text-decoration:underline;text-underline-offset:2px;font-family:inherit}.orgs-list{display:flex;flex-direction:column;gap:8px}.org-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:12px;background:var(--ion-color-light, #f4f5f8);border:1.5px solid transparent;cursor:pointer;transition:background .15s,border-color .15s}.org-card:active{opacity:.75}.org-card--active{border-color:var(--ion-color-primary);background:color-mix(in srgb,var(--ion-color-primary) 8%,transparent)}:host-context(body.dark) .org-card,:host-context(html.ion-palette-dark) .org-card,:host-context([data-theme=\"dark\"]) .org-card{background:#ffffff0d}:host-context(body.dark) .org-card--active,:host-context(html.ion-palette-dark) .org-card--active,:host-context([data-theme=\"dark\"]) .org-card--active{background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent)}.org-card__icon{width:40px;height:40px;border-radius:50%;background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent);display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:20px;color:var(--ion-color-primary);overflow:hidden;img{width:100%;height:100%;object-fit:cover;border-radius:50%}}.org-card__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.org-card__name{font-weight:600;font-size:.95rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.org-card__meta{display:flex;flex-direction:column;gap:1px;margin-top:3px}.org-card__meta-item{font-size:.78rem;color:var(--ion-color-dark)}.org-card__meta-label{font-weight:600;color:var(--ion-color-dark);margin-right:4px}.org-card__end{display:flex;align-items:center;gap:8px;flex-shrink:0}.section-title-danger{display:flex;align-items:center;gap:8px}.danger-icon{font-size:1.15rem;color:var(--ion-color-warning-shade, #d4a017);flex-shrink:0}.settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 4%,transparent);border-radius:14px;padding:16px;margin:0 -4px}:host-context(body.dark) .settings-section--danger,:host-context(html.ion-palette-dark) .settings-section--danger,:host-context([data-theme=\"dark\"]) .settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 8%,transparent)}\n"], dependencies: [{ kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: SkeletonLayoutComponent, selector: "val-skeleton-layout", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: CtaCardComponent, selector: "val-cta-card", inputs: ["props"], outputs: ["onAction"] }, { kind: "component", type: InvitationCardComponent, selector: "val-invitation-card", inputs: ["props"], outputs: ["onAccept", "onDecline"] }, { kind: "component", type: CreateOrgModalComponent, selector: "val-create-org-modal", inputs: ["i18nNamespace", "isOpen"], outputs: ["dismissed", "created"] }, { kind: "component", type: DeleteAccountModalComponent, selector: "val-delete-account-modal", inputs: ["i18nNamespace", "isOpen"], outputs: ["dismissed"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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: "pipe", type: TitleCasePipe, name: "titlecase" }] }); }
48735
+ `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.settings-section val-title{display:block;margin-bottom:12px}.section-body{display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.row-actions--gap{display:flex;flex-wrap:wrap;gap:8px}.section-header-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.org-new-cta-card{display:block;margin-top:12px}.orgs-empty-card{background:var(--ion-color-secondary-tint, rgba(var(--ion-color-secondary-rgb, 130, 101, 208), .2));border-radius:18px;padding:18px 16px 12px;display:flex;flex-direction:column;gap:8px}.orgs-empty-card__main{display:flex;align-items:center;gap:10px}.orgs-empty-card__icon{font-size:20px;flex-shrink:0;color:var(--ion-color-dark)}.orgs-empty-card__text{font-size:.875rem;color:var(--ion-color-dark)}.orgs-empty-card__link{background:none;border:none;padding:0;cursor:pointer;font-size:.8125rem;color:var(--ion-color-primary);text-align:left;text-decoration:underline;text-underline-offset:2px;font-family:inherit}.orgs-list{display:flex;flex-direction:column;gap:8px}.org-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:12px;background:var(--ion-color-light, #f4f5f8);border:1.5px solid transparent;cursor:pointer;transition:background .15s,border-color .15s}.org-card:active{opacity:.75}.org-card--active{border-color:var(--ion-color-primary);background:color-mix(in srgb,var(--ion-color-primary) 8%,transparent)}:host-context(body.dark) .org-card,:host-context(html.ion-palette-dark) .org-card,:host-context([data-theme=\"dark\"]) .org-card{background:#ffffff0d}:host-context(body.dark) .org-card--active,:host-context(html.ion-palette-dark) .org-card--active,:host-context([data-theme=\"dark\"]) .org-card--active{background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent)}.org-card__icon{width:40px;height:40px;border-radius:50%;background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent);display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:20px;color:var(--ion-color-primary);overflow:hidden;img{width:100%;height:100%;object-fit:cover;border-radius:50%}}.org-card__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.org-card__name{font-weight:600;font-size:.95rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.org-card__meta{display:flex;flex-direction:column;gap:1px;margin-top:3px}.org-card__meta-item{font-size:.78rem;color:var(--ion-color-dark)}.org-card__meta-label{font-weight:600;color:var(--ion-color-dark);margin-right:4px}.org-card__end{display:flex;align-items:center;gap:8px;flex-shrink:0}.section-title-danger{display:flex;align-items:center;gap:8px}.section-title-danger val-title{display:block}.danger-icon{display:block;font-size:1.125rem;color:var(--ion-color-warning-shade, #d4a017);flex-shrink:0}.settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 4%,transparent);border-radius:14px;padding:16px;margin:0 -4px}:host-context(body.dark) .settings-section--danger,:host-context(html.ion-palette-dark) .settings-section--danger,:host-context([data-theme=\"dark\"]) .settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 8%,transparent)}\n"], dependencies: [{ kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: SkeletonLayoutComponent, selector: "val-skeleton-layout", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: CtaCardComponent, selector: "val-cta-card", inputs: ["props"], outputs: ["onAction"] }, { kind: "component", type: InvitationCardComponent, selector: "val-invitation-card", inputs: ["props"], outputs: ["onAccept", "onDecline"] }, { kind: "component", type: CreateOrgModalComponent, selector: "val-create-org-modal", inputs: ["i18nNamespace", "isOpen"], outputs: ["dismissed", "created"] }, { kind: "component", type: DeleteAccountModalComponent, selector: "val-delete-account-modal", inputs: ["i18nNamespace", "isOpen"], outputs: ["dismissed"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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: "pipe", type: TitleCasePipe, name: "titlecase" }] }); }
48807
48736
  }
48808
48737
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AccountViewComponent, decorators: [{
48809
48738
  type: Component,
@@ -49003,7 +48932,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49003
48932
  (dismissed)="deleteAccountOpen.set(false)"
49004
48933
  />
49005
48934
  </div>
49006
- `, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.settings-section val-title{display:block;margin-bottom:12px}.section-body{display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.row-actions--gap{display:flex;flex-wrap:wrap;gap:8px}.section-header-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.org-new-cta-card{display:block;margin-top:12px}.orgs-empty-card{background:var(--ion-color-secondary-tint, rgba(var(--ion-color-secondary-rgb, 130, 101, 208), .2));border-radius:18px;padding:18px 16px 12px;display:flex;flex-direction:column;gap:8px}.orgs-empty-card__main{display:flex;align-items:center;gap:10px}.orgs-empty-card__icon{font-size:20px;flex-shrink:0;color:var(--ion-color-dark)}.orgs-empty-card__text{font-size:.875rem;color:var(--ion-color-dark)}.orgs-empty-card__link{background:none;border:none;padding:0;cursor:pointer;font-size:.8125rem;color:var(--ion-color-primary);text-align:left;text-decoration:underline;text-underline-offset:2px;font-family:inherit}.orgs-list{display:flex;flex-direction:column;gap:8px}.org-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:12px;background:var(--ion-color-light, #f4f5f8);border:1.5px solid transparent;cursor:pointer;transition:background .15s,border-color .15s}.org-card:active{opacity:.75}.org-card--active{border-color:var(--ion-color-primary);background:color-mix(in srgb,var(--ion-color-primary) 8%,transparent)}:host-context(body.dark) .org-card,:host-context(html.ion-palette-dark) .org-card,:host-context([data-theme=\"dark\"]) .org-card{background:#ffffff0d}:host-context(body.dark) .org-card--active,:host-context(html.ion-palette-dark) .org-card--active,:host-context([data-theme=\"dark\"]) .org-card--active{background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent)}.org-card__icon{width:40px;height:40px;border-radius:50%;background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent);display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:20px;color:var(--ion-color-primary);overflow:hidden;img{width:100%;height:100%;object-fit:cover;border-radius:50%}}.org-card__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.org-card__name{font-weight:600;font-size:.95rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.org-card__meta{display:flex;flex-direction:column;gap:1px;margin-top:3px}.org-card__meta-item{font-size:.78rem;color:var(--ion-color-dark)}.org-card__meta-label{font-weight:600;color:var(--ion-color-dark);margin-right:4px}.org-card__end{display:flex;align-items:center;gap:8px;flex-shrink:0}.section-title-danger{display:flex;align-items:center;gap:8px}.danger-icon{font-size:1.15rem;color:var(--ion-color-warning-shade, #d4a017);flex-shrink:0}.settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 4%,transparent);border-radius:14px;padding:16px;margin:0 -4px}:host-context(body.dark) .settings-section--danger,:host-context(html.ion-palette-dark) .settings-section--danger,:host-context([data-theme=\"dark\"]) .settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 8%,transparent)}\n"] }]
48935
+ `, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.settings-section val-title{display:block;margin-bottom:12px}.section-body{display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.row-actions--gap{display:flex;flex-wrap:wrap;gap:8px}.section-header-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.org-new-cta-card{display:block;margin-top:12px}.orgs-empty-card{background:var(--ion-color-secondary-tint, rgba(var(--ion-color-secondary-rgb, 130, 101, 208), .2));border-radius:18px;padding:18px 16px 12px;display:flex;flex-direction:column;gap:8px}.orgs-empty-card__main{display:flex;align-items:center;gap:10px}.orgs-empty-card__icon{font-size:20px;flex-shrink:0;color:var(--ion-color-dark)}.orgs-empty-card__text{font-size:.875rem;color:var(--ion-color-dark)}.orgs-empty-card__link{background:none;border:none;padding:0;cursor:pointer;font-size:.8125rem;color:var(--ion-color-primary);text-align:left;text-decoration:underline;text-underline-offset:2px;font-family:inherit}.orgs-list{display:flex;flex-direction:column;gap:8px}.org-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:12px;background:var(--ion-color-light, #f4f5f8);border:1.5px solid transparent;cursor:pointer;transition:background .15s,border-color .15s}.org-card:active{opacity:.75}.org-card--active{border-color:var(--ion-color-primary);background:color-mix(in srgb,var(--ion-color-primary) 8%,transparent)}:host-context(body.dark) .org-card,:host-context(html.ion-palette-dark) .org-card,:host-context([data-theme=\"dark\"]) .org-card{background:#ffffff0d}:host-context(body.dark) .org-card--active,:host-context(html.ion-palette-dark) .org-card--active,:host-context([data-theme=\"dark\"]) .org-card--active{background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent)}.org-card__icon{width:40px;height:40px;border-radius:50%;background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent);display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:20px;color:var(--ion-color-primary);overflow:hidden;img{width:100%;height:100%;object-fit:cover;border-radius:50%}}.org-card__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.org-card__name{font-weight:600;font-size:.95rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.org-card__meta{display:flex;flex-direction:column;gap:1px;margin-top:3px}.org-card__meta-item{font-size:.78rem;color:var(--ion-color-dark)}.org-card__meta-label{font-weight:600;color:var(--ion-color-dark);margin-right:4px}.org-card__end{display:flex;align-items:center;gap:8px;flex-shrink:0}.section-title-danger{display:flex;align-items:center;gap:8px}.section-title-danger val-title{display:block}.danger-icon{display:block;font-size:1.125rem;color:var(--ion-color-warning-shade, #d4a017);flex-shrink:0}.settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 4%,transparent);border-radius:14px;padding:16px;margin:0 -4px}:host-context(body.dark) .settings-section--danger,:host-context(html.ion-palette-dark) .settings-section--danger,:host-context([data-theme=\"dark\"]) .settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 8%,transparent)}\n"] }]
49007
48936
  }], ctorParameters: () => [], propDecorators: { config: [{
49008
48937
  type: Input
49009
48938
  }] } });
@@ -53143,7 +53072,7 @@ class OrganizationViewComponent {
53143
53072
  (dismissed)="permissionsOpen.set(false)"
53144
53073
  />
53145
53074
  </div>
53146
- `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.org-more-info-link{background:none;border:none;padding:4px 0;margin-top:4px;font-size:13px;font-weight:600;color:var(--ion-color-primary, #7026df);cursor:pointer;text-align:left}.page-header{margin-bottom:16px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.section-header-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.section-body{display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.row-actions--gap{display:flex;gap:8px}.invite-cta{display:flex;flex-direction:column;gap:16px}.invite-cta__text{display:flex;flex-direction:column;gap:4px}.invite-cta__actions{display:flex;gap:12px;flex-wrap:wrap}.org-info-card{border-radius:14px;background:var(--ion-color-light, #f4f5f8);overflow:hidden}.org-info-logo{display:flex;justify-content:center;padding:8px 0 16px}.org-logo-img{width:80px;height:80px;border-radius:50%;object-fit:cover;border:2px solid var(--ion-color-light)}:host-context(body.dark) .org-info-card,:host-context(html.ion-palette-dark) .org-info-card,:host-context([data-theme=\"dark\"]) .org-info-card{background:#ffffff0d}.org-info-field{padding:12px 16px;display:flex;flex-direction:column;gap:4px;border-bottom:1px solid var(--val-border-color, rgba(0, 0, 0, .06))}.org-info-field:last-child{border-bottom:none}.org-info-label{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--ion-color-medium)}.org-info-value{font-size:.95rem;font-weight:500;color:var(--ion-color-dark)}.org-info-value--muted{color:var(--ion-color-medium);font-weight:400}.plan-badge{display:inline-block;font-size:.78rem;font-weight:700;padding:3px 10px;border-radius:20px;width:fit-content}.plan-badge--free{background:var(--ion-color-light-shade, #d7d8da);color:var(--ion-color-dark)}.plan-badge--pro{background:var(--ion-color-primary);color:#fff}.plan-badge--enterprise{background:#f5c542;color:#222}.members-list{display:flex;flex-direction:column;gap:8px}.members-show-more{background:none;border:none;color:var(--ion-color-primary);font-size:14px;font-weight:500;cursor:pointer;padding:8px 0}.rbac-debug{opacity:.7}.rbac-debug__body{display:flex;flex-direction:column;gap:6px;font-family:monospace;font-size:.78rem}.rbac-debug__row{display:flex;gap:8px;align-items:flex-start}.rbac-debug__label{color:var(--ion-color-medium);min-width:72px;flex-shrink:0}.rbac-debug__value{color:var(--ion-color-dark);word-break:break-all}.rbac-debug__value--perms{color:var(--ion-color-medium)}.section-title-danger{display:flex;align-items:center;gap:8px}.danger-icon{font-size:1.15rem;color:var(--ion-color-warning-shade, #d4a017);flex-shrink:0}\n"], dependencies: [{ kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "directive", type: HasPermissionDirective, selector: "[valHasPermission]", inputs: ["valHasPermission"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: SkeletonLayoutComponent, selector: "val-skeleton-layout", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: MemberCardComponent, selector: "val-member-card", inputs: ["props"], outputs: ["onAction"] }, { kind: "component", type: PermissionsModalComponent, selector: "val-permissions-modal", inputs: ["isOpen", "config"], outputs: ["dismissed"] }] }); }
53075
+ `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.org-more-info-link{background:none;border:none;padding:4px 0;margin-top:4px;font-size:13px;font-weight:600;color:var(--ion-color-primary, #7026df);cursor:pointer;text-align:left}.page-header{margin-bottom:16px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.section-header-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.section-body{display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.row-actions--gap{display:flex;gap:8px}.invite-cta{display:flex;flex-direction:column;gap:16px}.invite-cta__text{display:flex;flex-direction:column;gap:4px}.invite-cta__actions{display:flex;gap:12px;flex-wrap:wrap}.org-info-card{border-radius:14px;background:var(--ion-color-light, #f4f5f8);overflow:hidden}.org-info-logo{display:flex;justify-content:center;padding:8px 0 16px}.org-logo-img{width:80px;height:80px;border-radius:50%;object-fit:cover;border:2px solid var(--ion-color-light)}:host-context(body.dark) .org-info-card,:host-context(html.ion-palette-dark) .org-info-card,:host-context([data-theme=\"dark\"]) .org-info-card{background:#ffffff0d}.org-info-field{padding:12px 16px;display:flex;flex-direction:column;gap:4px;border-bottom:1px solid var(--val-border-color, rgba(0, 0, 0, .06))}.org-info-field:last-child{border-bottom:none}.org-info-label{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--ion-color-medium)}.org-info-value{font-size:.95rem;font-weight:500;color:var(--ion-color-dark)}.org-info-value--muted{color:var(--ion-color-medium);font-weight:400}.plan-badge{display:inline-block;font-size:.78rem;font-weight:700;padding:3px 10px;border-radius:20px;width:fit-content}.plan-badge--free{background:var(--ion-color-light-shade, #d7d8da);color:var(--ion-color-dark)}.plan-badge--pro{background:var(--ion-color-primary);color:#fff}.plan-badge--enterprise{background:#f5c542;color:#222}.members-list{display:flex;flex-direction:column;gap:8px}.members-show-more{background:none;border:none;color:var(--ion-color-primary);font-size:14px;font-weight:500;cursor:pointer;padding:8px 0}.rbac-debug{opacity:.7}.rbac-debug__body{display:flex;flex-direction:column;gap:6px;font-family:monospace;font-size:.78rem}.rbac-debug__row{display:flex;gap:8px;align-items:flex-start}.rbac-debug__label{color:var(--ion-color-medium);min-width:72px;flex-shrink:0}.rbac-debug__value{color:var(--ion-color-dark);word-break:break-all}.rbac-debug__value--perms{color:var(--ion-color-medium)}.section-title-danger{display:flex;align-items:center;gap:8px}.section-title-danger val-title{display:block}.danger-icon{display:block;font-size:1.125rem;color:var(--ion-color-warning-shade, #d4a017);flex-shrink:0}\n"], dependencies: [{ kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "directive", type: HasPermissionDirective, selector: "[valHasPermission]", inputs: ["valHasPermission"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: SkeletonLayoutComponent, selector: "val-skeleton-layout", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: MemberCardComponent, selector: "val-member-card", inputs: ["props"], outputs: ["onAction"] }, { kind: "component", type: PermissionsModalComponent, selector: "val-permissions-modal", inputs: ["isOpen", "config"], outputs: ["dismissed"] }] }); }
53147
53076
  }
53148
53077
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrganizationViewComponent, decorators: [{
53149
53078
  type: Component,
@@ -53451,7 +53380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
53451
53380
  (dismissed)="permissionsOpen.set(false)"
53452
53381
  />
53453
53382
  </div>
53454
- `, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.org-more-info-link{background:none;border:none;padding:4px 0;margin-top:4px;font-size:13px;font-weight:600;color:var(--ion-color-primary, #7026df);cursor:pointer;text-align:left}.page-header{margin-bottom:16px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.section-header-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.section-body{display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.row-actions--gap{display:flex;gap:8px}.invite-cta{display:flex;flex-direction:column;gap:16px}.invite-cta__text{display:flex;flex-direction:column;gap:4px}.invite-cta__actions{display:flex;gap:12px;flex-wrap:wrap}.org-info-card{border-radius:14px;background:var(--ion-color-light, #f4f5f8);overflow:hidden}.org-info-logo{display:flex;justify-content:center;padding:8px 0 16px}.org-logo-img{width:80px;height:80px;border-radius:50%;object-fit:cover;border:2px solid var(--ion-color-light)}:host-context(body.dark) .org-info-card,:host-context(html.ion-palette-dark) .org-info-card,:host-context([data-theme=\"dark\"]) .org-info-card{background:#ffffff0d}.org-info-field{padding:12px 16px;display:flex;flex-direction:column;gap:4px;border-bottom:1px solid var(--val-border-color, rgba(0, 0, 0, .06))}.org-info-field:last-child{border-bottom:none}.org-info-label{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--ion-color-medium)}.org-info-value{font-size:.95rem;font-weight:500;color:var(--ion-color-dark)}.org-info-value--muted{color:var(--ion-color-medium);font-weight:400}.plan-badge{display:inline-block;font-size:.78rem;font-weight:700;padding:3px 10px;border-radius:20px;width:fit-content}.plan-badge--free{background:var(--ion-color-light-shade, #d7d8da);color:var(--ion-color-dark)}.plan-badge--pro{background:var(--ion-color-primary);color:#fff}.plan-badge--enterprise{background:#f5c542;color:#222}.members-list{display:flex;flex-direction:column;gap:8px}.members-show-more{background:none;border:none;color:var(--ion-color-primary);font-size:14px;font-weight:500;cursor:pointer;padding:8px 0}.rbac-debug{opacity:.7}.rbac-debug__body{display:flex;flex-direction:column;gap:6px;font-family:monospace;font-size:.78rem}.rbac-debug__row{display:flex;gap:8px;align-items:flex-start}.rbac-debug__label{color:var(--ion-color-medium);min-width:72px;flex-shrink:0}.rbac-debug__value{color:var(--ion-color-dark);word-break:break-all}.rbac-debug__value--perms{color:var(--ion-color-medium)}.section-title-danger{display:flex;align-items:center;gap:8px}.danger-icon{font-size:1.15rem;color:var(--ion-color-warning-shade, #d4a017);flex-shrink:0}\n"] }]
53383
+ `, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.org-more-info-link{background:none;border:none;padding:4px 0;margin-top:4px;font-size:13px;font-weight:600;color:var(--ion-color-primary, #7026df);cursor:pointer;text-align:left}.page-header{margin-bottom:16px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.section-header-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.section-body{display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.row-actions--gap{display:flex;gap:8px}.invite-cta{display:flex;flex-direction:column;gap:16px}.invite-cta__text{display:flex;flex-direction:column;gap:4px}.invite-cta__actions{display:flex;gap:12px;flex-wrap:wrap}.org-info-card{border-radius:14px;background:var(--ion-color-light, #f4f5f8);overflow:hidden}.org-info-logo{display:flex;justify-content:center;padding:8px 0 16px}.org-logo-img{width:80px;height:80px;border-radius:50%;object-fit:cover;border:2px solid var(--ion-color-light)}:host-context(body.dark) .org-info-card,:host-context(html.ion-palette-dark) .org-info-card,:host-context([data-theme=\"dark\"]) .org-info-card{background:#ffffff0d}.org-info-field{padding:12px 16px;display:flex;flex-direction:column;gap:4px;border-bottom:1px solid var(--val-border-color, rgba(0, 0, 0, .06))}.org-info-field:last-child{border-bottom:none}.org-info-label{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--ion-color-medium)}.org-info-value{font-size:.95rem;font-weight:500;color:var(--ion-color-dark)}.org-info-value--muted{color:var(--ion-color-medium);font-weight:400}.plan-badge{display:inline-block;font-size:.78rem;font-weight:700;padding:3px 10px;border-radius:20px;width:fit-content}.plan-badge--free{background:var(--ion-color-light-shade, #d7d8da);color:var(--ion-color-dark)}.plan-badge--pro{background:var(--ion-color-primary);color:#fff}.plan-badge--enterprise{background:#f5c542;color:#222}.members-list{display:flex;flex-direction:column;gap:8px}.members-show-more{background:none;border:none;color:var(--ion-color-primary);font-size:14px;font-weight:500;cursor:pointer;padding:8px 0}.rbac-debug{opacity:.7}.rbac-debug__body{display:flex;flex-direction:column;gap:6px;font-family:monospace;font-size:.78rem}.rbac-debug__row{display:flex;gap:8px;align-items:flex-start}.rbac-debug__label{color:var(--ion-color-medium);min-width:72px;flex-shrink:0}.rbac-debug__value{color:var(--ion-color-dark);word-break:break-all}.rbac-debug__value--perms{color:var(--ion-color-medium)}.section-title-danger{display:flex;align-items:center;gap:8px}.section-title-danger val-title{display:block}.danger-icon{display:block;font-size:1.125rem;color:var(--ion-color-warning-shade, #d4a017);flex-shrink:0}\n"] }]
53455
53384
  }], ctorParameters: () => [], propDecorators: { config: [{
53456
53385
  type: Input
53457
53386
  }] } });
@@ -67384,11 +67313,19 @@ class AuthCtaComponent {
67384
67313
  <div
67385
67314
  class="auth-cta"
67386
67315
  [class.auth-cta--center]="config().align === 'center'"
67387
- [class.auth-cta--has-image]="!!config().image"
67316
+ [class.auth-cta--has-image]="!!config().image && config().imagePosition !== 'top'"
67317
+ [class.auth-cta--image-top]="config().imagePosition === 'top'"
67318
+ [class.auth-cta--image-top-large]="config().imagePosition === 'top' && config().imageSize === 'large'"
67388
67319
  [style.padding]="config().padding"
67389
67320
  [style.border-radius]="config().borderRadius"
67390
67321
  [style.background-color]="resolvedBg()"
67391
67322
  >
67323
+ @if (config().image && config().imagePosition === 'top') {
67324
+ <div class="auth-cta__image-wrap auth-cta__image-wrap--top">
67325
+ <img class="auth-cta__image" [src]="config().image" [alt]="config().imageAlt ?? ''" loading="lazy" />
67326
+ </div>
67327
+ }
67328
+
67392
67329
  <div class="auth-cta__text">
67393
67330
  @if (config().eyebrow) {
67394
67331
  <span class="auth-cta__eyebrow">{{ config().eyebrow }}</span>
@@ -67427,13 +67364,13 @@ class AuthCtaComponent {
67427
67364
  </div>
67428
67365
  </div>
67429
67366
 
67430
- @if (config().image) {
67367
+ @if (config().image && config().imagePosition !== 'top') {
67431
67368
  <div class="auth-cta__image-wrap">
67432
67369
  <img class="auth-cta__image" [src]="config().image" [alt]="config().imageAlt ?? ''" loading="lazy" />
67433
67370
  </div>
67434
67371
  }
67435
67372
  </div>
67436
- `, isInline: true, styles: [":host{display:block}.auth-cta{display:flex;flex-direction:row;align-items:center;gap:3rem;background:var(--ion-background-color)}.auth-cta--center{text-align:center}.auth-cta--center .auth-cta__actions{justify-content:center}.auth-cta--has-image{text-align:start}.auth-cta--has-image .auth-cta__actions{justify-content:flex-start}.auth-cta__text{flex:1 1 0;min-width:0;display:flex;flex-direction:column;gap:1rem}.auth-cta__eyebrow{font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--ion-color-primary)}.auth-cta__title{margin:0;font-size:2rem;font-weight:800;line-height:1.2;color:var(--ion-text-color)}.auth-cta__subtitle{margin:0;font-size:1.05rem;line-height:1.6;color:var(--ion-color-medium-shade)}.auth-cta__actions{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;margin-top:.5rem}.auth-cta__image-wrap{flex:0 0 auto;max-width:420px;width:40%}.auth-cta__image{display:block;width:100%;height:auto;border-radius:12px;object-fit:cover}@media (max-width: 768px){.auth-cta{flex-direction:column;gap:2rem;text-align:center}.auth-cta--has-image{text-align:center}.auth-cta--has-image .auth-cta__actions{justify-content:center}.auth-cta__image-wrap{max-width:100%;width:100%}.auth-cta__actions{justify-content:center}}:host-context(body.dark) .auth-cta__title,:host-context(html.ion-palette-dark) .auth-cta__title,:host-context([data-theme=dark]) .auth-cta__title{color:var(--ion-text-color)}:host-context(body.dark) .auth-cta__subtitle,:host-context(html.ion-palette-dark) .auth-cta__subtitle,:host-context([data-theme=dark]) .auth-cta__subtitle{color:var(--ion-color-medium)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { 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"] }] }); }
67373
+ `, isInline: true, styles: [":host{display:block}.auth-cta{display:flex;flex-direction:row;align-items:center;gap:3rem;background:var(--ion-background-color)}.auth-cta--center{text-align:center}.auth-cta--center .auth-cta__actions{justify-content:center}.auth-cta--has-image{text-align:start}.auth-cta--has-image .auth-cta__actions{justify-content:flex-start}.auth-cta__text{flex:1 1 0;min-width:0;display:flex;flex-direction:column;gap:1rem}.auth-cta__eyebrow{font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--ion-color-primary)}.auth-cta__title{margin:0;font-size:2rem;font-weight:800;line-height:1.2;color:var(--ion-text-color)}.auth-cta__subtitle{margin:0;font-size:1.05rem;line-height:1.6;color:var(--ion-color-medium-shade)}.auth-cta__actions{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;margin-top:.5rem}.auth-cta__image-wrap{flex:0 0 auto;max-width:420px;width:40%}.auth-cta__image-wrap--top{width:64px;max-width:64px;margin-bottom:.5rem}.auth-cta__image{display:block;width:100%;height:auto;border-radius:12px;object-fit:cover}.auth-cta--image-top{flex-direction:column;align-items:center;text-align:center}.auth-cta--image-top .auth-cta__actions{justify-content:center}.auth-cta--image-top .auth-cta__image{border-radius:8px}.auth-cta--image-top-large .auth-cta__image-wrap--top{width:120px;max-width:120px}@media (max-width: 768px){.auth-cta{flex-direction:column;gap:2rem;text-align:center}.auth-cta--has-image{text-align:center}.auth-cta--has-image .auth-cta__actions{justify-content:center}.auth-cta__image-wrap{max-width:100%;width:100%}.auth-cta__actions{justify-content:center}}:host-context(body.dark) .auth-cta__title,:host-context(html.ion-palette-dark) .auth-cta__title,:host-context([data-theme=dark]) .auth-cta__title{color:var(--ion-text-color)}:host-context(body.dark) .auth-cta__subtitle,:host-context(html.ion-palette-dark) .auth-cta__subtitle,:host-context([data-theme=dark]) .auth-cta__subtitle{color:var(--ion-color-medium)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { 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"] }] }); }
67437
67374
  }
67438
67375
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthCtaComponent, decorators: [{
67439
67376
  type: Component,
@@ -67441,11 +67378,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
67441
67378
  <div
67442
67379
  class="auth-cta"
67443
67380
  [class.auth-cta--center]="config().align === 'center'"
67444
- [class.auth-cta--has-image]="!!config().image"
67381
+ [class.auth-cta--has-image]="!!config().image && config().imagePosition !== 'top'"
67382
+ [class.auth-cta--image-top]="config().imagePosition === 'top'"
67383
+ [class.auth-cta--image-top-large]="config().imagePosition === 'top' && config().imageSize === 'large'"
67445
67384
  [style.padding]="config().padding"
67446
67385
  [style.border-radius]="config().borderRadius"
67447
67386
  [style.background-color]="resolvedBg()"
67448
67387
  >
67388
+ @if (config().image && config().imagePosition === 'top') {
67389
+ <div class="auth-cta__image-wrap auth-cta__image-wrap--top">
67390
+ <img class="auth-cta__image" [src]="config().image" [alt]="config().imageAlt ?? ''" loading="lazy" />
67391
+ </div>
67392
+ }
67393
+
67449
67394
  <div class="auth-cta__text">
67450
67395
  @if (config().eyebrow) {
67451
67396
  <span class="auth-cta__eyebrow">{{ config().eyebrow }}</span>
@@ -67484,13 +67429,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
67484
67429
  </div>
67485
67430
  </div>
67486
67431
 
67487
- @if (config().image) {
67432
+ @if (config().image && config().imagePosition !== 'top') {
67488
67433
  <div class="auth-cta__image-wrap">
67489
67434
  <img class="auth-cta__image" [src]="config().image" [alt]="config().imageAlt ?? ''" loading="lazy" />
67490
67435
  </div>
67491
67436
  }
67492
67437
  </div>
67493
- `, styles: [":host{display:block}.auth-cta{display:flex;flex-direction:row;align-items:center;gap:3rem;background:var(--ion-background-color)}.auth-cta--center{text-align:center}.auth-cta--center .auth-cta__actions{justify-content:center}.auth-cta--has-image{text-align:start}.auth-cta--has-image .auth-cta__actions{justify-content:flex-start}.auth-cta__text{flex:1 1 0;min-width:0;display:flex;flex-direction:column;gap:1rem}.auth-cta__eyebrow{font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--ion-color-primary)}.auth-cta__title{margin:0;font-size:2rem;font-weight:800;line-height:1.2;color:var(--ion-text-color)}.auth-cta__subtitle{margin:0;font-size:1.05rem;line-height:1.6;color:var(--ion-color-medium-shade)}.auth-cta__actions{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;margin-top:.5rem}.auth-cta__image-wrap{flex:0 0 auto;max-width:420px;width:40%}.auth-cta__image{display:block;width:100%;height:auto;border-radius:12px;object-fit:cover}@media (max-width: 768px){.auth-cta{flex-direction:column;gap:2rem;text-align:center}.auth-cta--has-image{text-align:center}.auth-cta--has-image .auth-cta__actions{justify-content:center}.auth-cta__image-wrap{max-width:100%;width:100%}.auth-cta__actions{justify-content:center}}:host-context(body.dark) .auth-cta__title,:host-context(html.ion-palette-dark) .auth-cta__title,:host-context([data-theme=dark]) .auth-cta__title{color:var(--ion-text-color)}:host-context(body.dark) .auth-cta__subtitle,:host-context(html.ion-palette-dark) .auth-cta__subtitle,:host-context([data-theme=dark]) .auth-cta__subtitle{color:var(--ion-color-medium)}\n"] }]
67438
+ `, styles: [":host{display:block}.auth-cta{display:flex;flex-direction:row;align-items:center;gap:3rem;background:var(--ion-background-color)}.auth-cta--center{text-align:center}.auth-cta--center .auth-cta__actions{justify-content:center}.auth-cta--has-image{text-align:start}.auth-cta--has-image .auth-cta__actions{justify-content:flex-start}.auth-cta__text{flex:1 1 0;min-width:0;display:flex;flex-direction:column;gap:1rem}.auth-cta__eyebrow{font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--ion-color-primary)}.auth-cta__title{margin:0;font-size:2rem;font-weight:800;line-height:1.2;color:var(--ion-text-color)}.auth-cta__subtitle{margin:0;font-size:1.05rem;line-height:1.6;color:var(--ion-color-medium-shade)}.auth-cta__actions{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;margin-top:.5rem}.auth-cta__image-wrap{flex:0 0 auto;max-width:420px;width:40%}.auth-cta__image-wrap--top{width:64px;max-width:64px;margin-bottom:.5rem}.auth-cta__image{display:block;width:100%;height:auto;border-radius:12px;object-fit:cover}.auth-cta--image-top{flex-direction:column;align-items:center;text-align:center}.auth-cta--image-top .auth-cta__actions{justify-content:center}.auth-cta--image-top .auth-cta__image{border-radius:8px}.auth-cta--image-top-large .auth-cta__image-wrap--top{width:120px;max-width:120px}@media (max-width: 768px){.auth-cta{flex-direction:column;gap:2rem;text-align:center}.auth-cta--has-image{text-align:center}.auth-cta--has-image .auth-cta__actions{justify-content:center}.auth-cta__image-wrap{max-width:100%;width:100%}.auth-cta__actions{justify-content:center}}:host-context(body.dark) .auth-cta__title,:host-context(html.ion-palette-dark) .auth-cta__title,:host-context([data-theme=dark]) .auth-cta__title{color:var(--ion-text-color)}:host-context(body.dark) .auth-cta__subtitle,:host-context(html.ion-palette-dark) .auth-cta__subtitle,:host-context([data-theme=dark]) .auth-cta__subtitle{color:var(--ion-color-medium)}\n"] }]
67494
67439
  }], ctorParameters: () => [], propDecorators: { onLogin: [{
67495
67440
  type: Output
67496
67441
  }], onRegister: [{
@@ -68033,5 +67978,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
68033
67978
  * Generated bundle index. Do not edit.
68034
67979
  */
68035
67980
 
68036
- 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 };
67981
+ 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 };
68037
67982
  //# sourceMappingURL=valtech-components.mjs.map