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.
- package/esm2022/lib/components/templates/page-content/page-content.component.mjs +9 -13
- package/esm2022/lib/components/templates/page-content/types.mjs +1 -1
- package/esm2022/lib/services/auth/oauth.service.mjs +12 -9
- package/esm2022/lib/services/firebase/types.mjs +10 -2
- package/esm2022/lib/services/meta/index.mjs +3 -0
- package/esm2022/lib/services/meta/meta.service.mjs +63 -0
- package/esm2022/lib/services/meta/types.mjs +2 -0
- package/esm2022/public-api.mjs +2 -3
- package/fesm2022/valtech-components.mjs +92 -422
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +2 -2
- package/lib/components/organisms/article/article.component.d.ts +1 -1
- package/lib/components/templates/page-content/page-content.component.d.ts +10 -10
- package/lib/components/templates/page-content/types.d.ts +0 -6
- package/lib/services/auth/oauth.service.d.ts +4 -1
- package/lib/services/firebase/types.d.ts +5 -0
- package/lib/services/meta/index.d.ts +2 -0
- package/lib/services/meta/meta.service.d.ts +23 -0
- package/lib/services/meta/types.d.ts +12 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -2
- package/esm2022/lib/components/molecules/welcome-card/types.mjs +0 -15
- package/esm2022/lib/components/molecules/welcome-card/welcome-card.component.mjs +0 -394
- package/lib/components/molecules/welcome-card/types.d.ts +0 -114
- package/lib/components/molecules/welcome-card/welcome-card.component.d.ts +0 -117
|
@@ -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,
|
|
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 {
|
|
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
|
|
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
|
|
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 =
|
|
30023
|
-
this.http =
|
|
30024
|
-
this.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
|
-
|
|
34153
|
-
|
|
34154
|
-
|
|
34155
|
-
|
|
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
|
-
|
|
34183
|
-
|
|
34184
|
-
|
|
34185
|
-
|
|
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,
|
|
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
|