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.
- package/esm2022/lib/components/organisms/faq/faq.component.mjs +176 -0
- package/esm2022/lib/components/organisms/faq/types.mjs +9 -0
- package/esm2022/lib/config/company-footer.config.mjs +4 -2
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/valtech-components.mjs +484 -305
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/faq/faq.component.d.ts +46 -0
- package/lib/components/organisms/faq/types.d.ts +53 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -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.
|
|
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
|
-
|
|
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
|