valtech-components 4.0.548 → 4.0.550

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.
@@ -23,7 +23,7 @@ import { IonicModule, ToastController, NavController } from '@ionic/angular';
23
23
  import { isSupported, getMessaging as getMessaging$1, getToken, deleteToken, onMessage } from 'firebase/messaging';
24
24
  import { getApps, getApp, initializeApp as initializeApp$1 } from 'firebase/app';
25
25
  import * as i2$1 from '@ionic/angular/standalone';
26
- import { AlertController, IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal, IonHeader, IonToolbar, IonContent, IonButtons, IonTitle, IonProgressBar, IonSkeletonText, IonFab, IonFabButton, IonFabList, IonLabel, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonRadio, IonRadioGroup, IonTextarea, IonDatetime, IonSelect, IonSelectOption, IonPopover, IonList, IonItem, IonInput, IonChip, IonRange, IonSearchbar, IonSegment, IonSegmentButton, IonToggle, IonRippleEffect, IonAccordion, IonAccordionGroup, IonTabBar, IonTabButton, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonInfiniteScroll, IonInfiniteScrollContent, IonNote, IonDatetimeButton, ToastController as ToastController$1, IonCol, IonRow, IonRefresher, IonRefresherContent, IonFooter, IonMenuButton, IonListHeader, IonGrid, MenuController, IonMenu, IonMenuToggle, IonSplitPane } from '@ionic/angular/standalone';
26
+ import { AlertController, IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal, IonHeader, IonToolbar, IonContent, IonButtons, IonTitle, IonProgressBar, IonSkeletonText, IonFab, IonFabButton, IonFabList, IonLabel, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonRadio, IonRadioGroup, IonTextarea, IonDatetime, IonInput, IonSelect, IonSelectOption, IonPopover, IonList, IonItem, IonChip, IonRange, IonSearchbar, IonSegment, IonSegmentButton, IonToggle, IonRippleEffect, IonAccordion, IonAccordionGroup, IonTabBar, IonTabButton, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonInfiniteScroll, IonInfiniteScrollContent, IonNote, IonDatetimeButton, ToastController as ToastController$1, IonCol, IonRow, IonRefresher, IonRefresherContent, IonFooter, IonMenuButton, IonListHeader, IonGrid, MenuController, IonMenu, IonMenuToggle, IonSplitPane } from '@ionic/angular/standalone';
27
27
  import { addIcons } from 'ionicons';
28
28
  import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, createOutline, trashOutline, playOutline, peopleOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, cloudUploadOutline, textOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, personOutline, shieldCheckmarkOutline, keyOutline, desktopOutline, logOutOutline, cloudDownloadOutline, cloudOutline, gitBranchOutline, layersOutline, serverOutline, warningOutline, bulbOutline, lockOpenOutline, diamondOutline, newspaperOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, chevronDown, language, globeOutline, checkmark, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starOutline, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, mailOutline, chevronDownCircleOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, cloudOfflineOutline, documentOutline, attachOutline, cameraOutline, closeCircleOutline, imageOutline, printOutline, chevronBackOutline, sendOutline, chatbubbleEllipsesOutline, swapVerticalOutline, chevronUpOutline, searchOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, listOutline, folderOutline, documents, documentsOutline, statsChart, statsChartOutline, laptopOutline, swapHorizontalOutline, codeSlashOutline, notificationsOffOutline, alarmOutline, chatboxEllipsesOutline, checkmarkDoneOutline, cogOutline, shareSocialOutline, helpCircleOutline, sparklesOutline, trophyOutline, musicalNotesOutline, gameControllerOutline, volumeHighOutline, volumeMuteOutline, menuOutline, stopCircleOutline, videocamOffOutline, checkmarkDone, arrowUndoOutline, micOutline, pulseOutline, arrowUpOutline } from 'ionicons/icons';
29
29
  import { Browser } from '@capacitor/browser';
@@ -59,7 +59,7 @@ import fixWebmDuration from 'fix-webm-duration';
59
59
  * Current version of valtech-components.
60
60
  * This is automatically updated during the publish process.
61
61
  */
62
- const VERSION = '4.0.548';
62
+ const VERSION = '4.0.550';
63
63
 
64
64
  // Control de estado de refresco (singleton a nivel de módulo)
65
65
  let isRefreshing = false;
@@ -8822,6 +8822,19 @@ class AuthService {
8822
8822
  return throwError(() => authError);
8823
8823
  }));
8824
8824
  }
8825
+ /**
8826
+ * Continúa un login OAuth que volvió por redirect principal con MFA requerido.
8827
+ * En ese caso `signinWithOAuth()` no puede emitir porque la página navegó al
8828
+ * backend OAuth y el callback corre en una ruta nueva de la misma SPA.
8829
+ */
8830
+ setOAuthMFAPending(mfaToken, method) {
8831
+ this.stateService.clearError();
8832
+ this.stateService.setMFAPending({
8833
+ required: true,
8834
+ mfaToken,
8835
+ method,
8836
+ });
8837
+ }
8825
8838
  /**
8826
8839
  * Vincula un proveedor OAuth adicional a la cuenta actual.
8827
8840
  * Requiere que el usuario esté autenticado.
@@ -17072,6 +17085,228 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
17072
17085
  args: ['fileInput']
17073
17086
  }] } });
17074
17087
 
17088
+ class FieldOptionsEditorComponent {
17089
+ constructor() {
17090
+ this.props = {};
17091
+ this.optionsChange = new EventEmitter();
17092
+ this.fallback = {
17093
+ title: 'Options',
17094
+ hint: '',
17095
+ addLabel: 'Add options',
17096
+ optionsLabel: 'Options',
17097
+ placeholder: 'One option per line',
17098
+ emptyText: 'No options yet.',
17099
+ removeOptionLabel: 'Remove option',
17100
+ state: ComponentStates.ENABLED,
17101
+ };
17102
+ this.resolved = this.fallback;
17103
+ this.options = [];
17104
+ this.draft = '';
17105
+ addIcons({ addOutline, trashOutline });
17106
+ }
17107
+ ngOnChanges(changes) {
17108
+ if (changes['props']) {
17109
+ this.resolved = { ...this.fallback, ...this.props };
17110
+ this.options = this.normalizeOptions(this.props.options ?? []);
17111
+ }
17112
+ }
17113
+ get disabled() {
17114
+ return this.resolved.state !== ComponentStates.ENABLED;
17115
+ }
17116
+ stringValue(event) {
17117
+ return String(event.detail?.value ?? '');
17118
+ }
17119
+ addDraft() {
17120
+ const names = this.draft
17121
+ .split(/\r?\n|,/)
17122
+ .map(value => value.trim())
17123
+ .filter(Boolean);
17124
+ if (names.length === 0)
17125
+ return;
17126
+ const next = [...this.options, ...names.map(name => this.createOption(name))];
17127
+ this.draft = '';
17128
+ this.setOptions(next);
17129
+ }
17130
+ updateOption(id, name) {
17131
+ this.setOptions(this.options.map(option => option.id === id
17132
+ ? {
17133
+ ...option,
17134
+ name: name.trimStart(),
17135
+ }
17136
+ : option));
17137
+ }
17138
+ removeOption(id) {
17139
+ this.setOptions(this.options.filter(option => option.id !== id));
17140
+ }
17141
+ createOption(name) {
17142
+ return {
17143
+ id: this.uniqueID(this.optionID(name) || `option-${this.options.length + 1}`),
17144
+ name,
17145
+ order: this.options.length,
17146
+ };
17147
+ }
17148
+ setOptions(options) {
17149
+ this.options = this.normalizeOptions(options).filter(option => option.name.trim());
17150
+ this.optionsChange.emit(this.options);
17151
+ }
17152
+ normalizeOptions(options) {
17153
+ const seen = new Set();
17154
+ return [...options]
17155
+ .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
17156
+ .map((option, index) => {
17157
+ const name = option.name.trim();
17158
+ const id = this.uniqueID(option.id || this.optionID(name) || `option-${index + 1}`, seen);
17159
+ seen.add(id);
17160
+ return { id, name, order: index };
17161
+ });
17162
+ }
17163
+ uniqueID(value, used = new Set(this.options.map(option => option.id))) {
17164
+ const base = value || 'option';
17165
+ if (!used.has(base))
17166
+ return base;
17167
+ let suffix = 2;
17168
+ while (used.has(`${base}-${suffix}`))
17169
+ suffix += 1;
17170
+ return `${base}-${suffix}`;
17171
+ }
17172
+ optionID(value) {
17173
+ return value
17174
+ .normalize('NFD')
17175
+ .replace(/[\u0300-\u036f]/g, '')
17176
+ .replace(/[^a-zA-Z0-9]+/g, '-')
17177
+ .replace(/^-+|-+$/g, '')
17178
+ .toLowerCase();
17179
+ }
17180
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FieldOptionsEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17181
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FieldOptionsEditorComponent, isStandalone: true, selector: "val-field-options-editor", inputs: { props: "props" }, outputs: { optionsChange: "optionsChange" }, usesOnChanges: true, ngImport: i0, template: `
17182
+ <section class="options-editor">
17183
+ @if (resolved.title) {
17184
+ <h3>{{ resolved.title }}</h3>
17185
+ }
17186
+ @if (resolved.hint) {
17187
+ <p class="options-editor__hint">{{ resolved.hint }}</p>
17188
+ }
17189
+
17190
+ <div class="options-editor__add">
17191
+ <ion-textarea
17192
+ autoGrow="true"
17193
+ fill="outline"
17194
+ [placeholder]="resolved.placeholder"
17195
+ [value]="draft"
17196
+ [disabled]="disabled"
17197
+ (ionInput)="draft = stringValue($event)"
17198
+ />
17199
+ <ion-button
17200
+ type="button"
17201
+ fill="outline"
17202
+ shape="round"
17203
+ color="dark"
17204
+ [disabled]="disabled || !draft.trim()"
17205
+ (click)="addDraft()"
17206
+ >
17207
+ <ion-icon name="add-outline" slot="start" aria-hidden="true" />
17208
+ {{ resolved.addLabel }}
17209
+ </ion-button>
17210
+ </div>
17211
+
17212
+ @if (options.length === 0) {
17213
+ <p class="options-editor__empty">{{ resolved.emptyText }}</p>
17214
+ } @else {
17215
+ <div class="options-editor__list" [attr.aria-label]="resolved.optionsLabel">
17216
+ @for (option of options; track option.id) {
17217
+ <div class="options-editor__row">
17218
+ <ion-input
17219
+ fill="outline"
17220
+ [value]="option.name"
17221
+ [disabled]="disabled"
17222
+ [attr.aria-label]="resolved.optionsLabel"
17223
+ (ionInput)="updateOption(option.id, stringValue($event))"
17224
+ />
17225
+ <ion-button
17226
+ type="button"
17227
+ fill="clear"
17228
+ color="medium"
17229
+ [disabled]="disabled"
17230
+ [attr.aria-label]="resolved.removeOptionLabel"
17231
+ (click)="removeOption(option.id)"
17232
+ >
17233
+ <ion-icon name="trash-outline" slot="icon-only" />
17234
+ </ion-button>
17235
+ </div>
17236
+ }
17237
+ </div>
17238
+ }
17239
+ </section>
17240
+ `, isInline: true, styles: [".options-editor{margin-top:16px}.options-editor h3{margin:0 0 6px;color:var(--ion-color-dark);font-size:1rem}.options-editor__hint,.options-editor__empty{margin:0;color:var(--ion-color-medium);font-size:.875rem;line-height:1.35}.options-editor__add{display:grid;gap:10px;margin-top:12px}.options-editor__list{display:grid;gap:8px;margin-top:12px}.options-editor__row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "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", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }] }); }
17241
+ }
17242
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FieldOptionsEditorComponent, decorators: [{
17243
+ type: Component,
17244
+ args: [{ selector: 'val-field-options-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon, IonInput, IonTextarea], template: `
17245
+ <section class="options-editor">
17246
+ @if (resolved.title) {
17247
+ <h3>{{ resolved.title }}</h3>
17248
+ }
17249
+ @if (resolved.hint) {
17250
+ <p class="options-editor__hint">{{ resolved.hint }}</p>
17251
+ }
17252
+
17253
+ <div class="options-editor__add">
17254
+ <ion-textarea
17255
+ autoGrow="true"
17256
+ fill="outline"
17257
+ [placeholder]="resolved.placeholder"
17258
+ [value]="draft"
17259
+ [disabled]="disabled"
17260
+ (ionInput)="draft = stringValue($event)"
17261
+ />
17262
+ <ion-button
17263
+ type="button"
17264
+ fill="outline"
17265
+ shape="round"
17266
+ color="dark"
17267
+ [disabled]="disabled || !draft.trim()"
17268
+ (click)="addDraft()"
17269
+ >
17270
+ <ion-icon name="add-outline" slot="start" aria-hidden="true" />
17271
+ {{ resolved.addLabel }}
17272
+ </ion-button>
17273
+ </div>
17274
+
17275
+ @if (options.length === 0) {
17276
+ <p class="options-editor__empty">{{ resolved.emptyText }}</p>
17277
+ } @else {
17278
+ <div class="options-editor__list" [attr.aria-label]="resolved.optionsLabel">
17279
+ @for (option of options; track option.id) {
17280
+ <div class="options-editor__row">
17281
+ <ion-input
17282
+ fill="outline"
17283
+ [value]="option.name"
17284
+ [disabled]="disabled"
17285
+ [attr.aria-label]="resolved.optionsLabel"
17286
+ (ionInput)="updateOption(option.id, stringValue($event))"
17287
+ />
17288
+ <ion-button
17289
+ type="button"
17290
+ fill="clear"
17291
+ color="medium"
17292
+ [disabled]="disabled"
17293
+ [attr.aria-label]="resolved.removeOptionLabel"
17294
+ (click)="removeOption(option.id)"
17295
+ >
17296
+ <ion-icon name="trash-outline" slot="icon-only" />
17297
+ </ion-button>
17298
+ </div>
17299
+ }
17300
+ </div>
17301
+ }
17302
+ </section>
17303
+ `, styles: [".options-editor{margin-top:16px}.options-editor h3{margin:0 0 6px;color:var(--ion-color-dark);font-size:1rem}.options-editor__hint,.options-editor__empty{margin:0;color:var(--ion-color-medium);font-size:.875rem;line-height:1.35}.options-editor__add{display:grid;gap:10px;margin-top:12px}.options-editor__list{display:grid;gap:8px;margin-top:12px}.options-editor__row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px}\n"] }]
17304
+ }], ctorParameters: () => [], propDecorators: { props: [{
17305
+ type: Input
17306
+ }], optionsChange: [{
17307
+ type: Output
17308
+ }] } });
17309
+
17075
17310
  /**
17076
17311
  * val-hint
17077
17312
  *
@@ -17396,8 +17631,7 @@ class LanguageSelectorComponent {
17396
17631
  * Emits the selected language code.
17397
17632
  */
17398
17633
  this.languageChange = new EventEmitter();
17399
- /** Unique ID for the icon mode popover trigger */
17400
- this.popoverId = `lang-selector-${Math.random().toString(36).substring(2, 9)}`;
17634
+ this.iconPopoverOpen = false;
17401
17635
  /** Available languages (exposed for icon mode template) */
17402
17636
  this.availableLanguages = [];
17403
17637
  /** Current language (exposed for icon mode template) */
@@ -17487,6 +17721,14 @@ class LanguageSelectorComponent {
17487
17721
  }
17488
17722
  }
17489
17723
  }
17724
+ openIconPopover(event) {
17725
+ event.stopPropagation();
17726
+ this.iconPopoverEvent = event;
17727
+ this.iconPopoverOpen = true;
17728
+ }
17729
+ closeIconPopover() {
17730
+ this.iconPopoverOpen = false;
17731
+ }
17490
17732
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LanguageSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17491
17733
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LanguageSelectorComponent, isStandalone: true, selector: "val-language-selector", inputs: { props: "props" }, outputs: { languageChange: "languageChange" }, ngImport: i0, template: `
17492
17734
  <!-- Default mode: use popover-selector -->
@@ -17497,7 +17739,6 @@ class LanguageSelectorComponent {
17497
17739
  <!-- Icon mode: compact globe button with popover -->
17498
17740
  @if (props.mode === 'icon') {
17499
17741
  <ion-button
17500
- [id]="popoverId"
17501
17742
  [color]="props.color || 'medium'"
17502
17743
  [fill]="props.fill || 'clear'"
17503
17744
  [size]="props.size || 'default'"
@@ -17505,11 +17746,17 @@ class LanguageSelectorComponent {
17505
17746
  [attr.aria-label]="'Cambiar idioma'"
17506
17747
  class="icon-mode-button"
17507
17748
  style="min-width: 44px; width: 44px; height: 44px; margin: 0; --padding-start: 0; --padding-end: 0;"
17749
+ (click)="openIconPopover($event)"
17508
17750
  >
17509
17751
  <ion-icon slot="icon-only" [name]="props.icon || 'globe-outline'" aria-hidden="true"></ion-icon>
17510
17752
  </ion-button>
17511
17753
 
17512
- <ion-popover [trigger]="popoverId" [dismissOnSelect]="true">
17754
+ <ion-popover
17755
+ [isOpen]="iconPopoverOpen"
17756
+ [event]="iconPopoverEvent"
17757
+ [dismissOnSelect]="true"
17758
+ (didDismiss)="closeIconPopover()"
17759
+ >
17513
17760
  <ng-template>
17514
17761
  <ion-list>
17515
17762
  @for (lang of availableLanguages; track lang) {
@@ -17542,7 +17789,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
17542
17789
  <!-- Icon mode: compact globe button with popover -->
17543
17790
  @if (props.mode === 'icon') {
17544
17791
  <ion-button
17545
- [id]="popoverId"
17546
17792
  [color]="props.color || 'medium'"
17547
17793
  [fill]="props.fill || 'clear'"
17548
17794
  [size]="props.size || 'default'"
@@ -17550,11 +17796,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
17550
17796
  [attr.aria-label]="'Cambiar idioma'"
17551
17797
  class="icon-mode-button"
17552
17798
  style="min-width: 44px; width: 44px; height: 44px; margin: 0; --padding-start: 0; --padding-end: 0;"
17799
+ (click)="openIconPopover($event)"
17553
17800
  >
17554
17801
  <ion-icon slot="icon-only" [name]="props.icon || 'globe-outline'" aria-hidden="true"></ion-icon>
17555
17802
  </ion-button>
17556
17803
 
17557
- <ion-popover [trigger]="popoverId" [dismissOnSelect]="true">
17804
+ <ion-popover
17805
+ [isOpen]="iconPopoverOpen"
17806
+ [event]="iconPopoverEvent"
17807
+ [dismissOnSelect]="true"
17808
+ (didDismiss)="closeIconPopover()"
17809
+ >
17558
17810
  <ng-template>
17559
17811
  <ion-list>
17560
17812
  @for (lang of availableLanguages; track lang) {
@@ -17861,7 +18113,7 @@ class FontSizeSelectorComponent {
17861
18113
  this.props = {};
17862
18114
  this.fontSizeService = inject(FontSizeService);
17863
18115
  this.i18n = inject(I18nService);
17864
- this.popoverId = `font-size-selector-${Math.random().toString(36).slice(2, 8)}`;
18116
+ this.isOpen = false;
17865
18117
  this.currentSize = this.fontSizeService.size;
17866
18118
  this.i18n.registerDefaults('FontSizeSelector', FONT_SIZE_SELECTOR_I18N);
17867
18119
  }
@@ -17875,13 +18127,20 @@ class FontSizeSelectorComponent {
17875
18127
  setSize(size) {
17876
18128
  this.fontSizeService.setSize(size);
17877
18129
  }
18130
+ openPopover(event) {
18131
+ event.stopPropagation();
18132
+ this.popoverEvent = event;
18133
+ this.isOpen = true;
18134
+ }
18135
+ closePopover() {
18136
+ this.isOpen = false;
18137
+ }
17878
18138
  t(key) {
17879
18139
  return this.i18n.t(key, 'FontSizeSelector');
17880
18140
  }
17881
18141
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FontSizeSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17882
18142
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FontSizeSelectorComponent, isStandalone: true, selector: "val-font-size-selector", inputs: { props: "props" }, ngImport: i0, template: `
17883
18143
  <ion-button
17884
- [id]="popoverId"
17885
18144
  [color]="props.color || 'medium'"
17886
18145
  [fill]="props.fill || 'clear'"
17887
18146
  [size]="props.size || 'default'"
@@ -17889,11 +18148,17 @@ class FontSizeSelectorComponent {
17889
18148
  [attr.aria-label]="t('ariaLabel')"
17890
18149
  class="icon-mode-button"
17891
18150
  style="min-width: 44px; width: 44px; height: 44px; margin: 0; --padding-start: 0; --padding-end: 0;"
18151
+ (click)="openPopover($event)"
17892
18152
  >
17893
18153
  <ion-icon slot="icon-only" name="text-outline" aria-hidden="true"></ion-icon>
17894
18154
  </ion-button>
17895
18155
 
17896
- <ion-popover [trigger]="popoverId" [dismissOnSelect]="true">
18156
+ <ion-popover
18157
+ [isOpen]="isOpen"
18158
+ [event]="popoverEvent"
18159
+ [dismissOnSelect]="true"
18160
+ (didDismiss)="closePopover()"
18161
+ >
17897
18162
  <ng-template>
17898
18163
  <ion-list>
17899
18164
  @for (option of options; track option.value) {
@@ -17919,7 +18184,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
17919
18184
  type: Component,
17920
18185
  args: [{ selector: 'val-font-size-selector', standalone: true, imports: [IonButton, IonIcon, IonPopover, IonList, IonItem, IonLabel], template: `
17921
18186
  <ion-button
17922
- [id]="popoverId"
17923
18187
  [color]="props.color || 'medium'"
17924
18188
  [fill]="props.fill || 'clear'"
17925
18189
  [size]="props.size || 'default'"
@@ -17927,11 +18191,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
17927
18191
  [attr.aria-label]="t('ariaLabel')"
17928
18192
  class="icon-mode-button"
17929
18193
  style="min-width: 44px; width: 44px; height: 44px; margin: 0; --padding-start: 0; --padding-end: 0;"
18194
+ (click)="openPopover($event)"
17930
18195
  >
17931
18196
  <ion-icon slot="icon-only" name="text-outline" aria-hidden="true"></ion-icon>
17932
18197
  </ion-button>
17933
18198
 
17934
- <ion-popover [trigger]="popoverId" [dismissOnSelect]="true">
18199
+ <ion-popover
18200
+ [isOpen]="isOpen"
18201
+ [event]="popoverEvent"
18202
+ [dismissOnSelect]="true"
18203
+ (didDismiss)="closePopover()"
18204
+ >
17935
18205
  <ng-template>
17936
18206
  <ion-list>
17937
18207
  @for (option of options; track option.value) {
@@ -35462,10 +35732,7 @@ class OAuthCallbackComponent {
35462
35732
  const params = new URLSearchParams(window.location.search);
35463
35733
  if (params.get('popup') === 'true')
35464
35734
  return false;
35465
- // Compatibilidad con flujos sin popup=true (redirect directo, tests, legacy).
35466
- if (window.name === 'oauth' || window.name === 'oauth-link')
35467
- return false;
35468
- return !window.opener && window.parent === window;
35735
+ return !window.opener;
35469
35736
  }
35470
35737
  /**
35471
35738
  * Completa el login en la ventana principal: instala la sesión desde los
@@ -35514,6 +35781,8 @@ class OAuthCallbackComponent {
35514
35781
  // MFA requerido — el backend redirige sin tokens, con mfa_token. El flujo
35515
35782
  // continúa con el challenge MFA (AuthService.setMFAPending → modal verify).
35516
35783
  if (params.get('mfa_required') === 'true') {
35784
+ const mfaToken = params.get('mfa_token') || undefined;
35785
+ const mfaMethod = params.get('mfa_method') || undefined;
35517
35786
  this.sendToParent({
35518
35787
  type: 'oauth-callback',
35519
35788
  tokens: {
@@ -35521,10 +35790,19 @@ class OAuthCallbackComponent {
35521
35790
  refreshToken: '',
35522
35791
  expiresIn: 0,
35523
35792
  mfaRequired: true,
35524
- mfaToken: params.get('mfa_token') || undefined,
35525
- mfaMethod: params.get('mfa_method') || undefined,
35793
+ mfaToken,
35794
+ mfaMethod,
35526
35795
  },
35527
35796
  });
35797
+ // Flujo redirect en ventana principal: no hay opener escuchando el
35798
+ // callback. Dejamos el challenge en AuthService y volvemos al login para
35799
+ // que val-login abra el modal MFA sobre la misma SPA.
35800
+ if (this.isMainWindow() && this.authService && mfaToken && mfaMethod) {
35801
+ this.authService.setOAuthMFAPending(mfaToken, mfaMethod);
35802
+ const loginRoute = this.config?.loginRoute || '/login';
35803
+ this.router.navigateByUrl(`${loginRoute}?oauth_mfa=1`, { replaceUrl: true });
35804
+ return;
35805
+ }
35528
35806
  this.message = 'Verificación adicional requerida';
35529
35807
  this.closeAfterDelay();
35530
35808
  return;
@@ -35633,7 +35911,7 @@ class OAuthCallbackComponent {
35633
35911
  // (window.name se borra en cross-origin nav; window.opener sever por COOP).
35634
35912
  setTimeout(() => {
35635
35913
  const params = new URLSearchParams(window.location.search);
35636
- const isPopup = params.get('popup') === 'true' || window.name === 'oauth' || window.name === 'oauth-link';
35914
+ const isPopup = params.get('popup') === 'true';
35637
35915
  if (window.opener || isPopup) {
35638
35916
  window.close();
35639
35917
  }
@@ -44879,6 +45157,9 @@ class LoginComponent {
44879
45157
  if (this.props.initialOperation === 'signup') {
44880
45158
  this.isRegisterModalOpen = true;
44881
45159
  }
45160
+ if (this.authService.mfaPending().required) {
45161
+ queueMicrotask(() => this.openMFAVerifyModal());
45162
+ }
44882
45163
  }
44883
45164
  ngOnDestroy() {
44884
45165
  this.stopResendCooldown();
@@ -93521,5 +93802,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
93521
93802
  * Generated bundle index. Do not edit.
93522
93803
  */
93523
93804
 
93524
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, BubbleBlitzGameComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHESSIMALS_BOT_PROFILES, CHEV_KEYS, CHRISTIANITY_BATTLE_SLOTS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, ChatComposerComponent, ChatInputComponent, ChatWindowComponent, CheckInputComponent, CheckboxRadioInputComponent, ChessimalsGameComponent, ChessimalsOnlineService, ChipGroupComponent, ChristianityGameComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, 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, 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, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, EntityFeedService, ExpandableTextComponent, ExternalBrowserService, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSchemaBuilderService, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, 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, META_SCHEMA_VERSION, METRIC_CARD_DEFAULTS, 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, MetricCardComponent, MfaModalComponent, MiniGameCalloutComponent, MiniGamePlayerProfileService, MiniGameScorePopComponent, MiniGamesMenuComponent, ModalLayoutComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OperationReferenceComponent, OptionCardsComponent, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PdfService, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PhoneDisplayComponent, PhoneFormatService, PhoneInputComponent, PickerV2Component, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PricingTableComponent, ProcessLinksPipe, ProfileContentComponent, ProfileModalComponent, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, ReactionBarComponent, ReactionsService, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestService, RetroAudioService, 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, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SessionTransitionOverlayComponent, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimonGameComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, 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_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_CHAT_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_REACTIONS_CONFIG, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VERSION, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, WorkflowService, advanceTurn, applyChessimalsMove, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, buildSideNavItemsFromBottomNav, button, canPlayCard, canSubmitRequestType, canUseOfferingAbility, chooseChessimalsBotMove, cleanupDestroyed, collections, connectPageRefresh, createChessimalsGame, createChessimalsReviewState, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialDatasetState, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, datasetPageFromLegacyCursor, docs, errorLoggingInterceptor, evaluateVictory, extractPathParams, formatClockTime, formatDateSeparator, formatRelativeTime, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getChessimalsAllLegalMoves, getChessimalsLegalMoves, getChessimalsPieceAt, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isKnownRoute, isValidPath, joinPath, maxLength, mulberry32, news, opponentSeat, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, playCardFromHand, positionKey, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechChat, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationClickActions, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechReactions, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, query, rbacGuard, readyOfferings, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resignChessimalsGame, resolveAttackCharacter, resolveAttackLeader, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveOfferingAbility, resolveWebBaseUrl, roleGuard, selectableRequestTypes, spendOfferings, storagePaths, superAdminGuard, toArticle, totalOfferings, validateRoutes };
93805
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, BubbleBlitzGameComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHESSIMALS_BOT_PROFILES, CHEV_KEYS, CHRISTIANITY_BATTLE_SLOTS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, ChatComposerComponent, ChatInputComponent, ChatWindowComponent, CheckInputComponent, CheckboxRadioInputComponent, ChessimalsGameComponent, ChessimalsOnlineService, ChipGroupComponent, ChristianityGameComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, 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, 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, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, EntityFeedService, ExpandableTextComponent, ExternalBrowserService, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FieldOptionsEditorComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSchemaBuilderService, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, 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, META_SCHEMA_VERSION, METRIC_CARD_DEFAULTS, 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, MetricCardComponent, MfaModalComponent, MiniGameCalloutComponent, MiniGamePlayerProfileService, MiniGameScorePopComponent, MiniGamesMenuComponent, ModalLayoutComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OperationReferenceComponent, OptionCardsComponent, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PdfService, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PhoneDisplayComponent, PhoneFormatService, PhoneInputComponent, PickerV2Component, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PricingTableComponent, ProcessLinksPipe, ProfileContentComponent, ProfileModalComponent, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, ReactionBarComponent, ReactionsService, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestService, RetroAudioService, 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, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SessionTransitionOverlayComponent, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimonGameComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, 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_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_CHAT_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_REACTIONS_CONFIG, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VERSION, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, WorkflowService, advanceTurn, applyChessimalsMove, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, buildSideNavItemsFromBottomNav, button, canPlayCard, canSubmitRequestType, canUseOfferingAbility, chooseChessimalsBotMove, cleanupDestroyed, collections, connectPageRefresh, createChessimalsGame, createChessimalsReviewState, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialDatasetState, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, datasetPageFromLegacyCursor, docs, errorLoggingInterceptor, evaluateVictory, extractPathParams, formatClockTime, formatDateSeparator, formatRelativeTime, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getChessimalsAllLegalMoves, getChessimalsLegalMoves, getChessimalsPieceAt, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isKnownRoute, isValidPath, joinPath, maxLength, mulberry32, news, opponentSeat, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, playCardFromHand, positionKey, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechChat, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationClickActions, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechReactions, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, query, rbacGuard, readyOfferings, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resignChessimalsGame, resolveAttackCharacter, resolveAttackLeader, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveOfferingAbility, resolveWebBaseUrl, roleGuard, selectableRequestTypes, spendOfferings, storagePaths, superAdminGuard, toArticle, totalOfferings, validateRoutes };
93525
93806
  //# sourceMappingURL=valtech-components.mjs.map