valtech-components 2.0.666 → 2.0.669

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, Injectable, makeEnvironmentProviders, APP_INITIALIZER, inject, EventEmitter, Component, Input, Output, HostListener, Pipe, input, computed, ChangeDetectionStrategy, ViewChild, ChangeDetectorRef, ElementRef, ContentChild, PLATFORM_ID, Inject, ErrorHandler, DestroyRef, InjectionToken, runInInjectionContext, effect, Optional, NgZone, TemplateRef, ViewContainerRef, isSignal, Directive, ViewEncapsulation } from '@angular/core';
2
+ import { signal, Injectable, makeEnvironmentProviders, APP_INITIALIZER, inject, EventEmitter, Component, Input, Output, HostListener, Pipe, input, computed, ChangeDetectionStrategy, ViewChild, ChangeDetectorRef, ElementRef, ContentChild, PLATFORM_ID, Inject, ErrorHandler, DestroyRef, InjectionToken, runInInjectionContext, effect, Optional, TemplateRef, ViewContainerRef, isSignal, Directive, ViewEncapsulation } 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, IonPopover, IonList, IonItem, IonRadioGroup, IonRadio, IonRange, IonSearchbar, IonSegment, IonSegmentButton, IonToggle, IonAccordion, IonAccordionGroup, IonTabBar, IonTabButton, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonChip, IonNote, ToastController as ToastController$1, IonCol, IonRow, IonRefresher, IonRefresherContent, IonRippleEffect, AlertController, IonMenuButton, IonFooter, IonListHeader, IonInfiniteScroll, IonInfiniteScrollContent, IonGrid, MenuController, IonMenu, IonMenuToggle, IonSplitPane } from '@ionic/angular/standalone';
5
5
  import * as i1 from '@angular/common';
@@ -10,6 +10,7 @@ import * as i1$1 from '@angular/router';
10
10
  import { Router, NavigationEnd, RouterLink, RouterOutlet, RouterModule } from '@angular/router';
11
11
  import { Browser } from '@capacitor/browser';
12
12
  import * as i1$2 from '@angular/platform-browser';
13
+ import { Meta, Title } from '@angular/platform-browser';
13
14
  import QRCodeStyling from 'qr-code-styling';
14
15
  import * as i1$3 from '@angular/forms';
15
16
  import { ReactiveFormsModule, FormsModule, FormControl, Validators, FormBuilder } from '@angular/forms';
@@ -39,7 +40,7 @@ import { provideStorage, getStorage, connectStorageEmulator, ref, uploadBytesRes
39
40
  import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
40
41
  import { filter, map as map$1, catchError as catchError$1, tap, switchMap as switchMap$1, finalize, take, debounceTime as debounceTime$1, takeUntil as takeUntil$1 } from 'rxjs/operators';
41
42
  import * as i1$8 from '@angular/common/http';
42
- import { HttpClient, provideHttpClient, withInterceptors } from '@angular/common/http';
43
+ import { provideHttpClient, withInterceptors, HttpClient } from '@angular/common/http';
43
44
  import { Capacitor } from '@capacitor/core';
44
45
  import 'prismjs/components/prism-scss';
45
46
  import 'prismjs/components/prism-json';
@@ -20234,7 +20235,7 @@ const ACTION_CARD_DEFAULTS = {
20234
20235
  };
20235
20236
 
20236
20237
  addIcons({ chevronForwardOutline });
20237
- const IONIC_COLORS$1 = [
20238
+ const IONIC_COLORS = [
20238
20239
  'primary', 'secondary', 'tertiary', 'success',
20239
20240
  'warning', 'danger', 'light', 'medium', 'dark'
20240
20241
  ];
@@ -20317,7 +20318,7 @@ class ActionCardComponent {
20317
20318
  resolveColor(color) {
20318
20319
  if (!color)
20319
20320
  return null;
20320
- if (IONIC_COLORS$1.includes(color)) {
20321
+ if (IONIC_COLORS.includes(color)) {
20321
20322
  return `var(--ion-color-${color})`;
20322
20323
  }
20323
20324
  return color;
@@ -21027,405 +21028,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
21027
21028
  type: Input
21028
21029
  }] } });
21029
21030
 
21030
- /**
21031
- * Default values
21032
- */
21033
- const WELCOME_CARD_DEFAULTS = {
21034
- variant: 'gradient',
21035
- gradientAngle: 135,
21036
- showParticles: true,
21037
- loading: false,
21038
- avatar: {
21039
- mode: 'initials',
21040
- size: 'large',
21041
- showRing: true,
21042
- },
21043
- };
21044
-
21045
- addIcons({ personOutline, chevronForwardOutline });
21046
- const IONIC_COLORS = [
21047
- 'primary', 'secondary', 'tertiary', 'success',
21048
- 'warning', 'danger', 'light', 'medium', 'dark'
21049
- ];
21050
- // Vibrant color palette for avatar backgrounds
21051
- const AVATAR_COLORS = [
21052
- { bg: '#6366f1', text: '#ffffff' }, // Indigo
21053
- { bg: '#8b5cf6', text: '#ffffff' }, // Violet
21054
- { bg: '#ec4899', text: '#ffffff' }, // Pink
21055
- { bg: '#f43f5e', text: '#ffffff' }, // Rose
21056
- { bg: '#f97316', text: '#ffffff' }, // Orange
21057
- { bg: '#eab308', text: '#1f2937' }, // Yellow
21058
- { bg: '#22c55e', text: '#ffffff' }, // Green
21059
- { bg: '#14b8a6', text: '#ffffff' }, // Teal
21060
- { bg: '#06b6d4', text: '#ffffff' }, // Cyan
21061
- { bg: '#3b82f6', text: '#ffffff' }, // Blue
21062
- ];
21063
- /**
21064
- * val-welcome-card
21065
- *
21066
- * A modern welcome/greeting card with avatar, animated gradient background,
21067
- * and optional action buttons. Perfect for dashboard headers.
21068
- *
21069
- * @example Basic usage
21070
- * ```html
21071
- * <val-welcome-card
21072
- * [props]="{
21073
- * greeting: 'Welcome back',
21074
- * user: { name: 'John Doe', email: 'john@example.com' }
21075
- * }"
21076
- * />
21077
- * ```
21078
- *
21079
- * @example With gradient variant
21080
- * ```html
21081
- * <val-welcome-card
21082
- * [props]="{
21083
- * variant: 'gradient',
21084
- * greeting: 'Good morning',
21085
- * user: { name: 'Jane', email: 'jane@example.com' },
21086
- * gradientFrom: 'primary',
21087
- * gradientTo: 'tertiary'
21088
- * }"
21089
- * />
21090
- * ```
21091
- *
21092
- * @example With i18n
21093
- * ```html
21094
- * <val-welcome-card
21095
- * [props]="{
21096
- * greetingKey: 'welcome',
21097
- * i18nNamespace: 'Dashboard',
21098
- * user: user()
21099
- * }"
21100
- * />
21101
- * ```
21102
- */
21103
- class WelcomeCardComponent {
21104
- constructor() {
21105
- this.i18n = inject(I18nService);
21106
- this.themeService = inject(ThemeService);
21107
- /** Component configuration */
21108
- this.props = input({});
21109
- /** Event emitted when card elements are clicked */
21110
- this.cardClick = new EventEmitter();
21111
- /** Merged configuration with defaults */
21112
- this.config = computed(() => ({
21113
- ...WELCOME_CARD_DEFAULTS,
21114
- ...this.props(),
21115
- }));
21116
- /** Avatar configuration with defaults */
21117
- this.avatarConfig = computed(() => ({
21118
- ...WELCOME_CARD_DEFAULTS.avatar,
21119
- ...this.props().avatar,
21120
- }));
21121
- /** Current theme mode */
21122
- this.isDark = computed(() => this.themeService.IsDark);
21123
- /** Color index based on user name hash */
21124
- this.colorIndex = computed(() => {
21125
- const name = this.config().user?.name || '';
21126
- let hash = 0;
21127
- for (let i = 0; i < name.length; i++) {
21128
- hash = name.charCodeAt(i) + ((hash << 5) - hash);
21129
- }
21130
- return Math.abs(hash) % AVATAR_COLORS.length;
21131
- });
21132
- }
21133
- /** Get initials from user name */
21134
- getInitials() {
21135
- const props = this.props();
21136
- // Check for explicit initials first (from props, not merged config)
21137
- if (props.avatar?.initials || props.user?.initials) {
21138
- return props.avatar?.initials || props.user?.initials || '';
21139
- }
21140
- const name = props.user?.name || '';
21141
- if (!name)
21142
- return '?';
21143
- const parts = name.trim().split(/\s+/);
21144
- if (parts.length === 1) {
21145
- return parts[0].substring(0, 2).toUpperCase();
21146
- }
21147
- return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
21148
- }
21149
- /** Get greeting text with i18n support */
21150
- getGreeting() {
21151
- const cfg = this.config();
21152
- if (cfg.i18nNamespace && cfg.greetingKey) {
21153
- this.i18n.lang(); // Track for reactivity
21154
- return this.i18n.t(cfg.greetingKey, cfg.i18nNamespace);
21155
- }
21156
- return cfg.greeting || '';
21157
- }
21158
- /** Get subtitle text with i18n support */
21159
- getSubtitle() {
21160
- const cfg = this.config();
21161
- if (cfg.i18nNamespace && cfg.subtitleKey) {
21162
- this.i18n.lang();
21163
- return this.i18n.t(cfg.subtitleKey, cfg.i18nNamespace);
21164
- }
21165
- return cfg.subtitle || '';
21166
- }
21167
- /** Get action label with i18n support */
21168
- getActionLabel(action) {
21169
- const cfg = this.config();
21170
- if (cfg.i18nNamespace && action.labelKey) {
21171
- this.i18n.lang();
21172
- return this.i18n.t(action.labelKey, cfg.i18nNamespace);
21173
- }
21174
- return action.label || '';
21175
- }
21176
- /** Resolve color value */
21177
- resolveColor(color) {
21178
- if (!color)
21179
- return null;
21180
- if (IONIC_COLORS.includes(color)) {
21181
- return `var(--ion-color-${color})`;
21182
- }
21183
- return color;
21184
- }
21185
- /** Get gradient start color */
21186
- getGradientFrom() {
21187
- const color = this.config().gradientFrom;
21188
- return this.resolveColor(color) || 'var(--ion-color-primary)';
21189
- }
21190
- /** Get gradient end color */
21191
- getGradientTo() {
21192
- const color = this.config().gradientTo;
21193
- return this.resolveColor(color) || 'var(--ion-color-tertiary)';
21194
- }
21195
- /** Get background color (for non-gradient variants) */
21196
- getBackgroundColor() {
21197
- return this.resolveColor(this.config().backgroundColor);
21198
- }
21199
- /** Get avatar background based on user name */
21200
- getAvatarBackground() {
21201
- const cfg = this.avatarConfig();
21202
- if (cfg.mode === 'image')
21203
- return 'transparent';
21204
- return AVATAR_COLORS[this.colorIndex()].bg;
21205
- }
21206
- /** Get avatar text color */
21207
- getAvatarTextColor() {
21208
- return AVATAR_COLORS[this.colorIndex()].text;
21209
- }
21210
- /** Get ring color */
21211
- getRingColor() {
21212
- const ringColor = this.avatarConfig().ringColor;
21213
- return this.resolveColor(ringColor) || 'rgba(255, 255, 255, 0.5)';
21214
- }
21215
- /** Handle card click */
21216
- onCardClick(event) {
21217
- // Don't emit if clicking avatar or actions
21218
- if (event.target.closest('.welcome-card__avatar, .welcome-card__action')) {
21219
- return;
21220
- }
21221
- this.cardClick.emit({ target: 'card' });
21222
- }
21223
- /** Handle avatar click */
21224
- onAvatarClick(event) {
21225
- event.stopPropagation();
21226
- this.cardClick.emit({ target: 'avatar' });
21227
- }
21228
- /** Handle action click */
21229
- onActionClick(event, token) {
21230
- event.stopPropagation();
21231
- this.cardClick.emit({ target: 'action', actionToken: token });
21232
- }
21233
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WelcomeCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
21234
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: WelcomeCardComponent, isStandalone: true, selector: "val-welcome-card", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cardClick: "cardClick" }, ngImport: i0, template: `
21235
- <article
21236
- class="welcome-card"
21237
- [class.welcome-card--default]="config().variant === 'default'"
21238
- [class.welcome-card--gradient]="config().variant === 'gradient'"
21239
- [class.welcome-card--glass]="config().variant === 'glass'"
21240
- [class.welcome-card--minimal]="config().variant === 'minimal'"
21241
- [class.welcome-card--dark]="isDark()"
21242
- [class.welcome-card--loading]="config().loading"
21243
- [style.--gradient-from]="getGradientFrom()"
21244
- [style.--gradient-to]="getGradientTo()"
21245
- [style.--gradient-angle]="config().gradientAngle + 'deg'"
21246
- [style.--bg-color]="getBackgroundColor()"
21247
- (click)="onCardClick($event)"
21248
- >
21249
- <!-- Animated particles background -->
21250
- @if (config().showParticles && config().variant === 'gradient') {
21251
- <div class="welcome-card__particles">
21252
- @for (i of [1,2,3,4,5,6]; track i) {
21253
- <span class="particle" [class]="'particle--' + i"></span>
21254
- }
21255
- </div>
21256
- }
21257
-
21258
- <!-- Content -->
21259
- <div class="welcome-card__content">
21260
- <!-- Avatar -->
21261
- <div
21262
- class="welcome-card__avatar"
21263
- [class.welcome-card__avatar--small]="avatarConfig().size === 'small'"
21264
- [class.welcome-card__avatar--medium]="avatarConfig().size === 'medium'"
21265
- [class.welcome-card__avatar--large]="avatarConfig().size === 'large'"
21266
- [class.welcome-card__avatar--ring]="avatarConfig().showRing"
21267
- [style.--avatar-bg]="getAvatarBackground()"
21268
- [style.--avatar-color]="getAvatarTextColor()"
21269
- [style.--ring-color]="getRingColor()"
21270
- (click)="onAvatarClick($event)"
21271
- >
21272
- @if (config().loading) {
21273
- <ion-skeleton-text [animated]="true" class="avatar-skeleton"></ion-skeleton-text>
21274
- } @else if (avatarConfig().mode === 'image' && (avatarConfig().imageUrl || config().user?.avatarUrl)) {
21275
- <img
21276
- [src]="avatarConfig().imageUrl || config().user?.avatarUrl"
21277
- [alt]="config().user?.name || 'Avatar'"
21278
- class="avatar-image"
21279
- />
21280
- } @else if (avatarConfig().mode === 'icon') {
21281
- <ion-icon [name]="avatarConfig().icon || 'person-outline'"></ion-icon>
21282
- } @else {
21283
- <span class="avatar-initials">{{ getInitials() }}</span>
21284
- }
21285
- </div>
21286
-
21287
- <!-- Text content -->
21288
- <div class="welcome-card__text">
21289
- @if (config().loading) {
21290
- <ion-skeleton-text [animated]="true" style="width: 40%; height: 14px; margin-bottom: 8px;"></ion-skeleton-text>
21291
- <ion-skeleton-text [animated]="true" style="width: 60%; height: 24px; margin-bottom: 4px;"></ion-skeleton-text>
21292
- <ion-skeleton-text [animated]="true" style="width: 50%; height: 14px;"></ion-skeleton-text>
21293
- } @else {
21294
- @if (getGreeting()) {
21295
- <span class="welcome-card__greeting">{{ getGreeting() }}</span>
21296
- }
21297
- <h2 class="welcome-card__name">{{ config().user?.name || 'User' }}</h2>
21298
- @if (getSubtitle() || config().user?.email) {
21299
- <span class="welcome-card__subtitle">{{ getSubtitle() || config().user?.email }}</span>
21300
- }
21301
- }
21302
- </div>
21303
- </div>
21304
-
21305
- <!-- Actions -->
21306
- @if (config().actions?.length && !config().loading) {
21307
- <div class="welcome-card__actions">
21308
- @for (action of config().actions; track action.token || action.label) {
21309
- <button
21310
- type="button"
21311
- class="welcome-card__action"
21312
- [routerLink]="action.routerLink"
21313
- (click)="onActionClick($event, action.token)"
21314
- >
21315
- @if (action.icon) {
21316
- <ion-icon [name]="action.icon"></ion-icon>
21317
- }
21318
- <span>{{ getActionLabel(action) }}</span>
21319
- <ion-icon name="chevron-forward-outline" class="action-chevron"></ion-icon>
21320
- </button>
21321
- }
21322
- </div>
21323
- }
21324
-
21325
- <ion-ripple-effect></ion-ripple-effect>
21326
- </article>
21327
- `, isInline: true, styles: [":host{display:block;width:100%}.welcome-card{position:relative;border-radius:20px;padding:1.5rem;overflow:hidden;cursor:pointer;transition:transform .3s ease,box-shadow .3s ease}.welcome-card--default{background:var(--bg-color, var(--ion-card-background, #fff));box-shadow:0 4px 20px #00000014}.welcome-card--default .welcome-card__greeting,.welcome-card--default .welcome-card__subtitle{color:var(--ion-color-medium)}.welcome-card--default .welcome-card__name{color:var(--ion-text-color)}.welcome-card--gradient{background:linear-gradient(var(--gradient-angle, 135deg),var(--gradient-from, var(--ion-color-primary)),var(--gradient-to, var(--ion-color-tertiary)));box-shadow:0 8px 32px #00000026}.welcome-card--gradient .welcome-card__greeting,.welcome-card--gradient .welcome-card__subtitle{color:#ffffffd9}.welcome-card--gradient .welcome-card__name{color:#fff}.welcome-card--gradient .welcome-card__action{background:#ffffff26;color:#fff;border-color:#fff3}.welcome-card--gradient .welcome-card__action:hover{background:#ffffff40}.welcome-card--glass{background:#ffffff26;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid rgba(255,255,255,.2);box-shadow:0 8px 32px #0000001a}.welcome-card--glass .welcome-card__greeting,.welcome-card--glass .welcome-card__subtitle{color:var(--ion-color-medium)}.welcome-card--glass .welcome-card__name{color:var(--ion-text-color)}.welcome-card--minimal{background:transparent;padding:1rem 0;border-radius:0;box-shadow:none}.welcome-card--minimal .welcome-card__greeting,.welcome-card--minimal .welcome-card__subtitle{color:var(--ion-color-medium)}.welcome-card--minimal .welcome-card__name{color:var(--ion-text-color)}.welcome-card--dark.welcome-card--default{background:var(--ion-card-background, #1e1e1e);box-shadow:0 4px 20px #0000004d}.welcome-card--dark.welcome-card--glass{background:#1e1e1eb3;border-color:#ffffff1a}.welcome-card:hover{transform:translateY(-2px)}.welcome-card--loading{pointer-events:none}.welcome-card__particles{position:absolute;inset:0;overflow:hidden;pointer-events:none}.welcome-card__particles .particle{position:absolute;border-radius:50%;background:#fff3;animation:float 8s ease-in-out infinite}.welcome-card__particles .particle--1{width:80px;height:80px;top:-20px;right:10%;animation-delay:0s}.welcome-card__particles .particle--2{width:60px;height:60px;bottom:-15px;right:25%;animation-delay:-2s}.welcome-card__particles .particle--3{width:40px;height:40px;top:40%;right:-10px;animation-delay:-4s}.welcome-card__particles .particle--4{width:30px;height:30px;top:20%;left:10%;animation-delay:-1s;opacity:.5}.welcome-card__particles .particle--5{width:50px;height:50px;bottom:10%;left:5%;animation-delay:-3s;opacity:.3}.welcome-card__particles .particle--6{width:25px;height:25px;top:60%;left:30%;animation-delay:-5s;opacity:.4}@keyframes float{0%,to{transform:translateY(0) scale(1);opacity:.2}50%{transform:translateY(-20px) scale(1.1);opacity:.35}}.welcome-card__content{position:relative;z-index:1;display:flex;align-items:center;gap:1.25rem}.welcome-card__avatar{position:relative;flex-shrink:0;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--avatar-bg);color:var(--avatar-color);font-weight:700;transition:transform .3s ease}.welcome-card__avatar--small{width:48px;height:48px;font-size:1rem}.welcome-card__avatar--small ion-icon{font-size:1.25rem}.welcome-card__avatar--medium{width:64px;height:64px;font-size:1.25rem}.welcome-card__avatar--medium ion-icon{font-size:1.5rem}.welcome-card__avatar--large{width:80px;height:80px;font-size:1.75rem}.welcome-card__avatar--large ion-icon{font-size:2rem}.welcome-card__avatar--ring:before{content:\"\";position:absolute;inset:-4px;border-radius:50%;border:3px solid var(--ring-color, rgba(255, 255, 255, .5));animation:pulse-ring 2s ease-in-out infinite}.welcome-card__avatar .avatar-skeleton{width:100%;height:100%;border-radius:50%}.welcome-card__avatar .avatar-image{width:100%;height:100%;border-radius:50%;object-fit:cover}.welcome-card__avatar .avatar-initials{-webkit-user-select:none;user-select:none;text-transform:uppercase;letter-spacing:.5px}.welcome-card__avatar:hover{transform:scale(1.05)}@keyframes pulse-ring{0%,to{transform:scale(1);opacity:.5}50%{transform:scale(1.05);opacity:.8}}.welcome-card__text{flex:1;min-width:0}.welcome-card__greeting{display:block;font-size:.875rem;font-weight:500;margin-bottom:.25rem;text-transform:uppercase;letter-spacing:.5px}.welcome-card__name{margin:0 0 .25rem;font-size:1.5rem;font-weight:700;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.welcome-card__subtitle{display:block;font-size:.875rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.welcome-card__actions{position:relative;z-index:1;display:flex;flex-wrap:wrap;gap:.75rem;margin-top:1.25rem;padding-top:1rem;border-top:1px solid rgba(255,255,255,.15)}.welcome-card__action{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-radius:12px;border:1px solid transparent;background:var(--ion-color-light);color:var(--ion-text-color);font-size:.875rem;font-weight:500;cursor:pointer;transition:all .2s ease;text-decoration:none}.welcome-card__action ion-icon{font-size:1rem}.welcome-card__action .action-chevron{font-size:.75rem;opacity:.6;transition:transform .2s ease}.welcome-card__action:hover .action-chevron{transform:translate(3px)}@media (max-width: 480px){.welcome-card{padding:1.25rem}.welcome-card__content{gap:1rem}.welcome-card__avatar--large{width:64px;height:64px;font-size:1.25rem}.welcome-card__name{font-size:1.25rem}.welcome-card__actions{flex-direction:column}.welcome-card__action{width:100%;justify-content:space-between}}:host{animation:slideInUp .5s ease-out}@keyframes slideInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonRippleEffect, selector: "ion-ripple-effect", inputs: ["type"] }, { kind: "component", type: IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }] }); }
21328
- }
21329
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WelcomeCardComponent, decorators: [{
21330
- type: Component,
21331
- args: [{ selector: 'val-welcome-card', standalone: true, imports: [CommonModule, RouterLink, IonIcon, IonRippleEffect, IonSkeletonText], template: `
21332
- <article
21333
- class="welcome-card"
21334
- [class.welcome-card--default]="config().variant === 'default'"
21335
- [class.welcome-card--gradient]="config().variant === 'gradient'"
21336
- [class.welcome-card--glass]="config().variant === 'glass'"
21337
- [class.welcome-card--minimal]="config().variant === 'minimal'"
21338
- [class.welcome-card--dark]="isDark()"
21339
- [class.welcome-card--loading]="config().loading"
21340
- [style.--gradient-from]="getGradientFrom()"
21341
- [style.--gradient-to]="getGradientTo()"
21342
- [style.--gradient-angle]="config().gradientAngle + 'deg'"
21343
- [style.--bg-color]="getBackgroundColor()"
21344
- (click)="onCardClick($event)"
21345
- >
21346
- <!-- Animated particles background -->
21347
- @if (config().showParticles && config().variant === 'gradient') {
21348
- <div class="welcome-card__particles">
21349
- @for (i of [1,2,3,4,5,6]; track i) {
21350
- <span class="particle" [class]="'particle--' + i"></span>
21351
- }
21352
- </div>
21353
- }
21354
-
21355
- <!-- Content -->
21356
- <div class="welcome-card__content">
21357
- <!-- Avatar -->
21358
- <div
21359
- class="welcome-card__avatar"
21360
- [class.welcome-card__avatar--small]="avatarConfig().size === 'small'"
21361
- [class.welcome-card__avatar--medium]="avatarConfig().size === 'medium'"
21362
- [class.welcome-card__avatar--large]="avatarConfig().size === 'large'"
21363
- [class.welcome-card__avatar--ring]="avatarConfig().showRing"
21364
- [style.--avatar-bg]="getAvatarBackground()"
21365
- [style.--avatar-color]="getAvatarTextColor()"
21366
- [style.--ring-color]="getRingColor()"
21367
- (click)="onAvatarClick($event)"
21368
- >
21369
- @if (config().loading) {
21370
- <ion-skeleton-text [animated]="true" class="avatar-skeleton"></ion-skeleton-text>
21371
- } @else if (avatarConfig().mode === 'image' && (avatarConfig().imageUrl || config().user?.avatarUrl)) {
21372
- <img
21373
- [src]="avatarConfig().imageUrl || config().user?.avatarUrl"
21374
- [alt]="config().user?.name || 'Avatar'"
21375
- class="avatar-image"
21376
- />
21377
- } @else if (avatarConfig().mode === 'icon') {
21378
- <ion-icon [name]="avatarConfig().icon || 'person-outline'"></ion-icon>
21379
- } @else {
21380
- <span class="avatar-initials">{{ getInitials() }}</span>
21381
- }
21382
- </div>
21383
-
21384
- <!-- Text content -->
21385
- <div class="welcome-card__text">
21386
- @if (config().loading) {
21387
- <ion-skeleton-text [animated]="true" style="width: 40%; height: 14px; margin-bottom: 8px;"></ion-skeleton-text>
21388
- <ion-skeleton-text [animated]="true" style="width: 60%; height: 24px; margin-bottom: 4px;"></ion-skeleton-text>
21389
- <ion-skeleton-text [animated]="true" style="width: 50%; height: 14px;"></ion-skeleton-text>
21390
- } @else {
21391
- @if (getGreeting()) {
21392
- <span class="welcome-card__greeting">{{ getGreeting() }}</span>
21393
- }
21394
- <h2 class="welcome-card__name">{{ config().user?.name || 'User' }}</h2>
21395
- @if (getSubtitle() || config().user?.email) {
21396
- <span class="welcome-card__subtitle">{{ getSubtitle() || config().user?.email }}</span>
21397
- }
21398
- }
21399
- </div>
21400
- </div>
21401
-
21402
- <!-- Actions -->
21403
- @if (config().actions?.length && !config().loading) {
21404
- <div class="welcome-card__actions">
21405
- @for (action of config().actions; track action.token || action.label) {
21406
- <button
21407
- type="button"
21408
- class="welcome-card__action"
21409
- [routerLink]="action.routerLink"
21410
- (click)="onActionClick($event, action.token)"
21411
- >
21412
- @if (action.icon) {
21413
- <ion-icon [name]="action.icon"></ion-icon>
21414
- }
21415
- <span>{{ getActionLabel(action) }}</span>
21416
- <ion-icon name="chevron-forward-outline" class="action-chevron"></ion-icon>
21417
- </button>
21418
- }
21419
- </div>
21420
- }
21421
-
21422
- <ion-ripple-effect></ion-ripple-effect>
21423
- </article>
21424
- `, styles: [":host{display:block;width:100%}.welcome-card{position:relative;border-radius:20px;padding:1.5rem;overflow:hidden;cursor:pointer;transition:transform .3s ease,box-shadow .3s ease}.welcome-card--default{background:var(--bg-color, var(--ion-card-background, #fff));box-shadow:0 4px 20px #00000014}.welcome-card--default .welcome-card__greeting,.welcome-card--default .welcome-card__subtitle{color:var(--ion-color-medium)}.welcome-card--default .welcome-card__name{color:var(--ion-text-color)}.welcome-card--gradient{background:linear-gradient(var(--gradient-angle, 135deg),var(--gradient-from, var(--ion-color-primary)),var(--gradient-to, var(--ion-color-tertiary)));box-shadow:0 8px 32px #00000026}.welcome-card--gradient .welcome-card__greeting,.welcome-card--gradient .welcome-card__subtitle{color:#ffffffd9}.welcome-card--gradient .welcome-card__name{color:#fff}.welcome-card--gradient .welcome-card__action{background:#ffffff26;color:#fff;border-color:#fff3}.welcome-card--gradient .welcome-card__action:hover{background:#ffffff40}.welcome-card--glass{background:#ffffff26;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid rgba(255,255,255,.2);box-shadow:0 8px 32px #0000001a}.welcome-card--glass .welcome-card__greeting,.welcome-card--glass .welcome-card__subtitle{color:var(--ion-color-medium)}.welcome-card--glass .welcome-card__name{color:var(--ion-text-color)}.welcome-card--minimal{background:transparent;padding:1rem 0;border-radius:0;box-shadow:none}.welcome-card--minimal .welcome-card__greeting,.welcome-card--minimal .welcome-card__subtitle{color:var(--ion-color-medium)}.welcome-card--minimal .welcome-card__name{color:var(--ion-text-color)}.welcome-card--dark.welcome-card--default{background:var(--ion-card-background, #1e1e1e);box-shadow:0 4px 20px #0000004d}.welcome-card--dark.welcome-card--glass{background:#1e1e1eb3;border-color:#ffffff1a}.welcome-card:hover{transform:translateY(-2px)}.welcome-card--loading{pointer-events:none}.welcome-card__particles{position:absolute;inset:0;overflow:hidden;pointer-events:none}.welcome-card__particles .particle{position:absolute;border-radius:50%;background:#fff3;animation:float 8s ease-in-out infinite}.welcome-card__particles .particle--1{width:80px;height:80px;top:-20px;right:10%;animation-delay:0s}.welcome-card__particles .particle--2{width:60px;height:60px;bottom:-15px;right:25%;animation-delay:-2s}.welcome-card__particles .particle--3{width:40px;height:40px;top:40%;right:-10px;animation-delay:-4s}.welcome-card__particles .particle--4{width:30px;height:30px;top:20%;left:10%;animation-delay:-1s;opacity:.5}.welcome-card__particles .particle--5{width:50px;height:50px;bottom:10%;left:5%;animation-delay:-3s;opacity:.3}.welcome-card__particles .particle--6{width:25px;height:25px;top:60%;left:30%;animation-delay:-5s;opacity:.4}@keyframes float{0%,to{transform:translateY(0) scale(1);opacity:.2}50%{transform:translateY(-20px) scale(1.1);opacity:.35}}.welcome-card__content{position:relative;z-index:1;display:flex;align-items:center;gap:1.25rem}.welcome-card__avatar{position:relative;flex-shrink:0;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--avatar-bg);color:var(--avatar-color);font-weight:700;transition:transform .3s ease}.welcome-card__avatar--small{width:48px;height:48px;font-size:1rem}.welcome-card__avatar--small ion-icon{font-size:1.25rem}.welcome-card__avatar--medium{width:64px;height:64px;font-size:1.25rem}.welcome-card__avatar--medium ion-icon{font-size:1.5rem}.welcome-card__avatar--large{width:80px;height:80px;font-size:1.75rem}.welcome-card__avatar--large ion-icon{font-size:2rem}.welcome-card__avatar--ring:before{content:\"\";position:absolute;inset:-4px;border-radius:50%;border:3px solid var(--ring-color, rgba(255, 255, 255, .5));animation:pulse-ring 2s ease-in-out infinite}.welcome-card__avatar .avatar-skeleton{width:100%;height:100%;border-radius:50%}.welcome-card__avatar .avatar-image{width:100%;height:100%;border-radius:50%;object-fit:cover}.welcome-card__avatar .avatar-initials{-webkit-user-select:none;user-select:none;text-transform:uppercase;letter-spacing:.5px}.welcome-card__avatar:hover{transform:scale(1.05)}@keyframes pulse-ring{0%,to{transform:scale(1);opacity:.5}50%{transform:scale(1.05);opacity:.8}}.welcome-card__text{flex:1;min-width:0}.welcome-card__greeting{display:block;font-size:.875rem;font-weight:500;margin-bottom:.25rem;text-transform:uppercase;letter-spacing:.5px}.welcome-card__name{margin:0 0 .25rem;font-size:1.5rem;font-weight:700;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.welcome-card__subtitle{display:block;font-size:.875rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.welcome-card__actions{position:relative;z-index:1;display:flex;flex-wrap:wrap;gap:.75rem;margin-top:1.25rem;padding-top:1rem;border-top:1px solid rgba(255,255,255,.15)}.welcome-card__action{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-radius:12px;border:1px solid transparent;background:var(--ion-color-light);color:var(--ion-text-color);font-size:.875rem;font-weight:500;cursor:pointer;transition:all .2s ease;text-decoration:none}.welcome-card__action ion-icon{font-size:1rem}.welcome-card__action .action-chevron{font-size:.75rem;opacity:.6;transition:transform .2s ease}.welcome-card__action:hover .action-chevron{transform:translate(3px)}@media (max-width: 480px){.welcome-card{padding:1.25rem}.welcome-card__content{gap:1rem}.welcome-card__avatar--large{width:64px;height:64px;font-size:1.25rem}.welcome-card__name{font-size:1.25rem}.welcome-card__actions{flex-direction:column}.welcome-card__action{width:100%;justify-content:space-between}}:host{animation:slideInUp .5s ease-out}@keyframes slideInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}\n"] }]
21425
- }], propDecorators: { cardClick: [{
21426
- type: Output
21427
- }] } });
21428
-
21429
21031
  /**
21430
21032
  * Configuración de espaciado predefinida
21431
21033
  */
@@ -27609,6 +27211,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
27609
27211
  * Tipos e interfaces para la integración de Firebase en valtech-components.
27610
27212
  * Todos los modelos de Firestore deben extender FirestoreDocument.
27611
27213
  */
27214
+ /**
27215
+ * Configuración por defecto de emuladores.
27216
+ * Puertos estándar usados en todos los proyectos frontend.
27217
+ */
27218
+ const DEFAULT_EMULATOR_CONFIG = {
27219
+ firestore: { host: 'localhost', port: 9080 },
27220
+ storage: { host: 'localhost', port: 9199 },
27221
+ auth: { host: 'localhost', port: 9099 },
27222
+ };
27612
27223
 
27613
27224
  /**
27614
27225
  * Firebase Shared Configuration
@@ -30018,10 +29629,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
30018
29629
  * ```
30019
29630
  */
30020
29631
  class OAuthService {
30021
- constructor() {
30022
- this.config = inject(VALTECH_AUTH_CONFIG);
30023
- this.http = inject(HttpClient);
30024
- this.ngZone = inject(NgZone);
29632
+ constructor(config, http, ngZone) {
29633
+ this.config = config;
29634
+ this.http = http;
29635
+ this.ngZone = ngZone;
30025
29636
  this.popup = null;
30026
29637
  this.messageHandler = null;
30027
29638
  this.checkClosedInterval = null;
@@ -30284,13 +29895,16 @@ class OAuthService {
30284
29895
  }
30285
29896
  this.popup = null;
30286
29897
  }
30287
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OAuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
29898
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OAuthService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: i1$8.HttpClient }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
30288
29899
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OAuthService, providedIn: 'root' }); }
30289
29900
  }
30290
29901
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OAuthService, decorators: [{
30291
29902
  type: Injectable,
30292
29903
  args: [{ providedIn: 'root' }]
30293
- }] });
29904
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
29905
+ type: Inject,
29906
+ args: [VALTECH_AUTH_CONFIG]
29907
+ }] }, { type: i1$8.HttpClient }, { type: i0.NgZone }] });
30294
29908
 
30295
29909
  /**
30296
29910
  * Servicio principal de autenticación.
@@ -34149,12 +33763,10 @@ class PageContentComponent {
34149
33763
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PageContentComponent, deps: [{ token: ThemeService }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component }); }
34150
33764
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PageContentComponent, isStandalone: true, selector: "val-page-content", inputs: { props: "props" }, outputs: { onHeaderClick: "onHeaderClick" }, ngImport: i0, template: `
34151
33765
  <div class="ion-page">
34152
- @if (props.showHeader !== false) {
34153
- <val-header
34154
- [props]="headerProps"
34155
- (onClick)="onHeaderClickHandler($event)"
34156
- />
34157
- }
33766
+ <val-header
33767
+ [props]="headerProps"
33768
+ (onClick)="onHeaderClickHandler($event)"
33769
+ />
34158
33770
  <ion-content
34159
33771
  [fullscreen]="true"
34160
33772
  [ngStyle]="{
@@ -34179,12 +33791,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
34179
33791
  type: Component,
34180
33792
  args: [{ selector: 'val-page-content', standalone: true, imports: [CommonModule, HeaderComponent, IonContent, UpdateBannerComponent], template: `
34181
33793
  <div class="ion-page">
34182
- @if (props.showHeader !== false) {
34183
- <val-header
34184
- [props]="headerProps"
34185
- (onClick)="onHeaderClickHandler($event)"
34186
- />
34187
- }
33794
+ <val-header
33795
+ [props]="headerProps"
33796
+ (onClick)="onHeaderClickHandler($event)"
33797
+ />
34188
33798
  <ion-content
34189
33799
  [fullscreen]="true"
34190
33800
  [ngStyle]="{
@@ -35310,6 +34920,66 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
35310
34920
  }]
35311
34921
  }], ctorParameters: () => [{ type: i2$1.ModalController }] });
35312
34922
 
34923
+ class MetaService {
34924
+ constructor() {
34925
+ this.meta = inject(Meta);
34926
+ this.titleService = inject(Title);
34927
+ this.baseUrl = '';
34928
+ this.defaultImage = '/assets/images/main-icon.png';
34929
+ this.siteName = '';
34930
+ }
34931
+ /**
34932
+ * Configurar el servicio con valores de la app
34933
+ */
34934
+ configure(config) {
34935
+ this.baseUrl = config.baseUrl;
34936
+ this.siteName = config.siteName;
34937
+ if (config.defaultImage) {
34938
+ this.defaultImage = config.defaultImage;
34939
+ }
34940
+ }
34941
+ /**
34942
+ * Actualizar meta tags de la página
34943
+ */
34944
+ updatePageMeta(metadata, path) {
34945
+ const fullTitle = `${metadata.title} | ${this.siteName}`;
34946
+ const url = path ? `${this.baseUrl}${path}` : this.baseUrl;
34947
+ const ogImage = metadata.ogImage || this.defaultImage;
34948
+ const fullImageUrl = ogImage.startsWith('http') ? ogImage : `${this.baseUrl}${ogImage}`;
34949
+ // Title
34950
+ this.titleService.setTitle(fullTitle);
34951
+ // Basic meta tags
34952
+ this.meta.updateTag({ name: 'description', content: metadata.description });
34953
+ if (metadata.keywords) {
34954
+ this.meta.updateTag({ name: 'keywords', content: metadata.keywords });
34955
+ }
34956
+ // Open Graph
34957
+ this.meta.updateTag({ property: 'og:title', content: fullTitle });
34958
+ this.meta.updateTag({ property: 'og:description', content: metadata.description });
34959
+ this.meta.updateTag({ property: 'og:url', content: url });
34960
+ this.meta.updateTag({ property: 'og:image', content: fullImageUrl });
34961
+ this.meta.updateTag({ property: 'og:type', content: metadata.type || 'website' });
34962
+ // Twitter Card
34963
+ this.meta.updateTag({ name: 'twitter:title', content: fullTitle });
34964
+ this.meta.updateTag({ name: 'twitter:description', content: metadata.description });
34965
+ this.meta.updateTag({ name: 'twitter:image', content: fullImageUrl });
34966
+ }
34967
+ /**
34968
+ * Resetear a valores por defecto
34969
+ */
34970
+ resetToDefault(metadata) {
34971
+ this.updatePageMeta(metadata);
34972
+ }
34973
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MetaService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
34974
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MetaService, providedIn: 'root' }); }
34975
+ }
34976
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MetaService, decorators: [{
34977
+ type: Injectable,
34978
+ args: [{
34979
+ providedIn: 'root',
34980
+ }]
34981
+ }] });
34982
+
35313
34983
  /**
35314
34984
  * Cross-Platform Version Helpers
35315
34985
  *
@@ -41221,5 +40891,5 @@ function buildFooterLinks(links, t) {
41221
40891
  * Generated bundle index. Do not edit.
41222
40892
  */
41223
40893
 
41224
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BottomNavComponent, 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, ContentReactionComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_INFINITE_LIST_METADATA, 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_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_STATUS_COLORS, DEFAULT_STATUS_LABELS, DEFAULT_WINNER_LABELS, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GridSkeletonComponent, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LayoutComponent, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTION, MaintenancePageComponent, MenuComponent, MessagingService, ModalService, MultiSelectSearchComponent, NavigationService, NoContentComponent, NotesBoxComponent, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, 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, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RaffleStatusCardComponent, RangeInputComponent, RatingComponent, RecapCardComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, 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, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketGridComponent, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_SOCIAL_LINKS, WELCOME_CARD_DEFAULTS, WelcomeCardComponent, WinnerDisplayComponent, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, extractPathParams, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, permissionGuard, permissionGuardFromRoute, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechPresets, provideValtechSkeleton, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard };
40894
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BottomNavComponent, 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, ContentReactionComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_INFINITE_LIST_METADATA, 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_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_STATUS_COLORS, DEFAULT_STATUS_LABELS, DEFAULT_WINNER_LABELS, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GridSkeletonComponent, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LayoutComponent, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTION, MaintenancePageComponent, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NoContentComponent, NotesBoxComponent, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, 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, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RaffleStatusCardComponent, RangeInputComponent, RatingComponent, RecapCardComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, 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, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketGridComponent, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_SOCIAL_LINKS, WinnerDisplayComponent, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, extractPathParams, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, permissionGuard, permissionGuardFromRoute, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechPresets, provideValtechSkeleton, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard };
41225
40895
  //# sourceMappingURL=valtech-components.mjs.map