valtech-components 2.0.809 → 2.0.812

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.
@@ -53,7 +53,7 @@ import 'prismjs/components/prism-json';
53
53
  * Current version of valtech-components.
54
54
  * This is automatically updated during the publish process.
55
55
  */
56
- const VERSION = '2.0.809';
56
+ const VERSION = '2.0.812';
57
57
 
58
58
  /**
59
59
  * Servicio para gestionar presets de componentes.
@@ -35849,6 +35849,485 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
35849
35849
  type: Input
35850
35850
  }] } });
35851
35851
 
35852
+ /** Built-in label sets for the three platform locales. */
35853
+ const CALLOUT_LABELS = {
35854
+ es: {
35855
+ NOTE: 'Nota',
35856
+ TIP: 'Tip',
35857
+ INFO: 'Info',
35858
+ IMPORTANT: 'Importante',
35859
+ WARNING: 'Atención',
35860
+ CAUTION: 'Precaución',
35861
+ },
35862
+ en: {
35863
+ NOTE: 'Note',
35864
+ TIP: 'Tip',
35865
+ INFO: 'Info',
35866
+ IMPORTANT: 'Important',
35867
+ WARNING: 'Warning',
35868
+ CAUTION: 'Caution',
35869
+ },
35870
+ pt: {
35871
+ NOTE: 'Nota',
35872
+ TIP: 'Dica',
35873
+ INFO: 'Info',
35874
+ IMPORTANT: 'Importante',
35875
+ WARNING: 'Atenção',
35876
+ CAUTION: 'Cuidado',
35877
+ },
35878
+ };
35879
+ /**
35880
+ * Per-callout-kind color (Ionic semantic color). Fixed across locales since
35881
+ * red = danger no matter what language you speak.
35882
+ */
35883
+ const CALLOUT_COLORS = {
35884
+ NOTE: 'primary',
35885
+ TIP: 'success',
35886
+ INFO: 'tertiary',
35887
+ IMPORTANT: 'warning',
35888
+ WARNING: 'warning',
35889
+ CAUTION: 'danger',
35890
+ };
35891
+ const BOX_DRAWING = /[┌┐└┘├┤┬┴┼─│╔╗╚╝═║]/;
35892
+ const CALLOUT_RE = /^>\s*\[!(NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT)\]\s*(.*)$/i;
35893
+ const FENCE_RE = /^```([\w-]*)\s*$/;
35894
+ const HEADING_RE = /^(#{1,6})\s+(.+)$/;
35895
+ const SEPARATOR_RE = /^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/;
35896
+ const UNORDERED_RE = /^\s*[-*+]\s+(.+)$/;
35897
+ const CHECKLIST_RE = /^\s*[-*+]\s+\[([ xX])\]\s+(.+)$/;
35898
+ const ORDERED_RE = /^\s*\d+\.\s+(.+)$/;
35899
+ const TABLE_DIVIDER_RE = /^\s*\|?[\s:|-]+\|?\s*$/;
35900
+ const TABLE_ROW_RE = /^\s*\|(.+)\|\s*$/;
35901
+ /**
35902
+ * Pure Markdown → ArticleMetadata parser. No Angular deps — usable from Node scripts
35903
+ * (build-time generation) and from the Angular `MarkdownArticleParserService` wrapper.
35904
+ *
35905
+ * Supported syntax:
35906
+ * - Headings (#, ##, ### …) → title / subtitle
35907
+ * - Paragraphs → paragraph (with `processLinks` + `allowPartialBold`)
35908
+ * - Lists (-, *, 1.) → unordered / ordered list (- [ ] / - [x] for checklist)
35909
+ * - Blockquotes (>) → quote, with GitHub callouts `> [!NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT]` mapped to notes
35910
+ * - Code fences (```lang) → code
35911
+ * - Box-drawing ASCII art (┌┐└┘│─) auto-wrapped as code
35912
+ * - Tables → flattened into paragraphs with bold keys
35913
+ * - Horizontal rules (---, ***, ___) → separator
35914
+ */
35915
+ function parseMarkdownArticle(markdown, options) {
35916
+ const lines = normalize(markdown).split('\n');
35917
+ const elements = [];
35918
+ const labels = options?.calloutLabels ??
35919
+ (options?.locale ? CALLOUT_LABELS[options.locale] : CALLOUT_LABELS.es);
35920
+ let i = 0;
35921
+ while (i < lines.length) {
35922
+ const line = lines[i];
35923
+ if (line.trim() === '') {
35924
+ i++;
35925
+ continue;
35926
+ }
35927
+ const fence = line.match(FENCE_RE);
35928
+ if (fence) {
35929
+ const lang = fence[1] || undefined;
35930
+ const body = [];
35931
+ i++;
35932
+ while (i < lines.length && !FENCE_RE.test(lines[i])) {
35933
+ body.push(lines[i]);
35934
+ i++;
35935
+ }
35936
+ i++;
35937
+ elements.push({
35938
+ type: 'code',
35939
+ props: { code: body.join('\n'), language: lang, theme: 'dark' },
35940
+ });
35941
+ continue;
35942
+ }
35943
+ if (BOX_DRAWING.test(line)) {
35944
+ const body = [];
35945
+ while (i < lines.length && (lines[i].trim() === '' || BOX_DRAWING.test(lines[i]))) {
35946
+ body.push(lines[i]);
35947
+ i++;
35948
+ }
35949
+ while (body.length && body[body.length - 1].trim() === '')
35950
+ body.pop();
35951
+ elements.push({
35952
+ type: 'code',
35953
+ props: { code: body.join('\n'), language: 'text', theme: 'dark' },
35954
+ });
35955
+ continue;
35956
+ }
35957
+ if (SEPARATOR_RE.test(line)) {
35958
+ elements.push({ type: 'separator', props: { style: 'line' } });
35959
+ i++;
35960
+ continue;
35961
+ }
35962
+ const heading = line.match(HEADING_RE);
35963
+ if (heading) {
35964
+ elements.push(makeHeading(heading[1].length, heading[2].trim()));
35965
+ i++;
35966
+ continue;
35967
+ }
35968
+ if (line.startsWith('>')) {
35969
+ const block = [];
35970
+ while (i < lines.length && lines[i].startsWith('>')) {
35971
+ block.push(lines[i]);
35972
+ i++;
35973
+ }
35974
+ elements.push(makeQuoteOrCallout(block, labels));
35975
+ continue;
35976
+ }
35977
+ if (TABLE_ROW_RE.test(line)) {
35978
+ const rows = [];
35979
+ while (i < lines.length && TABLE_ROW_RE.test(lines[i])) {
35980
+ rows.push(lines[i]);
35981
+ i++;
35982
+ }
35983
+ elements.push(...makeTable(rows));
35984
+ continue;
35985
+ }
35986
+ if (CHECKLIST_RE.test(line) || UNORDERED_RE.test(line) || ORDERED_RE.test(line)) {
35987
+ const listType = CHECKLIST_RE.test(line)
35988
+ ? 'checklist'
35989
+ : ORDERED_RE.test(line)
35990
+ ? 'ordered'
35991
+ : 'unordered';
35992
+ const items = [];
35993
+ while (i < lines.length && lines[i].trim() !== '') {
35994
+ const cur = lines[i];
35995
+ const check = cur.match(CHECKLIST_RE);
35996
+ const unord = cur.match(UNORDERED_RE);
35997
+ const ord = cur.match(ORDERED_RE);
35998
+ if (check)
35999
+ items.push({ text: check[2].trim() });
36000
+ else if (ord && listType === 'ordered')
36001
+ items.push({ text: ord[1].trim() });
36002
+ else if (unord && listType !== 'ordered')
36003
+ items.push({ text: unord[1].trim() });
36004
+ else
36005
+ break;
36006
+ i++;
36007
+ }
36008
+ elements.push({ type: 'list', props: { items, listType } });
36009
+ continue;
36010
+ }
36011
+ const paragraph = [];
36012
+ while (i < lines.length && lines[i].trim() !== '' && !startsNewBlock(lines[i])) {
36013
+ paragraph.push(lines[i]);
36014
+ i++;
36015
+ }
36016
+ const text = paragraph.join(' ').trim();
36017
+ if (text) {
36018
+ elements.push({
36019
+ type: 'paragraph',
36020
+ props: {
36021
+ content: text,
36022
+ size: 'medium',
36023
+ color: 'dark',
36024
+ bold: false,
36025
+ processLinks: true,
36026
+ allowPartialBold: true,
36027
+ },
36028
+ });
36029
+ }
36030
+ }
36031
+ // Strip parser-only options before merging into ArticleMetadata
36032
+ const { locale: _l, calloutLabels: _c, ...metadataOverrides } = options ?? {};
36033
+ return {
36034
+ elements,
36035
+ maxWidth: '900px',
36036
+ centered: true,
36037
+ theme: 'auto',
36038
+ ...metadataOverrides,
36039
+ };
36040
+ }
36041
+ function normalize(md) {
36042
+ return md.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
36043
+ }
36044
+ function startsNewBlock(line) {
36045
+ return (HEADING_RE.test(line) ||
36046
+ FENCE_RE.test(line) ||
36047
+ SEPARATOR_RE.test(line) ||
36048
+ TABLE_ROW_RE.test(line) ||
36049
+ UNORDERED_RE.test(line) ||
36050
+ ORDERED_RE.test(line) ||
36051
+ CHECKLIST_RE.test(line) ||
36052
+ line.startsWith('>') ||
36053
+ BOX_DRAWING.test(line));
36054
+ }
36055
+ function makeHeading(level, content) {
36056
+ if (level === 1) {
36057
+ return {
36058
+ type: 'title',
36059
+ props: { content, size: 'xlarge', color: 'dark', bold: true },
36060
+ };
36061
+ }
36062
+ const size = level === 2 ? 'large' : level === 3 ? 'medium' : 'small';
36063
+ return {
36064
+ type: 'subtitle',
36065
+ props: { content, size, color: 'dark', bold: true },
36066
+ };
36067
+ }
36068
+ function makeQuoteOrCallout(block, labels) {
36069
+ const first = block[0];
36070
+ const callout = first.match(CALLOUT_RE);
36071
+ const lines = block.map(l => l.replace(/^>\s?/, ''));
36072
+ if (callout) {
36073
+ const type = callout[1].toUpperCase();
36074
+ const firstLineRest = callout[2] || '';
36075
+ const rest = lines.slice(1).join(' ').trim();
36076
+ const text = [firstLineRest, rest].filter(Boolean).join(' ').trim();
36077
+ return makeNote(type, text, labels);
36078
+ }
36079
+ const text = lines.join(' ').trim();
36080
+ return {
36081
+ type: 'quote',
36082
+ props: {
36083
+ content: text,
36084
+ size: 'medium',
36085
+ color: 'medium',
36086
+ bold: false,
36087
+ showQuoteMark: true,
36088
+ alignment: 'left',
36089
+ },
36090
+ };
36091
+ }
36092
+ function makeNote(kind, text, labels) {
36093
+ return {
36094
+ type: 'note',
36095
+ props: {
36096
+ text,
36097
+ prefix: `${labels[kind]}:`,
36098
+ color: CALLOUT_COLORS[kind],
36099
+ textColor: 'dark',
36100
+ size: 'medium',
36101
+ rounded: true,
36102
+ allowPartialBold: true,
36103
+ processLinks: true,
36104
+ },
36105
+ };
36106
+ }
36107
+ function makeTable(rows) {
36108
+ const parsed = rows
36109
+ .filter(r => !TABLE_DIVIDER_RE.test(r))
36110
+ .map(r => r
36111
+ .trim()
36112
+ .replace(/^\|/, '')
36113
+ .replace(/\|$/, '')
36114
+ .split('|')
36115
+ .map(c => c.trim()));
36116
+ if (parsed.length === 0)
36117
+ return [];
36118
+ const header = parsed[0];
36119
+ const dataRows = parsed.slice(1);
36120
+ if (dataRows.length === 0) {
36121
+ return [
36122
+ {
36123
+ type: 'paragraph',
36124
+ props: {
36125
+ content: header.join(' · '),
36126
+ size: 'medium',
36127
+ color: 'dark',
36128
+ bold: false,
36129
+ processLinks: true,
36130
+ allowPartialBold: true,
36131
+ },
36132
+ },
36133
+ ];
36134
+ }
36135
+ return dataRows.map(row => {
36136
+ const pairs = row.map((cell, idx) => {
36137
+ const key = header[idx] ?? '';
36138
+ return key ? `**${key}:** ${cell}` : cell;
36139
+ });
36140
+ return {
36141
+ type: 'paragraph',
36142
+ props: {
36143
+ content: pairs.join(' · '),
36144
+ size: 'medium',
36145
+ color: 'dark',
36146
+ bold: false,
36147
+ processLinks: true,
36148
+ allowPartialBold: true,
36149
+ },
36150
+ };
36151
+ });
36152
+ }
36153
+
36154
+ /**
36155
+ * `val-faq`
36156
+ *
36157
+ * Organism de preguntas frecuentes. Q&A categorizado con accordion colapsable
36158
+ * y buscador en vivo. Pensado para vistas FAQ públicas — el caller puede
36159
+ * reusar la misma data (`FaqMetadata.categories`) para emitir el structured
36160
+ * data `FAQPage` (JSON-LD) y ganar rich results en buscadores.
36161
+ *
36162
+ * Las respuestas (`FaqItem.answer`) son **Markdown** — se parsean con
36163
+ * `parseMarkdownArticle` y se renderizan vía `val-article`. Soportan links,
36164
+ * listas, negritas, tablas, etc.
36165
+ *
36166
+ * @example
36167
+ * ```html
36168
+ * <val-faq [props]="{ categories: faqCategories, searchable: true }" />
36169
+ * ```
36170
+ */
36171
+ class FaqComponent {
36172
+ constructor() {
36173
+ this.props_ = signal({ categories: [] });
36174
+ /** Término de búsqueda actual. */
36175
+ this.query = signal('');
36176
+ /**
36177
+ * Cache de respuestas parseadas (Markdown → ArticleMetadata). Se reconstruye
36178
+ * solo cuando cambian las categorías — el parseo NO corre por keystroke.
36179
+ * Keyed por id de item (los ids son únicos en toda la FAQ).
36180
+ */
36181
+ this.parsedAnswers = computed(() => {
36182
+ const map = new Map();
36183
+ for (const cat of this.props_().categories ?? []) {
36184
+ for (const item of cat.items) {
36185
+ map.set(item.id, parseMarkdownArticle(item.answer));
36186
+ }
36187
+ }
36188
+ return map;
36189
+ });
36190
+ /**
36191
+ * Categorías visibles tras el filtro. Una categoría desaparece si ninguna
36192
+ * de sus preguntas matchea. Match sobre pregunta + respuesta (raw markdown),
36193
+ * case-insensitive.
36194
+ */
36195
+ this.visibleCategories = computed(() => {
36196
+ const q = this.query().trim().toLowerCase();
36197
+ const cats = this.props_().categories ?? [];
36198
+ if (!q)
36199
+ return cats;
36200
+ return cats
36201
+ .map(cat => ({
36202
+ ...cat,
36203
+ items: cat.items.filter(it => it.question.toLowerCase().includes(q) || it.answer.toLowerCase().includes(q)),
36204
+ }))
36205
+ .filter(cat => cat.items.length > 0);
36206
+ });
36207
+ /** `true` si se debe mostrar el label de cada categoría. */
36208
+ this.showCategoryLabel = computed(() => {
36209
+ const p = this.props_();
36210
+ if (p.hideSingleCategoryLabel === false)
36211
+ return true;
36212
+ return (p.categories?.length ?? 0) > 1;
36213
+ });
36214
+ }
36215
+ set props(value) {
36216
+ if (value)
36217
+ this.props_.set(value);
36218
+ }
36219
+ get props() {
36220
+ return this.props_();
36221
+ }
36222
+ /** Respuesta parseada de un item — desde el cache. */
36223
+ answerOf(item) {
36224
+ return this.parsedAnswers().get(item.id) ?? { elements: [] };
36225
+ }
36226
+ onSearch(term) {
36227
+ this.query.set(term ?? '');
36228
+ }
36229
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FaqComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
36230
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FaqComponent, isStandalone: true, selector: "val-faq", inputs: { props: "props" }, ngImport: i0, template: `
36231
+ <div class="val-faq">
36232
+ @if (props.searchable !== false) {
36233
+ <div class="val-faq__search">
36234
+ <val-searchbar
36235
+ [props]="{
36236
+ placeholder: props.searchPlaceholder || '',
36237
+ debounce: 200,
36238
+ }"
36239
+ (filterEvent)="onSearch($event)"
36240
+ />
36241
+ </div>
36242
+ }
36243
+
36244
+ @if (visibleCategories().length === 0) {
36245
+ <p class="val-faq__empty">
36246
+ {{ props.noResultsText || 'Sin resultados' }}
36247
+ </p>
36248
+ } @else {
36249
+ @for (cat of visibleCategories(); track cat.id) {
36250
+ <section class="val-faq__category">
36251
+ @if (showCategoryLabel()) {
36252
+ <h3 class="val-faq__category-label">{{ cat.label }}</h3>
36253
+ }
36254
+ <ion-accordion-group [multiple]="props.multiple ?? false">
36255
+ @for (item of cat.items; track item.id) {
36256
+ <ion-accordion [value]="item.id" class="val-faq__item">
36257
+ <ion-item slot="header" lines="none" class="val-faq__q">
36258
+ <ion-label class="val-faq__q-label">
36259
+ {{ item.question }}
36260
+ </ion-label>
36261
+ </ion-item>
36262
+ <div slot="content" class="val-faq__a">
36263
+ <val-article [props]="answerOf(item)" />
36264
+ </div>
36265
+ </ion-accordion>
36266
+ }
36267
+ </ion-accordion-group>
36268
+ </section>
36269
+ }
36270
+ }
36271
+ </div>
36272
+ `, isInline: true, styles: [":host{display:block;width:100%}.val-faq__search{margin-bottom:16px}.val-faq__category+.val-faq__category{margin-top:24px}.val-faq__category-label{font-size:.8rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ion-color-medium, #92949c);margin:0 0 8px;padding-inline:4px}ion-accordion-group{display:flex;flex-direction:column;gap:8px}.val-faq__item{border-radius:12px;overflow:hidden;background:var(--ion-color-light, #f4f5f8)}.val-faq__q{--background: transparent;--min-height: 56px}.val-faq__q-label{font-weight:600;white-space:normal}.val-faq__a{padding:4px 16px 16px}.val-faq__empty{text-align:center;padding:32px 16px;color:var(--ion-color-medium, #92949c);font-size:.95rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonAccordion, selector: "ion-accordion", inputs: ["disabled", "mode", "readonly", "toggleIcon", "toggleIconSlot", "value"] }, { kind: "component", type: IonAccordionGroup, selector: "ion-accordion-group", inputs: ["animated", "disabled", "expand", "mode", "multiple", "readonly", "value"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["preset", "props"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "component", type: ArticleComponent, selector: "val-article", inputs: ["props"] }] }); }
36273
+ }
36274
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FaqComponent, decorators: [{
36275
+ type: Component,
36276
+ args: [{ selector: 'val-faq', standalone: true, imports: [CommonModule, IonAccordion, IonAccordionGroup, IonItem, IonLabel, SearchbarComponent, ArticleComponent], template: `
36277
+ <div class="val-faq">
36278
+ @if (props.searchable !== false) {
36279
+ <div class="val-faq__search">
36280
+ <val-searchbar
36281
+ [props]="{
36282
+ placeholder: props.searchPlaceholder || '',
36283
+ debounce: 200,
36284
+ }"
36285
+ (filterEvent)="onSearch($event)"
36286
+ />
36287
+ </div>
36288
+ }
36289
+
36290
+ @if (visibleCategories().length === 0) {
36291
+ <p class="val-faq__empty">
36292
+ {{ props.noResultsText || 'Sin resultados' }}
36293
+ </p>
36294
+ } @else {
36295
+ @for (cat of visibleCategories(); track cat.id) {
36296
+ <section class="val-faq__category">
36297
+ @if (showCategoryLabel()) {
36298
+ <h3 class="val-faq__category-label">{{ cat.label }}</h3>
36299
+ }
36300
+ <ion-accordion-group [multiple]="props.multiple ?? false">
36301
+ @for (item of cat.items; track item.id) {
36302
+ <ion-accordion [value]="item.id" class="val-faq__item">
36303
+ <ion-item slot="header" lines="none" class="val-faq__q">
36304
+ <ion-label class="val-faq__q-label">
36305
+ {{ item.question }}
36306
+ </ion-label>
36307
+ </ion-item>
36308
+ <div slot="content" class="val-faq__a">
36309
+ <val-article [props]="answerOf(item)" />
36310
+ </div>
36311
+ </ion-accordion>
36312
+ }
36313
+ </ion-accordion-group>
36314
+ </section>
36315
+ }
36316
+ }
36317
+ </div>
36318
+ `, styles: [":host{display:block;width:100%}.val-faq__search{margin-bottom:16px}.val-faq__category+.val-faq__category{margin-top:24px}.val-faq__category-label{font-size:.8rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ion-color-medium, #92949c);margin:0 0 8px;padding-inline:4px}ion-accordion-group{display:flex;flex-direction:column;gap:8px}.val-faq__item{border-radius:12px;overflow:hidden;background:var(--ion-color-light, #f4f5f8)}.val-faq__q{--background: transparent;--min-height: 56px}.val-faq__q-label{font-weight:600;white-space:normal}.val-faq__a{padding:4px 16px 16px}.val-faq__empty{text-align:center;padding:32px 16px;color:var(--ion-color-medium, #92949c);font-size:.95rem}\n"] }]
36319
+ }], propDecorators: { props: [{
36320
+ type: Input
36321
+ }] } });
36322
+
36323
+ /**
36324
+ * Tipos del organism `val-faq`.
36325
+ *
36326
+ * Modelo Q&A categorizado. Pensado para vistas FAQ públicas (sitio corporativo)
36327
+ * — el caller también puede usar la misma data para emitir structured data
36328
+ * `FAQPage` (JSON-LD) y ganar rich results en buscadores.
36329
+ */
36330
+
35852
36331
  class SimpleComponent {
35853
36332
  constructor() {
35854
36333
  this.onClick = new EventEmitter();
@@ -37416,308 +37895,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
37416
37895
  }]
37417
37896
  }] });
37418
37897
 
37419
- /** Built-in label sets for the three platform locales. */
37420
- const CALLOUT_LABELS = {
37421
- es: {
37422
- NOTE: 'Nota',
37423
- TIP: 'Tip',
37424
- INFO: 'Info',
37425
- IMPORTANT: 'Importante',
37426
- WARNING: 'Atención',
37427
- CAUTION: 'Precaución',
37428
- },
37429
- en: {
37430
- NOTE: 'Note',
37431
- TIP: 'Tip',
37432
- INFO: 'Info',
37433
- IMPORTANT: 'Important',
37434
- WARNING: 'Warning',
37435
- CAUTION: 'Caution',
37436
- },
37437
- pt: {
37438
- NOTE: 'Nota',
37439
- TIP: 'Dica',
37440
- INFO: 'Info',
37441
- IMPORTANT: 'Importante',
37442
- WARNING: 'Atenção',
37443
- CAUTION: 'Cuidado',
37444
- },
37445
- };
37446
- /**
37447
- * Per-callout-kind color (Ionic semantic color). Fixed across locales since
37448
- * red = danger no matter what language you speak.
37449
- */
37450
- const CALLOUT_COLORS = {
37451
- NOTE: 'primary',
37452
- TIP: 'success',
37453
- INFO: 'tertiary',
37454
- IMPORTANT: 'warning',
37455
- WARNING: 'warning',
37456
- CAUTION: 'danger',
37457
- };
37458
- const BOX_DRAWING = /[┌┐└┘├┤┬┴┼─│╔╗╚╝═║]/;
37459
- const CALLOUT_RE = /^>\s*\[!(NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT)\]\s*(.*)$/i;
37460
- const FENCE_RE = /^```([\w-]*)\s*$/;
37461
- const HEADING_RE = /^(#{1,6})\s+(.+)$/;
37462
- const SEPARATOR_RE = /^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/;
37463
- const UNORDERED_RE = /^\s*[-*+]\s+(.+)$/;
37464
- const CHECKLIST_RE = /^\s*[-*+]\s+\[([ xX])\]\s+(.+)$/;
37465
- const ORDERED_RE = /^\s*\d+\.\s+(.+)$/;
37466
- const TABLE_DIVIDER_RE = /^\s*\|?[\s:|-]+\|?\s*$/;
37467
- const TABLE_ROW_RE = /^\s*\|(.+)\|\s*$/;
37468
- /**
37469
- * Pure Markdown → ArticleMetadata parser. No Angular deps — usable from Node scripts
37470
- * (build-time generation) and from the Angular `MarkdownArticleParserService` wrapper.
37471
- *
37472
- * Supported syntax:
37473
- * - Headings (#, ##, ### …) → title / subtitle
37474
- * - Paragraphs → paragraph (with `processLinks` + `allowPartialBold`)
37475
- * - Lists (-, *, 1.) → unordered / ordered list (- [ ] / - [x] for checklist)
37476
- * - Blockquotes (>) → quote, with GitHub callouts `> [!NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT]` mapped to notes
37477
- * - Code fences (```lang) → code
37478
- * - Box-drawing ASCII art (┌┐└┘│─) auto-wrapped as code
37479
- * - Tables → flattened into paragraphs with bold keys
37480
- * - Horizontal rules (---, ***, ___) → separator
37481
- */
37482
- function parseMarkdownArticle(markdown, options) {
37483
- const lines = normalize(markdown).split('\n');
37484
- const elements = [];
37485
- const labels = options?.calloutLabels ??
37486
- (options?.locale ? CALLOUT_LABELS[options.locale] : CALLOUT_LABELS.es);
37487
- let i = 0;
37488
- while (i < lines.length) {
37489
- const line = lines[i];
37490
- if (line.trim() === '') {
37491
- i++;
37492
- continue;
37493
- }
37494
- const fence = line.match(FENCE_RE);
37495
- if (fence) {
37496
- const lang = fence[1] || undefined;
37497
- const body = [];
37498
- i++;
37499
- while (i < lines.length && !FENCE_RE.test(lines[i])) {
37500
- body.push(lines[i]);
37501
- i++;
37502
- }
37503
- i++;
37504
- elements.push({
37505
- type: 'code',
37506
- props: { code: body.join('\n'), language: lang, theme: 'dark' },
37507
- });
37508
- continue;
37509
- }
37510
- if (BOX_DRAWING.test(line)) {
37511
- const body = [];
37512
- while (i < lines.length && (lines[i].trim() === '' || BOX_DRAWING.test(lines[i]))) {
37513
- body.push(lines[i]);
37514
- i++;
37515
- }
37516
- while (body.length && body[body.length - 1].trim() === '')
37517
- body.pop();
37518
- elements.push({
37519
- type: 'code',
37520
- props: { code: body.join('\n'), language: 'text', theme: 'dark' },
37521
- });
37522
- continue;
37523
- }
37524
- if (SEPARATOR_RE.test(line)) {
37525
- elements.push({ type: 'separator', props: { style: 'line' } });
37526
- i++;
37527
- continue;
37528
- }
37529
- const heading = line.match(HEADING_RE);
37530
- if (heading) {
37531
- elements.push(makeHeading(heading[1].length, heading[2].trim()));
37532
- i++;
37533
- continue;
37534
- }
37535
- if (line.startsWith('>')) {
37536
- const block = [];
37537
- while (i < lines.length && lines[i].startsWith('>')) {
37538
- block.push(lines[i]);
37539
- i++;
37540
- }
37541
- elements.push(makeQuoteOrCallout(block, labels));
37542
- continue;
37543
- }
37544
- if (TABLE_ROW_RE.test(line)) {
37545
- const rows = [];
37546
- while (i < lines.length && TABLE_ROW_RE.test(lines[i])) {
37547
- rows.push(lines[i]);
37548
- i++;
37549
- }
37550
- elements.push(...makeTable(rows));
37551
- continue;
37552
- }
37553
- if (CHECKLIST_RE.test(line) || UNORDERED_RE.test(line) || ORDERED_RE.test(line)) {
37554
- const listType = CHECKLIST_RE.test(line)
37555
- ? 'checklist'
37556
- : ORDERED_RE.test(line)
37557
- ? 'ordered'
37558
- : 'unordered';
37559
- const items = [];
37560
- while (i < lines.length && lines[i].trim() !== '') {
37561
- const cur = lines[i];
37562
- const check = cur.match(CHECKLIST_RE);
37563
- const unord = cur.match(UNORDERED_RE);
37564
- const ord = cur.match(ORDERED_RE);
37565
- if (check)
37566
- items.push({ text: check[2].trim() });
37567
- else if (ord && listType === 'ordered')
37568
- items.push({ text: ord[1].trim() });
37569
- else if (unord && listType !== 'ordered')
37570
- items.push({ text: unord[1].trim() });
37571
- else
37572
- break;
37573
- i++;
37574
- }
37575
- elements.push({ type: 'list', props: { items, listType } });
37576
- continue;
37577
- }
37578
- const paragraph = [];
37579
- while (i < lines.length && lines[i].trim() !== '' && !startsNewBlock(lines[i])) {
37580
- paragraph.push(lines[i]);
37581
- i++;
37582
- }
37583
- const text = paragraph.join(' ').trim();
37584
- if (text) {
37585
- elements.push({
37586
- type: 'paragraph',
37587
- props: {
37588
- content: text,
37589
- size: 'medium',
37590
- color: 'dark',
37591
- bold: false,
37592
- processLinks: true,
37593
- allowPartialBold: true,
37594
- },
37595
- });
37596
- }
37597
- }
37598
- // Strip parser-only options before merging into ArticleMetadata
37599
- const { locale: _l, calloutLabels: _c, ...metadataOverrides } = options ?? {};
37600
- return {
37601
- elements,
37602
- maxWidth: '900px',
37603
- centered: true,
37604
- theme: 'auto',
37605
- ...metadataOverrides,
37606
- };
37607
- }
37608
- function normalize(md) {
37609
- return md.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
37610
- }
37611
- function startsNewBlock(line) {
37612
- return (HEADING_RE.test(line) ||
37613
- FENCE_RE.test(line) ||
37614
- SEPARATOR_RE.test(line) ||
37615
- TABLE_ROW_RE.test(line) ||
37616
- UNORDERED_RE.test(line) ||
37617
- ORDERED_RE.test(line) ||
37618
- CHECKLIST_RE.test(line) ||
37619
- line.startsWith('>') ||
37620
- BOX_DRAWING.test(line));
37621
- }
37622
- function makeHeading(level, content) {
37623
- if (level === 1) {
37624
- return {
37625
- type: 'title',
37626
- props: { content, size: 'xlarge', color: 'dark', bold: true },
37627
- };
37628
- }
37629
- const size = level === 2 ? 'large' : level === 3 ? 'medium' : 'small';
37630
- return {
37631
- type: 'subtitle',
37632
- props: { content, size, color: 'dark', bold: true },
37633
- };
37634
- }
37635
- function makeQuoteOrCallout(block, labels) {
37636
- const first = block[0];
37637
- const callout = first.match(CALLOUT_RE);
37638
- const lines = block.map(l => l.replace(/^>\s?/, ''));
37639
- if (callout) {
37640
- const type = callout[1].toUpperCase();
37641
- const firstLineRest = callout[2] || '';
37642
- const rest = lines.slice(1).join(' ').trim();
37643
- const text = [firstLineRest, rest].filter(Boolean).join(' ').trim();
37644
- return makeNote(type, text, labels);
37645
- }
37646
- const text = lines.join(' ').trim();
37647
- return {
37648
- type: 'quote',
37649
- props: {
37650
- content: text,
37651
- size: 'medium',
37652
- color: 'medium',
37653
- bold: false,
37654
- showQuoteMark: true,
37655
- alignment: 'left',
37656
- },
37657
- };
37658
- }
37659
- function makeNote(kind, text, labels) {
37660
- return {
37661
- type: 'note',
37662
- props: {
37663
- text,
37664
- prefix: `${labels[kind]}:`,
37665
- color: CALLOUT_COLORS[kind],
37666
- textColor: 'dark',
37667
- size: 'medium',
37668
- rounded: true,
37669
- allowPartialBold: true,
37670
- processLinks: true,
37671
- },
37672
- };
37673
- }
37674
- function makeTable(rows) {
37675
- const parsed = rows
37676
- .filter(r => !TABLE_DIVIDER_RE.test(r))
37677
- .map(r => r
37678
- .trim()
37679
- .replace(/^\|/, '')
37680
- .replace(/\|$/, '')
37681
- .split('|')
37682
- .map(c => c.trim()));
37683
- if (parsed.length === 0)
37684
- return [];
37685
- const header = parsed[0];
37686
- const dataRows = parsed.slice(1);
37687
- if (dataRows.length === 0) {
37688
- return [
37689
- {
37690
- type: 'paragraph',
37691
- props: {
37692
- content: header.join(' · '),
37693
- size: 'medium',
37694
- color: 'dark',
37695
- bold: false,
37696
- processLinks: true,
37697
- allowPartialBold: true,
37698
- },
37699
- },
37700
- ];
37701
- }
37702
- return dataRows.map(row => {
37703
- const pairs = row.map((cell, idx) => {
37704
- const key = header[idx] ?? '';
37705
- return key ? `**${key}:** ${cell}` : cell;
37706
- });
37707
- return {
37708
- type: 'paragraph',
37709
- props: {
37710
- content: pairs.join(' · '),
37711
- size: 'medium',
37712
- color: 'dark',
37713
- bold: false,
37714
- processLinks: true,
37715
- allowPartialBold: true,
37716
- },
37717
- };
37718
- });
37719
- }
37720
-
37721
37898
  /**
37722
37899
  * Angular service wrapper for the pure {@link parseMarkdownArticle} function.
37723
37900
  * Provided in root so it can be injected anywhere. The actual parsing logic lives in
@@ -45461,7 +45638,9 @@ const VALTECH_COMPANY_LINKS = {
45461
45638
  ],
45462
45639
  support: [
45463
45640
  { key: 'contactSupport', url: '/contact', kind: 'support', external: false },
45464
- { key: 'faq', url: '/legal/faq', kind: 'site', external: false },
45641
+ // FAQ página dedicada `/faq` (kind 'site': vive en el sitio corporativo;
45642
+ // en apps satellite se reescribe al main site vía LegalLinkService).
45643
+ { key: 'faq', url: '/faq', kind: 'site', external: false },
45465
45644
  { key: 'feedback', url: '/feedback', kind: 'support', external: false },
45466
45645
  ],
45467
45646
  };
@@ -45548,5 +45727,5 @@ function buildFooterLinks(links, t, resolver) {
45548
45727
  * Generated bundle index. Do not edit.
45549
45728
  */
45550
45729
 
45551
- 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, AppVersionService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, 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, CookieBannerComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DONATION_CONFIG, 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, DonationService, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlassComponent, GlowCardComponent, GlowComponent, 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, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTIF_KEYS, 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, PATTERN_MOTIFS, PATTERN_PALETTES, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, 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, SHAPE_KEYS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, 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, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createRefreshableStream, createTitleProps, docs, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechDonations, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
45730
+ 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, AppVersionService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, 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, CookieBannerComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DONATION_CONFIG, 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, DonationService, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlassComponent, GlowCardComponent, GlowComponent, 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, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTIF_KEYS, 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, PATTERN_MOTIFS, PATTERN_PALETTES, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, 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, SHAPE_KEYS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, 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, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createRefreshableStream, createTitleProps, docs, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechDonations, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
45552
45731
  //# sourceMappingURL=valtech-components.mjs.map