valtech-components 2.0.496 → 2.0.498

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/esm2022/lib/components/molecules/language-selector/language-selector.component.mjs +23 -14
  2. package/esm2022/lib/components/molecules/language-selector/types.mjs +1 -1
  3. package/esm2022/lib/services/auth/auth.service.mjs +16 -3
  4. package/esm2022/lib/services/auth/types.mjs +1 -1
  5. package/esm2022/lib/services/firebase/analytics-types.mjs +7 -0
  6. package/esm2022/lib/services/firebase/types.mjs +1 -1
  7. package/esm2022/lib/services/i18n/config.mjs +50 -0
  8. package/esm2022/lib/services/i18n/i18n.service.mjs +196 -0
  9. package/esm2022/lib/services/i18n/index.mjs +9 -0
  10. package/esm2022/lib/services/i18n/translate.pipe.mjs +50 -0
  11. package/esm2022/lib/services/i18n/types.mjs +14 -0
  12. package/esm2022/lib/services/presets/config.mjs +46 -0
  13. package/esm2022/lib/services/presets/index.mjs +5 -0
  14. package/esm2022/lib/services/presets/preset.service.mjs +104 -0
  15. package/esm2022/lib/services/presets/types.mjs +2 -0
  16. package/esm2022/public-api.mjs +9 -1
  17. package/fesm2022/valtech-components.mjs +526 -54
  18. package/fesm2022/valtech-components.mjs.map +1 -1
  19. package/lib/components/molecules/language-selector/language-selector.component.d.ts +1 -4
  20. package/lib/components/molecules/language-selector/types.d.ts +7 -0
  21. package/lib/services/auth/auth.service.d.ts +4 -2
  22. package/lib/services/auth/types.d.ts +4 -0
  23. package/lib/services/firebase/analytics-types.d.ts +219 -0
  24. package/lib/services/firebase/types.d.ts +11 -0
  25. package/lib/services/i18n/config.d.ts +29 -0
  26. package/lib/services/i18n/i18n.service.d.ts +112 -0
  27. package/lib/services/i18n/index.d.ts +4 -0
  28. package/lib/services/i18n/translate.pipe.d.ts +36 -0
  29. package/lib/services/i18n/types.d.ts +59 -0
  30. package/lib/services/presets/config.d.ts +32 -0
  31. package/lib/services/presets/index.d.ts +3 -0
  32. package/lib/services/presets/preset.service.d.ts +69 -0
  33. package/lib/services/presets/types.d.ts +39 -0
  34. package/package.json +1 -1
  35. package/public-api.d.ts +2 -0
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Component, Input, Output, Injectable, HostListener, inject, Pipe, ChangeDetectionStrategy, ViewChild, ChangeDetectorRef, ElementRef, signal, computed, InjectionToken, makeEnvironmentProviders, Inject, PLATFORM_ID, APP_INITIALIZER, Optional, runInInjectionContext, effect } from '@angular/core';
2
+ import { EventEmitter, Component, Input, Output, Injectable, HostListener, inject, Pipe, ChangeDetectionStrategy, ViewChild, signal, computed, makeEnvironmentProviders, APP_INITIALIZER, ChangeDetectorRef, ElementRef, InjectionToken, Inject, PLATFORM_ID, Optional, runInInjectionContext, effect } from '@angular/core';
3
3
  import * as i2$1 from '@ionic/angular/standalone';
4
4
  import { IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal, IonHeader, IonToolbar, IonContent, IonButtons, IonTitle, IonProgressBar, IonSkeletonText, IonFab, IonFabButton, IonFabList, IonLabel, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonTextarea, IonDatetime, IonDatetimeButton, IonInput, IonSelect, IonSelectOption, IonRadioGroup, IonRadio, IonRange, IonSearchbar, IonSegment, IonSegmentButton, IonToggle, IonAccordion, IonAccordionGroup, IonItem, IonTabBar, IonTabButton, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonChip, IonPopover, IonList, IonNote, ToastController as ToastController$1, IonCol, IonRow, IonMenuButton, IonFooter, IonListHeader, IonInfiniteScroll, IonInfiniteScrollContent, IonGrid, MenuController, IonMenu, IonMenuToggle, AlertController } from '@ionic/angular/standalone';
5
5
  import * as i1 from '@angular/common';
@@ -5112,78 +5112,308 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
5112
5112
  }] } });
5113
5113
 
5114
5114
  /**
5115
- * Clave para persistir el idioma en localStorage
5115
+ * Valores por defecto de configuración
5116
5116
  */
5117
- const LANG_STORAGE_KEY = 'app_lang';
5117
+ const DEFAULT_I18N_CONFIG = {
5118
+ defaultLanguage: 'es',
5119
+ supportedLanguages: ['es', 'en'],
5120
+ detectBrowserLanguage: true,
5121
+ content: {},
5122
+ };
5118
5123
  /**
5119
- * Idioma por defecto
5124
+ * Clave para persistir idioma en localStorage
5120
5125
  */
5121
- const DEFAULT_LANG = 'es';
5126
+ const LANG_STORAGE_KEY$1 = 'app_lang';
5127
+
5122
5128
  /**
5123
- * Servicio mínimo de localización.
5129
+ * Servicio de internacionalización basado en Angular Signals.
5124
5130
  *
5125
- * - Lee el idioma desde localStorage al iniciar
5126
- * - Proporciona método para cambiar idioma (recarga la página)
5127
- * - Sin observables ni subscripciones
5131
+ * Características:
5132
+ * - Sin RxJS: usa Signals para evitar memory leaks y congelamiento
5133
+ * - Namespace-based: organiza traducciones por contexto
5134
+ * - Fallback multi-nivel: namespace → _global → placeholder
5135
+ * - Interpolación: soporta {variable} en textos
5128
5136
  *
5129
5137
  * @example
5130
5138
  * // En un componente
5131
- * locale = inject(LocaleService);
5139
+ * i18n = inject(I18nService);
5132
5140
  *
5133
- * // Obtener idioma actual
5134
- * console.log(this.locale.lang); // 'es' o 'en'
5141
+ * // Obtener texto
5142
+ * const title = this.i18n.t('title', 'Login');
5135
5143
  *
5136
- * // Cambiar idioma (recarga la página)
5137
- * this.locale.setLang('en');
5144
+ * // Con interpolación
5145
+ * const welcome = this.i18n.t('welcome', 'Login', { name: 'Juan' });
5146
+ *
5147
+ * // Cambiar idioma
5148
+ * this.i18n.setLanguage('en');
5138
5149
  */
5139
- class LocaleService {
5150
+ class I18nService {
5140
5151
  constructor() {
5141
- this.lang = this.getStoredLang();
5152
+ // Estado interno con Signals
5153
+ this._lang = signal(DEFAULT_I18N_CONFIG.defaultLanguage);
5154
+ this._content = signal({});
5155
+ this._supportedLanguages = signal(DEFAULT_I18N_CONFIG.supportedLanguages);
5156
+ // Públicos readonly
5157
+ this.lang = this._lang.asReadonly();
5158
+ this.supportedLanguages = this._supportedLanguages.asReadonly();
5159
+ // Computed para verificaciones rápidas
5160
+ this.isSpanish = computed(() => this._lang() === 'es');
5161
+ this.isEnglish = computed(() => this._lang() === 'en');
5162
+ this.loadStoredLanguage();
5163
+ }
5164
+ /**
5165
+ * Obtiene texto traducido (alias corto de getText)
5166
+ *
5167
+ * @param key Clave del texto
5168
+ * @param namespace Namespace (default: '_global')
5169
+ * @param data Variables para interpolación
5170
+ * @returns Texto traducido o placeholder [namespace.key]
5171
+ *
5172
+ * @example
5173
+ * i18n.t('submit'); // busca en _global
5174
+ * i18n.t('title', 'Login'); // busca en Login
5175
+ * i18n.t('welcome', 'Login', {name}); // con interpolación
5176
+ */
5177
+ t(key, namespace, data) {
5178
+ return this.getText(key, namespace, data);
5142
5179
  }
5143
5180
  /**
5144
- * Cambia el idioma de la aplicación.
5145
- * Guarda en localStorage y recarga la página para aplicar el cambio.
5181
+ * Obtiene texto traducido
5146
5182
  *
5147
- * @param lang Nuevo idioma ('es' o 'en')
5183
+ * Fallback order:
5184
+ * 1. content[namespace][lang][key]
5185
+ * 2. content['_global'][lang][key]
5186
+ * 3. "[namespace.key]" (placeholder)
5187
+ */
5188
+ getText(key, namespace, data) {
5189
+ const content = this._content();
5190
+ const lang = this._lang();
5191
+ const ns = namespace || '_global';
5192
+ // Buscar en namespace específico
5193
+ let text = content[ns]?.[lang]?.[key];
5194
+ // Fallback a _global
5195
+ if (!text && ns !== '_global') {
5196
+ text = content['_global']?.[lang]?.[key];
5197
+ }
5198
+ // Fallback a placeholder
5199
+ if (!text) {
5200
+ console.warn(`[i18n] Missing translation: ${ns}.${key} (${lang})`);
5201
+ return `[${ns}.${key}]`;
5202
+ }
5203
+ // Aplicar interpolación si hay data
5204
+ if (data) {
5205
+ return this.interpolate(text, data);
5206
+ }
5207
+ return text;
5208
+ }
5209
+ /**
5210
+ * Cambia el idioma de la aplicación
5211
+ *
5212
+ * @param lang Nuevo idioma
5213
+ * @param forceReload Si true, recarga la página (fallback si reactividad falla)
5148
5214
  */
5149
- setLang(lang) {
5150
- if (lang === this.lang) {
5215
+ setLanguage(lang, forceReload = false) {
5216
+ if (!this._supportedLanguages().includes(lang)) {
5217
+ console.warn(`[i18n] Language '${lang}' not in supported languages`);
5151
5218
  return;
5152
5219
  }
5153
- localStorage.setItem(LANG_STORAGE_KEY, lang);
5154
- window.location.reload();
5220
+ if (lang === this._lang()) {
5221
+ return;
5222
+ }
5223
+ // Persistir en localStorage
5224
+ localStorage.setItem(LANG_STORAGE_KEY$1, lang);
5225
+ // Actualizar signal
5226
+ this._lang.set(lang);
5227
+ // Fallback: recargar si se solicita
5228
+ if (forceReload) {
5229
+ window.location.reload();
5230
+ }
5155
5231
  }
5156
5232
  /**
5157
- * Obtiene el idioma almacenado en localStorage.
5158
- * Si no existe o no es válido, retorna el idioma por defecto.
5233
+ * Registra contenido de traducciones para un namespace
5234
+ *
5235
+ * @param namespace Nombre del namespace
5236
+ * @param content Contenido de traducciones
5237
+ *
5238
+ * @example
5239
+ * i18n.registerContent('Login', {
5240
+ * es: { title: 'Iniciar sesión' },
5241
+ * en: { title: 'Sign in' }
5242
+ * });
5159
5243
  */
5160
- getStoredLang() {
5161
- const stored = localStorage.getItem(LANG_STORAGE_KEY);
5162
- if (stored === 'es' || stored === 'en') {
5163
- return stored;
5244
+ registerContent(namespace, content) {
5245
+ this._content.update((store) => ({
5246
+ ...store,
5247
+ [namespace]: content,
5248
+ }));
5249
+ }
5250
+ /**
5251
+ * Registra múltiples namespaces de una vez
5252
+ *
5253
+ * @param contentStore Objeto con namespaces como keys
5254
+ */
5255
+ registerContentBulk(contentStore) {
5256
+ this._content.update((store) => ({
5257
+ ...store,
5258
+ ...contentStore,
5259
+ }));
5260
+ }
5261
+ /**
5262
+ * Configura los idiomas soportados
5263
+ */
5264
+ setI18nLanguages(languages) {
5265
+ this._supportedLanguages.set(languages);
5266
+ }
5267
+ /**
5268
+ * Obtiene todos los namespaces registrados
5269
+ */
5270
+ getNamespaces() {
5271
+ return Object.keys(this._content());
5272
+ }
5273
+ /**
5274
+ * Verifica si un namespace tiene traducciones
5275
+ */
5276
+ hasNamespace(namespace) {
5277
+ return namespace in this._content();
5278
+ }
5279
+ /**
5280
+ * Carga idioma guardado en localStorage o detecta del navegador
5281
+ */
5282
+ loadStoredLanguage() {
5283
+ const stored = localStorage.getItem(LANG_STORAGE_KEY$1);
5284
+ if (stored && this.isValidLanguage(stored)) {
5285
+ this._lang.set(stored);
5286
+ return;
5287
+ }
5288
+ // Detectar idioma del navegador
5289
+ const browserLang = navigator.language.split('-')[0];
5290
+ if (this.isValidLanguage(browserLang)) {
5291
+ this._lang.set(browserLang);
5292
+ localStorage.setItem(LANG_STORAGE_KEY$1, browserLang);
5164
5293
  }
5165
- return DEFAULT_LANG;
5166
5294
  }
5167
5295
  /**
5168
- * Verifica si el idioma actual es español
5296
+ * Valida si un idioma está soportado
5169
5297
  */
5170
- get isSpanish() {
5171
- return this.lang === 'es';
5298
+ isValidLanguage(lang) {
5299
+ return this._supportedLanguages().includes(lang);
5172
5300
  }
5173
5301
  /**
5174
- * Verifica si el idioma actual es inglés
5302
+ * Reemplaza {variable} en texto con valores de data
5303
+ *
5304
+ * @example
5305
+ * interpolate('Hola {name}', { name: 'Juan' }) // 'Hola Juan'
5175
5306
  */
5176
- get isEnglish() {
5177
- return this.lang === 'en';
5307
+ interpolate(text, data) {
5308
+ return Object.entries(data).reduce((result, [key, value]) => {
5309
+ const regex = new RegExp(`\\{${key}\\}`, 'g');
5310
+ return result.replace(regex, value);
5311
+ }, text);
5178
5312
  }
5179
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LocaleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5180
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LocaleService, providedIn: 'root' }); }
5313
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: I18nService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5314
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: I18nService, providedIn: 'root' }); }
5181
5315
  }
5182
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LocaleService, decorators: [{
5316
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: I18nService, decorators: [{
5183
5317
  type: Injectable,
5184
5318
  args: [{ providedIn: 'root' }]
5185
5319
  }], ctorParameters: () => [] });
5186
5320
 
5321
+ /**
5322
+ * Pipe de traducción para templates.
5323
+ *
5324
+ * NOTA: Es impure para detectar cambios de idioma.
5325
+ * El costo es mínimo porque I18nService usa Signals internamente.
5326
+ *
5327
+ * @example
5328
+ * <!-- Busca en _global -->
5329
+ * {{ 'submit' | t }}
5330
+ *
5331
+ * <!-- Busca en namespace específico -->
5332
+ * {{ 'title' | t:'Login' }}
5333
+ *
5334
+ * <!-- Con interpolación -->
5335
+ * {{ 'welcome' | t:'Login':{ name: userName } }}
5336
+ *
5337
+ * <!-- En atributos -->
5338
+ * <val-button [label]="'submit' | t"></val-button>
5339
+ * <val-input [label]="'email' | t:'Login'"></val-input>
5340
+ */
5341
+ class TranslatePipe {
5342
+ constructor() {
5343
+ this.i18n = inject(I18nService);
5344
+ }
5345
+ /**
5346
+ * Transforma una key de traducción a su valor
5347
+ *
5348
+ * @param key Clave del texto
5349
+ * @param namespace Namespace opcional (default: '_global')
5350
+ * @param data Variables para interpolación opcional
5351
+ * @returns Texto traducido
5352
+ */
5353
+ transform(key, namespace, data) {
5354
+ return this.i18n.t(key, namespace, data);
5355
+ }
5356
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TranslatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
5357
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: TranslatePipe, isStandalone: true, name: "t", pure: false }); }
5358
+ }
5359
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TranslatePipe, decorators: [{
5360
+ type: Pipe,
5361
+ args: [{
5362
+ name: 't',
5363
+ standalone: true,
5364
+ pure: false, // Impure para detectar cambios de idioma
5365
+ }]
5366
+ }] });
5367
+
5368
+ /**
5369
+ * Configura el sistema de internacionalización de Valtech Components.
5370
+ *
5371
+ * @param config Configuración de i18n
5372
+ * @returns Providers para agregar en app.config.ts
5373
+ *
5374
+ * @example
5375
+ * // app.config.ts
5376
+ * import { provideValtechI18n } from 'valtech-components';
5377
+ * import { GLOBAL_CONTENT } from './i18n/_global';
5378
+ * import { LOGIN_CONTENT } from './i18n/login.i18n';
5379
+ *
5380
+ * export const appConfig: ApplicationConfig = {
5381
+ * providers: [
5382
+ * provideValtechI18n({
5383
+ * defaultLanguage: 'es',
5384
+ * supportedLanguages: ['es', 'en'],
5385
+ * detectBrowserLanguage: true,
5386
+ * content: {
5387
+ * '_global': GLOBAL_CONTENT,
5388
+ * 'Login': LOGIN_CONTENT,
5389
+ * }
5390
+ * }),
5391
+ * ]
5392
+ * };
5393
+ */
5394
+ function provideValtechI18n(config = {}) {
5395
+ const mergedConfig = { ...DEFAULT_I18N_CONFIG, ...config };
5396
+ return makeEnvironmentProviders([
5397
+ {
5398
+ provide: APP_INITIALIZER,
5399
+ useFactory: (i18n) => {
5400
+ return () => {
5401
+ // Configurar idiomas soportados
5402
+ i18n.setI18nLanguages(mergedConfig.supportedLanguages);
5403
+ // Registrar contenido inicial
5404
+ if (mergedConfig.content && Object.keys(mergedConfig.content).length > 0) {
5405
+ i18n.registerContentBulk(mergedConfig.content);
5406
+ }
5407
+ };
5408
+ },
5409
+ deps: [I18nService],
5410
+ multi: true,
5411
+ },
5412
+ ]);
5413
+ }
5414
+
5415
+ // Types
5416
+
5187
5417
  /**
5188
5418
  * val-popover-selector
5189
5419
  *
@@ -5366,8 +5596,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
5366
5596
  /**
5367
5597
  * val-language-selector
5368
5598
  *
5369
- * A language selector component that uses LocaleService.
5370
- * When the language changes, the page will reload.
5599
+ * A language selector component that uses I18nService.
5600
+ * By default, language changes are reactive (no page reload).
5601
+ * Set forceReload: true in props to reload on change.
5371
5602
  *
5372
5603
  * @example
5373
5604
  * <val-language-selector
@@ -5375,7 +5606,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
5375
5606
  * </val-language-selector>
5376
5607
  *
5377
5608
  * @input props: LanguageSelectorMetadata - Configuration for the language selector
5378
- * @output languageChange: EventEmitter<string> - Emitted when language changes (before reload)
5609
+ * @output languageChange: EventEmitter<string> - Emitted when language changes
5379
5610
  */
5380
5611
  class LanguageSelectorComponent {
5381
5612
  constructor() {
@@ -5386,31 +5617,35 @@ class LanguageSelectorComponent {
5386
5617
  /**
5387
5618
  * Event emitted when the language selection changes.
5388
5619
  * Emits the selected language code.
5389
- * Note: Page will reload after this event.
5390
5620
  */
5391
5621
  this.languageChange = new EventEmitter();
5392
- this.localeService = inject(LocaleService);
5622
+ this.i18n = inject(I18nService);
5393
5623
  /** Default language display names */
5394
5624
  this.defaultLanguageNames = {
5395
5625
  es: 'Español',
5396
5626
  en: 'English',
5627
+ pt: 'Português',
5628
+ fr: 'Français',
5629
+ de: 'Deutsch',
5397
5630
  };
5398
5631
  /** Default flag icons for languages */
5399
5632
  this.defaultLanguageFlags = {
5400
5633
  es: '🇪🇸',
5401
5634
  en: '🇺🇸',
5635
+ pt: '🇧🇷',
5636
+ fr: '🇫🇷',
5637
+ de: '🇩🇪',
5402
5638
  };
5403
- /** Available languages */
5404
- this.availableLanguages = ['es', 'en'];
5405
5639
  addIcons({ language });
5406
5640
  }
5407
5641
  ngOnInit() {
5408
5642
  this.initializePopoverProps();
5409
5643
  }
5410
5644
  initializePopoverProps() {
5411
- const currentLanguage = this.localeService.lang;
5645
+ const currentLanguage = this.i18n.lang();
5646
+ const availableLanguages = this.props.availableLanguages || this.i18n.supportedLanguages();
5412
5647
  // Convert language codes to popover options
5413
- const options = this.availableLanguages.map(lang => ({
5648
+ const options = availableLanguages.map(lang => ({
5414
5649
  value: lang,
5415
5650
  label: this.getLanguageDisplayName(lang),
5416
5651
  }));
@@ -5453,10 +5688,14 @@ class LanguageSelectorComponent {
5453
5688
  onLanguageChange(selectedLanguage) {
5454
5689
  if (typeof selectedLanguage === 'string') {
5455
5690
  const newLang = selectedLanguage;
5456
- // Emit the change event before reload
5691
+ // Emit the change event
5457
5692
  this.languageChange.emit(selectedLanguage);
5458
- // Set the new language (this will reload the page)
5459
- this.localeService.setLang(newLang);
5693
+ // Set the new language (reactive by default, reload if forceReload is true)
5694
+ this.i18n.setLanguage(newLang, this.props.forceReload);
5695
+ // Update popover selected value for reactive UI
5696
+ if (this.popoverProps) {
5697
+ this.popoverProps = { ...this.popoverProps, selectedValue: newLang };
5698
+ }
5460
5699
  }
5461
5700
  }
5462
5701
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LanguageSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -20564,6 +20803,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20564
20803
  type: Output
20565
20804
  }] } });
20566
20805
 
20806
+ /**
20807
+ * Clave para persistir el idioma en localStorage
20808
+ */
20809
+ const LANG_STORAGE_KEY = 'app_lang';
20810
+ /**
20811
+ * Idioma por defecto
20812
+ */
20813
+ const DEFAULT_LANG = 'es';
20814
+ /**
20815
+ * Servicio mínimo de localización.
20816
+ *
20817
+ * - Lee el idioma desde localStorage al iniciar
20818
+ * - Proporciona método para cambiar idioma (recarga la página)
20819
+ * - Sin observables ni subscripciones
20820
+ *
20821
+ * @example
20822
+ * // En un componente
20823
+ * locale = inject(LocaleService);
20824
+ *
20825
+ * // Obtener idioma actual
20826
+ * console.log(this.locale.lang); // 'es' o 'en'
20827
+ *
20828
+ * // Cambiar idioma (recarga la página)
20829
+ * this.locale.setLang('en');
20830
+ */
20831
+ class LocaleService {
20832
+ constructor() {
20833
+ this.lang = this.getStoredLang();
20834
+ }
20835
+ /**
20836
+ * Cambia el idioma de la aplicación.
20837
+ * Guarda en localStorage y recarga la página para aplicar el cambio.
20838
+ *
20839
+ * @param lang Nuevo idioma ('es' o 'en')
20840
+ */
20841
+ setLang(lang) {
20842
+ if (lang === this.lang) {
20843
+ return;
20844
+ }
20845
+ localStorage.setItem(LANG_STORAGE_KEY, lang);
20846
+ window.location.reload();
20847
+ }
20848
+ /**
20849
+ * Obtiene el idioma almacenado en localStorage.
20850
+ * Si no existe o no es válido, retorna el idioma por defecto.
20851
+ */
20852
+ getStoredLang() {
20853
+ const stored = localStorage.getItem(LANG_STORAGE_KEY);
20854
+ if (stored === 'es' || stored === 'en') {
20855
+ return stored;
20856
+ }
20857
+ return DEFAULT_LANG;
20858
+ }
20859
+ /**
20860
+ * Verifica si el idioma actual es español
20861
+ */
20862
+ get isSpanish() {
20863
+ return this.lang === 'es';
20864
+ }
20865
+ /**
20866
+ * Verifica si el idioma actual es inglés
20867
+ */
20868
+ get isEnglish() {
20869
+ return this.lang === 'en';
20870
+ }
20871
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LocaleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
20872
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LocaleService, providedIn: 'root' }); }
20873
+ }
20874
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LocaleService, decorators: [{
20875
+ type: Injectable,
20876
+ args: [{ providedIn: 'root' }]
20877
+ }], ctorParameters: () => [] });
20878
+
20567
20879
  /**
20568
20880
  * Service for displaying toast notifications using Ionic's ToastController.
20569
20881
  * Provides methods to show and present toasts with custom options.
@@ -24966,7 +25278,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
24966
25278
  * ```
24967
25279
  */
24968
25280
  class AuthService {
24969
- constructor(config, http, router, stateService, tokenService, storageService, syncService, firebaseService, messagingService) {
25281
+ constructor(config, http, router, stateService, tokenService, storageService, syncService, firebaseService, messagingService, i18nService) {
24970
25282
  this.config = config;
24971
25283
  this.http = http;
24972
25284
  this.router = router;
@@ -24976,6 +25288,7 @@ class AuthService {
24976
25288
  this.syncService = syncService;
24977
25289
  this.firebaseService = firebaseService;
24978
25290
  this.messagingService = messagingService;
25291
+ this.i18nService = i18nService;
24979
25292
  // Timer para refresh proactivo
24980
25293
  this.refreshTimerId = null;
24981
25294
  this.syncSubscription = null;
@@ -25426,6 +25739,15 @@ class AuthService {
25426
25739
  if (this.config.enableDeviceRegistration) {
25427
25740
  this.registerDeviceIfNeeded(); // fire-and-forget
25428
25741
  }
25742
+ // Sincronizar idioma del usuario con i18n
25743
+ if (this.i18nService && 'language' in response && response.language) {
25744
+ const userLang = response.language;
25745
+ const currentLang = this.i18nService.lang();
25746
+ if (userLang !== currentLang) {
25747
+ this.i18nService.setLanguage(userLang);
25748
+ console.log(`[ValtechAuth] Language synced to: ${userLang}`);
25749
+ }
25750
+ }
25429
25751
  }
25430
25752
  clearState() {
25431
25753
  this.stopRefreshTimer();
@@ -25771,7 +26093,7 @@ class AuthService {
25771
26093
  }
25772
26094
  return { platform: 'web', browser, os };
25773
26095
  }
25774
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1$8.HttpClient }, { token: i1$1.Router }, { token: AuthStateService }, { token: TokenService }, { token: AuthStorageService }, { token: AuthSyncService }, { token: FirebaseService }, { token: MessagingService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
26096
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1$8.HttpClient }, { token: i1$1.Router }, { token: AuthStateService }, { token: TokenService }, { token: AuthStorageService }, { token: AuthSyncService }, { token: FirebaseService }, { token: MessagingService, optional: true }, { token: I18nService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
25775
26097
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthService, providedIn: 'root' }); }
25776
26098
  }
25777
26099
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthService, decorators: [{
@@ -25782,6 +26104,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
25782
26104
  args: [VALTECH_AUTH_CONFIG]
25783
26105
  }] }, { type: i1$8.HttpClient }, { type: i1$1.Router }, { type: AuthStateService }, { type: TokenService }, { type: AuthStorageService }, { type: AuthSyncService }, { type: FirebaseService }, { type: MessagingService, decorators: [{
25784
26106
  type: Optional
26107
+ }] }, { type: I18nService, decorators: [{
26108
+ type: Optional
25785
26109
  }] }] });
25786
26110
 
25787
26111
  /**
@@ -26473,6 +26797,154 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
26473
26797
  */
26474
26798
  // Tipos
26475
26799
 
26800
+ /**
26801
+ * Servicio para gestionar presets de componentes.
26802
+ *
26803
+ * Los presets permiten definir configuraciones reutilizables
26804
+ * de componentes (tamaño, color, variante, etc.) que se pueden
26805
+ * aplicar con un nombre semántico.
26806
+ *
26807
+ * @example
26808
+ * // En un componente
26809
+ * presets = inject(PresetService);
26810
+ *
26811
+ * // Obtener preset
26812
+ * const buttonProps = this.presets.get<ButtonMetadata>('button', 'primary-action');
26813
+ * // { size: 'large', color: 'primary', fill: 'solid' }
26814
+ */
26815
+ class PresetService {
26816
+ constructor() {
26817
+ this._presets = signal({});
26818
+ }
26819
+ /**
26820
+ * Obtiene un preset específico para un componente
26821
+ *
26822
+ * @param component Tipo de componente (ej: 'button', 'card', 'input')
26823
+ * @param presetName Nombre del preset (ej: 'primary-action', 'compact')
26824
+ * @returns Propiedades del preset o objeto vacío si no existe
26825
+ *
26826
+ * @example
26827
+ * // Obtener preset de botón
26828
+ * const props = presets.get<ButtonMetadata>('button', 'primary-action');
26829
+ *
26830
+ * // Usar en componente
26831
+ * <val-button [props]="props"></val-button>
26832
+ */
26833
+ get(component, presetName) {
26834
+ const componentPresets = this._presets()[component];
26835
+ if (!componentPresets) {
26836
+ console.warn(`[presets] No presets registered for component: ${component}`);
26837
+ return {};
26838
+ }
26839
+ const preset = componentPresets[presetName];
26840
+ if (!preset) {
26841
+ console.warn(`[presets] Preset '${presetName}' not found for component: ${component}`);
26842
+ return {};
26843
+ }
26844
+ return preset;
26845
+ }
26846
+ /**
26847
+ * Verifica si existe un preset
26848
+ */
26849
+ has(component, presetName) {
26850
+ return !!this._presets()[component]?.[presetName];
26851
+ }
26852
+ /**
26853
+ * Registra presets de la aplicación
26854
+ *
26855
+ * @param presets Configuración de presets
26856
+ *
26857
+ * @example
26858
+ * presets.registerPresets({
26859
+ * button: {
26860
+ * 'primary-action': { size: 'large', color: 'primary' },
26861
+ * },
26862
+ * card: {
26863
+ * 'feature': { variant: 'elevated' },
26864
+ * }
26865
+ * });
26866
+ */
26867
+ registerPresets(presets) {
26868
+ this._presets.set(presets);
26869
+ }
26870
+ /**
26871
+ * Agrega presets para un componente específico (merge con existentes)
26872
+ */
26873
+ registerComponentPresets(component, presets) {
26874
+ this._presets.update((current) => ({
26875
+ ...current,
26876
+ [component]: {
26877
+ ...current[component],
26878
+ ...presets,
26879
+ },
26880
+ }));
26881
+ }
26882
+ /**
26883
+ * Obtiene todos los nombres de presets para un componente
26884
+ */
26885
+ getPresetNames(component) {
26886
+ return Object.keys(this._presets()[component] || {});
26887
+ }
26888
+ /**
26889
+ * Obtiene todos los componentes con presets registrados
26890
+ */
26891
+ getRegisteredComponents() {
26892
+ return Object.keys(this._presets());
26893
+ }
26894
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
26895
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetService, providedIn: 'root' }); }
26896
+ }
26897
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetService, decorators: [{
26898
+ type: Injectable,
26899
+ args: [{ providedIn: 'root' }]
26900
+ }] });
26901
+
26902
+ /**
26903
+ * Configura el sistema de presets de Valtech Components.
26904
+ *
26905
+ * @param presets Configuración de presets por componente
26906
+ * @returns Providers para agregar en app.config.ts
26907
+ *
26908
+ * @example
26909
+ * // app.config.ts
26910
+ * import { provideValtechPresets } from 'valtech-components';
26911
+ *
26912
+ * export const appConfig: ApplicationConfig = {
26913
+ * providers: [
26914
+ * provideValtechPresets({
26915
+ * button: {
26916
+ * 'primary-action': { size: 'large', color: 'primary', fill: 'solid' },
26917
+ * 'secondary': { size: 'medium', color: 'secondary', fill: 'outline' },
26918
+ * 'danger': { size: 'medium', color: 'danger', fill: 'solid' },
26919
+ * },
26920
+ * card: {
26921
+ * 'feature': { variant: 'elevated', padding: 'large' },
26922
+ * 'compact': { variant: 'flat', padding: 'small' },
26923
+ * },
26924
+ * input: {
26925
+ * 'form-field': { size: 'medium', fill: 'outline', labelPosition: 'floating' },
26926
+ * }
26927
+ * }),
26928
+ * ]
26929
+ * };
26930
+ */
26931
+ function provideValtechPresets(presets) {
26932
+ return makeEnvironmentProviders([
26933
+ {
26934
+ provide: APP_INITIALIZER,
26935
+ useFactory: (presetService) => {
26936
+ return () => {
26937
+ presetService.registerPresets(presets);
26938
+ };
26939
+ },
26940
+ deps: [PresetService],
26941
+ multi: true,
26942
+ },
26943
+ ]);
26944
+ }
26945
+
26946
+ // Service
26947
+
26476
26948
  /*
26477
26949
  * Public API Surface of valtech-components
26478
26950
  */
@@ -26481,5 +26953,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
26481
26953
  * Generated bundle index. Do not edit.
26482
26954
  */
26483
26955
 
26484
- export { ARTICLE_SPACING, AccordionComponent, ActionHeaderComponent, ActionType, AlertBoxComponent, ArticleBuilder, ArticleComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, BannerComponent, BaseDefault, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContentLoaderComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_AUTH_CONFIG, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_LEGEND_LABELS, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PAYMENT_STATUS_COLORS, DEFAULT_PAYMENT_STATUS_LABELS, DEFAULT_PLATFORMS, DEFAULT_STATUS_COLORS, DEFAULT_STATUS_LABELS, DEFAULT_WINNER_LABELS, DataTableComponent, DateInputComponent, DateRangeInputComponent, DeviceService, DisplayComponent, DividerComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FabComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FunHeaderComponent, GlowCardComponent, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InfoComponent, InputType, ItemListComponent, LanguageSelectorComponent, LayeredCardComponent, LayoutComponent, LinkComponent, LinkProcessorService, LinksAccordionComponent, LinksCakeComponent, LocalStorageService, LocaleService, MODAL_SIZES, MOTION, MenuComponent, MessagingService, ModalService, MultiSelectSearchComponent, NavigationService, NoContentComponent, NotesBoxComponent, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, ParticipantCardComponent, PasswordInputComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RaffleStatusCardComponent, RangeInputComponent, RatingComponent, RecapCardComponent, RightsFooterComponent, SKELETON_PRESETS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TabbedContentComponent, TabsComponent, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketGridComponent, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TypedCollection, VALTECH_AUTH_CONFIG, VALTECH_FIREBASE_CONFIG, WinnerDisplayComponent, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, buildPath, collections, createFirebaseConfig, createGlowCardProps, createNumberFromToField, createTitleProps, extractPathParams, getCollectionPath, getDocumentId, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, permissionGuard, permissionGuardFromRoute, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFirebase, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard };
26956
+ export { ARTICLE_SPACING, AccordionComponent, ActionHeaderComponent, ActionType, AlertBoxComponent, ArticleBuilder, ArticleComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, BannerComponent, BaseDefault, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContentLoaderComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_AUTH_CONFIG, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_LEGEND_LABELS, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PAYMENT_STATUS_COLORS, DEFAULT_PAYMENT_STATUS_LABELS, DEFAULT_PLATFORMS, DEFAULT_STATUS_COLORS, DEFAULT_STATUS_LABELS, DEFAULT_WINNER_LABELS, DataTableComponent, DateInputComponent, DateRangeInputComponent, DeviceService, DisplayComponent, DividerComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FabComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FunHeaderComponent, GlowCardComponent, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InfoComponent, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LanguageSelectorComponent, LayeredCardComponent, LayoutComponent, LinkComponent, LinkProcessorService, LinksAccordionComponent, LinksCakeComponent, LocalStorageService, LocaleService, MODAL_SIZES, MOTION, MenuComponent, MessagingService, ModalService, MultiSelectSearchComponent, NavigationService, NoContentComponent, NotesBoxComponent, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, ParticipantCardComponent, PasswordInputComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RaffleStatusCardComponent, RangeInputComponent, RatingComponent, RecapCardComponent, RightsFooterComponent, SKELETON_PRESETS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TabbedContentComponent, TabsComponent, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketGridComponent, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, VALTECH_AUTH_CONFIG, VALTECH_FIREBASE_CONFIG, WinnerDisplayComponent, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, buildPath, collections, createFirebaseConfig, createGlowCardProps, createNumberFromToField, createTitleProps, extractPathParams, getCollectionPath, getDocumentId, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, permissionGuard, permissionGuardFromRoute, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFirebase, provideValtechI18n, provideValtechPresets, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard };
26485
26957
  //# sourceMappingURL=valtech-components.mjs.map