valtech-components 4.0.29 → 4.0.31

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 (28) hide show
  1. package/esm2022/lib/components/organisms/account-view/account-view.component.mjs +13 -21
  2. package/esm2022/lib/components/organisms/avatar-upload/avatar-upload.component.mjs +25 -12
  3. package/esm2022/lib/components/organisms/edit-org-modal/edit-org-modal.component.mjs +57 -5
  4. package/esm2022/lib/components/organisms/login/types.mjs +9 -7
  5. package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +49 -38
  6. package/esm2022/lib/components/organisms/profile-view/profile-view.component.mjs +2 -2
  7. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.component.mjs +59 -6
  8. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.i18n.mjs +3 -1
  9. package/esm2022/lib/services/org/types.mjs +1 -1
  10. package/esm2022/lib/version.mjs +2 -2
  11. package/fesm2022/valtech-components.mjs +204 -83
  12. package/fesm2022/valtech-components.mjs.map +1 -1
  13. package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +1 -1
  14. package/lib/components/atoms/text/text.component.d.ts +1 -1
  15. package/lib/components/atoms/user-avatar/user-avatar.component.d.ts +1 -1
  16. package/lib/components/molecules/cta-card/cta-card.component.d.ts +1 -1
  17. package/lib/components/molecules/features-list/features-list.component.d.ts +1 -1
  18. package/lib/components/molecules/metric-card/metric-card.component.d.ts +1 -1
  19. package/lib/components/organisms/article/article.component.d.ts +5 -5
  20. package/lib/components/organisms/auth-cta/auth-cta.component.d.ts +1 -1
  21. package/lib/components/organisms/avatar-upload/avatar-upload.component.d.ts +10 -1
  22. package/lib/components/organisms/edit-org-modal/edit-org-modal.component.d.ts +5 -1
  23. package/lib/components/organisms/login/types.d.ts +6 -4
  24. package/lib/components/organisms/member-import-modal/member-import-modal.component.d.ts +1 -1
  25. package/lib/components/organisms/switch-org-modal/switch-org-modal.component.d.ts +6 -1
  26. package/lib/services/org/types.d.ts +2 -0
  27. package/lib/version.d.ts +1 -1
  28. package/package.json +1 -1
@@ -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.29';
59
+ const VERSION = '4.0.31';
60
60
 
61
61
  // Control de estado de refresco (singleton a nivel de módulo)
62
62
  let isRefreshing = false;
@@ -40221,16 +40221,18 @@ const LOGIN_DEFAULTS = {
40221
40221
  /**
40222
40222
  * Logo por defecto de la card de login cuando el consumer no pasa `logo`.
40223
40223
  *
40224
- * Usa el token CSS `--main-logo` (resuelto por `val-image` vía `var(--main-logo)`),
40225
- * que cada app del factory define en su `theme/variables.scss` con su logo de
40226
- * marca (incluye variante dark). Así el login muestra SIEMPRE el logo de la app
40227
- * sin acoplar la lib a una marca concreta — es el estándar del factory.
40224
+ * Usa el token CSS `--main-logo-mini` (el logo MINI/icono, el mismo que el
40225
+ * side menu `val-menu`), resuelto por `val-image` vía `var(--main-logo-mini)`.
40226
+ * Cada app del factory lo define en su `theme/variables.scss` (showcase
40227
+ * `main-icon.png`, bingo `favicon-balls.svg`). NO es el lockup grande
40228
+ * `--main-logo` del header. Así el login muestra SIEMPRE el icono de marca de
40229
+ * la app sin acoplar la lib a una marca concreta — es el estándar del factory.
40228
40230
  *
40229
40231
  * Una app puede override pasando su propio `logo` en `LoginMetadata` (ej.
40230
40232
  * showcase usa un mark propio `terminal.svg`).
40231
40233
  */
40232
40234
  const DEFAULT_LOGIN_LOGO = {
40233
- src: '--main-logo',
40235
+ src: '--main-logo-mini',
40234
40236
  alt: '',
40235
40237
  mode: 'box',
40236
40238
  shaded: false,
@@ -40238,7 +40240,7 @@ const DEFAULT_LOGIN_LOGO = {
40238
40240
  size: 'xlarge',
40239
40241
  alignment: 'center',
40240
40242
  flex: true,
40241
- width: 8,
40243
+ width: 4,
40242
40244
  };
40243
40245
 
40244
40246
  class LoginComponent {
@@ -42060,6 +42062,15 @@ class AvatarUploadComponent {
42060
42062
  this.i18n = inject(I18nService);
42061
42063
  /** Component configuration */
42062
42064
  this.props = input({});
42065
+ /** Custom storage path for the full-size image (e.g. 'orgs/{orgId}/logo.jpg').
42066
+ * When provided, overrides the default 'users/{userId}/avatar.jpg' path. */
42067
+ this.customPath = input(null);
42068
+ /** Custom storage path for the thumbnail (e.g. 'orgs/{orgId}/thumb.jpg').
42069
+ * When provided, overrides the default 'users/{userId}/thumb.jpg' path. */
42070
+ this.customThumbPath = input(null);
42071
+ /** When true, skips the AuthService.updateAvatar() backend sync call after upload.
42072
+ * Use this when the caller will handle the backend update (e.g. via OrgService). */
42073
+ this.skipBackendSync = input(false);
42063
42074
  /** Emitted after successful upload and backend sync */
42064
42075
  this.uploaded = new EventEmitter();
42065
42076
  /** Emitted on any error during the process */
@@ -42167,16 +42178,18 @@ class AvatarUploadComponent {
42167
42178
  // 3. Set preview immediately
42168
42179
  this.previewUrl.set(compressed.dataUrl);
42169
42180
  this.imageLoadError.set(false);
42170
- // 4. Get user ID for storage path
42181
+ // 4. Get user ID for storage path (only required when using default user paths)
42182
+ const customAvatarPath = this.customPath();
42171
42183
  const userId = this.authService.user()?.userId;
42172
- if (!userId) {
42184
+ if (!customAvatarPath && !userId) {
42173
42185
  throw new Error('User not authenticated');
42174
42186
  }
42175
42187
  // 5. Upload to Firebase Storage with predictable paths
42176
- // Path: users/{userId}/avatar.jpg - allows any app to construct URL with just userId
42188
+ // When customPath is provided (e.g. orgs/{orgId}/logo.jpg), use it directly.
42189
+ // Otherwise fall back to the default user avatar path.
42177
42190
  // skipPrefix: true - bypasses appId prefix for shared/cross-app paths
42178
- const avatarPath = `users/${userId}/avatar.jpg`;
42179
- const thumbPath = `users/${userId}/thumb.jpg`;
42191
+ const avatarPath = customAvatarPath ?? 'users/' + userId + '/avatar.jpg';
42192
+ const thumbPath = this.customThumbPath() ?? 'users/' + userId + '/thumb.jpg';
42180
42193
  const uploadMetadata = { skipPrefix: true, contentType: 'image/jpeg' };
42181
42194
  // Race against timeout to prevent infinite loading
42182
42195
  const [avatarResult, thumbResult] = await Promise.race([
@@ -42186,11 +42199,13 @@ class AvatarUploadComponent {
42186
42199
  ]),
42187
42200
  uploadTimeout,
42188
42201
  ]);
42189
- // 6. Update backend with URLs
42190
- await firstValueFrom(this.authService.updateAvatar({
42191
- avatarUrl: avatarResult.downloadUrl,
42192
- avatarThumbnail: thumbResult.downloadUrl,
42193
- }));
42202
+ // 6. Update backend with URLs (skipped when skipBackendSync is true)
42203
+ if (!this.skipBackendSync()) {
42204
+ await firstValueFrom(this.authService.updateAvatar({
42205
+ avatarUrl: avatarResult.downloadUrl,
42206
+ avatarThumbnail: thumbResult.downloadUrl,
42207
+ }));
42208
+ }
42194
42209
  // 7. Update preview with cache-busting to force refresh
42195
42210
  const cacheBuster = `?t=${Date.now()}`;
42196
42211
  this.previewUrl.set(avatarResult.downloadUrl + cacheBuster);
@@ -42231,7 +42246,7 @@ class AvatarUploadComponent {
42231
42246
  this.error.emit({ type, message, originalError });
42232
42247
  }
42233
42248
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AvatarUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42234
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AvatarUploadComponent, isStandalone: true, selector: "val-avatar-upload", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { uploaded: "uploaded", error: "error", uploadStart: "uploadStart" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: `
42249
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AvatarUploadComponent, isStandalone: true, selector: "val-avatar-upload", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, customPath: { classPropertyName: "customPath", publicName: "customPath", isSignal: true, isRequired: false, transformFunction: null }, customThumbPath: { classPropertyName: "customThumbPath", publicName: "customThumbPath", isSignal: true, isRequired: false, transformFunction: null }, skipBackendSync: { classPropertyName: "skipBackendSync", publicName: "skipBackendSync", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { uploaded: "uploaded", error: "error", uploadStart: "uploadStart" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: `
42235
42250
  <div class="avatar-upload" [style.--avatar-size.px]="config().size" [class.avatar-upload--loading]="loading()">
42236
42251
  <div class="avatar-container">
42237
42252
  <!-- Avatar Image or Initials -->
@@ -43602,7 +43617,7 @@ class ProfileViewComponent {
43602
43617
  }
43603
43618
  }
43604
43619
  </div>
43605
- `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.page-header h1{font-size:22px;font-weight:700;margin:0 0 4px}.hint{font-size:13px;opacity:.7;margin:0 0 12px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.avatar-section{display:flex;align-items:center;gap:16px}.avatar-meta{display:flex;flex-direction:column;gap:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: AvatarUploadComponent, selector: "val-avatar-upload", inputs: ["props"], outputs: ["uploaded", "error", "uploadStart"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: SkeletonLayoutComponent, selector: "val-skeleton-layout", inputs: ["props"] }] }); }
43620
+ `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.page-header h1{font-size:22px;font-weight:700;margin:0 0 4px}.hint{font-size:13px;opacity:.7;margin:0 0 12px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.avatar-section{display:flex;align-items:center;gap:16px}.avatar-meta{display:flex;flex-direction:column;gap:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: AvatarUploadComponent, selector: "val-avatar-upload", inputs: ["props", "customPath", "customThumbPath", "skipBackendSync"], outputs: ["uploaded", "error", "uploadStart"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: SkeletonLayoutComponent, selector: "val-skeleton-layout", inputs: ["props"] }] }); }
43606
43621
  }
43607
43622
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProfileViewComponent, decorators: [{
43608
43623
  type: Component,
@@ -47511,6 +47526,7 @@ const SWITCH_ORG_MODAL_I18N = {
47511
47526
  current: 'Actual',
47512
47527
  close: 'Cerrar',
47513
47528
  switchError: 'No se pudo cambiar de organización.',
47529
+ profile: 'Mi perfil',
47514
47530
  },
47515
47531
  en: {
47516
47532
  title: 'Switch account',
@@ -47520,6 +47536,7 @@ const SWITCH_ORG_MODAL_I18N = {
47520
47536
  current: 'Active',
47521
47537
  close: 'Close',
47522
47538
  switchError: 'Could not switch organization.',
47539
+ profile: 'My profile',
47523
47540
  },
47524
47541
  };
47525
47542
 
@@ -47554,6 +47571,11 @@ class SwitchOrgModalComponent {
47554
47571
  this.loading = signal(false);
47555
47572
  this.query = signal('');
47556
47573
  this.switchingId = signal(null);
47574
+ this.user = computed(() => this.auth.user());
47575
+ this.userInitials = computed(() => {
47576
+ const name = this.user()?.name ?? this.user()?.email ?? '?';
47577
+ return name.slice(0, 2).toUpperCase();
47578
+ });
47557
47579
  this.activeOrgId = computed(() => {
47558
47580
  const u = this.auth.user();
47559
47581
  return u?.activeOrgId ?? u?.activeOrg ?? '';
@@ -47605,6 +47627,10 @@ class SwitchOrgModalComponent {
47605
47627
  error: () => this.loading.set(false),
47606
47628
  });
47607
47629
  }
47630
+ onProfile() {
47631
+ this.dismiss();
47632
+ this.onProfileClick?.();
47633
+ }
47608
47634
  dismiss() {
47609
47635
  this._modalRef?.dismiss(null, 'cancel');
47610
47636
  }
@@ -47612,7 +47638,7 @@ class SwitchOrgModalComponent {
47612
47638
  return this.i18n.t(key, this.i18nNamespace);
47613
47639
  }
47614
47640
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SwitchOrgModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
47615
- 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", i18nNamespace: "i18nNamespace" }, ngImport: i0, template: `
47641
+ 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: `
47616
47642
  <ion-header>
47617
47643
  <ion-toolbar>
47618
47644
  <ion-buttons slot="end">
@@ -47634,6 +47660,23 @@ class SwitchOrgModalComponent {
47634
47660
  }"
47635
47661
  />
47636
47662
 
47663
+ <div class="user-strip">
47664
+ <div class="user-strip__avatar">
47665
+ @if (user()?.avatarUrl) {
47666
+ <img [src]="user()!.avatarUrl!" [alt]="user()?.name ?? ''" />
47667
+ } @else {
47668
+ <span>{{ userInitials() }}</span>
47669
+ }
47670
+ </div>
47671
+ <div class="user-strip__info">
47672
+ <span class="user-strip__name">{{ user()?.name || user()?.email || '' }}</span>
47673
+ <span class="user-strip__email">{{ user()?.email || '' }}</span>
47674
+ </div>
47675
+ <button class="user-strip__profile-btn" type="button" (click)="onProfile()">
47676
+ {{ t('profile') }}
47677
+ </button>
47678
+ </div>
47679
+
47637
47680
  <div class="switch-section">
47638
47681
  <val-searchbar
47639
47682
  [props]="{
@@ -47667,7 +47710,11 @@ class SwitchOrgModalComponent {
47667
47710
  (click)="onSelect(org)"
47668
47711
  >
47669
47712
  <div class="org-row__icon">
47670
- <ion-icon name="business-outline" />
47713
+ @if (org.logoUrl) {
47714
+ <img [src]="org.logoUrl" [alt]="org.name" />
47715
+ } @else {
47716
+ <ion-icon name="business-outline" />
47717
+ }
47671
47718
  </div>
47672
47719
  <div class="org-row__body">
47673
47720
  <span class="org-row__name">{{ org.name }}</span>
@@ -47687,7 +47734,7 @@ class SwitchOrgModalComponent {
47687
47734
  }
47688
47735
  </div>
47689
47736
  </ion-content>
47690
- `, 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)}\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"] }] }); }
47737
+ `, 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"] }] }); }
47691
47738
  }
47692
47739
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SwitchOrgModalComponent, decorators: [{
47693
47740
  type: Component,
@@ -47725,6 +47772,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
47725
47772
  }"
47726
47773
  />
47727
47774
 
47775
+ <div class="user-strip">
47776
+ <div class="user-strip__avatar">
47777
+ @if (user()?.avatarUrl) {
47778
+ <img [src]="user()!.avatarUrl!" [alt]="user()?.name ?? ''" />
47779
+ } @else {
47780
+ <span>{{ userInitials() }}</span>
47781
+ }
47782
+ </div>
47783
+ <div class="user-strip__info">
47784
+ <span class="user-strip__name">{{ user()?.name || user()?.email || '' }}</span>
47785
+ <span class="user-strip__email">{{ user()?.email || '' }}</span>
47786
+ </div>
47787
+ <button class="user-strip__profile-btn" type="button" (click)="onProfile()">
47788
+ {{ t('profile') }}
47789
+ </button>
47790
+ </div>
47791
+
47728
47792
  <div class="switch-section">
47729
47793
  <val-searchbar
47730
47794
  [props]="{
@@ -47758,7 +47822,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
47758
47822
  (click)="onSelect(org)"
47759
47823
  >
47760
47824
  <div class="org-row__icon">
47761
- <ion-icon name="business-outline" />
47825
+ @if (org.logoUrl) {
47826
+ <img [src]="org.logoUrl" [alt]="org.name" />
47827
+ } @else {
47828
+ <ion-icon name="business-outline" />
47829
+ }
47762
47830
  </div>
47763
47831
  <div class="org-row__body">
47764
47832
  <span class="org-row__name">{{ org.name }}</span>
@@ -47778,11 +47846,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
47778
47846
  }
47779
47847
  </div>
47780
47848
  </ion-content>
47781
- `, 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)}\n"] }]
47849
+ `, 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"] }]
47782
47850
  }], ctorParameters: () => [], propDecorators: { _modalRef: [{
47783
47851
  type: Input
47784
47852
  }], onSuccess: [{
47785
47853
  type: Input
47854
+ }], onProfileClick: [{
47855
+ type: Input
47786
47856
  }], i18nNamespace: [{
47787
47857
  type: Input
47788
47858
  }] } });
@@ -47883,7 +47953,7 @@ const ACCOUNT_VIEW_I18N = {
47883
47953
  },
47884
47954
  };
47885
47955
 
47886
- addIcons({ peopleOutline, businessOutline, chevronForwardOutline, swapHorizontalOutline, mailOutline });
47956
+ addIcons({ peopleOutline, businessOutline, chevronForwardOutline, swapHorizontalOutline, mailOutline, warningOutline });
47887
47957
  const DEFAULT_NAMESPACE$d = 'Settings.Account';
47888
47958
  const DEFAULT_MANAGE_ORG_ROUTE = '/app/settings/organization';
47889
47959
  /**
@@ -48348,14 +48418,10 @@ class AccountViewComponent {
48348
48418
  @if (resolvedConfig().showDeleteAccount) {
48349
48419
  <!-- Delete account -->
48350
48420
  <section class="settings-section">
48351
- <val-title
48352
- [props]="{
48353
- size: 'medium',
48354
- color: 'dark',
48355
- bold: true,
48356
- content: dangerDeleteTitle(),
48357
- }"
48358
- />
48421
+ <div class="section-title-danger">
48422
+ <ion-icon name="warning-outline" class="danger-icon" aria-hidden="true"></ion-icon>
48423
+ <val-title [props]="{ size: 'medium', color: 'dark', bold: true, content: dangerDeleteTitle() }" />
48424
+ </div>
48359
48425
  <div class="section-body">
48360
48426
  <val-text
48361
48427
  [props]="{
@@ -48383,7 +48449,7 @@ class AccountViewComponent {
48383
48449
  (dismissed)="deleteAccountOpen.set(false)"
48384
48450
  />
48385
48451
  </div>
48386
- `, 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)}.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}\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" }] }); }
48452
+ `, 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)}.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}\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" }] }); }
48387
48453
  }
48388
48454
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AccountViewComponent, decorators: [{
48389
48455
  type: Component,
@@ -48548,14 +48614,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
48548
48614
  @if (resolvedConfig().showDeleteAccount) {
48549
48615
  <!-- Delete account -->
48550
48616
  <section class="settings-section">
48551
- <val-title
48552
- [props]="{
48553
- size: 'medium',
48554
- color: 'dark',
48555
- bold: true,
48556
- content: dangerDeleteTitle(),
48557
- }"
48558
- />
48617
+ <div class="section-title-danger">
48618
+ <ion-icon name="warning-outline" class="danger-icon" aria-hidden="true"></ion-icon>
48619
+ <val-title [props]="{ size: 'medium', color: 'dark', bold: true, content: dangerDeleteTitle() }" />
48620
+ </div>
48559
48621
  <div class="section-body">
48560
48622
  <val-text
48561
48623
  [props]="{
@@ -48583,7 +48645,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
48583
48645
  (dismissed)="deleteAccountOpen.set(false)"
48584
48646
  />
48585
48647
  </div>
48586
- `, 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)}.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}\n"] }]
48648
+ `, 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)}.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}\n"] }]
48587
48649
  }], ctorParameters: () => [], propDecorators: { config: [{
48588
48650
  type: Input
48589
48651
  }] } });
@@ -48753,6 +48815,11 @@ class EditOrgModalComponent {
48753
48815
  /** Namespace i18n con que la vista resuelve sus textos. */
48754
48816
  this.i18nNamespace = DEFAULT_NAMESPACE$c;
48755
48817
  this.saving = signal(false);
48818
+ this.logoUrl = signal(null);
48819
+ this.orgInitials = computed(() => {
48820
+ const name = this.org?.name ?? '';
48821
+ return name.slice(0, 2).toUpperCase() || '?';
48822
+ });
48756
48823
  if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$c)) {
48757
48824
  this.i18n.registerContent(DEFAULT_NAMESPACE$c, EDIT_ORG_MODAL_I18N);
48758
48825
  }
@@ -48774,6 +48841,7 @@ class EditOrgModalComponent {
48774
48841
  }, { allowSignalWrites: true });
48775
48842
  }
48776
48843
  ngOnInit() {
48844
+ this.logoUrl.set(this.org?.logoUrl ?? null);
48777
48845
  this.formMeta.set(this.buildFormMeta());
48778
48846
  }
48779
48847
  get activeOrgId() {
@@ -48867,6 +48935,23 @@ class EditOrgModalComponent {
48867
48935
  this.saving.set(false);
48868
48936
  }
48869
48937
  }
48938
+ async onLogoUploaded(result) {
48939
+ const orgId = this.org?.id ?? this.activeOrgId;
48940
+ if (!orgId)
48941
+ return;
48942
+ this.logoUrl.set(result.avatarUrl);
48943
+ try {
48944
+ const updated = await firstValueFrom(this.orgService.updateOrg(orgId, { logoUrl: result.avatarUrl }));
48945
+ this.onSuccess?.(updated);
48946
+ }
48947
+ catch (err) {
48948
+ this.errors.handle(err, {
48949
+ context: 'editOrgModal.logo',
48950
+ fallbackKey: 'saveError',
48951
+ i18nNamespace: this.i18nNamespace,
48952
+ });
48953
+ }
48954
+ }
48870
48955
  dismiss() {
48871
48956
  this._modalRef?.dismiss(null, 'cancel');
48872
48957
  }
@@ -48885,6 +48970,15 @@ class EditOrgModalComponent {
48885
48970
  </ion-toolbar>
48886
48971
  </ion-header>
48887
48972
  <ion-content class="ion-padding">
48973
+ <div class="logo-upload-wrapper">
48974
+ <val-avatar-upload
48975
+ [props]="{ currentUrl: logoUrl(), initials: orgInitials(), size: 80, editable: true, showViewButton: false }"
48976
+ [customPath]="'orgs/' + (org?.id ?? activeOrgId) + '/logo.jpg'"
48977
+ [customThumbPath]="'orgs/' + (org?.id ?? activeOrgId) + '/thumb.jpg'"
48978
+ [skipBackendSync]="true"
48979
+ (uploaded)="onLogoUploaded($event)"
48980
+ />
48981
+ </div>
48888
48982
  <val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
48889
48983
  <val-title
48890
48984
  [props]="{
@@ -48901,11 +48995,21 @@ class EditOrgModalComponent {
48901
48995
  </ion-button>
48902
48996
  </div>
48903
48997
  </ion-content>
48904
- `, isInline: true, styles: [".modal-close-bottom{margin-top:16px}\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: 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"] }] }); }
48998
+ `, isInline: true, styles: [".modal-close-bottom{margin-top:16px}.logo-upload-wrapper{display:flex;justify-content:center;padding:8px 0 16px}\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: 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"] }, { kind: "component", type: AvatarUploadComponent, selector: "val-avatar-upload", inputs: ["props", "customPath", "customThumbPath", "skipBackendSync"], outputs: ["uploaded", "error", "uploadStart"] }] }); }
48905
48999
  }
48906
49000
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EditOrgModalComponent, decorators: [{
48907
49001
  type: Component,
48908
- args: [{ selector: 'val-edit-org-modal', standalone: true, imports: [IonHeader, IonToolbar, IonButtons, IonButton, IonContent, FormComponent, DisplayComponent, TitleComponent], template: `
49002
+ args: [{ selector: 'val-edit-org-modal', standalone: true, imports: [
49003
+ IonHeader,
49004
+ IonToolbar,
49005
+ IonButtons,
49006
+ IonButton,
49007
+ IonContent,
49008
+ FormComponent,
49009
+ DisplayComponent,
49010
+ TitleComponent,
49011
+ AvatarUploadComponent,
49012
+ ], template: `
48909
49013
  <ion-header>
48910
49014
  <ion-toolbar>
48911
49015
  <ion-buttons slot="end">
@@ -48916,6 +49020,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
48916
49020
  </ion-toolbar>
48917
49021
  </ion-header>
48918
49022
  <ion-content class="ion-padding">
49023
+ <div class="logo-upload-wrapper">
49024
+ <val-avatar-upload
49025
+ [props]="{ currentUrl: logoUrl(), initials: orgInitials(), size: 80, editable: true, showViewButton: false }"
49026
+ [customPath]="'orgs/' + (org?.id ?? activeOrgId) + '/logo.jpg'"
49027
+ [customThumbPath]="'orgs/' + (org?.id ?? activeOrgId) + '/thumb.jpg'"
49028
+ [skipBackendSync]="true"
49029
+ (uploaded)="onLogoUploaded($event)"
49030
+ />
49031
+ </div>
48919
49032
  <val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
48920
49033
  <val-title
48921
49034
  [props]="{
@@ -48932,7 +49045,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
48932
49045
  </ion-button>
48933
49046
  </div>
48934
49047
  </ion-content>
48935
- `, styles: [".modal-close-bottom{margin-top:16px}\n"] }]
49048
+ `, styles: [".modal-close-bottom{margin-top:16px}.logo-upload-wrapper{display:flex;justify-content:center;padding:8px 0 16px}\n"] }]
48936
49049
  }], ctorParameters: () => [], propDecorators: { _modalRef: [{
48937
49050
  type: Input
48938
49051
  }], org: [{
@@ -51769,6 +51882,7 @@ const ORGANIZATION_VIEW_I18N = {
51769
51882
  },
51770
51883
  };
51771
51884
 
51885
+ addIcons({ warningOutline });
51772
51886
  const DEFAULT_NAMESPACE$6 = 'Settings.Organization';
51773
51887
  const DEFAULT_VIEW_PERMISSIONS_ROUTE = '/app/settings/permissions';
51774
51888
  const DEFAULT_API_KEYS_ROUTE = '/app/settings/api-keys';
@@ -52116,9 +52230,21 @@ class OrganizationViewComponent {
52116
52230
  componentProps: {
52117
52231
  showFeatures: false,
52118
52232
  features: [
52119
- { icon: 'code-slash-outline', title: this.tt('apiKeysFeatureAutoTitle'), desc: this.tt('apiKeysFeatureAutoDesc') },
52120
- { icon: 'shield-checkmark-outline', title: this.tt('apiKeysFeaturePermsTitle'), desc: this.tt('apiKeysFeaturePermsDesc') },
52121
- { icon: 'warning-outline', title: this.tt('apiKeysFeatureSecretTitle'), desc: this.tt('apiKeysFeatureSecretDesc') },
52233
+ {
52234
+ icon: 'code-slash-outline',
52235
+ title: this.tt('apiKeysFeatureAutoTitle'),
52236
+ desc: this.tt('apiKeysFeatureAutoDesc'),
52237
+ },
52238
+ {
52239
+ icon: 'shield-checkmark-outline',
52240
+ title: this.tt('apiKeysFeaturePermsTitle'),
52241
+ desc: this.tt('apiKeysFeaturePermsDesc'),
52242
+ },
52243
+ {
52244
+ icon: 'warning-outline',
52245
+ title: this.tt('apiKeysFeatureSecretTitle'),
52246
+ desc: this.tt('apiKeysFeatureSecretDesc'),
52247
+ },
52122
52248
  ],
52123
52249
  title: this.tt('apiKeysInfoTitle'),
52124
52250
  subtitle: this.tt('apiKeysInfoSubtitle'),
@@ -52369,6 +52495,11 @@ class OrganizationViewComponent {
52369
52495
  } @else {
52370
52496
  @if (org(); as o) {
52371
52497
  <div class="org-info-card">
52498
+ @if (o.logoUrl) {
52499
+ <div class="org-info-logo">
52500
+ <img class="org-logo-img" [src]="o.logoUrl" [alt]="o.name" />
52501
+ </div>
52502
+ }
52372
52503
  <div class="org-info-field">
52373
52504
  <span class="org-info-label">{{ tt('infoName') }}</span>
52374
52505
  <span class="org-info-value">{{ o.name }}</span>
@@ -52526,14 +52657,10 @@ class OrganizationViewComponent {
52526
52657
  @if (resolvedConfig().showTransferOwnership && isOwner()) {
52527
52658
  <!-- Transfer ownership: solo owner (gating RBAC interno) -->
52528
52659
  <section class="settings-section" data-testid="org-transfer-section">
52529
- <val-title
52530
- [props]="{
52531
- size: 'medium',
52532
- color: 'dark',
52533
- bold: true,
52534
- content: tt('transferTitle'),
52535
- }"
52536
- />
52660
+ <div class="section-title-danger">
52661
+ <ion-icon name="warning-outline" class="danger-icon" aria-hidden="true"></ion-icon>
52662
+ <val-title [props]="{ size: 'medium', color: 'dark', bold: true, content: tt('transferTitle') }" />
52663
+ </div>
52537
52664
  <div class="section-body">
52538
52665
  <val-text
52539
52666
  [props]="{
@@ -52564,14 +52691,10 @@ class OrganizationViewComponent {
52564
52691
  @if (resolvedConfig().showLeave) {
52565
52692
  <!-- Leave org -->
52566
52693
  <section class="settings-section">
52567
- <val-title
52568
- [props]="{
52569
- size: 'medium',
52570
- color: 'dark',
52571
- bold: true,
52572
- content: tt('leaveTitle'),
52573
- }"
52574
- />
52694
+ <div class="section-title-danger">
52695
+ <ion-icon name="warning-outline" class="danger-icon" aria-hidden="true"></ion-icon>
52696
+ <val-title [props]="{ size: 'medium', color: 'dark', bold: true, content: tt('leaveTitle') }" />
52697
+ </div>
52575
52698
  <div class="section-body">
52576
52699
  <val-text
52577
52700
  [props]="{
@@ -52618,7 +52741,7 @@ class OrganizationViewComponent {
52618
52741
  (dismissed)="permissionsOpen.set(false)"
52619
52742
  />
52620
52743
  </div>
52621
- `, 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}: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)}\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: 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"] }] }); }
52744
+ `, 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"] }] }); }
52622
52745
  }
52623
52746
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrganizationViewComponent, decorators: [{
52624
52747
  type: Component,
@@ -52626,6 +52749,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
52626
52749
  DisplayComponent,
52627
52750
  EmptyStateComponent,
52628
52751
  HasPermissionDirective,
52752
+ IonIcon,
52629
52753
  SkeletonLayoutComponent,
52630
52754
  TitleComponent,
52631
52755
  TextComponent,
@@ -52679,6 +52803,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
52679
52803
  } @else {
52680
52804
  @if (org(); as o) {
52681
52805
  <div class="org-info-card">
52806
+ @if (o.logoUrl) {
52807
+ <div class="org-info-logo">
52808
+ <img class="org-logo-img" [src]="o.logoUrl" [alt]="o.name" />
52809
+ </div>
52810
+ }
52682
52811
  <div class="org-info-field">
52683
52812
  <span class="org-info-label">{{ tt('infoName') }}</span>
52684
52813
  <span class="org-info-value">{{ o.name }}</span>
@@ -52836,14 +52965,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
52836
52965
  @if (resolvedConfig().showTransferOwnership && isOwner()) {
52837
52966
  <!-- Transfer ownership: solo owner (gating RBAC interno) -->
52838
52967
  <section class="settings-section" data-testid="org-transfer-section">
52839
- <val-title
52840
- [props]="{
52841
- size: 'medium',
52842
- color: 'dark',
52843
- bold: true,
52844
- content: tt('transferTitle'),
52845
- }"
52846
- />
52968
+ <div class="section-title-danger">
52969
+ <ion-icon name="warning-outline" class="danger-icon" aria-hidden="true"></ion-icon>
52970
+ <val-title [props]="{ size: 'medium', color: 'dark', bold: true, content: tt('transferTitle') }" />
52971
+ </div>
52847
52972
  <div class="section-body">
52848
52973
  <val-text
52849
52974
  [props]="{
@@ -52874,14 +52999,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
52874
52999
  @if (resolvedConfig().showLeave) {
52875
53000
  <!-- Leave org -->
52876
53001
  <section class="settings-section">
52877
- <val-title
52878
- [props]="{
52879
- size: 'medium',
52880
- color: 'dark',
52881
- bold: true,
52882
- content: tt('leaveTitle'),
52883
- }"
52884
- />
53002
+ <div class="section-title-danger">
53003
+ <ion-icon name="warning-outline" class="danger-icon" aria-hidden="true"></ion-icon>
53004
+ <val-title [props]="{ size: 'medium', color: 'dark', bold: true, content: tt('leaveTitle') }" />
53005
+ </div>
52885
53006
  <div class="section-body">
52886
53007
  <val-text
52887
53008
  [props]="{
@@ -52928,7 +53049,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
52928
53049
  (dismissed)="permissionsOpen.set(false)"
52929
53050
  />
52930
53051
  </div>
52931
- `, 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}: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)}\n"] }]
53052
+ `, 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"] }]
52932
53053
  }], ctorParameters: () => [], propDecorators: { config: [{
52933
53054
  type: Input
52934
53055
  }] } });