valtech-components 4.0.24 → 4.0.26

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 (25) hide show
  1. package/README.md +31 -262
  2. package/esm2022/lib/components/molecules/modal-shell/modal-shell.component.mjs +3 -3
  3. package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +3 -3
  4. package/esm2022/lib/components/organisms/change-password-modal/change-password-modal.component.mjs +5 -5
  5. package/esm2022/lib/components/organisms/create-org-modal/create-org-modal.component.mjs +5 -5
  6. package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.component.mjs +4 -3
  7. package/esm2022/lib/components/organisms/edit-org-modal/edit-org-modal.component.mjs +5 -5
  8. package/esm2022/lib/components/organisms/invite-member-modal/invite-member-modal.component.mjs +7 -5
  9. package/esm2022/lib/components/organisms/member-detail-modal/member-detail-modal.component.mjs +6 -5
  10. package/esm2022/lib/components/organisms/org-info-sheet/org-info-sheet.component.mjs +37 -48
  11. package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +8 -2
  12. package/esm2022/lib/components/organisms/organization-view/organization-view.i18n.mjs +15 -3
  13. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.component.mjs +3 -3
  14. package/esm2022/lib/components/organisms/transfer-ownership-modal/transfer-ownership-modal.component.mjs +7 -7
  15. package/esm2022/lib/services/firebase/messaging.service.mjs +2 -2
  16. package/esm2022/lib/services/refreshable-stream/refreshable-stream.mjs +2 -2
  17. package/esm2022/lib/version.mjs +2 -2
  18. package/fesm2022/valtech-components.mjs +98 -87
  19. package/fesm2022/valtech-components.mjs.map +1 -1
  20. package/lib/components/organisms/article/article.component.d.ts +2 -2
  21. package/lib/components/organisms/landing-steps/landing-steps.component.d.ts +1 -1
  22. package/lib/components/organisms/org-info-sheet/org-info-sheet.component.d.ts +12 -1
  23. package/lib/version.d.ts +1 -1
  24. package/package.json +1 -1
  25. package/src/lib/services/firebase/firebase-messaging-sw.js +0 -145
@@ -25,7 +25,7 @@ import { getApps, getApp, initializeApp as initializeApp$1 } from 'firebase/app'
25
25
  import * as i2$1 from '@ionic/angular/standalone';
26
26
  import { AlertController, IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal, IonHeader, IonToolbar, IonContent, IonButtons, IonTitle, IonProgressBar, IonSkeletonText, IonFab, IonFabButton, IonFabList, IonLabel, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonRadio, IonRadioGroup, IonTextarea, IonDatetime, IonSelect, IonSelectOption, IonPopover, IonList, IonItem, IonInput, IonRange, IonSearchbar, IonSegment, IonSegmentButton, IonToggle, IonRippleEffect, IonAccordion, IonAccordionGroup, IonTabBar, IonTabButton, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonChip, IonNote, IonDatetimeButton, ToastController as ToastController$1, IonCol, IonRow, IonRefresher, IonRefresherContent, IonMenuButton, IonFooter, IonListHeader, IonInfiniteScroll, IonInfiniteScrollContent, IonGrid, MenuController, IonMenu, IonMenuToggle, IonSplitPane } from '@ionic/angular/standalone';
27
27
  import { addIcons } from 'ionicons';
28
- import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, createOutline, trashOutline, playOutline, peopleOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, cloudUploadOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, personOutline, shieldCheckmarkOutline, keyOutline, desktopOutline, logOutOutline, cloudDownloadOutline, cloudOutline, gitBranchOutline, layersOutline, serverOutline, warningOutline, bulbOutline, lockOpenOutline, diamondOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, chevronDown, language, globeOutline, checkmark, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starOutline, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, mailOutline, chevronDownCircleOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, cloudOfflineOutline, documentOutline, attachOutline, cameraOutline, closeCircleOutline, imageOutline, chevronBackOutline, sendOutline, chatbubbleEllipsesOutline, swapVerticalOutline, chevronUpOutline, searchOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, listOutline, folderOutline, documents, documentsOutline, statsChart, statsChartOutline, laptopOutline, swapHorizontalOutline, notificationsOffOutline, alarmOutline, chatboxEllipsesOutline, checkmarkDoneOutline, cogOutline, shareSocialOutline, helpCircleOutline, menuOutline, stopCircleOutline, videocamOffOutline } from 'ionicons/icons';
28
+ import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, createOutline, trashOutline, playOutline, peopleOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, cloudUploadOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, personOutline, shieldCheckmarkOutline, keyOutline, desktopOutline, logOutOutline, cloudDownloadOutline, cloudOutline, gitBranchOutline, layersOutline, serverOutline, warningOutline, bulbOutline, lockOpenOutline, diamondOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, chevronDown, language, globeOutline, checkmark, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starOutline, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, mailOutline, chevronDownCircleOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, cloudOfflineOutline, documentOutline, attachOutline, cameraOutline, closeCircleOutline, imageOutline, chevronBackOutline, sendOutline, chatbubbleEllipsesOutline, swapVerticalOutline, chevronUpOutline, searchOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, listOutline, folderOutline, documents, documentsOutline, statsChart, statsChartOutline, laptopOutline, swapHorizontalOutline, codeSlashOutline, notificationsOffOutline, alarmOutline, chatboxEllipsesOutline, checkmarkDoneOutline, cogOutline, shareSocialOutline, helpCircleOutline, menuOutline, stopCircleOutline, videocamOffOutline } from 'ionicons/icons';
29
29
  import { Browser } from '@capacitor/browser';
30
30
  import * as i1$6 from '@angular/platform-browser';
31
31
  import { DomSanitizer, Meta, Title } from '@angular/platform-browser';
@@ -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.24';
59
+ const VERSION = '4.0.26';
60
60
 
61
61
  // Control de estado de refresco (singleton a nivel de módulo)
62
62
  let isRefreshing = false;
@@ -5499,7 +5499,7 @@ class MessagingService {
5499
5499
  const token = await this.requestPermission();
5500
5500
  if (!token) {
5501
5501
  // requestPermission devuelve null tanto por permiso denegado como por
5502
- // fallo al obtener el token. Distinguimos por el estado del permiso.
5502
+ // fallo al obtener el token. Distivdsmos por el estado del permiso.
5503
5503
  const permission = this.getPermissionState();
5504
5504
  if (permission === 'denied' || permission === 'default') {
5505
5505
  return { status: 'denied', reason: 'Permiso de notificaciones denegado' };
@@ -18493,7 +18493,7 @@ class SearchSelectorComponent {
18493
18493
  <ion-select-option [value]="o.id">{{ o.name }}</ion-select-option>
18494
18494
  }
18495
18495
  </ion-select>
18496
- `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-select{--padding-top: 0;--padding-bottom: 0;--padding-start: 0;--padding-end: 0;min-height:auto;border:.0625rem solid var(--ion-color-medium);border-radius:.625rem;margin-top:.375rem;padding-top:.5rem!important;padding-bottom:.5rem!important;padding-inline-start:1rem!important;padding-inline-end:.625rem!important}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }] }); }
18496
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-select{--padding-top: 0;--padding-bottom: 0;--padding-start: 0;--padding-end: 0;min-height:auto;border:.0625rem solid var(--ion-color-medium);border-radius:1.5rem;margin-top:.375rem;padding-top:.5rem!important;padding-bottom:.5rem!important;padding-inline-start:1rem!important;padding-inline-end:.625rem!important}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }] }); }
18497
18497
  }
18498
18498
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SearchSelectorComponent, decorators: [{
18499
18499
  type: Component,
@@ -18511,7 +18511,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
18511
18511
  <ion-select-option [value]="o.id">{{ o.name }}</ion-select-option>
18512
18512
  }
18513
18513
  </ion-select>
18514
- `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-select{--padding-top: 0;--padding-bottom: 0;--padding-start: 0;--padding-end: 0;min-height:auto;border:.0625rem solid var(--ion-color-medium);border-radius:.625rem;margin-top:.375rem;padding-top:.5rem!important;padding-bottom:.5rem!important;padding-inline-start:1rem!important;padding-inline-end:.625rem!important}\n"] }]
18514
+ `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-select{--padding-top: 0;--padding-bottom: 0;--padding-start: 0;--padding-end: 0;min-height:auto;border:.0625rem solid var(--ion-color-medium);border-radius:1.5rem;margin-top:.375rem;padding-top:.5rem!important;padding-bottom:.5rem!important;padding-inline-start:1rem!important;padding-inline-end:.625rem!important}\n"] }]
18515
18515
  }], propDecorators: { preset: [{
18516
18516
  type: Input
18517
18517
  }], props: [{
@@ -29795,7 +29795,7 @@ class ModalShellComponent {
29795
29795
  <ion-toolbar>
29796
29796
  @if (showClose()) {
29797
29797
  <ion-buttons slot="end">
29798
- <ion-button fill="clear" color="dark" (click)="onClose()">
29798
+ <ion-button fill="clear" color="dark" shape="round" (click)="onClose()">
29799
29799
  <strong>{{ resolvedCloseLabel() }}</strong>
29800
29800
  </ion-button>
29801
29801
  </ion-buttons>
@@ -29820,7 +29820,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
29820
29820
  <ion-toolbar>
29821
29821
  @if (showClose()) {
29822
29822
  <ion-buttons slot="end">
29823
- <ion-button fill="clear" color="dark" (click)="onClose()">
29823
+ <ion-button fill="clear" color="dark" shape="round" (click)="onClose()">
29824
29824
  <strong>{{ resolvedCloseLabel() }}</strong>
29825
29825
  </ion-button>
29826
29826
  </ion-buttons>
@@ -33391,7 +33391,7 @@ class ChangePasswordModalComponent {
33391
33391
  },
33392
33392
  ],
33393
33393
  actions: {
33394
- ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
33394
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block', shape: 'round' }),
33395
33395
  token: 'set-submit',
33396
33396
  textKey: 'setPasswordSubmit',
33397
33397
  },
@@ -33425,7 +33425,7 @@ class ChangePasswordModalComponent {
33425
33425
  },
33426
33426
  ],
33427
33427
  actions: {
33428
- ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
33428
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block', shape: 'round' }),
33429
33429
  token: 'change-submit',
33430
33430
  textKey: 'changePasswordSubmit',
33431
33431
  },
@@ -33564,11 +33564,11 @@ class ChangePasswordModalComponent {
33564
33564
  this.toast.show({ message, duration: 3500 });
33565
33565
  }
33566
33566
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChangePasswordModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33567
- 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()\">\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 (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"] }] }); }
33567
+ 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()\">\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"] }] }); }
33568
33568
  }
33569
33569
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChangePasswordModalComponent, decorators: [{
33570
33570
  type: Component,
33571
- args: [{ selector: 'val-change-password-modal', standalone: true, imports: [IonButton, IonButtons, IonContent, IonHeader, IonModal, IonSpinner, IonToolbar, FormComponent], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (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"] }]
33571
+ args: [{ selector: 'val-change-password-modal', standalone: true, imports: [IonButton, IonButtons, IonContent, IonHeader, IonModal, IonSpinner, IonToolbar, FormComponent], template: "<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" 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"] }]
33572
33572
  }], propDecorators: { isOpen: [{
33573
33573
  type: Input
33574
33574
  }], changed: [{
@@ -46822,7 +46822,7 @@ class CreateOrgModalComponent {
46822
46822
  <ion-header>
46823
46823
  <ion-toolbar>
46824
46824
  <ion-buttons slot="end">
46825
- <ion-button fill="clear" color="dark" (click)="dismiss()">
46825
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
46826
46826
  <strong>{{ t('close') }}</strong>
46827
46827
  </ion-button>
46828
46828
  </ion-buttons>
@@ -46840,7 +46840,7 @@ class CreateOrgModalComponent {
46840
46840
  />
46841
46841
  <val-form [props]="formMeta()" (onSubmit)="onSubmit($event)" />
46842
46842
  <div class="modal-close-bottom">
46843
- <ion-button expand="block" fill="outline" color="dark" (click)="dismiss()">
46843
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="dismiss()">
46844
46844
  {{ t('close') }}
46845
46845
  </ion-button>
46846
46846
  </div>
@@ -46853,7 +46853,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
46853
46853
  <ion-header>
46854
46854
  <ion-toolbar>
46855
46855
  <ion-buttons slot="end">
46856
- <ion-button fill="clear" color="dark" (click)="dismiss()">
46856
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
46857
46857
  <strong>{{ t('close') }}</strong>
46858
46858
  </ion-button>
46859
46859
  </ion-buttons>
@@ -46871,7 +46871,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
46871
46871
  />
46872
46872
  <val-form [props]="formMeta()" (onSubmit)="onSubmit($event)" />
46873
46873
  <div class="modal-close-bottom">
46874
- <ion-button expand="block" fill="outline" color="dark" (click)="dismiss()">
46874
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="dismiss()">
46875
46875
  {{ t('close') }}
46876
46876
  </ion-button>
46877
46877
  </div>
@@ -47035,6 +47035,7 @@ class DeleteAccountModalComponent {
47035
47035
  fill: 'solid',
47036
47036
  color: 'dark',
47037
47037
  size: 'default',
47038
+ shape: 'round',
47038
47039
  token,
47039
47040
  state: ComponentStates.ENABLED,
47040
47041
  };
@@ -47104,7 +47105,7 @@ class DeleteAccountModalComponent {
47104
47105
  <ion-header>
47105
47106
  <ion-toolbar>
47106
47107
  <ion-buttons slot="end">
47107
- <ion-button fill="clear" color="dark" (click)="close()">
47108
+ <ion-button fill="clear" color="dark" shape="round" (click)="close()">
47108
47109
  <strong>{{ t('close') }}</strong>
47109
47110
  </ion-button>
47110
47111
  </ion-buttons>
@@ -47145,7 +47146,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
47145
47146
  <ion-header>
47146
47147
  <ion-toolbar>
47147
47148
  <ion-buttons slot="end">
47148
- <ion-button fill="clear" color="dark" (click)="close()">
47149
+ <ion-button fill="clear" color="dark" shape="round" (click)="close()">
47149
47150
  <strong>{{ t('close') }}</strong>
47150
47151
  </ion-button>
47151
47152
  </ion-buttons>
@@ -47270,7 +47271,18 @@ class OrgInfoSheetComponent {
47270
47271
  ...this.closeProps,
47271
47272
  text: this.closeProps.text || this.resolvedCloseLabel(),
47272
47273
  }));
47273
- addIcons({ peopleOutline, swapHorizontalOutline, mailOutline });
47274
+ this.resolvedFeatures = computed(() => {
47275
+ if (this.features?.length)
47276
+ return this.features;
47277
+ if (!this.showFeatures)
47278
+ return [];
47279
+ return [
47280
+ { icon: 'people-outline', title: this.tt('featureCollabTitle'), desc: this.tt('featureCollabDesc') },
47281
+ { icon: 'swap-horizontal-outline', title: this.tt('featureSwitchTitle'), desc: this.tt('featureSwitchDesc') },
47282
+ { icon: 'mail-outline', title: this.tt('featureInviteTitle'), desc: this.tt('featureInviteDesc') },
47283
+ ];
47284
+ });
47285
+ addIcons({ peopleOutline, swapHorizontalOutline, mailOutline, codeSlashOutline, shieldCheckmarkOutline, warningOutline });
47274
47286
  if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE$f)) {
47275
47287
  this.i18n.registerContent(DEFAULT_NAMESPACE$f, ORG_INFO_SHEET_I18N);
47276
47288
  }
@@ -47282,11 +47294,11 @@ class OrgInfoSheetComponent {
47282
47294
  return this.i18n.t(key, DEFAULT_NAMESPACE$f);
47283
47295
  }
47284
47296
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrgInfoSheetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
47285
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: OrgInfoSheetComponent, isStandalone: true, selector: "val-org-info-sheet", inputs: { title: "title", subtitle: "subtitle", body: "body", closeLabel: "closeLabel", showFeatures: "showFeatures", closeProps: "closeProps", _modalRef: "_modalRef" }, ngImport: i0, template: `
47297
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: OrgInfoSheetComponent, isStandalone: true, selector: "val-org-info-sheet", inputs: { title: "title", subtitle: "subtitle", body: "body", closeLabel: "closeLabel", showFeatures: "showFeatures", features: "features", closeProps: "closeProps", _modalRef: "_modalRef" }, ngImport: i0, template: `
47286
47298
  <ion-header>
47287
47299
  <ion-toolbar>
47288
47300
  <ion-buttons slot="end">
47289
- <ion-button fill="clear" color="dark" (click)="dismiss()">
47301
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
47290
47302
  <strong>{{ resolvedCloseLabel() }}</strong>
47291
47303
  </ion-button>
47292
47304
  </ion-buttons>
@@ -47297,29 +47309,17 @@ class OrgInfoSheetComponent {
47297
47309
  <val-display [props]="{ content: resolvedTitle(), size: 'small', color: 'dark' }" />
47298
47310
  <val-title [props]="{ content: resolvedSubtitle(), size: 'large', color: '', bold: false }" />
47299
47311
 
47300
- @if (showFeatures) {
47312
+ @if (resolvedFeatures().length > 0) {
47301
47313
  <div class="info-features">
47302
- <div class="info-feature">
47303
- <ion-icon name="people-outline" class="info-feature__icon" />
47304
- <div>
47305
- <div class="info-feature__title">{{ tt('featureCollabTitle') }}</div>
47306
- <div class="info-feature__desc">{{ tt('featureCollabDesc') }}</div>
47307
- </div>
47308
- </div>
47309
- <div class="info-feature">
47310
- <ion-icon name="swap-horizontal-outline" class="info-feature__icon" />
47311
- <div>
47312
- <div class="info-feature__title">{{ tt('featureSwitchTitle') }}</div>
47313
- <div class="info-feature__desc">{{ tt('featureSwitchDesc') }}</div>
47314
- </div>
47315
- </div>
47316
- <div class="info-feature">
47317
- <ion-icon name="mail-outline" class="info-feature__icon" />
47318
- <div>
47319
- <div class="info-feature__title">{{ tt('featureInviteTitle') }}</div>
47320
- <div class="info-feature__desc">{{ tt('featureInviteDesc') }}</div>
47314
+ @for (f of resolvedFeatures(); track $index) {
47315
+ <div class="info-feature">
47316
+ <ion-icon [name]="f.icon" class="info-feature__icon" />
47317
+ <div>
47318
+ <div class="info-feature__title">{{ f.title }}</div>
47319
+ <div class="info-feature__desc">{{ f.desc }}</div>
47320
+ </div>
47321
47321
  </div>
47322
- </div>
47322
+ }
47323
47323
  </div>
47324
47324
  }
47325
47325
 
@@ -47357,7 +47357,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
47357
47357
  <ion-header>
47358
47358
  <ion-toolbar>
47359
47359
  <ion-buttons slot="end">
47360
- <ion-button fill="clear" color="dark" (click)="dismiss()">
47360
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
47361
47361
  <strong>{{ resolvedCloseLabel() }}</strong>
47362
47362
  </ion-button>
47363
47363
  </ion-buttons>
@@ -47368,29 +47368,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
47368
47368
  <val-display [props]="{ content: resolvedTitle(), size: 'small', color: 'dark' }" />
47369
47369
  <val-title [props]="{ content: resolvedSubtitle(), size: 'large', color: '', bold: false }" />
47370
47370
 
47371
- @if (showFeatures) {
47371
+ @if (resolvedFeatures().length > 0) {
47372
47372
  <div class="info-features">
47373
- <div class="info-feature">
47374
- <ion-icon name="people-outline" class="info-feature__icon" />
47375
- <div>
47376
- <div class="info-feature__title">{{ tt('featureCollabTitle') }}</div>
47377
- <div class="info-feature__desc">{{ tt('featureCollabDesc') }}</div>
47378
- </div>
47379
- </div>
47380
- <div class="info-feature">
47381
- <ion-icon name="swap-horizontal-outline" class="info-feature__icon" />
47382
- <div>
47383
- <div class="info-feature__title">{{ tt('featureSwitchTitle') }}</div>
47384
- <div class="info-feature__desc">{{ tt('featureSwitchDesc') }}</div>
47385
- </div>
47386
- </div>
47387
- <div class="info-feature">
47388
- <ion-icon name="mail-outline" class="info-feature__icon" />
47389
- <div>
47390
- <div class="info-feature__title">{{ tt('featureInviteTitle') }}</div>
47391
- <div class="info-feature__desc">{{ tt('featureInviteDesc') }}</div>
47373
+ @for (f of resolvedFeatures(); track $index) {
47374
+ <div class="info-feature">
47375
+ <ion-icon [name]="f.icon" class="info-feature__icon" />
47376
+ <div>
47377
+ <div class="info-feature__title">{{ f.title }}</div>
47378
+ <div class="info-feature__desc">{{ f.desc }}</div>
47379
+ </div>
47392
47380
  </div>
47393
- </div>
47381
+ }
47394
47382
  </div>
47395
47383
  }
47396
47384
 
@@ -47420,6 +47408,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
47420
47408
  type: Input
47421
47409
  }], showFeatures: [{
47422
47410
  type: Input
47411
+ }], features: [{
47412
+ type: Input
47423
47413
  }], closeProps: [{
47424
47414
  type: Input
47425
47415
  }], _modalRef: [{
@@ -47545,7 +47535,7 @@ class SwitchOrgModalComponent {
47545
47535
  <ion-header>
47546
47536
  <ion-toolbar>
47547
47537
  <ion-buttons slot="end">
47548
- <ion-button fill="clear" color="dark" (click)="dismiss()">
47538
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
47549
47539
  <strong>{{ t('close') }}</strong>
47550
47540
  </ion-button>
47551
47541
  </ion-buttons>
@@ -47636,7 +47626,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
47636
47626
  <ion-header>
47637
47627
  <ion-toolbar>
47638
47628
  <ion-buttons slot="end">
47639
- <ion-button fill="clear" color="dark" (click)="dismiss()">
47629
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
47640
47630
  <strong>{{ t('close') }}</strong>
47641
47631
  </ion-button>
47642
47632
  </ion-buttons>
@@ -48803,7 +48793,7 @@ class EditOrgModalComponent {
48803
48793
  <ion-header>
48804
48794
  <ion-toolbar>
48805
48795
  <ion-buttons slot="end">
48806
- <ion-button fill="clear" color="dark" (click)="dismiss()">
48796
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
48807
48797
  <strong>{{ t('close') }}</strong>
48808
48798
  </ion-button>
48809
48799
  </ion-buttons>
@@ -48821,7 +48811,7 @@ class EditOrgModalComponent {
48821
48811
  />
48822
48812
  <val-form [props]="formMeta()" (onSubmit)="onFormSubmit($event)" />
48823
48813
  <div class="modal-close-bottom">
48824
- <ion-button expand="block" fill="outline" color="dark" (click)="dismiss()">
48814
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="dismiss()">
48825
48815
  {{ t('close') }}
48826
48816
  </ion-button>
48827
48817
  </div>
@@ -48834,7 +48824,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
48834
48824
  <ion-header>
48835
48825
  <ion-toolbar>
48836
48826
  <ion-buttons slot="end">
48837
- <ion-button fill="clear" color="dark" (click)="dismiss()">
48827
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
48838
48828
  <strong>{{ t('close') }}</strong>
48839
48829
  </ion-button>
48840
48830
  </ion-buttons>
@@ -48852,7 +48842,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
48852
48842
  />
48853
48843
  <val-form [props]="formMeta()" (onSubmit)="onFormSubmit($event)" />
48854
48844
  <div class="modal-close-bottom">
48855
- <ion-button expand="block" fill="outline" color="dark" (click)="dismiss()">
48845
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="dismiss()">
48856
48846
  {{ t('close') }}
48857
48847
  </ion-button>
48858
48848
  </div>
@@ -48982,6 +48972,7 @@ class InviteMemberModalComponent {
48982
48972
  fill: 'solid',
48983
48973
  expand: 'block',
48984
48974
  size: 'default',
48975
+ shape: 'round',
48985
48976
  type: 'button',
48986
48977
  state: this.sending() ? ComponentStates.WORKING : ComponentStates.ENABLED,
48987
48978
  }));
@@ -48992,6 +48983,7 @@ class InviteMemberModalComponent {
48992
48983
  fill: 'solid',
48993
48984
  expand: 'block',
48994
48985
  size: 'default',
48986
+ shape: 'round',
48995
48987
  type: 'button',
48996
48988
  state: this.sending() ? ComponentStates.WORKING : ComponentStates.ENABLED,
48997
48989
  }));
@@ -49164,7 +49156,7 @@ class InviteMemberModalComponent {
49164
49156
  <ion-header>
49165
49157
  <ion-toolbar>
49166
49158
  <ion-buttons slot="end">
49167
- <ion-button fill="clear" color="dark" (click)="dismiss()">
49159
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
49168
49160
  <strong>{{ t('close') }}</strong>
49169
49161
  </ion-button>
49170
49162
  </ion-buttons>
@@ -49276,7 +49268,7 @@ class InviteMemberModalComponent {
49276
49268
  </div>
49277
49269
 
49278
49270
  <div class="modal-close-bottom">
49279
- <ion-button expand="block" fill="outline" color="dark" (click)="dismiss()">
49271
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="dismiss()">
49280
49272
  {{ t('close') }}
49281
49273
  </ion-button>
49282
49274
  </div>
@@ -49305,7 +49297,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49305
49297
  <ion-header>
49306
49298
  <ion-toolbar>
49307
49299
  <ion-buttons slot="end">
49308
- <ion-button fill="clear" color="dark" (click)="dismiss()">
49300
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
49309
49301
  <strong>{{ t('close') }}</strong>
49310
49302
  </ion-button>
49311
49303
  </ion-buttons>
@@ -49417,7 +49409,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49417
49409
  </div>
49418
49410
 
49419
49411
  <div class="modal-close-bottom">
49420
- <ion-button expand="block" fill="outline" color="dark" (click)="dismiss()">
49412
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="dismiss()">
49421
49413
  {{ t('close') }}
49422
49414
  </ion-button>
49423
49415
  </div>
@@ -49697,6 +49689,7 @@ class MemberDetailModalComponent {
49697
49689
  fill: 'outline',
49698
49690
  expand: 'block',
49699
49691
  size: 'default',
49692
+ shape: 'round',
49700
49693
  type: 'button',
49701
49694
  state: this.working() ? ComponentStates.WORKING : ComponentStates.ENABLED,
49702
49695
  }));
@@ -49814,7 +49807,7 @@ class MemberDetailModalComponent {
49814
49807
  <ion-header>
49815
49808
  <ion-toolbar>
49816
49809
  <ion-buttons slot="end">
49817
- <ion-button fill="clear" color="dark" (click)="dismiss()">
49810
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
49818
49811
  <strong>{{ t('close') }}</strong>
49819
49812
  </ion-button>
49820
49813
  </ion-buttons>
@@ -49885,7 +49878,7 @@ class MemberDetailModalComponent {
49885
49878
  }
49886
49879
 
49887
49880
  <div class="modal-close-bottom">
49888
- <ion-button expand="block" fill="outline" color="dark" (click)="dismiss()">
49881
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="dismiss()">
49889
49882
  {{ t('close') }}
49890
49883
  </ion-button>
49891
49884
  </div>
@@ -49911,7 +49904,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49911
49904
  <ion-header>
49912
49905
  <ion-toolbar>
49913
49906
  <ion-buttons slot="end">
49914
- <ion-button fill="clear" color="dark" (click)="dismiss()">
49907
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
49915
49908
  <strong>{{ t('close') }}</strong>
49916
49909
  </ion-button>
49917
49910
  </ion-buttons>
@@ -49982,7 +49975,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
49982
49975
  }
49983
49976
 
49984
49977
  <div class="modal-close-bottom">
49985
- <ion-button expand="block" fill="outline" color="dark" (click)="dismiss()">
49978
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="dismiss()">
49986
49979
  {{ t('close') }}
49987
49980
  </ion-button>
49988
49981
  </div>
@@ -50094,7 +50087,7 @@ class TransferOwnershipModalComponent {
50094
50087
  <ion-header>
50095
50088
  <ion-toolbar>
50096
50089
  <ion-buttons slot="end">
50097
- <ion-button fill="clear" color="dark" (click)="dismiss()">
50090
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
50098
50091
  <strong>{{ t('close') }}</strong>
50099
50092
  </ion-button>
50100
50093
  </ion-buttons>
@@ -50154,13 +50147,13 @@ class TransferOwnershipModalComponent {
50154
50147
  }
50155
50148
 
50156
50149
  <div class="transfer-confirm-row">
50157
- <ion-button expand="block" color="dark" [disabled]="!selectedId()" (click)="confirm()">
50150
+ <ion-button expand="block" color="dark" shape="round" [disabled]="!selectedId()" (click)="confirm()">
50158
50151
  {{ t('confirmCta') }}
50159
50152
  </ion-button>
50160
50153
  </div>
50161
50154
 
50162
50155
  <div class="modal-close-bottom">
50163
- <ion-button expand="block" fill="outline" color="dark" (click)="dismiss()">
50156
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="dismiss()">
50164
50157
  {{ t('close') }}
50165
50158
  </ion-button>
50166
50159
  </div>
@@ -50183,7 +50176,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50183
50176
  <ion-header>
50184
50177
  <ion-toolbar>
50185
50178
  <ion-buttons slot="end">
50186
- <ion-button fill="clear" color="dark" (click)="dismiss()">
50179
+ <ion-button fill="clear" color="dark" shape="round" (click)="dismiss()">
50187
50180
  <strong>{{ t('close') }}</strong>
50188
50181
  </ion-button>
50189
50182
  </ion-buttons>
@@ -50243,13 +50236,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50243
50236
  }
50244
50237
 
50245
50238
  <div class="transfer-confirm-row">
50246
- <ion-button expand="block" color="dark" [disabled]="!selectedId()" (click)="confirm()">
50239
+ <ion-button expand="block" color="dark" shape="round" [disabled]="!selectedId()" (click)="confirm()">
50247
50240
  {{ t('confirmCta') }}
50248
50241
  </ion-button>
50249
50242
  </div>
50250
50243
 
50251
50244
  <div class="modal-close-bottom">
50252
- <ion-button expand="block" fill="outline" color="dark" (click)="dismiss()">
50245
+ <ion-button expand="block" fill="outline" color="dark" shape="round" (click)="dismiss()">
50253
50246
  {{ t('close') }}
50254
50247
  </ion-button>
50255
50248
  </div>
@@ -50873,8 +50866,14 @@ const ORGANIZATION_VIEW_I18N = {
50873
50866
  apiKeysMoreInfo: 'Más información',
50874
50867
  apiKeysInfoTitle: 'Integraciones por API',
50875
50868
  apiKeysInfoSubtitle: '¿Qué puedes hacer con una API Key?',
50876
- apiKeysInfoContent: 'Una API Key te permite automatizar operaciones en tu organización desde tus propios sistemas, sin abrir la app. Es ideal para integraciones máquina-a-máquina: sincronizar usuarios desde tu ERP, asignar roles en masa o consultar datos desde tus reportes internos.\n\nCon una key puedes dar de alta y gestionar miembros, asignar roles y permisos, leer datos de la organización y conectar flujos de trabajo existentes.\n\nCada key lleva solo los permisos que tú le asignes — concede el mínimo necesario y revócala en cualquier momento desde la sección Integraciones.\n\nImportante: el secreto se muestra una sola vez al crear la key. Guárdalo en un lugar seguro (gestor de secretos, variable de entorno). Si lo pierdes, genera una nueva key y revoca la anterior.',
50869
+ apiKeysInfoContent: 'Revoca cualquier key en cualquier momento desde la sección Integraciones.',
50877
50870
  apiKeysInfoClose: 'Cerrar',
50871
+ apiKeysFeatureAutoTitle: 'Automatización',
50872
+ apiKeysFeatureAutoDesc: 'Conecta tus sistemas externos directamente, sin abrir la app.',
50873
+ apiKeysFeaturePermsTitle: 'Permisos a medida',
50874
+ apiKeysFeaturePermsDesc: 'Cada key lleva solo los permisos que tú le asignes — concede el mínimo.',
50875
+ apiKeysFeatureSecretTitle: 'Secreto único',
50876
+ apiKeysFeatureSecretDesc: 'El secreto se muestra una sola vez. Guárdalo en un gestor de secretos.',
50878
50877
  orgsMoreInfo: 'Aprender más sobre organizaciones',
50879
50878
  orgsInfoTitle: '¿Qué son las organizaciones?',
50880
50879
  orgsInfoSubtitle: 'Todo lo que necesitas saber',
@@ -50956,8 +50955,14 @@ const ORGANIZATION_VIEW_I18N = {
50956
50955
  apiKeysMoreInfo: 'More information',
50957
50956
  apiKeysInfoTitle: 'API integrations',
50958
50957
  apiKeysInfoSubtitle: 'What can you do with an API Key?',
50959
- apiKeysInfoContent: 'An API Key lets you automate operations in your organization from your own systems, without opening the app. It is ideal for machine-to-machine integrations: sync users from your ERP, bulk-assign roles, or query data for your internal reports.\n\nWith a key you can provision and manage members, assign roles and permissions, read organization data, and connect existing workflows.\n\nEach key carries only the permissions you assign — grant the minimum needed and revoke it at any time from the Integrations section.\n\nImportant: the secret is shown only once when the key is created. Store it somewhere safe (secret manager, environment variable). If you lose it, create a new key and revoke the old one.',
50958
+ apiKeysInfoContent: 'Revoke any key at any time from the Integrations section.',
50960
50959
  apiKeysInfoClose: 'Close',
50960
+ apiKeysFeatureAutoTitle: 'Automation',
50961
+ apiKeysFeatureAutoDesc: 'Connect your external systems directly, without opening the app.',
50962
+ apiKeysFeaturePermsTitle: 'Custom permissions',
50963
+ apiKeysFeaturePermsDesc: 'Each key carries only the permissions you assign — grant the minimum.',
50964
+ apiKeysFeatureSecretTitle: 'One-time secret',
50965
+ apiKeysFeatureSecretDesc: 'The secret is shown only once. Store it in a secret manager.',
50961
50966
  orgsMoreInfo: 'Learn more about organizations',
50962
50967
  orgsInfoTitle: 'What are organizations?',
50963
50968
  orgsInfoSubtitle: 'Everything you need to know',
@@ -51187,7 +51192,7 @@ class OrganizationViewComponent {
51187
51192
  this.openApiKeysButtonProps = computed(() => ({
51188
51193
  text: this.tt('apiKeysOpen'),
51189
51194
  color: 'dark',
51190
- fill: 'clear',
51195
+ fill: 'outline',
51191
51196
  size: 'default',
51192
51197
  shape: 'round',
51193
51198
  type: 'button',
@@ -51332,6 +51337,11 @@ class OrganizationViewComponent {
51332
51337
  component: OrgInfoSheetComponent,
51333
51338
  componentProps: {
51334
51339
  showFeatures: false,
51340
+ features: [
51341
+ { icon: 'code-slash-outline', title: this.tt('apiKeysFeatureAutoTitle'), desc: this.tt('apiKeysFeatureAutoDesc') },
51342
+ { icon: 'shield-checkmark-outline', title: this.tt('apiKeysFeaturePermsTitle'), desc: this.tt('apiKeysFeaturePermsDesc') },
51343
+ { icon: 'warning-outline', title: this.tt('apiKeysFeatureSecretTitle'), desc: this.tt('apiKeysFeatureSecretDesc') },
51344
+ ],
51335
51345
  title: this.tt('apiKeysInfoTitle'),
51336
51346
  subtitle: this.tt('apiKeysInfoSubtitle'),
51337
51347
  body: this.tt('apiKeysInfoContent'),
@@ -51343,6 +51353,7 @@ class OrganizationViewComponent {
51343
51353
  size: 'default',
51344
51354
  expand: 'block',
51345
51355
  type: 'button',
51356
+ shape: 'round',
51346
51357
  },
51347
51358
  },
51348
51359
  breakpoints: { breakpoints: [0, 0.92], initialBreakpoint: 0.92, showHandle: true },
@@ -54458,7 +54469,7 @@ function createRefreshableStream(factory, options) {
54458
54469
  // sesión NUNCA se establece (token inválido, signInWithFirebase falló), el
54459
54470
  // gate igual se libera tras `authGateTimeoutMs` y la factory procede: si no
54460
54471
  // hay permiso terminará en estado `error`, jamás en skeleton infinito.
54461
- // Tag los dos inputs del `race` para distinguir en logs cuál ganó: la sesión
54472
+ // Tag los dos inputs del `race` para distivdsr en logs cuál ganó: la sesión
54462
54473
  // de Firebase Auth (`auth-ready`) o el timeout de seguridad (`timeout`).
54463
54474
  const authGate$ = firebase
54464
54475
  ? race(firebase.firebaseAuthReady$.pipe(map$1(() => 'auth-ready')), timer(authGateTimeoutMs).pipe(map$1(() => 'timeout'))).pipe(take(1), tap(winner => {