valtech-components 2.0.729 → 2.0.730
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/services/markdown-article/legal-content.service.mjs +65 -14
- package/esm2022/lib/services/markdown-article/markdown-article-parser.mjs +266 -0
- package/esm2022/lib/services/markdown-article/markdown-article-parser.service.mjs +6 -275
- package/esm2022/lib/services/preferences/index.mjs +3 -0
- package/esm2022/lib/services/preferences/preferences.service.mjs +164 -0
- package/esm2022/lib/services/preferences/preferences.types.mjs +7 -0
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +7 -1
- package/fesm2022/valtech-components.mjs +452 -244
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +1 -1
- package/lib/components/atoms/text/text.component.d.ts +1 -1
- package/lib/components/molecules/features-list/features-list.component.d.ts +1 -1
- package/lib/components/organisms/article/article.component.d.ts +3 -3
- package/lib/components/organisms/bottom-nav/bottom-nav.component.d.ts +1 -1
- package/lib/components/organisms/toolbar/toolbar.component.d.ts +1 -1
- package/lib/services/markdown-article/legal-content.service.d.ts +49 -7
- package/lib/services/markdown-article/markdown-article-parser.d.ts +16 -0
- package/lib/services/markdown-article/markdown-article-parser.service.d.ts +3 -22
- package/lib/services/preferences/index.d.ts +2 -0
- package/lib/services/preferences/preferences.service.d.ts +51 -0
- package/lib/services/preferences/preferences.types.d.ts +35 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -50,7 +50,7 @@ import 'prismjs/components/prism-json';
|
|
|
50
50
|
* Current version of valtech-components.
|
|
51
51
|
* This is automatically updated during the publish process.
|
|
52
52
|
*/
|
|
53
|
-
const VERSION = '2.0.
|
|
53
|
+
const VERSION = '2.0.730';
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* Servicio para gestionar presets de componentes.
|
|
@@ -34953,7 +34953,8 @@ const ORDERED_RE = /^\s*\d+\.\s+(.+)$/;
|
|
|
34953
34953
|
const TABLE_DIVIDER_RE = /^\s*\|?[\s:|-]+\|?\s*$/;
|
|
34954
34954
|
const TABLE_ROW_RE = /^\s*\|(.+)\|\s*$/;
|
|
34955
34955
|
/**
|
|
34956
|
-
*
|
|
34956
|
+
* Pure Markdown → ArticleMetadata parser. No Angular deps — usable from Node scripts
|
|
34957
|
+
* (build-time generation) and from the Angular `MarkdownArticleParserService` wrapper.
|
|
34957
34958
|
*
|
|
34958
34959
|
* Supported syntax:
|
|
34959
34960
|
* - Headings (#, ##, ### …) → title / subtitle
|
|
@@ -34965,261 +34966,256 @@ const TABLE_ROW_RE = /^\s*\|(.+)\|\s*$/;
|
|
|
34965
34966
|
* - Tables → flattened into paragraphs with bold keys
|
|
34966
34967
|
* - Horizontal rules (---, ***, ___) → separator
|
|
34967
34968
|
*/
|
|
34968
|
-
|
|
34969
|
-
|
|
34970
|
-
|
|
34971
|
-
|
|
34972
|
-
|
|
34973
|
-
|
|
34974
|
-
|
|
34975
|
-
|
|
34969
|
+
function parseMarkdownArticle(markdown, config) {
|
|
34970
|
+
const lines = normalize(markdown).split('\n');
|
|
34971
|
+
const elements = [];
|
|
34972
|
+
let i = 0;
|
|
34973
|
+
while (i < lines.length) {
|
|
34974
|
+
const line = lines[i];
|
|
34975
|
+
if (line.trim() === '') {
|
|
34976
|
+
i++;
|
|
34977
|
+
continue;
|
|
34978
|
+
}
|
|
34979
|
+
const fence = line.match(FENCE_RE);
|
|
34980
|
+
if (fence) {
|
|
34981
|
+
const lang = fence[1] || undefined;
|
|
34982
|
+
const body = [];
|
|
34983
|
+
i++;
|
|
34984
|
+
while (i < lines.length && !FENCE_RE.test(lines[i])) {
|
|
34985
|
+
body.push(lines[i]);
|
|
34976
34986
|
i++;
|
|
34977
|
-
continue;
|
|
34978
34987
|
}
|
|
34979
|
-
|
|
34980
|
-
|
|
34981
|
-
|
|
34982
|
-
|
|
34983
|
-
|
|
34988
|
+
i++;
|
|
34989
|
+
elements.push({
|
|
34990
|
+
type: 'code',
|
|
34991
|
+
props: { code: body.join('\n'), language: lang, theme: 'dark' },
|
|
34992
|
+
});
|
|
34993
|
+
continue;
|
|
34994
|
+
}
|
|
34995
|
+
if (BOX_DRAWING.test(line)) {
|
|
34996
|
+
const body = [];
|
|
34997
|
+
while (i < lines.length && (lines[i].trim() === '' || BOX_DRAWING.test(lines[i]))) {
|
|
34998
|
+
body.push(lines[i]);
|
|
34984
34999
|
i++;
|
|
34985
|
-
while (i < lines.length && !FENCE_RE.test(lines[i])) {
|
|
34986
|
-
body.push(lines[i]);
|
|
34987
|
-
i++;
|
|
34988
|
-
}
|
|
34989
|
-
i++; // skip closing fence
|
|
34990
|
-
elements.push({
|
|
34991
|
-
type: 'code',
|
|
34992
|
-
props: { code: body.join('\n'), language: lang, theme: 'dark' },
|
|
34993
|
-
});
|
|
34994
|
-
continue;
|
|
34995
|
-
}
|
|
34996
|
-
// ASCII box-drawing art → treat as code block
|
|
34997
|
-
if (BOX_DRAWING.test(line)) {
|
|
34998
|
-
const body = [];
|
|
34999
|
-
while (i < lines.length && (lines[i].trim() === '' || BOX_DRAWING.test(lines[i]))) {
|
|
35000
|
-
body.push(lines[i]);
|
|
35001
|
-
i++;
|
|
35002
|
-
}
|
|
35003
|
-
// Trim trailing blank lines from the block
|
|
35004
|
-
while (body.length && body[body.length - 1].trim() === '')
|
|
35005
|
-
body.pop();
|
|
35006
|
-
elements.push({
|
|
35007
|
-
type: 'code',
|
|
35008
|
-
props: { code: body.join('\n'), language: 'text', theme: 'dark' },
|
|
35009
|
-
});
|
|
35010
|
-
continue;
|
|
35011
35000
|
}
|
|
35012
|
-
|
|
35013
|
-
|
|
35014
|
-
|
|
35001
|
+
while (body.length && body[body.length - 1].trim() === '')
|
|
35002
|
+
body.pop();
|
|
35003
|
+
elements.push({
|
|
35004
|
+
type: 'code',
|
|
35005
|
+
props: { code: body.join('\n'), language: 'text', theme: 'dark' },
|
|
35006
|
+
});
|
|
35007
|
+
continue;
|
|
35008
|
+
}
|
|
35009
|
+
if (SEPARATOR_RE.test(line)) {
|
|
35010
|
+
elements.push({ type: 'separator', props: { style: 'line' } });
|
|
35011
|
+
i++;
|
|
35012
|
+
continue;
|
|
35013
|
+
}
|
|
35014
|
+
const heading = line.match(HEADING_RE);
|
|
35015
|
+
if (heading) {
|
|
35016
|
+
elements.push(makeHeading(heading[1].length, heading[2].trim()));
|
|
35017
|
+
i++;
|
|
35018
|
+
continue;
|
|
35019
|
+
}
|
|
35020
|
+
if (line.startsWith('>')) {
|
|
35021
|
+
const block = [];
|
|
35022
|
+
while (i < lines.length && lines[i].startsWith('>')) {
|
|
35023
|
+
block.push(lines[i]);
|
|
35015
35024
|
i++;
|
|
35016
|
-
continue;
|
|
35017
35025
|
}
|
|
35018
|
-
|
|
35019
|
-
|
|
35020
|
-
|
|
35021
|
-
|
|
35026
|
+
elements.push(makeQuoteOrCallout(block));
|
|
35027
|
+
continue;
|
|
35028
|
+
}
|
|
35029
|
+
if (TABLE_ROW_RE.test(line)) {
|
|
35030
|
+
const rows = [];
|
|
35031
|
+
while (i < lines.length && TABLE_ROW_RE.test(lines[i])) {
|
|
35032
|
+
rows.push(lines[i]);
|
|
35022
35033
|
i++;
|
|
35023
|
-
continue;
|
|
35024
|
-
}
|
|
35025
|
-
// Callout / blockquote (consume contiguous `>` lines)
|
|
35026
|
-
if (line.startsWith('>')) {
|
|
35027
|
-
const block = [];
|
|
35028
|
-
while (i < lines.length && lines[i].startsWith('>')) {
|
|
35029
|
-
block.push(lines[i]);
|
|
35030
|
-
i++;
|
|
35031
|
-
}
|
|
35032
|
-
elements.push(this.makeQuoteOrCallout(block));
|
|
35033
|
-
continue;
|
|
35034
|
-
}
|
|
35035
|
-
// Table (consume contiguous `|` lines)
|
|
35036
|
-
if (TABLE_ROW_RE.test(line)) {
|
|
35037
|
-
const rows = [];
|
|
35038
|
-
while (i < lines.length && TABLE_ROW_RE.test(lines[i])) {
|
|
35039
|
-
rows.push(lines[i]);
|
|
35040
|
-
i++;
|
|
35041
|
-
}
|
|
35042
|
-
elements.push(...this.makeTable(rows));
|
|
35043
|
-
continue;
|
|
35044
|
-
}
|
|
35045
|
-
// List (checklist / unordered / ordered) — consume contiguous lines
|
|
35046
|
-
if (CHECKLIST_RE.test(line) || UNORDERED_RE.test(line) || ORDERED_RE.test(line)) {
|
|
35047
|
-
const listType = CHECKLIST_RE.test(line)
|
|
35048
|
-
? 'checklist'
|
|
35049
|
-
: ORDERED_RE.test(line)
|
|
35050
|
-
? 'ordered'
|
|
35051
|
-
: 'unordered';
|
|
35052
|
-
const items = [];
|
|
35053
|
-
while (i < lines.length && lines[i].trim() !== '') {
|
|
35054
|
-
const cur = lines[i];
|
|
35055
|
-
const check = cur.match(CHECKLIST_RE);
|
|
35056
|
-
const unord = cur.match(UNORDERED_RE);
|
|
35057
|
-
const ord = cur.match(ORDERED_RE);
|
|
35058
|
-
if (check)
|
|
35059
|
-
items.push({ text: check[2].trim() });
|
|
35060
|
-
else if (ord && listType === 'ordered')
|
|
35061
|
-
items.push({ text: ord[1].trim() });
|
|
35062
|
-
else if (unord && listType !== 'ordered')
|
|
35063
|
-
items.push({ text: unord[1].trim() });
|
|
35064
|
-
else
|
|
35065
|
-
break;
|
|
35066
|
-
i++;
|
|
35067
|
-
}
|
|
35068
|
-
elements.push({ type: 'list', props: { items, listType } });
|
|
35069
|
-
continue;
|
|
35070
35034
|
}
|
|
35071
|
-
|
|
35072
|
-
|
|
35073
|
-
|
|
35074
|
-
|
|
35035
|
+
elements.push(...makeTable(rows));
|
|
35036
|
+
continue;
|
|
35037
|
+
}
|
|
35038
|
+
if (CHECKLIST_RE.test(line) || UNORDERED_RE.test(line) || ORDERED_RE.test(line)) {
|
|
35039
|
+
const listType = CHECKLIST_RE.test(line)
|
|
35040
|
+
? 'checklist'
|
|
35041
|
+
: ORDERED_RE.test(line)
|
|
35042
|
+
? 'ordered'
|
|
35043
|
+
: 'unordered';
|
|
35044
|
+
const items = [];
|
|
35045
|
+
while (i < lines.length && lines[i].trim() !== '') {
|
|
35046
|
+
const cur = lines[i];
|
|
35047
|
+
const check = cur.match(CHECKLIST_RE);
|
|
35048
|
+
const unord = cur.match(UNORDERED_RE);
|
|
35049
|
+
const ord = cur.match(ORDERED_RE);
|
|
35050
|
+
if (check)
|
|
35051
|
+
items.push({ text: check[2].trim() });
|
|
35052
|
+
else if (ord && listType === 'ordered')
|
|
35053
|
+
items.push({ text: ord[1].trim() });
|
|
35054
|
+
else if (unord && listType !== 'ordered')
|
|
35055
|
+
items.push({ text: unord[1].trim() });
|
|
35056
|
+
else
|
|
35057
|
+
break;
|
|
35075
35058
|
i++;
|
|
35076
35059
|
}
|
|
35077
|
-
|
|
35078
|
-
|
|
35079
|
-
elements.push({
|
|
35080
|
-
type: 'paragraph',
|
|
35081
|
-
props: {
|
|
35082
|
-
content: text,
|
|
35083
|
-
size: 'medium',
|
|
35084
|
-
color: 'dark',
|
|
35085
|
-
bold: false,
|
|
35086
|
-
processLinks: true,
|
|
35087
|
-
allowPartialBold: true,
|
|
35088
|
-
},
|
|
35089
|
-
});
|
|
35090
|
-
}
|
|
35060
|
+
elements.push({ type: 'list', props: { items, listType } });
|
|
35061
|
+
continue;
|
|
35091
35062
|
}
|
|
35092
|
-
|
|
35093
|
-
|
|
35094
|
-
|
|
35095
|
-
|
|
35096
|
-
|
|
35097
|
-
|
|
35098
|
-
|
|
35099
|
-
|
|
35100
|
-
|
|
35101
|
-
|
|
35102
|
-
|
|
35103
|
-
|
|
35104
|
-
|
|
35105
|
-
|
|
35106
|
-
|
|
35107
|
-
|
|
35108
|
-
|
|
35109
|
-
|
|
35110
|
-
CHECKLIST_RE.test(line) ||
|
|
35111
|
-
line.startsWith('>') ||
|
|
35112
|
-
BOX_DRAWING.test(line));
|
|
35113
|
-
}
|
|
35114
|
-
makeHeading(level, content) {
|
|
35115
|
-
if (level === 1) {
|
|
35116
|
-
return {
|
|
35117
|
-
type: 'title',
|
|
35118
|
-
props: { content, size: 'xlarge', color: 'dark', bold: true },
|
|
35119
|
-
};
|
|
35063
|
+
const paragraph = [];
|
|
35064
|
+
while (i < lines.length && lines[i].trim() !== '' && !startsNewBlock(lines[i])) {
|
|
35065
|
+
paragraph.push(lines[i]);
|
|
35066
|
+
i++;
|
|
35067
|
+
}
|
|
35068
|
+
const text = paragraph.join(' ').trim();
|
|
35069
|
+
if (text) {
|
|
35070
|
+
elements.push({
|
|
35071
|
+
type: 'paragraph',
|
|
35072
|
+
props: {
|
|
35073
|
+
content: text,
|
|
35074
|
+
size: 'medium',
|
|
35075
|
+
color: 'dark',
|
|
35076
|
+
bold: false,
|
|
35077
|
+
processLinks: true,
|
|
35078
|
+
allowPartialBold: true,
|
|
35079
|
+
},
|
|
35080
|
+
});
|
|
35120
35081
|
}
|
|
35121
|
-
const size = level === 2 ? 'large' : level === 3 ? 'medium' : 'small';
|
|
35122
|
-
return {
|
|
35123
|
-
type: 'subtitle',
|
|
35124
|
-
props: { content, size, color: 'dark', bold: true },
|
|
35125
|
-
};
|
|
35126
|
-
}
|
|
35127
|
-
makeQuoteOrCallout(block) {
|
|
35128
|
-
const first = block[0];
|
|
35129
|
-
const callout = first.match(CALLOUT_RE);
|
|
35130
|
-
const lines = block.map(l => l.replace(/^>\s?/, ''));
|
|
35131
|
-
if (callout) {
|
|
35132
|
-
const type = callout[1].toUpperCase();
|
|
35133
|
-
const firstLineRest = callout[2] || '';
|
|
35134
|
-
const rest = lines.slice(1).join(' ').trim();
|
|
35135
|
-
const text = [firstLineRest, rest].filter(Boolean).join(' ').trim();
|
|
35136
|
-
return this.makeNote(type, text);
|
|
35137
|
-
}
|
|
35138
|
-
const text = lines.join(' ').trim();
|
|
35139
|
-
return {
|
|
35140
|
-
type: 'quote',
|
|
35141
|
-
props: {
|
|
35142
|
-
content: text,
|
|
35143
|
-
size: 'medium',
|
|
35144
|
-
color: 'medium',
|
|
35145
|
-
bold: false,
|
|
35146
|
-
showQuoteMark: true,
|
|
35147
|
-
alignment: 'left',
|
|
35148
|
-
},
|
|
35149
|
-
};
|
|
35150
35082
|
}
|
|
35151
|
-
|
|
35152
|
-
|
|
35153
|
-
|
|
35154
|
-
|
|
35155
|
-
|
|
35156
|
-
|
|
35157
|
-
|
|
35158
|
-
|
|
35159
|
-
|
|
35160
|
-
|
|
35083
|
+
return {
|
|
35084
|
+
elements,
|
|
35085
|
+
maxWidth: '900px',
|
|
35086
|
+
centered: true,
|
|
35087
|
+
theme: 'auto',
|
|
35088
|
+
...config,
|
|
35089
|
+
};
|
|
35090
|
+
}
|
|
35091
|
+
function normalize(md) {
|
|
35092
|
+
return md.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
35093
|
+
}
|
|
35094
|
+
function startsNewBlock(line) {
|
|
35095
|
+
return (HEADING_RE.test(line) ||
|
|
35096
|
+
FENCE_RE.test(line) ||
|
|
35097
|
+
SEPARATOR_RE.test(line) ||
|
|
35098
|
+
TABLE_ROW_RE.test(line) ||
|
|
35099
|
+
UNORDERED_RE.test(line) ||
|
|
35100
|
+
ORDERED_RE.test(line) ||
|
|
35101
|
+
CHECKLIST_RE.test(line) ||
|
|
35102
|
+
line.startsWith('>') ||
|
|
35103
|
+
BOX_DRAWING.test(line));
|
|
35104
|
+
}
|
|
35105
|
+
function makeHeading(level, content) {
|
|
35106
|
+
if (level === 1) {
|
|
35161
35107
|
return {
|
|
35162
|
-
type: '
|
|
35163
|
-
props: {
|
|
35164
|
-
text,
|
|
35165
|
-
prefix: `${cfg.prefix}:`,
|
|
35166
|
-
color: cfg.color,
|
|
35167
|
-
textColor: 'dark',
|
|
35168
|
-
size: 'medium',
|
|
35169
|
-
rounded: true,
|
|
35170
|
-
},
|
|
35108
|
+
type: 'title',
|
|
35109
|
+
props: { content, size: 'xlarge', color: 'dark', bold: true },
|
|
35171
35110
|
};
|
|
35172
35111
|
}
|
|
35173
|
-
|
|
35174
|
-
|
|
35175
|
-
|
|
35176
|
-
|
|
35177
|
-
|
|
35178
|
-
|
|
35179
|
-
|
|
35180
|
-
|
|
35181
|
-
|
|
35182
|
-
|
|
35183
|
-
|
|
35184
|
-
|
|
35185
|
-
|
|
35186
|
-
|
|
35187
|
-
|
|
35188
|
-
|
|
35189
|
-
|
|
35190
|
-
|
|
35191
|
-
|
|
35192
|
-
|
|
35193
|
-
|
|
35194
|
-
|
|
35195
|
-
|
|
35196
|
-
|
|
35197
|
-
|
|
35198
|
-
|
|
35199
|
-
|
|
35200
|
-
|
|
35201
|
-
|
|
35202
|
-
|
|
35203
|
-
|
|
35204
|
-
|
|
35205
|
-
}
|
|
35206
|
-
|
|
35207
|
-
|
|
35208
|
-
|
|
35209
|
-
|
|
35210
|
-
|
|
35211
|
-
|
|
35112
|
+
const size = level === 2 ? 'large' : level === 3 ? 'medium' : 'small';
|
|
35113
|
+
return {
|
|
35114
|
+
type: 'subtitle',
|
|
35115
|
+
props: { content, size, color: 'dark', bold: true },
|
|
35116
|
+
};
|
|
35117
|
+
}
|
|
35118
|
+
function makeQuoteOrCallout(block) {
|
|
35119
|
+
const first = block[0];
|
|
35120
|
+
const callout = first.match(CALLOUT_RE);
|
|
35121
|
+
const lines = block.map(l => l.replace(/^>\s?/, ''));
|
|
35122
|
+
if (callout) {
|
|
35123
|
+
const type = callout[1].toUpperCase();
|
|
35124
|
+
const firstLineRest = callout[2] || '';
|
|
35125
|
+
const rest = lines.slice(1).join(' ').trim();
|
|
35126
|
+
const text = [firstLineRest, rest].filter(Boolean).join(' ').trim();
|
|
35127
|
+
return makeNote(type, text);
|
|
35128
|
+
}
|
|
35129
|
+
const text = lines.join(' ').trim();
|
|
35130
|
+
return {
|
|
35131
|
+
type: 'quote',
|
|
35132
|
+
props: {
|
|
35133
|
+
content: text,
|
|
35134
|
+
size: 'medium',
|
|
35135
|
+
color: 'medium',
|
|
35136
|
+
bold: false,
|
|
35137
|
+
showQuoteMark: true,
|
|
35138
|
+
alignment: 'left',
|
|
35139
|
+
},
|
|
35140
|
+
};
|
|
35141
|
+
}
|
|
35142
|
+
function makeNote(kind, text) {
|
|
35143
|
+
const map = {
|
|
35144
|
+
NOTE: { color: 'primary', prefix: 'Nota' },
|
|
35145
|
+
TIP: { color: 'success', prefix: 'Tip' },
|
|
35146
|
+
INFO: { color: 'tertiary', prefix: 'Info' },
|
|
35147
|
+
IMPORTANT: { color: 'warning', prefix: 'Importante' },
|
|
35148
|
+
WARNING: { color: 'warning', prefix: 'Atención' },
|
|
35149
|
+
CAUTION: { color: 'danger', prefix: 'Precaución' },
|
|
35150
|
+
};
|
|
35151
|
+
const cfg = map[kind];
|
|
35152
|
+
return {
|
|
35153
|
+
type: 'note',
|
|
35154
|
+
props: {
|
|
35155
|
+
text,
|
|
35156
|
+
prefix: `${cfg.prefix}:`,
|
|
35157
|
+
color: cfg.color,
|
|
35158
|
+
textColor: 'dark',
|
|
35159
|
+
size: 'medium',
|
|
35160
|
+
rounded: true,
|
|
35161
|
+
},
|
|
35162
|
+
};
|
|
35163
|
+
}
|
|
35164
|
+
function makeTable(rows) {
|
|
35165
|
+
const parsed = rows
|
|
35166
|
+
.filter(r => !TABLE_DIVIDER_RE.test(r))
|
|
35167
|
+
.map(r => r
|
|
35168
|
+
.trim()
|
|
35169
|
+
.replace(/^\|/, '')
|
|
35170
|
+
.replace(/\|$/, '')
|
|
35171
|
+
.split('|')
|
|
35172
|
+
.map(c => c.trim()));
|
|
35173
|
+
if (parsed.length === 0)
|
|
35174
|
+
return [];
|
|
35175
|
+
const header = parsed[0];
|
|
35176
|
+
const dataRows = parsed.slice(1);
|
|
35177
|
+
if (dataRows.length === 0) {
|
|
35178
|
+
return [
|
|
35179
|
+
{
|
|
35212
35180
|
type: 'paragraph',
|
|
35213
35181
|
props: {
|
|
35214
|
-
content:
|
|
35182
|
+
content: header.join(' · '),
|
|
35215
35183
|
size: 'medium',
|
|
35216
35184
|
color: 'dark',
|
|
35217
35185
|
bold: false,
|
|
35218
35186
|
processLinks: true,
|
|
35219
35187
|
allowPartialBold: true,
|
|
35220
35188
|
},
|
|
35221
|
-
}
|
|
35189
|
+
},
|
|
35190
|
+
];
|
|
35191
|
+
}
|
|
35192
|
+
return dataRows.map(row => {
|
|
35193
|
+
const pairs = row.map((cell, idx) => {
|
|
35194
|
+
const key = header[idx] ?? '';
|
|
35195
|
+
return key ? `**${key}:** ${cell}` : cell;
|
|
35222
35196
|
});
|
|
35197
|
+
return {
|
|
35198
|
+
type: 'paragraph',
|
|
35199
|
+
props: {
|
|
35200
|
+
content: pairs.join(' · '),
|
|
35201
|
+
size: 'medium',
|
|
35202
|
+
color: 'dark',
|
|
35203
|
+
bold: false,
|
|
35204
|
+
processLinks: true,
|
|
35205
|
+
allowPartialBold: true,
|
|
35206
|
+
},
|
|
35207
|
+
};
|
|
35208
|
+
});
|
|
35209
|
+
}
|
|
35210
|
+
|
|
35211
|
+
/**
|
|
35212
|
+
* Angular service wrapper for the pure {@link parseMarkdownArticle} function.
|
|
35213
|
+
* Provided in root so it can be injected anywhere. The actual parsing logic lives in
|
|
35214
|
+
* `markdown-article-parser.ts` and is also usable from Node scripts (build-time generation).
|
|
35215
|
+
*/
|
|
35216
|
+
class MarkdownArticleParserService {
|
|
35217
|
+
parse(markdown, config) {
|
|
35218
|
+
return parseMarkdownArticle(markdown, config);
|
|
35223
35219
|
}
|
|
35224
35220
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkdownArticleParserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
35225
35221
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkdownArticleParserService, providedIn: 'root' }); }
|
|
@@ -35229,43 +35225,77 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
35229
35225
|
args: [{ providedIn: 'root' }]
|
|
35230
35226
|
}] });
|
|
35231
35227
|
|
|
35228
|
+
const LEGAL_CONTENT_CONFIG = new InjectionToken('LEGAL_CONTENT_CONFIG');
|
|
35232
35229
|
/**
|
|
35233
|
-
* Loads
|
|
35234
|
-
*
|
|
35235
|
-
*
|
|
35230
|
+
* Loads legal articles via one of two modes:
|
|
35231
|
+
*
|
|
35232
|
+
* 1. **Build-time** (preferred): when the app provides `LEGAL_CONTENT_CONFIG.factories`
|
|
35233
|
+
* via `provideLegalContent()`, the service dynamically imports the matching
|
|
35234
|
+
* locale module and returns the pre-parsed `ArticleMetadata` synchronously
|
|
35235
|
+
* (wrapped in an Observable). Each locale is code-split.
|
|
35236
|
+
*
|
|
35237
|
+
* 2. **Runtime**: when no factory matches, falls back to fetching
|
|
35238
|
+
* `/assets/legal/{locale}/{slug}.md` and parsing on the fly.
|
|
35239
|
+
*
|
|
35240
|
+
* Both modes cache by `locale:slug` so concurrent loads share one promise/HTTP request.
|
|
35236
35241
|
*/
|
|
35237
35242
|
class LegalContentService {
|
|
35238
35243
|
constructor() {
|
|
35239
35244
|
this.http = inject(HttpClient);
|
|
35240
35245
|
this.parser = inject(MarkdownArticleParserService);
|
|
35246
|
+
this.config = inject(LEGAL_CONTENT_CONFIG, { optional: true }) ?? {};
|
|
35241
35247
|
this.DEFAULT_BASE = '/assets/legal';
|
|
35242
35248
|
this.cache = new Map();
|
|
35249
|
+
this.factoryCache = new Map();
|
|
35243
35250
|
}
|
|
35244
35251
|
load(slug, options = {}) {
|
|
35245
35252
|
const locale = (options.locale ?? 'es').toLowerCase();
|
|
35246
|
-
const
|
|
35247
|
-
|
|
35248
|
-
|
|
35253
|
+
const fallback = options.fallbackLocale === undefined
|
|
35254
|
+
? (this.config.fallbackLocale ?? 'es')
|
|
35255
|
+
: options.fallbackLocale;
|
|
35256
|
+
const key = `${locale}|${slug}`;
|
|
35249
35257
|
const cached = this.cache.get(key);
|
|
35250
35258
|
if (cached)
|
|
35251
35259
|
return cached;
|
|
35252
|
-
const primary = this.
|
|
35260
|
+
const primary = this.loadOne(slug, locale, options.basePath);
|
|
35253
35261
|
const stream = fallback && fallback !== locale
|
|
35254
|
-
? primary.pipe(catchError(() => this.
|
|
35262
|
+
? primary.pipe(catchError(() => this.loadOne(slug, fallback, options.basePath)))
|
|
35255
35263
|
: primary;
|
|
35256
35264
|
const shared = stream.pipe(shareReplay({ bufferSize: 1, refCount: false }));
|
|
35257
35265
|
this.cache.set(key, shared);
|
|
35258
35266
|
return shared;
|
|
35259
35267
|
}
|
|
35260
|
-
/**
|
|
35268
|
+
/** Raw Markdown — only available in runtime mode (HTTP). */
|
|
35261
35269
|
raw(slug, options = {}) {
|
|
35262
35270
|
const locale = (options.locale ?? 'es').toLowerCase();
|
|
35263
|
-
const base = options.basePath ?? this.DEFAULT_BASE;
|
|
35271
|
+
const base = options.basePath ?? this.config.basePath ?? this.DEFAULT_BASE;
|
|
35264
35272
|
return this.http.get(`${base}/${locale}/${slug}.md`, { responseType: 'text' });
|
|
35265
35273
|
}
|
|
35266
|
-
/** Clears
|
|
35274
|
+
/** Clears in-memory caches. Call on runtime locale change. */
|
|
35267
35275
|
invalidate() {
|
|
35268
35276
|
this.cache.clear();
|
|
35277
|
+
this.factoryCache.clear();
|
|
35278
|
+
}
|
|
35279
|
+
loadOne(slug, locale, basePathOverride) {
|
|
35280
|
+
const factory = this.config.factories?.[locale];
|
|
35281
|
+
if (factory) {
|
|
35282
|
+
return from(this.runFactory(locale, factory)).pipe(switchMap(content => {
|
|
35283
|
+
const article = content[slug];
|
|
35284
|
+
return article
|
|
35285
|
+
? of(article)
|
|
35286
|
+
: throwError(() => new Error(`Legal doc not found: ${locale}/${slug}`));
|
|
35287
|
+
}));
|
|
35288
|
+
}
|
|
35289
|
+
const base = basePathOverride ?? this.config.basePath ?? this.DEFAULT_BASE;
|
|
35290
|
+
return this.fetchAndParse(`${base}/${locale}/${slug}.md`);
|
|
35291
|
+
}
|
|
35292
|
+
runFactory(locale, factory) {
|
|
35293
|
+
const cached = this.factoryCache.get(locale);
|
|
35294
|
+
if (cached)
|
|
35295
|
+
return cached;
|
|
35296
|
+
const promise = factory();
|
|
35297
|
+
this.factoryCache.set(locale, promise);
|
|
35298
|
+
return promise;
|
|
35269
35299
|
}
|
|
35270
35300
|
fetchAndParse(url) {
|
|
35271
35301
|
return this.http.get(url, { responseType: 'text' }).pipe(switchMap(md => md && md.trim().length > 0
|
|
@@ -35279,6 +35309,184 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
35279
35309
|
type: Injectable,
|
|
35280
35310
|
args: [{ providedIn: 'root' }]
|
|
35281
35311
|
}] });
|
|
35312
|
+
/**
|
|
35313
|
+
* Wires pre-generated legal content into `LegalContentService`. Call from `main.ts`
|
|
35314
|
+
* (or any `providers: []` array). The factories use dynamic `import()` so each
|
|
35315
|
+
* locale is code-split — only the active locale's bundle is loaded.
|
|
35316
|
+
*
|
|
35317
|
+
* @example
|
|
35318
|
+
* provideLegalContent({
|
|
35319
|
+
* factories: {
|
|
35320
|
+
* es: () => import('./app/generated/legal-content.es').then((m) => m.LEGAL_CONTENT_ES),
|
|
35321
|
+
* en: () => import('./app/generated/legal-content.en').then((m) => m.LEGAL_CONTENT_EN),
|
|
35322
|
+
* pt: () => import('./app/generated/legal-content.pt').then((m) => m.LEGAL_CONTENT_PT),
|
|
35323
|
+
* },
|
|
35324
|
+
* })
|
|
35325
|
+
*/
|
|
35326
|
+
function provideLegalContent(config) {
|
|
35327
|
+
return { provide: LEGAL_CONTENT_CONFIG, useValue: config };
|
|
35328
|
+
}
|
|
35329
|
+
|
|
35330
|
+
/**
|
|
35331
|
+
* PreferencesService — preferencias del user en el doc canónico Firestore
|
|
35332
|
+
* `/apps/{appId}/users/{uid}/preferences/main`.
|
|
35333
|
+
*
|
|
35334
|
+
* Read reactivo (signals) via listener Firestore.
|
|
35335
|
+
* Write via `PUT /v2/auth/preferences` (cliente NUNCA escribe Firestore directo —
|
|
35336
|
+
* ver memoria `feedback_no_direct_firestore_writes`).
|
|
35337
|
+
*
|
|
35338
|
+
* Side-effects automáticos:
|
|
35339
|
+
* - Cuando `theme()` cambia → `ThemeService.Theme = ...`
|
|
35340
|
+
* - Cuando `language()` cambia → `I18nService.setLanguage(...)`
|
|
35341
|
+
*
|
|
35342
|
+
* Auto-bind al user actual via `AuthService.user()`. Sin user (logout) → unbind.
|
|
35343
|
+
*/
|
|
35344
|
+
class PreferencesService {
|
|
35345
|
+
constructor(config, firestore, auth, http, themeService, i18n) {
|
|
35346
|
+
this.config = config;
|
|
35347
|
+
this.firestore = firestore;
|
|
35348
|
+
this.auth = auth;
|
|
35349
|
+
this.http = http;
|
|
35350
|
+
this.themeService = themeService;
|
|
35351
|
+
this.i18n = i18n;
|
|
35352
|
+
this._theme = signal('auto');
|
|
35353
|
+
this._language = signal('es');
|
|
35354
|
+
this._notificationsMaster = signal(true);
|
|
35355
|
+
/** `true` después del primer snapshot Firestore. Antes, defaults sin side-effects. */
|
|
35356
|
+
this._synced = signal(false);
|
|
35357
|
+
this.theme = this._theme.asReadonly();
|
|
35358
|
+
this.language = this._language.asReadonly();
|
|
35359
|
+
this.notificationsMaster = this._notificationsMaster.asReadonly();
|
|
35360
|
+
this.synced = this._synced.asReadonly();
|
|
35361
|
+
const destroyRef = inject(DestroyRef);
|
|
35362
|
+
destroyRef.onDestroy(() => this.unbind());
|
|
35363
|
+
// Auto-bind al user actual. effect() corre en injection context (constructor OK).
|
|
35364
|
+
effect(() => {
|
|
35365
|
+
const user = this.auth.user();
|
|
35366
|
+
if (user?.userId) {
|
|
35367
|
+
this.bindToUser(user.userId);
|
|
35368
|
+
}
|
|
35369
|
+
else {
|
|
35370
|
+
this.unbind();
|
|
35371
|
+
}
|
|
35372
|
+
});
|
|
35373
|
+
// Side-effect: aplicar theme local cuando llega snapshot real.
|
|
35374
|
+
effect(() => {
|
|
35375
|
+
if (!this._synced())
|
|
35376
|
+
return;
|
|
35377
|
+
const t = this._theme();
|
|
35378
|
+
if (this.themeService) {
|
|
35379
|
+
this.themeService.Theme = t;
|
|
35380
|
+
}
|
|
35381
|
+
});
|
|
35382
|
+
// Side-effect: aplicar language local cuando llega snapshot real.
|
|
35383
|
+
effect(() => {
|
|
35384
|
+
if (!this._synced())
|
|
35385
|
+
return;
|
|
35386
|
+
const l = this._language();
|
|
35387
|
+
if (this.i18n && this.i18n.lang() !== l) {
|
|
35388
|
+
this.i18n.setLanguage(l);
|
|
35389
|
+
}
|
|
35390
|
+
});
|
|
35391
|
+
}
|
|
35392
|
+
/** Actualiza preferencias via backend. Optimistic UI: aplica local, revierte si falla. */
|
|
35393
|
+
async update(partial) {
|
|
35394
|
+
const url = `${this.config.apiUrl}/v2/auth/preferences`;
|
|
35395
|
+
const prev = {
|
|
35396
|
+
theme: this._theme(),
|
|
35397
|
+
language: this._language(),
|
|
35398
|
+
master: this._notificationsMaster(),
|
|
35399
|
+
};
|
|
35400
|
+
if (partial.theme)
|
|
35401
|
+
this._theme.set(partial.theme);
|
|
35402
|
+
if (partial.language)
|
|
35403
|
+
this._language.set(partial.language);
|
|
35404
|
+
if (partial.notifications && typeof partial.notifications.master === 'boolean') {
|
|
35405
|
+
this._notificationsMaster.set(partial.notifications.master);
|
|
35406
|
+
}
|
|
35407
|
+
try {
|
|
35408
|
+
const res = await firstValueFrom(this.http.put(url, partial));
|
|
35409
|
+
// El listener Firestore es la fuente final, pero alinear ya con la
|
|
35410
|
+
// respuesta del backend acelera UX (especialmente si el listener
|
|
35411
|
+
// tarda en propagar).
|
|
35412
|
+
if (res.theme)
|
|
35413
|
+
this._theme.set(res.theme);
|
|
35414
|
+
if (res.language)
|
|
35415
|
+
this._language.set(res.language);
|
|
35416
|
+
if (typeof res.notifications?.master === 'boolean') {
|
|
35417
|
+
this._notificationsMaster.set(res.notifications.master);
|
|
35418
|
+
}
|
|
35419
|
+
return res;
|
|
35420
|
+
}
|
|
35421
|
+
catch (err) {
|
|
35422
|
+
// Revert optimistic.
|
|
35423
|
+
this._theme.set(prev.theme);
|
|
35424
|
+
this._language.set(prev.language);
|
|
35425
|
+
this._notificationsMaster.set(prev.master);
|
|
35426
|
+
throw err;
|
|
35427
|
+
}
|
|
35428
|
+
}
|
|
35429
|
+
setTheme(theme) {
|
|
35430
|
+
return this.update({ theme });
|
|
35431
|
+
}
|
|
35432
|
+
setLanguage(language) {
|
|
35433
|
+
return this.update({ language });
|
|
35434
|
+
}
|
|
35435
|
+
setNotificationsMaster(enabled) {
|
|
35436
|
+
return this.update({ notifications: { master: enabled } });
|
|
35437
|
+
}
|
|
35438
|
+
bindToUser(userId) {
|
|
35439
|
+
if (this.currentUserId === userId && this.subscription)
|
|
35440
|
+
return;
|
|
35441
|
+
this.unbind();
|
|
35442
|
+
this.currentUserId = userId;
|
|
35443
|
+
// FirestoreService.docChanges prefija automáticamente `apps/{appId}/`
|
|
35444
|
+
// cuando `config.appId` está seteado en ValtechAuthConfig.
|
|
35445
|
+
this.subscription = this.firestore
|
|
35446
|
+
.docChanges(`users/${userId}/preferences`, 'main')
|
|
35447
|
+
.subscribe(doc => {
|
|
35448
|
+
if (!doc) {
|
|
35449
|
+
// Doc no existe aún (user nuevo, sin primer sync). Mantenemos
|
|
35450
|
+
// defaults locales pero NO marcamos synced — los side-effects no
|
|
35451
|
+
// pisan el theme/lang locales con valores arbitrarios.
|
|
35452
|
+
return;
|
|
35453
|
+
}
|
|
35454
|
+
if (doc.theme)
|
|
35455
|
+
this._theme.set(doc.theme);
|
|
35456
|
+
if (doc.language)
|
|
35457
|
+
this._language.set(doc.language);
|
|
35458
|
+
if (doc.notifications && typeof doc.notifications.master === 'boolean') {
|
|
35459
|
+
this._notificationsMaster.set(doc.notifications.master);
|
|
35460
|
+
}
|
|
35461
|
+
this._synced.set(true);
|
|
35462
|
+
});
|
|
35463
|
+
}
|
|
35464
|
+
unbind() {
|
|
35465
|
+
this.subscription?.unsubscribe();
|
|
35466
|
+
this.subscription = undefined;
|
|
35467
|
+
this.currentUserId = undefined;
|
|
35468
|
+
this._synced.set(false);
|
|
35469
|
+
}
|
|
35470
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PreferencesService, deps: [{ token: VALTECH_AUTH_CONFIG }, { token: FirestoreService }, { token: AuthService }, { token: i1$8.HttpClient }, { token: ThemeService, optional: true }, { token: I18nService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
35471
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PreferencesService, providedIn: 'root' }); }
|
|
35472
|
+
}
|
|
35473
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PreferencesService, decorators: [{
|
|
35474
|
+
type: Injectable,
|
|
35475
|
+
args: [{ providedIn: 'root' }]
|
|
35476
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
35477
|
+
type: Inject,
|
|
35478
|
+
args: [VALTECH_AUTH_CONFIG]
|
|
35479
|
+
}] }, { type: FirestoreService }, { type: AuthService }, { type: i1$8.HttpClient }, { type: ThemeService, decorators: [{
|
|
35480
|
+
type: Optional
|
|
35481
|
+
}] }, { type: I18nService, decorators: [{
|
|
35482
|
+
type: Optional
|
|
35483
|
+
}] }] });
|
|
35484
|
+
|
|
35485
|
+
/**
|
|
35486
|
+
* Preferences types — Fase 1 schema simple (theme + language + notifications.master).
|
|
35487
|
+
* Doc canónico: /apps/{appId}/users/{uid}/preferences/main
|
|
35488
|
+
* Cliente NUNCA escribe directo — todas las mutaciones via PUT /v2/auth/preferences.
|
|
35489
|
+
*/
|
|
35282
35490
|
|
|
35283
35491
|
/**
|
|
35284
35492
|
* Cross-Platform Version Helpers
|
|
@@ -42427,5 +42635,5 @@ function buildFooterLinks(links, t) {
|
|
|
42427
42635
|
* Generated bundle index. Do not edit.
|
|
42428
42636
|
*/
|
|
42429
42637
|
|
|
42430
|
-
export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SKELETON_PRESETS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, news, permissionGuard, permissionGuardFromRoute, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechPresets, provideValtechSkeleton, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
|
|
42638
|
+
export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, 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, SKELETON_PRESETS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechPresets, provideValtechSkeleton, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
|
|
42431
42639
|
//# sourceMappingURL=valtech-components.mjs.map
|