valtech-components 2.0.972 → 2.0.975

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/esm2022/lib/components/organisms/profile-view/profile-view.component.mjs +59 -2
  2. package/esm2022/lib/components/organisms/profile-view/profile-view.i18n.mjs +7 -1
  3. package/esm2022/lib/components/organisms/profile-view/types.mjs +1 -1
  4. package/esm2022/lib/components/organisms/settings-hub/settings-hub.component.mjs +152 -0
  5. package/esm2022/lib/components/organisms/settings-hub/settings-hub.i18n.mjs +57 -0
  6. package/esm2022/lib/components/organisms/settings-hub/settings-sections.mjs +137 -0
  7. package/esm2022/lib/components/organisms/settings-hub/settings.routes.mjs +59 -0
  8. package/esm2022/lib/components/organisms/settings-hub/types.mjs +2 -0
  9. package/esm2022/lib/components/organisms/share-profile-modal/share-profile-modal.component.mjs +13 -5
  10. package/esm2022/lib/components/organisms/share-profile-modal/types.mjs +1 -1
  11. package/esm2022/lib/version.mjs +2 -2
  12. package/esm2022/public-api.mjs +5 -1
  13. package/fesm2022/valtech-components.mjs +467 -7
  14. package/fesm2022/valtech-components.mjs.map +1 -1
  15. package/lib/components/organisms/profile-view/profile-view.component.d.ts +6 -1
  16. package/lib/components/organisms/profile-view/types.d.ts +12 -0
  17. package/lib/components/organisms/settings-hub/settings-hub.component.d.ts +43 -0
  18. package/lib/components/organisms/settings-hub/settings-hub.i18n.d.ts +13 -0
  19. package/lib/components/organisms/settings-hub/settings-sections.d.ts +62 -0
  20. package/lib/components/organisms/settings-hub/settings.routes.d.ts +59 -0
  21. package/lib/components/organisms/settings-hub/types.d.ts +37 -0
  22. package/lib/components/organisms/share-profile-modal/types.d.ts +2 -0
  23. package/lib/version.d.ts +1 -1
  24. package/package.json +1 -1
  25. package/public-api.d.ts +4 -0
@@ -54,7 +54,7 @@ import 'prismjs/components/prism-json';
54
54
  * Current version of valtech-components.
55
55
  * This is automatically updated during the publish process.
56
56
  */
57
- const VERSION = '2.0.972';
57
+ const VERSION = '2.0.975';
58
58
 
59
59
  // Control de estado de refresco (singleton a nivel de módulo)
60
60
  let isRefreshing = false;
@@ -32849,6 +32849,9 @@ class ShareProfileModalComponent {
32849
32849
  [props]="{ name: config().name, avatarUrl: config().avatarUrl, email: config().email, size: 'xlarge' }"
32850
32850
  />
32851
32851
  <val-display [props]="{ content: displayName(), size: 'small', color: 'dark' }" />
32852
+ @if (config().handle) {
32853
+ <p class="share-profile__handle">{{ '@' + config().handle }}</p>
32854
+ }
32852
32855
 
32853
32856
  <div class="share-profile__qr">
32854
32857
  @if (qr(); as qrResult) {
@@ -32876,7 +32879,8 @@ class ShareProfileModalComponent {
32876
32879
  shareData: { title: config().shareTitle || config().name, text: config().shareText, url: config().url },
32877
32880
  platforms: config().platforms,
32878
32881
  layout: 'horizontal',
32879
- variant: 'icon-only',
32882
+ variant: 'outline',
32883
+ color: 'dark',
32880
32884
  usePlatformColors: false,
32881
32885
  }"
32882
32886
  (shareComplete)="shared.emit($event)"
@@ -32885,7 +32889,7 @@ class ShareProfileModalComponent {
32885
32889
  </val-modal-shell>
32886
32890
  </ng-template>
32887
32891
  </ion-modal>
32888
- `, isInline: true, styles: [".share-profile{display:flex;flex-direction:column;align-items:center;gap:1rem;padding:.5rem 0 1rem;text-align:center}.share-profile__name{margin:0;font-size:1.5rem;font-weight:700;line-height:1.2;color:var(--ion-text-color)}.share-profile__qr{display:flex;justify-content:center}.share-profile__qr-loading{display:flex;align-items:center;justify-content:center;min-width:120px}.share-profile__qr-error{margin:0;padding:1rem;max-width:28ch;word-break:break-all;font-size:.9rem;font-weight:600;color:var(--ion-color-medium-shade)}.share-profile__caption{margin:0;max-width:32ch;font-size:.95rem;line-height:1.45;color:var(--ion-color-medium-shade)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: ModalShellComponent, selector: "val-modal-shell", inputs: ["title", "subtitle", "closeLabel", "showClose"], outputs: ["close"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: UserAvatarComponent, selector: "val-user-avatar", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: QrCodeComponent, selector: "val-qr-code", inputs: ["props"], outputs: ["actionComplete", "imageLoad", "imageError"] }, { kind: "component", type: ShareButtonsComponent, selector: "val-share-buttons", inputs: ["props"], outputs: ["shareComplete"] }] }); }
32892
+ `, isInline: true, styles: [".share-profile{display:flex;flex-direction:column;align-items:center;gap:1rem;padding:.5rem 0 1rem;text-align:center}.share-profile__name{margin:0;font-size:1.5rem;font-weight:700;line-height:1.2;color:var(--ion-text-color)}.share-profile__handle{margin:-.5rem 0 0;font-size:.875rem;font-weight:500;color:var(--ion-color-medium-shade);letter-spacing:.01em}.share-profile__qr{display:flex;justify-content:center}.share-profile__qr-loading{display:flex;align-items:center;justify-content:center;min-width:120px}.share-profile__qr-error{margin:0;padding:1rem;max-width:28ch;word-break:break-all;font-size:.9rem;font-weight:600;color:var(--ion-color-medium-shade)}.share-profile__caption{margin:0;max-width:32ch;font-size:.95rem;line-height:1.45;color:var(--ion-color-medium-shade)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: ModalShellComponent, selector: "val-modal-shell", inputs: ["title", "subtitle", "closeLabel", "showClose"], outputs: ["close"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: UserAvatarComponent, selector: "val-user-avatar", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: QrCodeComponent, selector: "val-qr-code", inputs: ["props"], outputs: ["actionComplete", "imageLoad", "imageError"] }, { kind: "component", type: ShareButtonsComponent, selector: "val-share-buttons", inputs: ["props"], outputs: ["shareComplete"] }] }); }
32889
32893
  }
32890
32894
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ShareProfileModalComponent, decorators: [{
32891
32895
  type: Component,
@@ -32907,6 +32911,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
32907
32911
  [props]="{ name: config().name, avatarUrl: config().avatarUrl, email: config().email, size: 'xlarge' }"
32908
32912
  />
32909
32913
  <val-display [props]="{ content: displayName(), size: 'small', color: 'dark' }" />
32914
+ @if (config().handle) {
32915
+ <p class="share-profile__handle">{{ '@' + config().handle }}</p>
32916
+ }
32910
32917
 
32911
32918
  <div class="share-profile__qr">
32912
32919
  @if (qr(); as qrResult) {
@@ -32934,7 +32941,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
32934
32941
  shareData: { title: config().shareTitle || config().name, text: config().shareText, url: config().url },
32935
32942
  platforms: config().platforms,
32936
32943
  layout: 'horizontal',
32937
- variant: 'icon-only',
32944
+ variant: 'outline',
32945
+ color: 'dark',
32938
32946
  usePlatformColors: false,
32939
32947
  }"
32940
32948
  (shareComplete)="shared.emit($event)"
@@ -32943,7 +32951,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
32943
32951
  </val-modal-shell>
32944
32952
  </ng-template>
32945
32953
  </ion-modal>
32946
- `, styles: [".share-profile{display:flex;flex-direction:column;align-items:center;gap:1rem;padding:.5rem 0 1rem;text-align:center}.share-profile__name{margin:0;font-size:1.5rem;font-weight:700;line-height:1.2;color:var(--ion-text-color)}.share-profile__qr{display:flex;justify-content:center}.share-profile__qr-loading{display:flex;align-items:center;justify-content:center;min-width:120px}.share-profile__qr-error{margin:0;padding:1rem;max-width:28ch;word-break:break-all;font-size:.9rem;font-weight:600;color:var(--ion-color-medium-shade)}.share-profile__caption{margin:0;max-width:32ch;font-size:.95rem;line-height:1.45;color:var(--ion-color-medium-shade)}\n"] }]
32954
+ `, styles: [".share-profile{display:flex;flex-direction:column;align-items:center;gap:1rem;padding:.5rem 0 1rem;text-align:center}.share-profile__name{margin:0;font-size:1.5rem;font-weight:700;line-height:1.2;color:var(--ion-text-color)}.share-profile__handle{margin:-.5rem 0 0;font-size:.875rem;font-weight:500;color:var(--ion-color-medium-shade);letter-spacing:.01em}.share-profile__qr{display:flex;justify-content:center}.share-profile__qr-loading{display:flex;align-items:center;justify-content:center;min-width:120px}.share-profile__qr-error{margin:0;padding:1rem;max-width:28ch;word-break:break-all;font-size:.9rem;font-weight:600;color:var(--ion-color-medium-shade)}.share-profile__caption{margin:0;max-width:32ch;font-size:.95rem;line-height:1.45;color:var(--ion-color-medium-shade)}\n"] }]
32947
32955
  }], ctorParameters: () => [], propDecorators: { isOpen: [{
32948
32956
  type: Input
32949
32957
  }], props: [{
@@ -41596,6 +41604,9 @@ const PROFILE_VIEW_I18N = {
41596
41604
  offlineTitle: 'Sin conexión',
41597
41605
  offlineHint: 'Revisa tu conexión a internet e intenta nuevamente.',
41598
41606
  retry: 'Reintentar',
41607
+ shareCtaTitle: 'Compartí tu perfil',
41608
+ shareCtaDesc: 'Generá un QR para que te agreguen como contacto al instante.',
41609
+ shareCtaBtn: 'Mostrar QR',
41599
41610
  },
41600
41611
  en: {
41601
41612
  pageTitle: 'Profile',
@@ -41627,6 +41638,9 @@ const PROFILE_VIEW_I18N = {
41627
41638
  offlineTitle: 'Offline',
41628
41639
  offlineHint: 'Check your internet connection and try again.',
41629
41640
  retry: 'Retry',
41641
+ shareCtaTitle: 'Share your profile',
41642
+ shareCtaDesc: 'Generate a QR so people can add you as a contact instantly.',
41643
+ shareCtaBtn: 'Show QR',
41630
41644
  },
41631
41645
  };
41632
41646
 
@@ -41682,6 +41696,8 @@ class ProfileViewComponent {
41682
41696
  showAvatar: merged.showAvatar ?? true,
41683
41697
  showHandle: merged.showHandle ?? true,
41684
41698
  showPhone: merged.showPhone ?? true,
41699
+ showShareCta: merged.showShareCta ?? true,
41700
+ profileBaseUrl: merged.profileBaseUrl ?? '',
41685
41701
  i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE$1,
41686
41702
  onSaved: merged.onSaved,
41687
41703
  onAvatarUploaded: merged.onAvatarUploaded,
@@ -41699,6 +41715,41 @@ class ProfileViewComponent {
41699
41715
  this.loading = signal(true);
41700
41716
  this.saving = signal(false);
41701
41717
  this.loadError = signal(null);
41718
+ this.shareOpen = signal(false);
41719
+ this.shareCta = computed(() => {
41720
+ this.i18n.lang();
41721
+ return {
41722
+ title: this.t('shareCtaTitle'),
41723
+ description: this.t('shareCtaDesc'),
41724
+ bordered: true,
41725
+ actions: {
41726
+ position: 'left',
41727
+ columned: false,
41728
+ buttons: [
41729
+ {
41730
+ text: this.t('shareCtaBtn'),
41731
+ color: 'dark',
41732
+ shape: 'round',
41733
+ type: 'button',
41734
+ state: 'ENABLED',
41735
+ token: 'share',
41736
+ },
41737
+ ],
41738
+ },
41739
+ };
41740
+ });
41741
+ this.shareModal = computed(() => {
41742
+ const p = this.profile();
41743
+ const handle = p?.handle ?? 'me';
41744
+ const base = this.resolvedConfig().profileBaseUrl;
41745
+ return {
41746
+ name: p?.name ?? '',
41747
+ handle: p?.handle,
41748
+ avatarUrl: p?.avatarUrl,
41749
+ email: p?.email,
41750
+ url: base ? `${base}/u/${handle}` : `/u/${handle}`,
41751
+ };
41752
+ });
41702
41753
  this._userId = computed(() => this.auth.user()?.userId ?? null);
41703
41754
  this.errorState = computed(() => {
41704
41755
  this.i18n.lang();
@@ -42122,10 +42173,18 @@ class ProfileViewComponent {
42122
42173
  }
42123
42174
 
42124
42175
  <val-form #form [props]="formMeta" (onSubmit)="onSubmit($event)" />
42176
+
42177
+ @if (resolvedConfig().showShareCta && p.handle) {
42178
+ <section class="settings-section share-cta-section">
42179
+ <val-cta-card [props]="shareCta()" (onAction)="shareOpen.set(true)" />
42180
+ </section>
42181
+ }
42125
42182
  }
42126
42183
  }
42127
42184
  </div>
42128
- `, 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"] }] }); }
42185
+
42186
+ <val-share-profile-modal [isOpen]="shareOpen()" [props]="shareModal()" (dismissed)="shareOpen.set(false)" />
42187
+ `, 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"] }, { kind: "component", type: CtaCardComponent, selector: "val-cta-card", inputs: ["props"], outputs: ["onAction"] }, { kind: "component", type: ShareProfileModalComponent, selector: "val-share-profile-modal", inputs: ["isOpen", "props"], outputs: ["dismissed", "shared"] }] }); }
42129
42188
  }
42130
42189
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProfileViewComponent, decorators: [{
42131
42190
  type: Component,
@@ -42139,6 +42198,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42139
42198
  TextComponent,
42140
42199
  TitleComponent,
42141
42200
  SkeletonLayoutComponent,
42201
+ CtaCardComponent,
42202
+ ShareProfileModalComponent,
42142
42203
  ], template: `
42143
42204
  <div class="page">
42144
42205
  <header class="page-header">
@@ -42198,9 +42259,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42198
42259
  }
42199
42260
 
42200
42261
  <val-form #form [props]="formMeta" (onSubmit)="onSubmit($event)" />
42262
+
42263
+ @if (resolvedConfig().showShareCta && p.handle) {
42264
+ <section class="settings-section share-cta-section">
42265
+ <val-cta-card [props]="shareCta()" (onAction)="shareOpen.set(true)" />
42266
+ </section>
42267
+ }
42201
42268
  }
42202
42269
  }
42203
42270
  </div>
42271
+
42272
+ <val-share-profile-modal [isOpen]="shareOpen()" [props]="shareModal()" (dismissed)="shareOpen.set(false)" />
42204
42273
  `, 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"] }]
42205
42274
  }], ctorParameters: () => [], propDecorators: { config: [{
42206
42275
  type: Input
@@ -42736,6 +42805,397 @@ function provideValtechPreferencesRoutes(opts) {
42736
42805
  ];
42737
42806
  }
42738
42807
 
42808
+ /**
42809
+ * Catálogo default de secciones del HUB de settings (8 entradas). `logout` va
42810
+ * incluida pero sin `routerLink` (la maneja un callback). Mismo set, mismos
42811
+ * tokens/iconos/rutas que el builder original de showcase
42812
+ * (`shared/settings-action-cards.ts`) que esta promoción reemplaza.
42813
+ */
42814
+ const SETTINGS_SECTIONS_CATALOG = [
42815
+ {
42816
+ token: 'action-general',
42817
+ titleKey: 'general',
42818
+ descKey: 'generalDesc',
42819
+ ionicon: 'options-outline',
42820
+ routerLink: '/app/settings/general',
42821
+ showChevron: true,
42822
+ shadowed: true,
42823
+ },
42824
+ {
42825
+ token: 'action-account',
42826
+ titleKey: 'account',
42827
+ descKey: 'accountDesc',
42828
+ ionicon: 'business-outline',
42829
+ routerLink: '/app/settings/account',
42830
+ showChevron: true,
42831
+ shadowed: true,
42832
+ },
42833
+ {
42834
+ token: 'action-profile',
42835
+ titleKey: 'editProfile',
42836
+ descKey: 'editProfileDesc',
42837
+ ionicon: 'person-outline',
42838
+ routerLink: '/app/settings/profile',
42839
+ showChevron: true,
42840
+ shadowed: true,
42841
+ },
42842
+ {
42843
+ token: 'action-preferences',
42844
+ titleKey: 'preferences',
42845
+ descKey: 'preferencesDesc',
42846
+ ionicon: 'options-outline',
42847
+ routerLink: '/app/settings/preferences',
42848
+ showChevron: true,
42849
+ shadowed: true,
42850
+ },
42851
+ {
42852
+ token: 'action-notifications',
42853
+ titleKey: 'notifications',
42854
+ descKey: 'notificationsDesc',
42855
+ ionicon: 'notifications-outline',
42856
+ routerLink: '/app/settings/notifications',
42857
+ showChevron: true,
42858
+ shadowed: true,
42859
+ },
42860
+ {
42861
+ token: 'action-security',
42862
+ titleKey: 'security',
42863
+ descKey: 'securityDesc',
42864
+ ionicon: 'shield-checkmark-outline',
42865
+ routerLink: '/app/settings/security',
42866
+ showChevron: true,
42867
+ shadowed: true,
42868
+ },
42869
+ {
42870
+ token: 'action-about',
42871
+ titleKey: 'about',
42872
+ descKey: 'aboutDesc',
42873
+ ionicon: 'information-circle-outline',
42874
+ routerLink: '/app/about',
42875
+ showChevron: true,
42876
+ shadowed: true,
42877
+ },
42878
+ {
42879
+ token: 'action-logout',
42880
+ titleKey: 'logout',
42881
+ ionicon: 'log-out-outline',
42882
+ showChevron: false,
42883
+ shadowed: true,
42884
+ },
42885
+ ];
42886
+ const CATALOG_BASE = '/app/settings';
42887
+ /**
42888
+ * Construye el grid de cards de navegación del HUB de settings (versión
42889
+ * promovida del `buildSettingsActionCards` de showcase). Usa el catálogo
42890
+ * default + las `include` del consumer, filtra `exclude`, gatea logout por
42891
+ * `includeLogout`, reordena por `order` y reescribe las rutas por `basePath`.
42892
+ *
42893
+ * El `t` resuelve los `titleKey`/`descKey` contra el namespace de labels
42894
+ * (default del componente: `Dashboard`). `logout` NO tiene `routerLink` — el
42895
+ * consumer maneja el flujo de cierre de sesión por token / callback.
42896
+ */
42897
+ function buildSettingsCards(t, options = {}) {
42898
+ const exclude = new Set(options.exclude ?? []);
42899
+ const includeLogout = options.includeLogout ?? false;
42900
+ const basePath = options.basePath;
42901
+ const sections = [...SETTINGS_SECTIONS_CATALOG, ...(options.include ?? [])];
42902
+ let resolved = sections.filter(s => {
42903
+ if (exclude.has(s.token))
42904
+ return false;
42905
+ if (s.token === 'action-logout' && !includeLogout)
42906
+ return false;
42907
+ return true;
42908
+ });
42909
+ if (options.order && options.order.length > 0) {
42910
+ const rank = new Map(options.order.map((token, i) => [token, i]));
42911
+ resolved = [...resolved].sort((a, b) => {
42912
+ const ra = rank.has(a.token) ? rank.get(a.token) : Number.MAX_SAFE_INTEGER;
42913
+ const rb = rank.has(b.token) ? rank.get(b.token) : Number.MAX_SAFE_INTEGER;
42914
+ return ra - rb;
42915
+ });
42916
+ }
42917
+ return resolved.map(s => {
42918
+ const card = {
42919
+ token: s.token,
42920
+ title: t(s.titleKey),
42921
+ icon: {
42922
+ ionicon: s.ionicon,
42923
+ color: 'dark',
42924
+ backgroundColor: 'light',
42925
+ },
42926
+ showChevron: s.showChevron ?? true,
42927
+ shadowed: s.shadowed ?? true,
42928
+ };
42929
+ if (s.descKey)
42930
+ card.description = t(s.descKey);
42931
+ if (s.routerLink) {
42932
+ card.routerLink = basePath ? rewriteBasePath(s.routerLink, basePath) : s.routerLink;
42933
+ }
42934
+ return card;
42935
+ });
42936
+ }
42937
+ /** Reescribe el prefijo `/app/settings` de una ruta del catálogo por `basePath`. */
42938
+ function rewriteBasePath(routerLink, basePath) {
42939
+ if (routerLink.startsWith(CATALOG_BASE)) {
42940
+ return basePath + routerLink.slice(CATALOG_BASE.length);
42941
+ }
42942
+ return routerLink;
42943
+ }
42944
+
42945
+ /**
42946
+ * Defaults i18n embebidos en `val-settings-hub`. Dos sets, uno por namespace
42947
+ * (ver `SettingsHubConfig.i18nNamespace` / `.pageI18nNamespace`). Auto-registrados
42948
+ * en el constructor SOLO si el namespace no existe (respeta override del consumer).
42949
+ *
42950
+ * `SETTINGS_HUB_LABELS_I18N` — labels de cada sección (namespace `Dashboard` por
42951
+ * default). Mismo set que showcase mantiene en `src/i18n/index.ts` (queda como
42952
+ * override). `SETTINGS_HUB_PAGE_I18N` — header del HUB (namespace
42953
+ * `Settings.Preferences` por default), tomado de la page Preferencias original.
42954
+ */
42955
+ const SETTINGS_HUB_LABELS_I18N = {
42956
+ es: {
42957
+ general: 'General',
42958
+ generalDesc: 'Apariencia e idioma',
42959
+ account: 'Cuenta',
42960
+ accountDesc: 'Organizaciones y sesión',
42961
+ editProfile: 'Editar perfil',
42962
+ editProfileDesc: 'Actualiza tu información personal',
42963
+ preferences: 'Preferencias',
42964
+ preferencesDesc: 'Tema, idioma y otras opciones',
42965
+ notifications: 'Notificaciones',
42966
+ notificationsDesc: 'Configura tus preferencias',
42967
+ security: 'Seguridad',
42968
+ securityDesc: 'Gestiona contraseñas y MFA',
42969
+ about: 'Acerca de',
42970
+ aboutDesc: 'Versión, feedback y enlaces útiles',
42971
+ logout: 'Cerrar sesión',
42972
+ },
42973
+ en: {
42974
+ general: 'General',
42975
+ generalDesc: 'Appearance and language',
42976
+ account: 'Account',
42977
+ accountDesc: 'Organizations and session',
42978
+ editProfile: 'Edit profile',
42979
+ editProfileDesc: 'Update your personal information',
42980
+ preferences: 'Preferences',
42981
+ preferencesDesc: 'Theme, language and other options',
42982
+ notifications: 'Notifications',
42983
+ notificationsDesc: 'Configure your preferences',
42984
+ security: 'Security',
42985
+ securityDesc: 'Manage passwords and MFA',
42986
+ about: 'About',
42987
+ aboutDesc: 'Version, feedback and useful links',
42988
+ logout: 'Sign out',
42989
+ },
42990
+ };
42991
+ const SETTINGS_HUB_PAGE_I18N = {
42992
+ es: {
42993
+ pageTitle: 'Preferencias',
42994
+ pageDescription: 'Ajusta tu cuenta y la app',
42995
+ },
42996
+ en: {
42997
+ pageTitle: 'Preferences',
42998
+ pageDescription: 'Tune your account and the app',
42999
+ },
43000
+ };
43001
+
43002
+ const DEFAULT_LABELS_NS = 'Dashboard';
43003
+ const DEFAULT_PAGE_NS = 'Settings.Preferences';
43004
+ /**
43005
+ * `val-settings-hub` — portada de la sección Settings (organism). Renderiza un
43006
+ * header (título + descripción) + un grid de `val-action-card` que navega a las
43007
+ * sub-vistas. Promovido desde `showcase` (`pages/settings/pages/preferences`)
43008
+ * bajo el proceso de ADR-021.
43009
+ *
43010
+ * Las cards salen de `buildSettingsCards` sobre el catálogo default
43011
+ * (`SETTINGS_SECTIONS_CATALOG`), filtrado/extendido/reordenado por la config.
43012
+ *
43013
+ * Navegación: cards con `routerLink` navegan vía `Router`; la card de logout
43014
+ * (sin ruta) invoca `config.onLogout`. Cada click emite `config.onSectionClick`.
43015
+ *
43016
+ * NO renderiza ion-content — vive dentro de val-page-wrapper.
43017
+ *
43018
+ * Auto-registra sus dos sets de defaults i18n (labels + header) en sus
43019
+ * respectivos namespaces si el consumer no los proveyó.
43020
+ */
43021
+ class SettingsHubComponent {
43022
+ get labelsNs() {
43023
+ return this.resolvedConfig().i18nNamespace;
43024
+ }
43025
+ get pageNs() {
43026
+ return this.resolvedConfig().pageI18nNamespace;
43027
+ }
43028
+ constructor() {
43029
+ this.nav = inject(NavigationService);
43030
+ this.i18n = inject(I18nService);
43031
+ this.router = inject(Router);
43032
+ this.route = inject(ActivatedRoute, { optional: true });
43033
+ this.resolvedConfig = computed(() => {
43034
+ const fromRoute = (this.route?.snapshot.data['settingsHubConfig'] ?? {});
43035
+ const merged = { ...fromRoute, ...(this.config ?? {}) };
43036
+ return {
43037
+ ...merged,
43038
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_LABELS_NS,
43039
+ pageI18nNamespace: merged.pageI18nNamespace ?? DEFAULT_PAGE_NS,
43040
+ };
43041
+ });
43042
+ this.pageTitle = computed(() => {
43043
+ this.i18n.lang();
43044
+ return this.i18n.t('pageTitle', this.pageNs);
43045
+ });
43046
+ this.pageDescription = computed(() => {
43047
+ this.i18n.lang();
43048
+ return this.i18n.t('pageDescription', this.pageNs);
43049
+ });
43050
+ /** Cards del HUB, resueltas desde la config. */
43051
+ this.actionCards = computed(() => {
43052
+ this.i18n.lang();
43053
+ const cfg = this.resolvedConfig();
43054
+ return buildSettingsCards(k => this.i18n.t(k, cfg.i18nNamespace), {
43055
+ exclude: cfg.exclude,
43056
+ include: cfg.include,
43057
+ order: cfg.order,
43058
+ includeLogout: cfg.includeLogout,
43059
+ basePath: cfg.basePath,
43060
+ });
43061
+ });
43062
+ // Auto-registro i18n — respeta override del consumer. Los namespaces pueden
43063
+ // venir de @Input.config o del route data; los resolvemos acá.
43064
+ const labelsNs = this.labelsNs;
43065
+ if (!this.i18n.hasNamespace(labelsNs)) {
43066
+ this.i18n.registerContent(labelsNs, SETTINGS_HUB_LABELS_I18N);
43067
+ }
43068
+ const pageNs = this.pageNs;
43069
+ if (!this.i18n.hasNamespace(pageNs)) {
43070
+ this.i18n.registerContent(pageNs, SETTINGS_HUB_PAGE_I18N);
43071
+ }
43072
+ this.nav.setBackHeader('pageTitle', pageNs, { withMenu: true });
43073
+ }
43074
+ onActionClick(action) {
43075
+ const token = action.token;
43076
+ this.resolvedConfig().onSectionClick?.(token ?? '');
43077
+ if (token === 'action-logout') {
43078
+ this.resolvedConfig().onLogout?.();
43079
+ return;
43080
+ }
43081
+ if (action.routerLink) {
43082
+ this.router.navigate(Array.isArray(action.routerLink) ? action.routerLink : [action.routerLink]);
43083
+ }
43084
+ }
43085
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SettingsHubComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
43086
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SettingsHubComponent, isStandalone: true, selector: "val-settings-hub", inputs: { config: "config" }, ngImport: i0, template: `
43087
+ <div class="page">
43088
+ <header class="page-header">
43089
+ <val-display [props]="{ size: 'small', color: 'dark', content: pageTitle() }" />
43090
+ <val-title
43091
+ [props]="{
43092
+ size: 'large',
43093
+ color: 'dark',
43094
+ bold: false,
43095
+ content: pageDescription(),
43096
+ }"
43097
+ />
43098
+ </header>
43099
+
43100
+ <ion-grid class="cards-grid">
43101
+ <ion-row>
43102
+ @for (action of actionCards(); track action.token) {
43103
+ <ion-col size="12" size-sm="6">
43104
+ <val-action-card [props]="action" (onClick)="onActionClick(action)" />
43105
+ </ion-col>
43106
+ }
43107
+ </ion-row>
43108
+ </ion-grid>
43109
+ </div>
43110
+ `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.cards-grid{margin:0 -4px;padding:0}.cards-grid ion-col{padding:4px}\n"], dependencies: [{ kind: "component", type: IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: IonRow, selector: "ion-row" }, { kind: "component", type: IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: ActionCardComponent, selector: "val-action-card", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
43111
+ }
43112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SettingsHubComponent, decorators: [{
43113
+ type: Component,
43114
+ args: [{ selector: 'val-settings-hub', standalone: true, imports: [IonGrid, IonRow, IonCol, ActionCardComponent, DisplayComponent, TitleComponent], template: `
43115
+ <div class="page">
43116
+ <header class="page-header">
43117
+ <val-display [props]="{ size: 'small', color: 'dark', content: pageTitle() }" />
43118
+ <val-title
43119
+ [props]="{
43120
+ size: 'large',
43121
+ color: 'dark',
43122
+ bold: false,
43123
+ content: pageDescription(),
43124
+ }"
43125
+ />
43126
+ </header>
43127
+
43128
+ <ion-grid class="cards-grid">
43129
+ <ion-row>
43130
+ @for (action of actionCards(); track action.token) {
43131
+ <ion-col size="12" size-sm="6">
43132
+ <val-action-card [props]="action" (onClick)="onActionClick(action)" />
43133
+ </ion-col>
43134
+ }
43135
+ </ion-row>
43136
+ </ion-grid>
43137
+ </div>
43138
+ `, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.cards-grid{margin:0 -4px;padding:0}.cards-grid ion-col{padding:4px}\n"] }]
43139
+ }], ctorParameters: () => [], propDecorators: { config: [{
43140
+ type: Input
43141
+ }] } });
43142
+
43143
+ /**
43144
+ * Helper para montar el bloque completo de Settings en una app del factory: el
43145
+ * HUB de navegación (`val-settings-hub`) en el index + las vistas promovidas
43146
+ * (Perfil, Preferencias) + las rutas propias de la app (`extraRoutes`).
43147
+ *
43148
+ * Pensado para apps nuevas (greenfield) que adoptan el set entero. showcase NO
43149
+ * lo usa hoy (preserva su `settings.routes.ts` por la semántica de sus muchas
43150
+ * secciones no promovidas — ver guía de promoción), pero el provider debe
43151
+ * existir y compilar para el resto de apps.
43152
+ *
43153
+ * @example
43154
+ * ```ts
43155
+ * // app.routes.ts
43156
+ * import { provideValtechSettingsRoutes } from 'valtech-components';
43157
+ *
43158
+ * export const routes: Routes = [
43159
+ * {
43160
+ * path: 'app',
43161
+ * children: [
43162
+ * ...provideValtechSettingsRoutes({
43163
+ * hubConfig: { onLogout: () => auth.logoutWithConfirmation() },
43164
+ * extraRoutes: [
43165
+ * { path: 'security', loadComponent: () => ... },
43166
+ * ],
43167
+ * }),
43168
+ * ],
43169
+ * },
43170
+ * ];
43171
+ * ```
43172
+ */
43173
+ function provideValtechSettingsRoutes(opts) {
43174
+ const basePath = opts?.basePath ?? 'settings';
43175
+ const includeProfile = opts?.includeProfile ?? true;
43176
+ const includePreferences = opts?.includePreferences ?? true;
43177
+ return [
43178
+ {
43179
+ path: basePath,
43180
+ children: [
43181
+ {
43182
+ path: '',
43183
+ component: SettingsHubComponent,
43184
+ data: { settingsHubConfig: opts?.hubConfig },
43185
+ },
43186
+ ...(includeProfile ? provideValtechProfileRoutes({ config: opts?.profileConfig }) : []),
43187
+ ...(includePreferences
43188
+ ? provideValtechPreferencesRoutes({
43189
+ path: opts?.preferencesPath ?? 'preferences',
43190
+ config: opts?.preferencesConfig,
43191
+ })
43192
+ : []),
43193
+ ...(opts?.extraRoutes ?? []),
43194
+ ],
43195
+ },
43196
+ ];
43197
+ }
43198
+
42739
43199
  /** Built-in label sets for the three platform locales. */
42740
43200
  const CALLOUT_LABELS = {
42741
43201
  es: {
@@ -53611,5 +54071,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
53611
54071
  * Generated bundle index. Do not edit.
53612
54072
  */
53613
54073
 
53614
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CONTENT_CARD_DEFAULTS, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentCardComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CountdownComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DebugConsoleComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EmailInputComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INFO_CARD_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoCardComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildFooterLinks, buildPath, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSite, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor$1 as resolveColor, resolveInputDefaultValue, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
54074
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CONTENT_CARD_DEFAULTS, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentCardComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CountdownComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DebugConsoleComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EmailInputComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INFO_CARD_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoCardComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildFooterLinks, buildPath, buildSettingsCards, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor$1 as resolveColor, resolveInputDefaultValue, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
53615
54075
  //# sourceMappingURL=valtech-components.mjs.map