valtech-components 2.0.726 → 2.0.728

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.
@@ -14,7 +14,7 @@ import { Meta, Title } from '@angular/platform-browser';
14
14
  import QRCodeStyling from 'qr-code-styling';
15
15
  import * as i1$3 from '@angular/forms';
16
16
  import { ReactiveFormsModule, FormsModule, FormControl, Validators, FormBuilder } from '@angular/forms';
17
- import { BehaviorSubject, map, Subject, debounceTime, distinctUntilChanged, switchMap, of, catchError, takeUntil, isObservable, firstValueFrom, EMPTY, from, Observable, throwError, filter as filter$1 } from 'rxjs';
17
+ import { BehaviorSubject, map, Subject, debounceTime, distinctUntilChanged, switchMap, of, catchError, takeUntil, isObservable, firstValueFrom, EMPTY, from, Observable, throwError, filter as filter$1, shareReplay } from 'rxjs';
18
18
  import * as i1$4 from 'ng-otp-input';
19
19
  import { NgOtpInputComponent, NgOtpInputModule } from 'ng-otp-input';
20
20
  import * as i2 from '@ionic/angular';
@@ -41,7 +41,7 @@ import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
41
41
  import { filter, switchMap as switchMap$1, catchError as catchError$1, tap, map as map$1, finalize, take, debounceTime as debounceTime$1, takeUntil as takeUntil$1 } from 'rxjs/operators';
42
42
  import { ImageCropperComponent } from 'ngx-image-cropper';
43
43
  import * as i1$8 from '@angular/common/http';
44
- import { provideHttpClient, withInterceptors, HttpClient } from '@angular/common/http';
44
+ import { provideHttpClient, withInterceptors, HttpErrorResponse, HttpClient } from '@angular/common/http';
45
45
  import { Capacitor } from '@capacitor/core';
46
46
  import 'prismjs/components/prism-scss';
47
47
  import 'prismjs/components/prism-json';
@@ -50,7 +50,7 @@ import 'prismjs/components/prism-json';
50
50
  * Current version of valtech-components.
51
51
  * This is automatically updated during the publish process.
52
52
  */
53
- const VERSION = '2.0.726';
53
+ const VERSION = '2.0.728';
54
54
 
55
55
  /**
56
56
  * Servicio para gestionar presets de componentes.
@@ -28279,11 +28279,12 @@ class NotificationsService {
28279
28279
  return;
28280
28280
  }
28281
28281
  this.currentUserId = userId;
28282
- // Path relativo - FirestoreService agrega automáticamente apps/{appId}/
28283
- // NO agregar apps/ aquí para evitar doble prefijo
28282
+ // Path global cross-app: /users/{uid}/notifications (sin prefijo apps/{appId}/).
28283
+ // skipAppPrefix bypassa FirestoreService.prefixCollectionPath para fan-out compartido.
28284
28284
  const basePath = `users/${userId}/notifications`;
28285
28285
  this.collection = this.collectionFactory.create(basePath, {
28286
28286
  timestamps: true,
28287
+ skipAppPrefix: true,
28287
28288
  });
28288
28289
  this.collectionReady$.next(this.collection);
28289
28290
  console.log('[Notifications] Initialized with path:', basePath);
@@ -31120,6 +31121,109 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
31120
31121
  args: [{ providedIn: 'root' }]
31121
31122
  }], ctorParameters: () => [{ type: AuthService }] });
31122
31123
 
31124
+ /**
31125
+ * NotificationActionService — orquesta el "click en notificación" cross-app cross-org.
31126
+ *
31127
+ * Flujo:
31128
+ * 1. markAsRead (best-effort, no bloquea)
31129
+ * 2. Si appId destino !== appId actual → handoff token + redirect a app destino
31130
+ * 3. Si orgId destino !== activeOrg → switchTo(orgId) (sin reload, navega después)
31131
+ * 4. router.navigateByUrl(actionRoute)
31132
+ *
31133
+ * Requiere:
31134
+ * - ValtechAuthConfig.appId (identifica la app actual)
31135
+ * - ValtechAuthConfig.appUrls (mapa baseUrl para handoff cross-app)
31136
+ */
31137
+ class NotificationActionService {
31138
+ constructor(config, auth, orgSwitch, handoff, notifications, router) {
31139
+ this.config = config;
31140
+ this.auth = auth;
31141
+ this.orgSwitch = orgSwitch;
31142
+ this.handoff = handoff;
31143
+ this.notifications = notifications;
31144
+ this.router = router;
31145
+ }
31146
+ /**
31147
+ * Abre la notificación: marca como leída, switch-org si toca, navegación local o
31148
+ * redirect cross-app vía handoff.
31149
+ *
31150
+ * No lanza errores hacia la UI — devuelve un resultado descriptivo. Errores
31151
+ * técnicos quedan en console.warn.
31152
+ */
31153
+ async open(notif) {
31154
+ // 1) Mark as read (best-effort, no bloquea el flujo principal)
31155
+ if (notif.id && !notif.isRead) {
31156
+ this.notifications.markAsRead(notif.id).catch(err => {
31157
+ console.warn('[NotificationAction] markAsRead failed', err);
31158
+ });
31159
+ }
31160
+ const route = notif.actionRoute;
31161
+ if (!route) {
31162
+ return 'no-action-route';
31163
+ }
31164
+ const currentApp = this.config.appId;
31165
+ const targetApp = notif.appId;
31166
+ // 2) Cross-app: handoff + full redirect
31167
+ if (targetApp && currentApp && targetApp !== currentApp) {
31168
+ const baseUrl = this.config.appUrls?.[targetApp];
31169
+ if (!baseUrl) {
31170
+ console.warn(`[NotificationAction] Missing appUrls['${targetApp}'] — configure ValtechAuthConfig.appUrls`);
31171
+ return 'cross-app-unconfigured';
31172
+ }
31173
+ try {
31174
+ const resp = await firstValueFrom(this.handoff.createHandoff({ targetAppId: targetApp, route }));
31175
+ const url = this.buildHandoffUrl(baseUrl, resp.token, route);
31176
+ if (typeof window !== 'undefined') {
31177
+ window.location.href = url;
31178
+ }
31179
+ return 'redirected-cross-app';
31180
+ }
31181
+ catch (err) {
31182
+ const msg = err instanceof HttpErrorResponse ? err.message : String(err);
31183
+ console.warn('[NotificationAction] createHandoff failed:', msg);
31184
+ return 'handoff-failed';
31185
+ }
31186
+ }
31187
+ // 3) Same app — switch-org si toca (sin reload — la navegación posterior monta page fresh)
31188
+ let switched = false;
31189
+ if (notif.orgId) {
31190
+ const active = this.activeOrg();
31191
+ if (active && active !== notif.orgId) {
31192
+ await this.orgSwitch.switchTo(notif.orgId);
31193
+ switched = true;
31194
+ }
31195
+ }
31196
+ // 4) Navigate local
31197
+ await this.router.navigateByUrl(route);
31198
+ return switched ? 'navigated-after-switch-org' : 'navigated';
31199
+ }
31200
+ activeOrg() {
31201
+ const user = this.auth.user();
31202
+ return (user?.activeOrgId ??
31203
+ user?.activeOrg ??
31204
+ '');
31205
+ }
31206
+ /**
31207
+ * Construye URL absoluta para handoff cross-app preservando pathname y otros
31208
+ * params existentes de la baseUrl.
31209
+ */
31210
+ buildHandoffUrl(baseUrl, token, route) {
31211
+ const url = new URL(baseUrl);
31212
+ url.searchParams.set('handoff', token);
31213
+ url.searchParams.set('route', route);
31214
+ return url.toString();
31215
+ }
31216
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NotificationActionService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: AuthService }, { token: OrgSwitchService }, { token: HandoffService }, { token: NotificationsService }, { token: i1$1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
31217
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NotificationActionService, providedIn: 'root' }); }
31218
+ }
31219
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NotificationActionService, decorators: [{
31220
+ type: Injectable,
31221
+ args: [{ providedIn: 'root' }]
31222
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
31223
+ type: Inject,
31224
+ args: [VALTECH_AUTH_CONFIG]
31225
+ }] }, { type: AuthService }, { type: OrgSwitchService }, { type: HandoffService }, { type: NotificationsService }, { type: i1$1.Router }] });
31226
+
31123
31227
  /**
31124
31228
  * Valtech Auth Service
31125
31229
  *
@@ -34818,6 +34922,344 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
34818
34922
  }]
34819
34923
  }] });
34820
34924
 
34925
+ const BOX_DRAWING = /[┌┐└┘├┤┬┴┼─│╔╗╚╝═║]/;
34926
+ const CALLOUT_RE = /^>\s*\[!(NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT)\]\s*(.*)$/i;
34927
+ const FENCE_RE = /^```([\w-]*)\s*$/;
34928
+ const HEADING_RE = /^(#{1,6})\s+(.+)$/;
34929
+ const SEPARATOR_RE = /^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/;
34930
+ const UNORDERED_RE = /^\s*[-*+]\s+(.+)$/;
34931
+ const CHECKLIST_RE = /^\s*[-*+]\s+\[([ xX])\]\s+(.+)$/;
34932
+ const ORDERED_RE = /^\s*\d+\.\s+(.+)$/;
34933
+ const TABLE_DIVIDER_RE = /^\s*\|?[\s:|-]+\|?\s*$/;
34934
+ const TABLE_ROW_RE = /^\s*\|(.+)\|\s*$/;
34935
+ /**
34936
+ * Converts Markdown documents into ArticleMetadata for the val-article organism.
34937
+ *
34938
+ * Supported syntax:
34939
+ * - Headings (#, ##, ### …) → title / subtitle
34940
+ * - Paragraphs → paragraph (with `processLinks` + `allowPartialBold`)
34941
+ * - Lists (-, *, 1.) → unordered / ordered list (- [ ] / - [x] for checklist)
34942
+ * - Blockquotes (>) → quote, with GitHub callouts `> [!NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT]` mapped to notes
34943
+ * - Code fences (```lang) → code
34944
+ * - Box-drawing ASCII art (┌┐└┘│─) auto-wrapped as code
34945
+ * - Tables → flattened into paragraphs with bold keys
34946
+ * - Horizontal rules (---, ***, ___) → separator
34947
+ */
34948
+ class MarkdownArticleParserService {
34949
+ parse(markdown, config) {
34950
+ const lines = this.normalize(markdown).split('\n');
34951
+ const elements = [];
34952
+ let i = 0;
34953
+ while (i < lines.length) {
34954
+ const line = lines[i];
34955
+ if (line.trim() === '') {
34956
+ i++;
34957
+ continue;
34958
+ }
34959
+ // Fenced code block
34960
+ const fence = line.match(FENCE_RE);
34961
+ if (fence) {
34962
+ const lang = fence[1] || undefined;
34963
+ const body = [];
34964
+ i++;
34965
+ while (i < lines.length && !FENCE_RE.test(lines[i])) {
34966
+ body.push(lines[i]);
34967
+ i++;
34968
+ }
34969
+ i++; // skip closing fence
34970
+ elements.push({
34971
+ type: 'code',
34972
+ props: { code: body.join('\n'), language: lang, theme: 'dark' },
34973
+ });
34974
+ continue;
34975
+ }
34976
+ // ASCII box-drawing art → treat as code block
34977
+ if (BOX_DRAWING.test(line)) {
34978
+ const body = [];
34979
+ while (i < lines.length && (lines[i].trim() === '' || BOX_DRAWING.test(lines[i]))) {
34980
+ body.push(lines[i]);
34981
+ i++;
34982
+ }
34983
+ // Trim trailing blank lines from the block
34984
+ while (body.length && body[body.length - 1].trim() === '')
34985
+ body.pop();
34986
+ elements.push({
34987
+ type: 'code',
34988
+ props: { code: body.join('\n'), language: 'text', theme: 'dark' },
34989
+ });
34990
+ continue;
34991
+ }
34992
+ // Separator
34993
+ if (SEPARATOR_RE.test(line)) {
34994
+ elements.push({ type: 'separator', props: { style: 'line' } });
34995
+ i++;
34996
+ continue;
34997
+ }
34998
+ // Heading
34999
+ const heading = line.match(HEADING_RE);
35000
+ if (heading) {
35001
+ elements.push(this.makeHeading(heading[1].length, heading[2].trim()));
35002
+ i++;
35003
+ continue;
35004
+ }
35005
+ // Callout / blockquote (consume contiguous `>` lines)
35006
+ if (line.startsWith('>')) {
35007
+ const block = [];
35008
+ while (i < lines.length && lines[i].startsWith('>')) {
35009
+ block.push(lines[i]);
35010
+ i++;
35011
+ }
35012
+ elements.push(this.makeQuoteOrCallout(block));
35013
+ continue;
35014
+ }
35015
+ // Table (consume contiguous `|` lines)
35016
+ if (TABLE_ROW_RE.test(line)) {
35017
+ const rows = [];
35018
+ while (i < lines.length && TABLE_ROW_RE.test(lines[i])) {
35019
+ rows.push(lines[i]);
35020
+ i++;
35021
+ }
35022
+ elements.push(...this.makeTable(rows));
35023
+ continue;
35024
+ }
35025
+ // List (checklist / unordered / ordered) — consume contiguous lines
35026
+ if (CHECKLIST_RE.test(line) || UNORDERED_RE.test(line) || ORDERED_RE.test(line)) {
35027
+ const listType = CHECKLIST_RE.test(line)
35028
+ ? 'checklist'
35029
+ : ORDERED_RE.test(line)
35030
+ ? 'ordered'
35031
+ : 'unordered';
35032
+ const items = [];
35033
+ while (i < lines.length && lines[i].trim() !== '') {
35034
+ const cur = lines[i];
35035
+ const check = cur.match(CHECKLIST_RE);
35036
+ const unord = cur.match(UNORDERED_RE);
35037
+ const ord = cur.match(ORDERED_RE);
35038
+ if (check)
35039
+ items.push({ text: check[2].trim() });
35040
+ else if (ord && listType === 'ordered')
35041
+ items.push({ text: ord[1].trim() });
35042
+ else if (unord && listType !== 'ordered')
35043
+ items.push({ text: unord[1].trim() });
35044
+ else
35045
+ break;
35046
+ i++;
35047
+ }
35048
+ elements.push({ type: 'list', props: { items, listType } });
35049
+ continue;
35050
+ }
35051
+ // Paragraph — consume contiguous non-empty lines that aren't a special block
35052
+ const paragraph = [];
35053
+ while (i < lines.length && lines[i].trim() !== '' && !this.startsNewBlock(lines[i])) {
35054
+ paragraph.push(lines[i]);
35055
+ i++;
35056
+ }
35057
+ const text = paragraph.join(' ').trim();
35058
+ if (text) {
35059
+ elements.push({
35060
+ type: 'paragraph',
35061
+ props: {
35062
+ content: text,
35063
+ size: 'medium',
35064
+ color: 'dark',
35065
+ bold: false,
35066
+ processLinks: true,
35067
+ allowPartialBold: true,
35068
+ },
35069
+ });
35070
+ }
35071
+ }
35072
+ return {
35073
+ elements,
35074
+ maxWidth: '900px',
35075
+ centered: true,
35076
+ theme: 'auto',
35077
+ ...config,
35078
+ };
35079
+ }
35080
+ normalize(md) {
35081
+ return md.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
35082
+ }
35083
+ startsNewBlock(line) {
35084
+ return (HEADING_RE.test(line) ||
35085
+ FENCE_RE.test(line) ||
35086
+ SEPARATOR_RE.test(line) ||
35087
+ TABLE_ROW_RE.test(line) ||
35088
+ UNORDERED_RE.test(line) ||
35089
+ ORDERED_RE.test(line) ||
35090
+ CHECKLIST_RE.test(line) ||
35091
+ line.startsWith('>') ||
35092
+ BOX_DRAWING.test(line));
35093
+ }
35094
+ makeHeading(level, content) {
35095
+ if (level === 1) {
35096
+ return {
35097
+ type: 'title',
35098
+ props: { content, size: 'xlarge', color: 'dark', bold: true },
35099
+ };
35100
+ }
35101
+ const size = level === 2 ? 'large' : level === 3 ? 'medium' : 'small';
35102
+ return {
35103
+ type: 'subtitle',
35104
+ props: { content, size, color: 'dark', bold: true },
35105
+ };
35106
+ }
35107
+ makeQuoteOrCallout(block) {
35108
+ const first = block[0];
35109
+ const callout = first.match(CALLOUT_RE);
35110
+ const lines = block.map(l => l.replace(/^>\s?/, ''));
35111
+ if (callout) {
35112
+ const type = callout[1].toUpperCase();
35113
+ const firstLineRest = callout[2] || '';
35114
+ const rest = lines.slice(1).join(' ').trim();
35115
+ const text = [firstLineRest, rest].filter(Boolean).join(' ').trim();
35116
+ return this.makeNote(type, text);
35117
+ }
35118
+ const text = lines.join(' ').trim();
35119
+ return {
35120
+ type: 'quote',
35121
+ props: {
35122
+ content: text,
35123
+ size: 'medium',
35124
+ color: 'medium',
35125
+ bold: false,
35126
+ showQuoteMark: true,
35127
+ alignment: 'left',
35128
+ },
35129
+ };
35130
+ }
35131
+ makeNote(kind, text) {
35132
+ const map = {
35133
+ NOTE: { color: 'primary', prefix: 'Nota' },
35134
+ TIP: { color: 'success', prefix: 'Tip' },
35135
+ INFO: { color: 'tertiary', prefix: 'Info' },
35136
+ IMPORTANT: { color: 'warning', prefix: 'Importante' },
35137
+ WARNING: { color: 'warning', prefix: 'Atención' },
35138
+ CAUTION: { color: 'danger', prefix: 'Precaución' },
35139
+ };
35140
+ const cfg = map[kind];
35141
+ return {
35142
+ type: 'note',
35143
+ props: {
35144
+ text,
35145
+ prefix: `${cfg.prefix}:`,
35146
+ color: cfg.color,
35147
+ textColor: 'dark',
35148
+ size: 'medium',
35149
+ rounded: true,
35150
+ },
35151
+ };
35152
+ }
35153
+ /**
35154
+ * Tables are flattened into a header subtitle (if present) followed by one paragraph per
35155
+ * data row using `**col[0]:** col[1] · **col[2]:** col[3] …` format. val-article has no
35156
+ * native table element so this preserves the information without breaking the layout.
35157
+ */
35158
+ makeTable(rows) {
35159
+ const parsed = rows
35160
+ .filter(r => !TABLE_DIVIDER_RE.test(r))
35161
+ .map(r => r
35162
+ .trim()
35163
+ .replace(/^\|/, '')
35164
+ .replace(/\|$/, '')
35165
+ .split('|')
35166
+ .map(c => c.trim()));
35167
+ if (parsed.length === 0)
35168
+ return [];
35169
+ const header = parsed[0];
35170
+ const dataRows = parsed.slice(1);
35171
+ if (dataRows.length === 0) {
35172
+ return [
35173
+ {
35174
+ type: 'paragraph',
35175
+ props: {
35176
+ content: header.join(' · '),
35177
+ size: 'medium',
35178
+ color: 'dark',
35179
+ bold: false,
35180
+ processLinks: true,
35181
+ allowPartialBold: true,
35182
+ },
35183
+ },
35184
+ ];
35185
+ }
35186
+ return dataRows.map(row => {
35187
+ const pairs = row.map((cell, idx) => {
35188
+ const key = header[idx] ?? '';
35189
+ return key ? `**${key}:** ${cell}` : cell;
35190
+ });
35191
+ return {
35192
+ type: 'paragraph',
35193
+ props: {
35194
+ content: pairs.join(' · '),
35195
+ size: 'medium',
35196
+ color: 'dark',
35197
+ bold: false,
35198
+ processLinks: true,
35199
+ allowPartialBold: true,
35200
+ },
35201
+ };
35202
+ });
35203
+ }
35204
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkdownArticleParserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
35205
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkdownArticleParserService, providedIn: 'root' }); }
35206
+ }
35207
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkdownArticleParserService, decorators: [{
35208
+ type: Injectable,
35209
+ args: [{ providedIn: 'root' }]
35210
+ }] });
35211
+
35212
+ /**
35213
+ * Loads Markdown legal documents from `/assets/legal/{locale}/{slug}.md` and parses them
35214
+ * into ArticleMetadata ready for `<val-article>`. Caches parsed results by `locale:slug`
35215
+ * so multiple views consuming the same doc share one HTTP request.
35216
+ */
35217
+ class LegalContentService {
35218
+ constructor() {
35219
+ this.http = inject(HttpClient);
35220
+ this.parser = inject(MarkdownArticleParserService);
35221
+ this.DEFAULT_BASE = '/assets/legal';
35222
+ this.cache = new Map();
35223
+ }
35224
+ load(slug, options = {}) {
35225
+ const locale = (options.locale ?? 'es').toLowerCase();
35226
+ const base = options.basePath ?? this.DEFAULT_BASE;
35227
+ const fallback = options.fallbackLocale === undefined ? 'es' : options.fallbackLocale;
35228
+ const key = `${base}|${locale}|${slug}`;
35229
+ const cached = this.cache.get(key);
35230
+ if (cached)
35231
+ return cached;
35232
+ const primary = this.fetchAndParse(`${base}/${locale}/${slug}.md`);
35233
+ const stream = fallback && fallback !== locale
35234
+ ? primary.pipe(catchError(() => this.fetchAndParse(`${base}/${fallback}/${slug}.md`)))
35235
+ : primary;
35236
+ const shared = stream.pipe(shareReplay({ bufferSize: 1, refCount: false }));
35237
+ this.cache.set(key, shared);
35238
+ return shared;
35239
+ }
35240
+ /** Returns the raw Markdown string without parsing. Useful for debugging. */
35241
+ raw(slug, options = {}) {
35242
+ const locale = (options.locale ?? 'es').toLowerCase();
35243
+ const base = options.basePath ?? this.DEFAULT_BASE;
35244
+ return this.http.get(`${base}/${locale}/${slug}.md`, { responseType: 'text' });
35245
+ }
35246
+ /** Clears the in-memory cache. Call when the user changes locale at runtime. */
35247
+ invalidate() {
35248
+ this.cache.clear();
35249
+ }
35250
+ fetchAndParse(url) {
35251
+ return this.http.get(url, { responseType: 'text' }).pipe(switchMap(md => md && md.trim().length > 0
35252
+ ? of(this.parser.parse(md))
35253
+ : throwError(() => new Error(`Empty legal doc: ${url}`))), map(parsed => parsed));
35254
+ }
35255
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LegalContentService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
35256
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LegalContentService, providedIn: 'root' }); }
35257
+ }
35258
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LegalContentService, decorators: [{
35259
+ type: Injectable,
35260
+ args: [{ providedIn: 'root' }]
35261
+ }] });
35262
+
34821
35263
  /**
34822
35264
  * Cross-Platform Version Helpers
34823
35265
  *
@@ -41965,5 +42407,5 @@ function buildFooterLinks(links, t) {
41965
42407
  * Generated bundle index. Do not edit.
41966
42408
  */
41967
42409
 
41968
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, 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_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, 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, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTION, MaintenancePageComponent, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, 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, RangeInputComponent, RatingComponent, 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, 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, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, news, permissionGuard, permissionGuardFromRoute, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechPresets, provideValtechSkeleton, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
42410
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, 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_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, 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, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, 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, RangeInputComponent, RatingComponent, 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, 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, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, news, permissionGuard, permissionGuardFromRoute, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechPresets, provideValtechSkeleton, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
41969
42411
  //# sourceMappingURL=valtech-components.mjs.map