valtech-components 4.0.954 → 4.0.956

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.
@@ -7,7 +7,7 @@ import { provideHttpClient, withInterceptors, HttpContextToken, HttpClient, Http
7
7
  import * as i1$1 from '@angular/fire/firestore';
8
8
  import { provideFirestore, getFirestore, connectFirestoreEmulator, enableMultiTabIndexedDbPersistence, doc, getDoc, collection, query as query$1, getDocs, getCountFromServer, limit, collectionGroup, collectionData, docData, serverTimestamp, addDoc, setDoc, updateDoc, deleteDoc, writeBatch, arrayUnion, arrayRemove, increment, where, orderBy, startAfter, startAt, endBefore, endAt, Timestamp, onSnapshot, Firestore } from '@angular/fire/firestore';
9
9
  import * as i1$4 from '@angular/common';
10
- import { isPlatformBrowser, CommonModule, NgStyle, NgFor, DOCUMENT, NgClass, TitleCasePipe, NgTemplateOutlet } from '@angular/common';
10
+ import { isPlatformBrowser, CommonModule, NgStyle, NgFor, NgClass, DOCUMENT, TitleCasePipe, NgTemplateOutlet } from '@angular/common';
11
11
  import { provideAnalytics, getAnalytics, Analytics, logEvent, setUserId, setUserProperties } from '@angular/fire/analytics';
12
12
  import { provideFirebaseApp, initializeApp } from '@angular/fire/app';
13
13
  import * as i1 from '@angular/fire/auth';
@@ -67,7 +67,7 @@ import fixWebmDuration from 'fix-webm-duration';
67
67
  * Current version of valtech-components.
68
68
  * This is automatically updated during the publish process.
69
69
  */
70
- const VERSION = '4.0.954';
70
+ const VERSION = '4.0.956';
71
71
 
72
72
  function evaluateValtechAccess(rule, context, features = {}, visitedFeatures = new Set()) {
73
73
  if (rule == null)
@@ -22517,6 +22517,100 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
22517
22517
  type: Input
22518
22518
  }] } });
22519
22519
 
22520
+ /**
22521
+ * Layout canonico para modales con body scrolleable y footer de acciones fijo.
22522
+ *
22523
+ * Usalo dentro de componentes abiertos via `ModalService.open(...)` cuando el
22524
+ * contenido pueda crecer y el CTA deba quedar siempre visible. El header/body
22525
+ * delegan en `val-modal-shell`; el footer queda fuera del `ion-content`, como
22526
+ * sibling, para evitar problemas de scroll.
22527
+ */
22528
+ class ModalLayoutComponent {
22529
+ constructor() {
22530
+ this.title = input('');
22531
+ this.subtitle = input('');
22532
+ this.closeLabel = input('');
22533
+ this.showClose = input(true);
22534
+ this.actions = input([]);
22535
+ /**
22536
+ * Alineación del footer. **No pasarlo**: el default `auto` ya da el
22537
+ * comportamiento correcto (CTA full-width en mobile, a la derecha en desktop).
22538
+ * Ver ModalActionAlignment antes de elegir otro valor.
22539
+ */
22540
+ this.actionsAlign = input('auto');
22541
+ this.footer = input(undefined);
22542
+ this.footerClass = input('');
22543
+ this.close = output();
22544
+ this.actionClick = output();
22545
+ this.showFooter = computed(() => this.footer() ?? this.actions().length > 0);
22546
+ }
22547
+ handleAction(action, index) {
22548
+ this.actionClick.emit({ action, index });
22549
+ }
22550
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModalLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22551
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ModalLayoutComponent, isStandalone: true, selector: "val-modal-layout", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, closeLabel: { classPropertyName: "closeLabel", publicName: "closeLabel", isSignal: true, isRequired: false, transformFunction: null }, showClose: { classPropertyName: "showClose", publicName: "showClose", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, actionsAlign: { classPropertyName: "actionsAlign", publicName: "actionsAlign", isSignal: true, isRequired: false, transformFunction: null }, footer: { classPropertyName: "footer", publicName: "footer", isSignal: true, isRequired: false, transformFunction: null }, footerClass: { classPropertyName: "footerClass", publicName: "footerClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { close: "close", actionClick: "actionClick" }, ngImport: i0, template: `
22552
+ <val-modal-shell
22553
+ [title]="title()"
22554
+ [subtitle]="subtitle()"
22555
+ [closeLabel]="closeLabel()"
22556
+ [showClose]="showClose()"
22557
+ (close)="close.emit()"
22558
+ >
22559
+ <ng-content />
22560
+ </val-modal-shell>
22561
+
22562
+ @if (showFooter()) {
22563
+ <ion-footer class="val-modal-layout__footer" [ngClass]="footerClass()">
22564
+ <div
22565
+ class="val-modal-layout__actions"
22566
+ [ngClass]="'val-modal-layout__actions--' + actionsAlign()"
22567
+ >
22568
+ @for (action of actions(); track action.token || action.text || $index) {
22569
+ <val-button
22570
+ class="val-modal-layout__button"
22571
+ [props]="action"
22572
+ (onClick)="handleAction(action, $index)"
22573
+ />
22574
+ }
22575
+ <ng-content select="[modal-actions]" />
22576
+ </div>
22577
+ </ion-footer>
22578
+ }
22579
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.val-modal-layout__footer{flex-shrink:0;background:var( --ion-card-background, var(--ion-background-color, #fff) );border-top:1px solid var(--ion-border-color, #e7e4ea)}.val-modal-layout__actions{display:flex;align-items:center;gap:var(--val-modal-footer-gap, 8px);padding:var(--val-modal-footer-padding, 12px 16px);padding-bottom:calc(var(--val-modal-footer-padding-bottom, 12px) + var(--ion-safe-area-bottom, env(safe-area-inset-bottom, 0px)))}.val-modal-layout__actions--start{justify-content:flex-start}.val-modal-layout__actions--center{justify-content:center}.val-modal-layout__actions--end{justify-content:flex-end}.val-modal-layout__actions--space-between{justify-content:space-between}.val-modal-layout__actions--auto,.val-modal-layout__actions--stretch{justify-content:flex-end}.val-modal-layout__actions--auto .val-modal-layout__button,.val-modal-layout__actions--stretch .val-modal-layout__button{flex:1 1 auto;min-width:0;display:block}.val-modal-layout__actions--auto .val-modal-layout__button ::ng-deep ion-button,.val-modal-layout__actions--stretch .val-modal-layout__button ::ng-deep ion-button{width:100%}@media (min-width: 481px){.val-modal-layout__actions--auto .val-modal-layout__button,.val-modal-layout__actions--stretch .val-modal-layout__button{flex:0 0 auto;display:inline-block}.val-modal-layout__actions--auto .val-modal-layout__button ::ng-deep ion-button,.val-modal-layout__actions--stretch .val-modal-layout__button ::ng-deep ion-button{width:auto}}@media (max-width: 480px){.val-modal-layout__actions{padding-left:var(--val-modal-footer-padding-inline-mobile, 16px);padding-right:var(--val-modal-footer-padding-inline-mobile, 16px)}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: ModalShellComponent, selector: "val-modal-shell", inputs: ["title", "subtitle", "closeLabel", "showClose"], outputs: ["close"] }] }); }
22580
+ }
22581
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModalLayoutComponent, decorators: [{
22582
+ type: Component,
22583
+ args: [{ selector: 'val-modal-layout', standalone: true, imports: [NgClass, IonFooter, ButtonComponent, ModalShellComponent], template: `
22584
+ <val-modal-shell
22585
+ [title]="title()"
22586
+ [subtitle]="subtitle()"
22587
+ [closeLabel]="closeLabel()"
22588
+ [showClose]="showClose()"
22589
+ (close)="close.emit()"
22590
+ >
22591
+ <ng-content />
22592
+ </val-modal-shell>
22593
+
22594
+ @if (showFooter()) {
22595
+ <ion-footer class="val-modal-layout__footer" [ngClass]="footerClass()">
22596
+ <div
22597
+ class="val-modal-layout__actions"
22598
+ [ngClass]="'val-modal-layout__actions--' + actionsAlign()"
22599
+ >
22600
+ @for (action of actions(); track action.token || action.text || $index) {
22601
+ <val-button
22602
+ class="val-modal-layout__button"
22603
+ [props]="action"
22604
+ (onClick)="handleAction(action, $index)"
22605
+ />
22606
+ }
22607
+ <ng-content select="[modal-actions]" />
22608
+ </div>
22609
+ </ion-footer>
22610
+ }
22611
+ `, styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.val-modal-layout__footer{flex-shrink:0;background:var( --ion-card-background, var(--ion-background-color, #fff) );border-top:1px solid var(--ion-border-color, #e7e4ea)}.val-modal-layout__actions{display:flex;align-items:center;gap:var(--val-modal-footer-gap, 8px);padding:var(--val-modal-footer-padding, 12px 16px);padding-bottom:calc(var(--val-modal-footer-padding-bottom, 12px) + var(--ion-safe-area-bottom, env(safe-area-inset-bottom, 0px)))}.val-modal-layout__actions--start{justify-content:flex-start}.val-modal-layout__actions--center{justify-content:center}.val-modal-layout__actions--end{justify-content:flex-end}.val-modal-layout__actions--space-between{justify-content:space-between}.val-modal-layout__actions--auto,.val-modal-layout__actions--stretch{justify-content:flex-end}.val-modal-layout__actions--auto .val-modal-layout__button,.val-modal-layout__actions--stretch .val-modal-layout__button{flex:1 1 auto;min-width:0;display:block}.val-modal-layout__actions--auto .val-modal-layout__button ::ng-deep ion-button,.val-modal-layout__actions--stretch .val-modal-layout__button ::ng-deep ion-button{width:100%}@media (min-width: 481px){.val-modal-layout__actions--auto .val-modal-layout__button,.val-modal-layout__actions--stretch .val-modal-layout__button{flex:0 0 auto;display:inline-block}.val-modal-layout__actions--auto .val-modal-layout__button ::ng-deep ion-button,.val-modal-layout__actions--stretch .val-modal-layout__button ::ng-deep ion-button{width:auto}}@media (max-width: 480px){.val-modal-layout__actions{padding-left:var(--val-modal-footer-padding-inline-mobile, 16px);padding-right:var(--val-modal-footer-padding-inline-mobile, 16px)}}\n"] }]
22612
+ }] });
22613
+
22520
22614
  /**
22521
22615
  * Removes diacritical marks (accents) from a string using Unicode normalization.
22522
22616
  * Useful for text search and comparison.
@@ -22529,6 +22623,143 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
22529
22623
  */
22530
22624
  const replaceSpecialChars = (text) => text.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
22531
22625
 
22626
+ /**
22627
+ * Picker de `val-select-search` / `val-multi-select-search` — full-screen en
22628
+ * mobile, card flotante en desktop (`ModalService.openAdaptive`, Regla #5).
22629
+ * Reemplaza el `ion-modal` con breakpoints que ambos componentes tenían
22630
+ * embebido: mismo bottom-sheet en cualquier tamaño de pantalla, sin el
22631
+ * tratamiento "card centrada" que el resto de los modales del factory ya usa.
22632
+ *
22633
+ * Selección simple: cierra al tocar un ítem (`dismiss({values:[v]}, 'selected')`).
22634
+ * Selección múltiple: acumula localmente, footer con "Aplicar" (Regla #5,
22635
+ * val-modal-layout con `actions`).
22636
+ */
22637
+ class SelectSearchPickerModalComponent {
22638
+ constructor() {
22639
+ this.i18n = inject(I18nService);
22640
+ this.query = signal('');
22641
+ this.selected = signal([]);
22642
+ this.filteredItems = computed(() => {
22643
+ const opts = this.props.options ?? [];
22644
+ const q = replaceSpecialChars(this.query().trim().toLowerCase());
22645
+ if (!q)
22646
+ return opts;
22647
+ return opts.filter(o => {
22648
+ const label = replaceSpecialChars(String(o[this.props.labelProperty] ?? '').toLowerCase());
22649
+ const value = replaceSpecialChars(String(o[this.props.valueProperty] ?? '').toLowerCase());
22650
+ return label.includes(q) || value.includes(q);
22651
+ });
22652
+ });
22653
+ this.footerActions = computed(() => this.props?.multiple
22654
+ ? [
22655
+ {
22656
+ text: this.i18n.t('apply'),
22657
+ color: 'primary',
22658
+ shape: 'round',
22659
+ type: 'button',
22660
+ state: 'ENABLED',
22661
+ },
22662
+ ]
22663
+ : []);
22664
+ }
22665
+ // NG0600: escribir `selected` desde un `computed`/desde el template (como
22666
+ // hacía `ensureSeeded()` antes) dispara "signal write during template
22667
+ // evaluation" — Ionic ya asignó `componentProps` sobre la instancia antes
22668
+ // de `ngOnInit`, así que sembrar acá es seguro y evita el write lazy.
22669
+ ngOnInit() {
22670
+ if (this.props?.selectedValues?.length) {
22671
+ this.selected.set([...this.props.selectedValues]);
22672
+ }
22673
+ }
22674
+ isSelected(item) {
22675
+ return this.selected().includes(item[this.props.valueProperty]);
22676
+ }
22677
+ toggle(item) {
22678
+ const value = item[this.props.valueProperty];
22679
+ if (!this.props.multiple) {
22680
+ this._modalRef?.dismiss({ values: [value] }, 'selected');
22681
+ return;
22682
+ }
22683
+ const current = this.selected();
22684
+ const idx = current.indexOf(value);
22685
+ this.selected.set(idx === -1 ? [...current, value] : current.filter(v => v !== value));
22686
+ }
22687
+ apply() {
22688
+ this._modalRef?.dismiss({ values: this.selected() }, 'selected');
22689
+ }
22690
+ cancel() {
22691
+ this._modalRef?.dismiss(undefined, 'cancel');
22692
+ }
22693
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectSearchPickerModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22694
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SelectSearchPickerModalComponent, isStandalone: true, selector: "val-select-search-picker-modal", ngImport: i0, template: `
22695
+ <val-modal-layout
22696
+ [title]="props.title"
22697
+ [closeLabel]="i18n.t('close')"
22698
+ [actions]="footerActions()"
22699
+ actionsAlign="stretch"
22700
+ (close)="cancel()"
22701
+ (actionClick)="apply()"
22702
+ >
22703
+ <div class="ssp-search">
22704
+ <val-searchbar
22705
+ [props]="{ placeholder: props.placeholder || i18n.t('selectOption'), debounce: 200 }"
22706
+ (filterEvent)="query.set($event)"
22707
+ />
22708
+ </div>
22709
+
22710
+ @if (filteredItems().length === 0) {
22711
+ <p class="ssp-empty">{{ i18n.t('noResults') }}</p>
22712
+ } @else {
22713
+ <ion-list class="ssp-list" lines="none">
22714
+ @for (item of filteredItems(); track item[props.valueProperty]) {
22715
+ <ion-item class="ssp-item" button detail="false" (click)="toggle(item)">
22716
+ <ion-label>{{ item[props.labelProperty] }}</ion-label>
22717
+ @if (isSelected(item)) {
22718
+ <ion-icon name="checkmark-outline" slot="end" color="primary" aria-hidden="true" />
22719
+ }
22720
+ </ion-item>
22721
+ }
22722
+ </ion-list>
22723
+ }
22724
+ </val-modal-layout>
22725
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.ssp-search{margin:0 0 12px}.ssp-list{background:transparent;display:flex;flex-direction:column;gap:6px}.ssp-item{--background: var(--ion-card-background, var(--ion-background-color, #fff));--padding-start: 12px;--padding-end: 12px;--inner-padding-end: 0;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:10px;cursor:pointer}.ssp-empty{text-align:center;color:var(--ion-color-medium, #92949c);font-size:.875rem;margin:24px 0}\n"], dependencies: [{ kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: ModalLayoutComponent, selector: "val-modal-layout", inputs: ["title", "subtitle", "closeLabel", "showClose", "actions", "actionsAlign", "footer", "footerClass"], outputs: ["close", "actionClick"] }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["preset", "props"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }] }); }
22726
+ }
22727
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectSearchPickerModalComponent, decorators: [{
22728
+ type: Component,
22729
+ args: [{ selector: 'val-select-search-picker-modal', standalone: true, imports: [IonIcon, IonItem, IonLabel, IonList, ButtonComponent, ModalLayoutComponent, SearchbarComponent], template: `
22730
+ <val-modal-layout
22731
+ [title]="props.title"
22732
+ [closeLabel]="i18n.t('close')"
22733
+ [actions]="footerActions()"
22734
+ actionsAlign="stretch"
22735
+ (close)="cancel()"
22736
+ (actionClick)="apply()"
22737
+ >
22738
+ <div class="ssp-search">
22739
+ <val-searchbar
22740
+ [props]="{ placeholder: props.placeholder || i18n.t('selectOption'), debounce: 200 }"
22741
+ (filterEvent)="query.set($event)"
22742
+ />
22743
+ </div>
22744
+
22745
+ @if (filteredItems().length === 0) {
22746
+ <p class="ssp-empty">{{ i18n.t('noResults') }}</p>
22747
+ } @else {
22748
+ <ion-list class="ssp-list" lines="none">
22749
+ @for (item of filteredItems(); track item[props.valueProperty]) {
22750
+ <ion-item class="ssp-item" button detail="false" (click)="toggle(item)">
22751
+ <ion-label>{{ item[props.labelProperty] }}</ion-label>
22752
+ @if (isSelected(item)) {
22753
+ <ion-icon name="checkmark-outline" slot="end" color="primary" aria-hidden="true" />
22754
+ }
22755
+ </ion-item>
22756
+ }
22757
+ </ion-list>
22758
+ }
22759
+ </val-modal-layout>
22760
+ `, styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.ssp-search{margin:0 0 12px}.ssp-list{background:transparent;display:flex;flex-direction:column;gap:6px}.ssp-item{--background: var(--ion-card-background, var(--ion-background-color, #fff));--padding-start: 12px;--padding-end: 12px;--inner-padding-end: 0;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:10px;cursor:pointer}.ssp-empty{text-align:center;color:var(--ion-color-medium, #92949c);font-size:.875rem;margin:24px 0}\n"] }]
22761
+ }] });
22762
+
22532
22763
  /**
22533
22764
  * val-select-search
22534
22765
  *
@@ -22549,6 +22780,7 @@ class SelectSearchComponent {
22549
22780
  this.icon = inject(IconService);
22550
22781
  this.changeDetector = inject(ChangeDetectorRef);
22551
22782
  this.i18n = inject(I18nService);
22783
+ this.modals = inject(ModalService);
22552
22784
  this.searchTerm = '';
22553
22785
  this.filteredItems = [];
22554
22786
  this.selectedItems = [];
@@ -22714,90 +22946,43 @@ class SelectSearchComponent {
22714
22946
  applyDefaultValue() {
22715
22947
  applyDefaultValueToControl(this.props);
22716
22948
  }
22717
- onFilter(event) {
22718
- // If no search term, show all options
22719
- if (!event || event.trim() === '') {
22720
- this.filteredItems = this.props?.options ? [...this.props.options] : [];
22721
- this.changeDetector.detectChanges();
22722
- return;
22723
- }
22724
- // If no options, nothing to filter
22725
- if (!this.props?.options || this.props.options.length === 0) {
22726
- this.filteredItems = [];
22727
- this.changeDetector.detectChanges();
22728
- return;
22729
- }
22730
- // PERF: Avoid repeated replaceSpecialChars and toLowerCase for each option
22731
- const search = replaceSpecialChars(event.toLowerCase());
22732
- this.filteredItems = this.props.options.filter(element => {
22733
- // Only use labelProperty and valueProperty for filtering (faster)
22734
- const label = element[this.labelProperty]
22735
- ? replaceSpecialChars(String(element[this.labelProperty]).toLowerCase())
22736
- : '';
22737
- const value = element[this.valueProperty]
22738
- ? replaceSpecialChars(String(element[this.valueProperty]).toLowerCase())
22739
- : '';
22740
- return label.includes(search) || value.includes(search);
22741
- });
22742
- this.changeDetector.detectChanges();
22743
- }
22744
- onFocus() {
22745
- console.log('onFocus');
22746
- }
22747
- onBlur() {
22748
- console.log('onBlur');
22749
- }
22750
- openModal() {
22751
- if (this.modal) {
22752
- this.modal.present();
22753
- }
22754
- }
22755
- preventDefaultBehavior(event) {
22756
- event.preventDefault();
22757
- event.stopPropagation();
22758
- this.openModal();
22759
- }
22760
22949
  /**
22761
- * Reset state only - called by didDismiss event
22762
- * Separated from closeModal to avoid double dismissal and scroll issues
22950
+ * Abre el picker vía `ModalService.openAdaptive` (Regla #5: full-screen en
22951
+ * mobile, card flotante en desktop) en vez del `ion-modal` con breakpoints
22952
+ * que este componente tenía embebido antes — mismo bottom-sheet en
22953
+ * cualquier tamaño de pantalla, sin el tratamiento de card centrada que ya
22954
+ * usa el resto de los modales del factory. El filtrado, la selección y el
22955
+ * footer "Aplicar" (modo `multiple`) viven en `SelectSearchPickerModalComponent`.
22763
22956
  */
22764
- resetState() {
22765
- this.searchTerm = '';
22766
- this.filteredItems = this.props?.options ? [...this.props.options] : [];
22767
- }
22768
- /**
22769
- * Close modal only - does not reset state (didDismiss will handle that)
22770
- */
22771
- closeModal() {
22772
- if (this.modal) {
22773
- this.modal.dismiss();
22774
- }
22775
- }
22776
- /**
22777
- * @deprecated Use closeModal() instead. Kept for backwards compatibility.
22778
- */
22779
- cancelModal() {
22780
- this.closeModal();
22781
- }
22782
- selectItem(item) {
22783
- if (this.multiple) {
22784
- const index = this.selectedItems.findIndex(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);
22785
- if (index === -1) {
22786
- this.selectedItems.push(item);
22787
- }
22788
- else {
22789
- this.selectedItems.splice(index, 1);
22790
- }
22791
- }
22792
- else {
22793
- this.selectedItems = [item];
22794
- this.closeModal();
22795
- }
22957
+ async openPicker() {
22958
+ const { data, role } = await this.modals.openAdaptive({
22959
+ component: SelectSearchPickerModalComponent,
22960
+ componentProps: {
22961
+ props: {
22962
+ title: this.getLabel(),
22963
+ options: this.props?.options ?? [],
22964
+ valueProperty: this.valueProperty,
22965
+ labelProperty: this.labelProperty,
22966
+ multiple: this.multiple,
22967
+ selectedValues: this.selectedItems.map(item => item[this.valueProperty]),
22968
+ placeholder: this.getPlaceholder(),
22969
+ },
22970
+ },
22971
+ });
22972
+ if (role !== 'selected' || !data)
22973
+ return;
22974
+ const values = data.values ?? [];
22975
+ const options = this.props?.options ?? [];
22976
+ this.selectedItems = values
22977
+ .map(v => options.find(o => o[this.valueProperty] === v))
22978
+ .filter((o) => !!o);
22796
22979
  this.updateDisplayValue();
22797
22980
  this.applyChanges();
22798
22981
  }
22799
- isItemSelected(item) {
22800
- return this.selectedItems.some(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);
22982
+ preventDefaultBehavior(event) {
22983
+ event.preventDefault();
22984
+ event.stopPropagation();
22985
+ void this.openPicker();
22801
22986
  }
22802
22987
  updateDisplayValue() {
22803
22988
  if (this.props?.mode === 'legacy' && this.selectedItems.length === 0 && this.props?.control?.value) {
@@ -22849,7 +23034,7 @@ class SelectSearchComponent {
22849
23034
  this.changeDetector.detectChanges();
22850
23035
  }
22851
23036
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22852
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: SelectSearchComponent, isStandalone: true, selector: "val-select-search", inputs: { label: "label", labelProperty: "labelProperty", valueProperty: "valueProperty", multiple: "multiple", placeholder: "placeholder", props: "props" }, viewQueries: [{ propertyName: "modal", first: true, predicate: ["modal"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
23037
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: SelectSearchComponent, isStandalone: true, selector: "val-select-search", inputs: { label: "label", labelProperty: "labelProperty", valueProperty: "valueProperty", multiple: "multiple", placeholder: "placeholder", props: "props" }, usesOnChanges: true, ngImport: i0, template: `
22853
23038
  <label *ngIf="displayLabel" class="vss-label">{{ displayLabel }}</label>
22854
23039
 
22855
23040
  <ion-input
@@ -22861,44 +23046,11 @@ class SelectSearchComponent {
22861
23046
  />
22862
23047
 
22863
23048
  <ion-input style="position: absolute;" [formControl]="props.control" type="hidden"></ion-input>
22864
-
22865
- <ion-modal #modal [initialBreakpoint]="1" [breakpoints]="[0, 0.5, 0.75, 1]" (didDismiss)="resetState()">
22866
- <ng-template>
22867
- <ion-header>
22868
- <ion-toolbar>
22869
- <ion-title>{{ getLabel() }}</ion-title>
22870
- <ion-buttons slot="end">
22871
- <ion-button (click)="cancelModal()">{{ getCloseText() }}</ion-button>
22872
- </ion-buttons>
22873
- </ion-toolbar>
22874
- <ion-toolbar>
22875
- <val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()" />
22876
- </ion-toolbar>
22877
- </ion-header>
22878
- <ion-content>
22879
- <ion-list>
22880
- <ion-item *ngFor="let item of filteredItems" button (click)="selectItem(item)" detail="false">
22881
- <ion-label>{{ item[labelProperty] }}</ion-label>
22882
- <ion-icon
22883
- *ngIf="isItemSelected(item)"
22884
- name="checkmark-outline"
22885
- slot="end"
22886
- color="primary"
22887
- aria-hidden="true"
22888
- ></ion-icon>
22889
- </ion-item>
22890
- <ion-item *ngIf="filteredItems.length === 0" lines="none">
22891
- <ion-label color="dark">{{ getNoResultsText() }}</ion-label>
22892
- </ion-item>
22893
- </ion-list>
22894
- </ion-content>
22895
- </ng-template>
22896
- </ion-modal>
22897
- `, isInline: true, styles: [":host{display:block}.vss-label{display:block;margin-bottom:4px;font-size:.8125rem;color:var(--ion-color-dark, #43464d)}ion-header{padding:8px 8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i2.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: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-input-otp[type=text],ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["preset", "props"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$8.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
23049
+ `, isInline: true, styles: [":host{display:block}.vss-label{display:block;margin-bottom:4px;font-size:.8125rem;color:var(--ion-color-dark, #43464d)}ion-header{padding:8px 8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-input-otp[type=text],ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$8.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
22898
23050
  }
22899
23051
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectSearchComponent, decorators: [{
22900
23052
  type: Component,
22901
- args: [{ selector: 'val-select-search', standalone: true, imports: [CommonModule, IonicModule, FormsModule, SearchbarComponent, ReactiveFormsModule], template: `
23053
+ args: [{ selector: 'val-select-search', standalone: true, imports: [CommonModule, IonicModule, FormsModule, ReactiveFormsModule], template: `
22902
23054
  <label *ngIf="displayLabel" class="vss-label">{{ displayLabel }}</label>
22903
23055
 
22904
23056
  <ion-input
@@ -22910,44 +23062,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
22910
23062
  />
22911
23063
 
22912
23064
  <ion-input style="position: absolute;" [formControl]="props.control" type="hidden"></ion-input>
22913
-
22914
- <ion-modal #modal [initialBreakpoint]="1" [breakpoints]="[0, 0.5, 0.75, 1]" (didDismiss)="resetState()">
22915
- <ng-template>
22916
- <ion-header>
22917
- <ion-toolbar>
22918
- <ion-title>{{ getLabel() }}</ion-title>
22919
- <ion-buttons slot="end">
22920
- <ion-button (click)="cancelModal()">{{ getCloseText() }}</ion-button>
22921
- </ion-buttons>
22922
- </ion-toolbar>
22923
- <ion-toolbar>
22924
- <val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()" />
22925
- </ion-toolbar>
22926
- </ion-header>
22927
- <ion-content>
22928
- <ion-list>
22929
- <ion-item *ngFor="let item of filteredItems" button (click)="selectItem(item)" detail="false">
22930
- <ion-label>{{ item[labelProperty] }}</ion-label>
22931
- <ion-icon
22932
- *ngIf="isItemSelected(item)"
22933
- name="checkmark-outline"
22934
- slot="end"
22935
- color="primary"
22936
- aria-hidden="true"
22937
- ></ion-icon>
22938
- </ion-item>
22939
- <ion-item *ngIf="filteredItems.length === 0" lines="none">
22940
- <ion-label color="dark">{{ getNoResultsText() }}</ion-label>
22941
- </ion-item>
22942
- </ion-list>
22943
- </ion-content>
22944
- </ng-template>
22945
- </ion-modal>
22946
23065
  `, styles: [":host{display:block}.vss-label{display:block;margin-bottom:4px;font-size:.8125rem;color:var(--ion-color-dark, #43464d)}ion-header{padding:8px 8px 0}\n"] }]
22947
- }], propDecorators: { modal: [{
22948
- type: ViewChild,
22949
- args: ['modal']
22950
- }], label: [{
23066
+ }], propDecorators: { label: [{
22951
23067
  type: Input
22952
23068
  }], labelProperty: [{
22953
23069
  type: Input
@@ -38468,100 +38584,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
38468
38584
  type: Output
38469
38585
  }] } });
38470
38586
 
38471
- /**
38472
- * Layout canonico para modales con body scrolleable y footer de acciones fijo.
38473
- *
38474
- * Usalo dentro de componentes abiertos via `ModalService.open(...)` cuando el
38475
- * contenido pueda crecer y el CTA deba quedar siempre visible. El header/body
38476
- * delegan en `val-modal-shell`; el footer queda fuera del `ion-content`, como
38477
- * sibling, para evitar problemas de scroll.
38478
- */
38479
- class ModalLayoutComponent {
38480
- constructor() {
38481
- this.title = input('');
38482
- this.subtitle = input('');
38483
- this.closeLabel = input('');
38484
- this.showClose = input(true);
38485
- this.actions = input([]);
38486
- /**
38487
- * Alineación del footer. **No pasarlo**: el default `auto` ya da el
38488
- * comportamiento correcto (CTA full-width en mobile, a la derecha en desktop).
38489
- * Ver ModalActionAlignment antes de elegir otro valor.
38490
- */
38491
- this.actionsAlign = input('auto');
38492
- this.footer = input(undefined);
38493
- this.footerClass = input('');
38494
- this.close = output();
38495
- this.actionClick = output();
38496
- this.showFooter = computed(() => this.footer() ?? this.actions().length > 0);
38497
- }
38498
- handleAction(action, index) {
38499
- this.actionClick.emit({ action, index });
38500
- }
38501
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModalLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
38502
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ModalLayoutComponent, isStandalone: true, selector: "val-modal-layout", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, closeLabel: { classPropertyName: "closeLabel", publicName: "closeLabel", isSignal: true, isRequired: false, transformFunction: null }, showClose: { classPropertyName: "showClose", publicName: "showClose", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, actionsAlign: { classPropertyName: "actionsAlign", publicName: "actionsAlign", isSignal: true, isRequired: false, transformFunction: null }, footer: { classPropertyName: "footer", publicName: "footer", isSignal: true, isRequired: false, transformFunction: null }, footerClass: { classPropertyName: "footerClass", publicName: "footerClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { close: "close", actionClick: "actionClick" }, ngImport: i0, template: `
38503
- <val-modal-shell
38504
- [title]="title()"
38505
- [subtitle]="subtitle()"
38506
- [closeLabel]="closeLabel()"
38507
- [showClose]="showClose()"
38508
- (close)="close.emit()"
38509
- >
38510
- <ng-content />
38511
- </val-modal-shell>
38512
-
38513
- @if (showFooter()) {
38514
- <ion-footer class="val-modal-layout__footer" [ngClass]="footerClass()">
38515
- <div
38516
- class="val-modal-layout__actions"
38517
- [ngClass]="'val-modal-layout__actions--' + actionsAlign()"
38518
- >
38519
- @for (action of actions(); track action.token || action.text || $index) {
38520
- <val-button
38521
- class="val-modal-layout__button"
38522
- [props]="action"
38523
- (onClick)="handleAction(action, $index)"
38524
- />
38525
- }
38526
- <ng-content select="[modal-actions]" />
38527
- </div>
38528
- </ion-footer>
38529
- }
38530
- `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.val-modal-layout__footer{flex-shrink:0;background:var( --ion-card-background, var(--ion-background-color, #fff) );border-top:1px solid var(--ion-border-color, #e7e4ea)}.val-modal-layout__actions{display:flex;align-items:center;gap:var(--val-modal-footer-gap, 8px);padding:var(--val-modal-footer-padding, 12px 16px);padding-bottom:calc(var(--val-modal-footer-padding-bottom, 12px) + var(--ion-safe-area-bottom, env(safe-area-inset-bottom, 0px)))}.val-modal-layout__actions--start{justify-content:flex-start}.val-modal-layout__actions--center{justify-content:center}.val-modal-layout__actions--end{justify-content:flex-end}.val-modal-layout__actions--space-between{justify-content:space-between}.val-modal-layout__actions--auto,.val-modal-layout__actions--stretch{justify-content:flex-end}.val-modal-layout__actions--auto .val-modal-layout__button,.val-modal-layout__actions--stretch .val-modal-layout__button{flex:1 1 auto;min-width:0;display:block}.val-modal-layout__actions--auto .val-modal-layout__button ::ng-deep ion-button,.val-modal-layout__actions--stretch .val-modal-layout__button ::ng-deep ion-button{width:100%}@media (min-width: 481px){.val-modal-layout__actions--auto .val-modal-layout__button,.val-modal-layout__actions--stretch .val-modal-layout__button{flex:0 0 auto;display:inline-block}.val-modal-layout__actions--auto .val-modal-layout__button ::ng-deep ion-button,.val-modal-layout__actions--stretch .val-modal-layout__button ::ng-deep ion-button{width:auto}}@media (max-width: 480px){.val-modal-layout__actions{padding-left:var(--val-modal-footer-padding-inline-mobile, 16px);padding-right:var(--val-modal-footer-padding-inline-mobile, 16px)}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: ModalShellComponent, selector: "val-modal-shell", inputs: ["title", "subtitle", "closeLabel", "showClose"], outputs: ["close"] }] }); }
38531
- }
38532
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModalLayoutComponent, decorators: [{
38533
- type: Component,
38534
- args: [{ selector: 'val-modal-layout', standalone: true, imports: [NgClass, IonFooter, ButtonComponent, ModalShellComponent], template: `
38535
- <val-modal-shell
38536
- [title]="title()"
38537
- [subtitle]="subtitle()"
38538
- [closeLabel]="closeLabel()"
38539
- [showClose]="showClose()"
38540
- (close)="close.emit()"
38541
- >
38542
- <ng-content />
38543
- </val-modal-shell>
38544
-
38545
- @if (showFooter()) {
38546
- <ion-footer class="val-modal-layout__footer" [ngClass]="footerClass()">
38547
- <div
38548
- class="val-modal-layout__actions"
38549
- [ngClass]="'val-modal-layout__actions--' + actionsAlign()"
38550
- >
38551
- @for (action of actions(); track action.token || action.text || $index) {
38552
- <val-button
38553
- class="val-modal-layout__button"
38554
- [props]="action"
38555
- (onClick)="handleAction(action, $index)"
38556
- />
38557
- }
38558
- <ng-content select="[modal-actions]" />
38559
- </div>
38560
- </ion-footer>
38561
- }
38562
- `, styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.val-modal-layout__footer{flex-shrink:0;background:var( --ion-card-background, var(--ion-background-color, #fff) );border-top:1px solid var(--ion-border-color, #e7e4ea)}.val-modal-layout__actions{display:flex;align-items:center;gap:var(--val-modal-footer-gap, 8px);padding:var(--val-modal-footer-padding, 12px 16px);padding-bottom:calc(var(--val-modal-footer-padding-bottom, 12px) + var(--ion-safe-area-bottom, env(safe-area-inset-bottom, 0px)))}.val-modal-layout__actions--start{justify-content:flex-start}.val-modal-layout__actions--center{justify-content:center}.val-modal-layout__actions--end{justify-content:flex-end}.val-modal-layout__actions--space-between{justify-content:space-between}.val-modal-layout__actions--auto,.val-modal-layout__actions--stretch{justify-content:flex-end}.val-modal-layout__actions--auto .val-modal-layout__button,.val-modal-layout__actions--stretch .val-modal-layout__button{flex:1 1 auto;min-width:0;display:block}.val-modal-layout__actions--auto .val-modal-layout__button ::ng-deep ion-button,.val-modal-layout__actions--stretch .val-modal-layout__button ::ng-deep ion-button{width:100%}@media (min-width: 481px){.val-modal-layout__actions--auto .val-modal-layout__button,.val-modal-layout__actions--stretch .val-modal-layout__button{flex:0 0 auto;display:inline-block}.val-modal-layout__actions--auto .val-modal-layout__button ::ng-deep ion-button,.val-modal-layout__actions--stretch .val-modal-layout__button ::ng-deep ion-button{width:auto}}@media (max-width: 480px){.val-modal-layout__actions{padding-left:var(--val-modal-footer-padding-inline-mobile, 16px);padding-right:var(--val-modal-footer-padding-inline-mobile, 16px)}}\n"] }]
38563
- }] });
38564
-
38565
38587
  /**
38566
38588
  * Configuración de espaciado predefinida
38567
38589
  */
@@ -89621,5 +89643,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
89621
89643
  * Generated bundle index. Do not edit.
89622
89644
  */
89623
89645
 
89624
- export { ACCESS_REQUEST_TYPE, ACCESS_REQUEST_VIEW_I18N, ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccessControlService, AccessRequestViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimalCardComponent, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BackButtonComponent, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, BubbleBlitzGameComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CanAccessDirective, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, ChatComposerComponent, ChatInputComponent, ChatWindowComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ChipSelectComponent, ClientTelemetryService, CodeDisplayComponent, CodeValidatorComponent, CollectionsService, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ConfirmationDialogV2Component, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentReactionModalComponent, ContentService, ContentTransformer, ConversationListItemComponent, ConversationService, CookieBannerComponent, CookieSettingsComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CANONICAL_FIELD_ALIASES, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_POST_UPDATE_GRACE_MS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DangerSectionComponent, DataTableComponent, DatasetPaginationService, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EXPECTED_NOT_FOUND, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, EntityFeedService, EntradaSerializada, ExpandableTextComponent, ExternalBrowserService, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeatureControlService, FeatureGuardDirective, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FieldOptionsEditorComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FolderTabsComponent, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSchemaBuilderService, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GAME_AVATAR_CATALOG_SIZE_PER_STYLE, GameAvatarComponent, GameProfileService, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, GroupMembersComponent, GroupPickerComponent, GroupsService, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandleService, HandoffService, HapticsService, HasPermissionDirective, HeaderActionsService, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, HtmlViewerModalComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, KNOWN_ROUTES, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LightRippleDirective, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LiveReadFallbackService, LoadMoreComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METADATA_LIST_DEFAULTS, META_SCHEMA_VERSION, METRIC_CARD_DEFAULTS, MINI_GAMES_I18N, MINI_GAME_PLAYER_AVATARS, MINI_GAME_PLAYER_COLORS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MediaViewerModalComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MemoryGameComponent, MenuComponent, MessageBubbleComponent, MessagingService, MetaService, MetadataListComponent, MeteringService, MetricCardComponent, MfaModalComponent, MiniGameCalloutComponent, MiniGamePlayerProfileService, MiniGameScorePopComponent, MiniGamesMenuComponent, ModalLayoutComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NoticeComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberPickerComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OperationReferenceComponent, OptionCardsComponent, OptionSheetComponent, OptionSheetService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PERSONA_CONFIG, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PdfService, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PersonaService, PhoneDisplayComponent, PhoneFormatService, PhoneInputComponent, PickerV2Component, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PricingTableComponent, ProcessLinksPipe, ProfileCardComponent, ProfileContentComponent, ProfileModalComponent, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrBrandValidationError, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RbacService, ReactionBarComponent, ReactionsService, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestReviewPanelComponent, RequestService, RetroAudioService, RightsFooterComponent, RoleManagerComponent, 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, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SessionTransitionOverlayComponent, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimonGameComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SupportTicketCtaComponent, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeSelectorComponent, ThemeService, ThreadPanelComponent, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, TypingIndicatorComponent, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UsageMetersComponent, UsageService, UserAvatarComponent, UsernameInputComponent, VALTECH_ACCESS_FEATURES, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_CHAT_CONFIG, VALTECH_COLLECTIONS_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_COPYRIGHT_TEMPLATE, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DIAGRAMS, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_LEGAL_ENTITY, VALTECH_MENU_I18N, VALTECH_NETWORK_ERROR_KEY, VALTECH_REACTIONS_CONFIG, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VAL_REGISTERED_ICONS, VERSION, ValCommentThreadComponent, ValQuotaWarningComponent, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, WorkflowService, accessGuard, accessGuardFromRoute, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildPlatformMenu, buildSettingsCards, buildSideNavItemsFromBottomNav, button, canSubmitRequestType, classifyChip, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGameAvatarCatalog, createGameAvatarProps, createGlowCardProps, createInitialDatasetState, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, datasetPageFromLegacyCursor, defaultQrBrand, docs, errorLoggingInterceptor, evaluateValtechAccess, extractPathParams, firmaDeSesionDeCustomToken, formatClockTime, formatDateSeparator, formatRelativeTime, gameAvatarCatalogEntryToMetadata, gameAvatarDataUri, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isKnownRoute, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, providePersona, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccessFeatures, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechChat, provideValtechCollections, provideValtechContent, provideValtechDebugConsole, provideValtechDiagrams, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationClickActions, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechReactions, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, qrContrastRatio, qrErrorCorrectionFor, query, rbacGuard, renderGameAvatarSvg, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveCopyrightTemplate, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, roleOf, selectableRequestTypes, storagePaths, suggestEmailFix, superAdminGuard, supportedGameAvatarStyles, toArticle, validateQrBrand, validateRoutes };
89646
+ export { ACCESS_REQUEST_TYPE, ACCESS_REQUEST_VIEW_I18N, ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccessControlService, AccessRequestViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimalCardComponent, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BackButtonComponent, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, BubbleBlitzGameComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CanAccessDirective, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, ChatComposerComponent, ChatInputComponent, ChatWindowComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ChipSelectComponent, ClientTelemetryService, CodeDisplayComponent, CodeValidatorComponent, CollectionsService, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ConfirmationDialogV2Component, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentReactionModalComponent, ContentService, ContentTransformer, ConversationListItemComponent, ConversationService, CookieBannerComponent, CookieSettingsComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CANONICAL_FIELD_ALIASES, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_POST_UPDATE_GRACE_MS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DangerSectionComponent, DataTableComponent, DatasetPaginationService, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EXPECTED_NOT_FOUND, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, EntityFeedService, EntradaSerializada, ExpandableTextComponent, ExternalBrowserService, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeatureControlService, FeatureGuardDirective, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FieldOptionsEditorComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FolderTabsComponent, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSchemaBuilderService, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GAME_AVATAR_CATALOG_SIZE_PER_STYLE, GameAvatarComponent, GameProfileService, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, GroupMembersComponent, GroupPickerComponent, GroupsService, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandleService, HandoffService, HapticsService, HasPermissionDirective, HeaderActionsService, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, HtmlViewerModalComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, KNOWN_ROUTES, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LightRippleDirective, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LiveReadFallbackService, LoadMoreComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METADATA_LIST_DEFAULTS, META_SCHEMA_VERSION, METRIC_CARD_DEFAULTS, MINI_GAMES_I18N, MINI_GAME_PLAYER_AVATARS, MINI_GAME_PLAYER_COLORS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MediaViewerModalComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MemoryGameComponent, MenuComponent, MessageBubbleComponent, MessagingService, MetaService, MetadataListComponent, MeteringService, MetricCardComponent, MfaModalComponent, MiniGameCalloutComponent, MiniGamePlayerProfileService, MiniGameScorePopComponent, MiniGamesMenuComponent, ModalLayoutComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NoticeComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberPickerComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OperationReferenceComponent, OptionCardsComponent, OptionSheetComponent, OptionSheetService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PERSONA_CONFIG, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PdfService, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PersonaService, PhoneDisplayComponent, PhoneFormatService, PhoneInputComponent, PickerV2Component, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PricingTableComponent, ProcessLinksPipe, ProfileCardComponent, ProfileContentComponent, ProfileModalComponent, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrBrandValidationError, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RbacService, ReactionBarComponent, ReactionsService, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestReviewPanelComponent, RequestService, RetroAudioService, RightsFooterComponent, RoleManagerComponent, 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, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SelectSearchPickerModalComponent, SessionListModalComponent, SessionService, SessionTransitionOverlayComponent, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimonGameComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SupportTicketCtaComponent, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeSelectorComponent, ThemeService, ThreadPanelComponent, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, TypingIndicatorComponent, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UsageMetersComponent, UsageService, UserAvatarComponent, UsernameInputComponent, VALTECH_ACCESS_FEATURES, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_CHAT_CONFIG, VALTECH_COLLECTIONS_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_COPYRIGHT_TEMPLATE, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DIAGRAMS, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_LEGAL_ENTITY, VALTECH_MENU_I18N, VALTECH_NETWORK_ERROR_KEY, VALTECH_REACTIONS_CONFIG, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VAL_REGISTERED_ICONS, VERSION, ValCommentThreadComponent, ValQuotaWarningComponent, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, WorkflowService, accessGuard, accessGuardFromRoute, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildPlatformMenu, buildSettingsCards, buildSideNavItemsFromBottomNav, button, canSubmitRequestType, classifyChip, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGameAvatarCatalog, createGameAvatarProps, createGlowCardProps, createInitialDatasetState, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, datasetPageFromLegacyCursor, defaultQrBrand, docs, errorLoggingInterceptor, evaluateValtechAccess, extractPathParams, firmaDeSesionDeCustomToken, formatClockTime, formatDateSeparator, formatRelativeTime, gameAvatarCatalogEntryToMetadata, gameAvatarDataUri, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isKnownRoute, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, providePersona, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccessFeatures, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechChat, provideValtechCollections, provideValtechContent, provideValtechDebugConsole, provideValtechDiagrams, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationClickActions, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechReactions, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, qrContrastRatio, qrErrorCorrectionFor, query, rbacGuard, renderGameAvatarSvg, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveCopyrightTemplate, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, roleOf, selectableRequestTypes, storagePaths, suggestEmailFix, superAdminGuard, supportedGameAvatarStyles, toArticle, validateQrBrand, validateRoutes };
89625
89647
  //# sourceMappingURL=valtech-components.mjs.map