valtech-components 2.0.286 → 2.0.289

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.
Files changed (30) hide show
  1. package/README.md +61 -21
  2. package/esm2022/lib/components/atoms/text/text.component.mjs +46 -10
  3. package/esm2022/lib/components/atoms/text/types.mjs +1 -1
  4. package/esm2022/lib/examples/custom-content-demo.component.mjs +291 -0
  5. package/esm2022/lib/examples/link-processing-example.component.mjs +189 -0
  6. package/esm2022/lib/services/lang-provider/content.mjs +1 -13
  7. package/esm2022/lib/services/link-processor.service.mjs +192 -0
  8. package/esm2022/lib/shared/pipes/process-links.pipe.mjs +69 -0
  9. package/esm2022/public-api.mjs +5 -4
  10. package/fesm2022/valtech-components.mjs +473 -919
  11. package/fesm2022/valtech-components.mjs.map +1 -1
  12. package/lib/components/atoms/text/text.component.d.ts +5 -1
  13. package/lib/components/atoms/text/types.d.ts +5 -0
  14. package/lib/examples/link-processing-example.component.d.ts +24 -0
  15. package/lib/services/link-processor.service.d.ts +98 -0
  16. package/lib/shared/pipes/process-links.pipe.d.ts +55 -0
  17. package/package.json +1 -1
  18. package/public-api.d.ts +4 -3
  19. package/esm2022/lib/components/_examples/custom-content-demo.component.mjs +0 -291
  20. package/esm2022/lib/components/_examples/global-content-example-content.mjs +0 -23
  21. package/esm2022/lib/components/_examples/global-content-example.component.mjs +0 -504
  22. package/esm2022/lib/components/_examples/reactive-content-example-content.mjs +0 -43
  23. package/esm2022/lib/components/_examples/reactive-content-example.component.mjs +0 -347
  24. package/esm2022/lib/services/lang-provider/components/theme-settings.mjs +0 -15
  25. package/lib/components/_examples/global-content-example-content.d.ts +0 -9
  26. package/lib/components/_examples/global-content-example.component.d.ts +0 -73
  27. package/lib/components/_examples/reactive-content-example-content.d.ts +0 -32
  28. package/lib/components/_examples/reactive-content-example.component.d.ts +0 -47
  29. package/lib/services/lang-provider/components/theme-settings.d.ts +0 -3
  30. /package/lib/{components/_examples → examples}/custom-content-demo.component.d.ts +0 -0
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Component, Input, Output, Injectable, inject, InjectionToken, Inject, ChangeDetectionStrategy, ViewChild, ChangeDetectorRef } from '@angular/core';
2
+ import { EventEmitter, Component, Input, Output, Injectable, inject, Pipe, InjectionToken, Inject, ChangeDetectionStrategy, ViewChild, ChangeDetectorRef } from '@angular/core';
3
3
  import { IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonProgressBar, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonButtons, IonTextarea, IonDatetime, IonDatetimeButton, IonModal, IonInput, IonRadioGroup, IonRadio, IonSearchbar, IonSelect, IonSelectOption, IonToolbar, IonTitle, IonMenuButton, IonFooter, IonHeader, IonList, IonListHeader, IonLabel, IonNote, IonItem, IonContent } from '@ionic/angular/standalone';
4
4
  import * as i1 from '@angular/common';
5
5
  import { CommonModule, NgStyle, AsyncPipe, NgIf, NgFor, NgClass } from '@angular/common';
@@ -8,9 +8,10 @@ import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBa
8
8
  import { Router, RouterLink } from '@angular/router';
9
9
  import { Browser } from '@capacitor/browser';
10
10
  import { map, BehaviorSubject, distinctUntilChanged, Subscription, of } from 'rxjs';
11
- import * as i1$1 from '@angular/forms';
11
+ import * as i1$1 from '@angular/platform-browser';
12
+ import * as i1$2 from '@angular/forms';
12
13
  import { ReactiveFormsModule, FormsModule, Validators } from '@angular/forms';
13
- import * as i1$2 from 'ng-otp-input';
14
+ import * as i1$3 from 'ng-otp-input';
14
15
  import { NgOtpInputComponent, NgOtpInputModule } from 'ng-otp-input';
15
16
  import * as i2 from '@ionic/angular';
16
17
  import { IonicModule } from '@ionic/angular';
@@ -1003,6 +1004,261 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1003
1004
  type: Input
1004
1005
  }] } });
1005
1006
 
1007
+ /**
1008
+ * LinkProcessorService - Service for processing text content to convert URLs and internal routes into clickable links.
1009
+ *
1010
+ * This service automatically detects external URLs (http/https), internal routes (starting with /),
1011
+ * and Markdown-style links [text](url) and converts them into HTML anchor elements with appropriate attributes.
1012
+ *
1013
+ * @example Basic usage:
1014
+ * ```typescript
1015
+ * constructor(private linkProcessor: LinkProcessorService) {}
1016
+ *
1017
+ * processText() {
1018
+ * const text = 'Visit https://example.com, go to /profile, or [check docs](https://docs.example.com)';
1019
+ * const processed = this.linkProcessor.processLinks(text);
1020
+ * // Returns SafeHtml with clickable links
1021
+ * }
1022
+ * ```
1023
+ */
1024
+ class LinkProcessorService {
1025
+ constructor(sanitizer) {
1026
+ this.sanitizer = sanitizer;
1027
+ // Regex para detectar URLs completas (http/https) - excluye caracteres de puntuación al final
1028
+ this.urlRegex = /(https?:\/\/[^\s,;.!?()]+)/g;
1029
+ // Regex para detectar rutas internas (empiezan con / pero no son URLs completas) - excluye puntuación
1030
+ this.internalRouteRegex = /(\s|^)(\/[^\s,;.!?()]*)/g;
1031
+ // Regex para detectar enlaces estilo Markdown [texto](url)
1032
+ this.markdownLinkRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
1033
+ }
1034
+ /**
1035
+ * Procesa texto para convertir enlaces en elementos <a> clickeables.
1036
+ * Detecta automáticamente URLs externas, rutas internas y enlaces estilo Markdown.
1037
+ *
1038
+ * @param text - Texto a procesar
1039
+ * @param config - Configuración del procesamiento
1040
+ * @returns SafeHtml con enlaces procesados o string original
1041
+ *
1042
+ * @example
1043
+ * ```typescript
1044
+ * const result = this.linkProcessor.processLinks(
1045
+ * 'Visit https://example.com, go to /profile, or [check docs](https://docs.example.com)',
1046
+ * {
1047
+ * openExternalInNewTab: true,
1048
+ * openInternalInNewTab: false,
1049
+ * processMarkdownLinks: true,
1050
+ * linkClass: 'custom-link'
1051
+ * }
1052
+ * );
1053
+ * ```
1054
+ */
1055
+ processLinks(text, config = {}) {
1056
+ if (!text)
1057
+ return '';
1058
+ const { openExternalInNewTab = true, openInternalInNewTab = false, linkClass = 'processed-link', externalLinkClass = 'external-link', internalLinkClass = 'internal-link', processMarkdownLinks = true, } = config;
1059
+ let hasLinks = false;
1060
+ let processedText = text;
1061
+ // 1. Procesar enlaces estilo Markdown [texto](url) primero
1062
+ if (processMarkdownLinks && this.markdownLinkRegex.test(text)) {
1063
+ hasLinks = true;
1064
+ this.markdownLinkRegex.lastIndex = 0; // Reset regex
1065
+ processedText = processedText.replace(this.markdownLinkRegex, (match, linkText, url) => {
1066
+ const isExternal = /^https?:\/\//.test(url);
1067
+ const target = (isExternal ? openExternalInNewTab : openInternalInNewTab)
1068
+ ? isExternal
1069
+ ? ' target="_blank" rel="noopener noreferrer"'
1070
+ : ' target="_blank"'
1071
+ : '';
1072
+ const typeClass = isExternal ? externalLinkClass : internalLinkClass;
1073
+ const classes = `${linkClass} ${typeClass}`.trim();
1074
+ return `<a href="${url}"${target} class="${classes}">${linkText}</a>`;
1075
+ });
1076
+ }
1077
+ // 2. Procesar URLs externas directas
1078
+ if (this.urlRegex.test(processedText)) {
1079
+ hasLinks = true;
1080
+ this.urlRegex.lastIndex = 0; // Reset regex
1081
+ processedText = processedText.replace(this.urlRegex, url => {
1082
+ // Verificar que no esté ya dentro de un enlace procesado
1083
+ const beforeMatch = processedText.substring(0, processedText.indexOf(url));
1084
+ if (beforeMatch.includes('<a href="' + url + '"')) {
1085
+ return url; // Ya está procesado como Markdown link
1086
+ }
1087
+ const target = openExternalInNewTab ? ' target="_blank" rel="noopener noreferrer"' : '';
1088
+ const classes = `${linkClass} ${externalLinkClass}`.trim();
1089
+ return `<a href="${url}"${target} class="${classes}">${url}</a>`;
1090
+ });
1091
+ }
1092
+ // 3. Procesar rutas internas después
1093
+ if (this.internalRouteRegex.test(processedText)) {
1094
+ hasLinks = true;
1095
+ this.internalRouteRegex.lastIndex = 0; // Reset regex
1096
+ processedText = processedText.replace(this.internalRouteRegex, (match, prefix, route) => {
1097
+ // Solo procesar si no está ya dentro de un enlace
1098
+ const beforeMatch = processedText.substring(0, processedText.indexOf(match));
1099
+ if (beforeMatch.includes(`href="${route}"`)) {
1100
+ return match; // Ya está procesado
1101
+ }
1102
+ const target = openInternalInNewTab ? ' target="_blank"' : '';
1103
+ const classes = `${linkClass} ${internalLinkClass}`.trim();
1104
+ return `${prefix}<a href="${route}"${target} class="${classes}">${route}</a>`;
1105
+ });
1106
+ }
1107
+ // Si hay enlaces, sanitizar el HTML
1108
+ if (hasLinks) {
1109
+ return this.sanitizer.bypassSecurityTrustHtml(processedText);
1110
+ }
1111
+ return text;
1112
+ }
1113
+ /**
1114
+ * Detecta si un texto contiene enlaces (URLs, rutas internas o enlaces Markdown).
1115
+ *
1116
+ * @param text - Texto a analizar
1117
+ * @returns true si contiene enlaces
1118
+ *
1119
+ * @example
1120
+ * ```typescript
1121
+ * const hasLinks = this.linkProcessor.hasLinks('Visit https://example.com or [docs](https://docs.com)');
1122
+ * // Returns: true
1123
+ * ```
1124
+ */
1125
+ hasLinks(text) {
1126
+ if (!text)
1127
+ return false;
1128
+ // Reset regex indices
1129
+ this.urlRegex.lastIndex = 0;
1130
+ this.internalRouteRegex.lastIndex = 0;
1131
+ this.markdownLinkRegex.lastIndex = 0;
1132
+ return (this.urlRegex.test(text) ||
1133
+ this.internalRouteRegex.test(text) ||
1134
+ this.markdownLinkRegex.test(text));
1135
+ }
1136
+ /**
1137
+ * Extrae todos los enlaces de un texto.
1138
+ *
1139
+ * @param text - Texto a analizar
1140
+ * @returns Array de enlaces encontrados con su tipo y texto (si es Markdown)
1141
+ *
1142
+ * @example
1143
+ * ```typescript
1144
+ * const links = this.linkProcessor.extractLinks('Visit https://example.com, /profile, or [docs](https://docs.com)');
1145
+ * // Returns: [
1146
+ * // { url: 'https://example.com', type: 'external', text: 'https://example.com' },
1147
+ * // { url: '/profile', type: 'internal', text: '/profile' },
1148
+ * // { url: 'https://docs.com', type: 'external', text: 'docs' }
1149
+ * // ]
1150
+ * ```
1151
+ */
1152
+ extractLinks(text) {
1153
+ if (!text)
1154
+ return [];
1155
+ const links = [];
1156
+ // Reset regex indices
1157
+ this.urlRegex.lastIndex = 0;
1158
+ this.internalRouteRegex.lastIndex = 0;
1159
+ this.markdownLinkRegex.lastIndex = 0;
1160
+ // Extraer enlaces Markdown primero
1161
+ let match;
1162
+ while ((match = this.markdownLinkRegex.exec(text)) !== null) {
1163
+ const url = match[2];
1164
+ const linkText = match[1];
1165
+ const type = /^https?:\/\//.test(url) ? 'external' : 'internal';
1166
+ links.push({ url, type, text: linkText });
1167
+ }
1168
+ // Extraer URLs externas directas
1169
+ while ((match = this.urlRegex.exec(text)) !== null) {
1170
+ const url = match[1];
1171
+ // Verificar que no esté ya capturado como Markdown link
1172
+ if (!links.some(link => link.url === url)) {
1173
+ links.push({ url, type: 'external', text: url });
1174
+ }
1175
+ }
1176
+ // Extraer rutas internas directas
1177
+ while ((match = this.internalRouteRegex.exec(text)) !== null) {
1178
+ const url = match[2];
1179
+ // Verificar que no esté ya capturado como Markdown link
1180
+ if (!links.some(link => link.url === url)) {
1181
+ links.push({ url, type: 'internal', text: url });
1182
+ }
1183
+ }
1184
+ return links;
1185
+ }
1186
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessorService, deps: [{ token: i1$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Injectable }); }
1187
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessorService, providedIn: 'root' }); }
1188
+ }
1189
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessorService, decorators: [{
1190
+ type: Injectable,
1191
+ args: [{
1192
+ providedIn: 'root',
1193
+ }]
1194
+ }], ctorParameters: () => [{ type: i1$1.DomSanitizer }] });
1195
+
1196
+ /**
1197
+ * ProcessLinksPipe - Pipe para procesar texto y convertir URLs en enlaces clickeables.
1198
+ *
1199
+ * Este pipe standalone detecta automáticamente URLs externas (http/https) y rutas internas
1200
+ * (que empiezan con /) y las convierte en elementos HTML anchor con los atributos apropiados.
1201
+ *
1202
+ * @example Uso básico:
1203
+ * ```html
1204
+ * <div [innerHTML]="'Visit https://example.com or go to /profile' | processLinks"></div>
1205
+ * ```
1206
+ *
1207
+ * @example Con configuración personalizada:
1208
+ * ```html
1209
+ * <div [innerHTML]="text | processLinks:linkConfig"></div>
1210
+ * ```
1211
+ *
1212
+ * @example En TypeScript:
1213
+ * ```typescript
1214
+ * export class MyComponent {
1215
+ * linkConfig: LinkProcessorConfig = {
1216
+ * openExternalInNewTab: true,
1217
+ * openInternalInNewTab: false,
1218
+ * linkClass: 'my-link',
1219
+ * externalLinkClass: 'external',
1220
+ * internalLinkClass: 'internal'
1221
+ * };
1222
+ * }
1223
+ * ```
1224
+ */
1225
+ class ProcessLinksPipe {
1226
+ constructor() {
1227
+ this.linkProcessor = inject(LinkProcessorService);
1228
+ }
1229
+ /**
1230
+ * Transforma texto procesando URLs y rutas internas para convertirlas en enlaces.
1231
+ *
1232
+ * @param value - El texto a procesar
1233
+ * @param config - Configuración opcional para el procesamiento de enlaces
1234
+ * @returns SafeHtml con enlaces procesados o string original si no hay enlaces
1235
+ *
1236
+ * @example
1237
+ * ```html
1238
+ * <!-- Uso básico -->
1239
+ * <p [innerHTML]="'Check out https://angular.io' | processLinks"></p>
1240
+ *
1241
+ * <!-- Con configuración -->
1242
+ * <p [innerHTML]="message | processLinks:{ openExternalInNewTab: false }"></p>
1243
+ * ```
1244
+ */
1245
+ transform(value, config) {
1246
+ if (!value) {
1247
+ return '';
1248
+ }
1249
+ return this.linkProcessor.processLinks(value, config);
1250
+ }
1251
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinksPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
1252
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinksPipe, isStandalone: true, name: "processLinks" }); }
1253
+ }
1254
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinksPipe, decorators: [{
1255
+ type: Pipe,
1256
+ args: [{
1257
+ name: 'processLinks',
1258
+ standalone: true,
1259
+ }]
1260
+ }] });
1261
+
1006
1262
  /**
1007
1263
  * Create a reactive content observable from a content key.
1008
1264
  * This is the primary utility for the `fromContent` pattern with unified support
@@ -1747,6 +2003,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1747
2003
  * }"></val-text>
1748
2004
  * ```
1749
2005
  *
2006
+ * @example With automatic link processing:
2007
+ * ```html
2008
+ * <val-text [props]="{
2009
+ * content: 'Visit https://example.com or go to /profile for more info',
2010
+ * processLinks: true,
2011
+ * linkConfig: {
2012
+ * openExternalInNewTab: true,
2013
+ * openInternalInNewTab: false,
2014
+ * linkClass: 'custom-link',
2015
+ * externalLinkClass: 'external',
2016
+ * internalLinkClass: 'internal'
2017
+ * },
2018
+ * color: 'primary',
2019
+ * size: 'medium'
2020
+ * }"></val-text>
2021
+ * ```
2022
+ *
1750
2023
  * @example Using ContentService helper:
1751
2024
  * ```typescript
1752
2025
  * // In component
@@ -1766,8 +2039,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1766
2039
  * @input props: TextMetadata - Configuration for the text (content, styling, and reactive content options)
1767
2040
  */
1768
2041
  class TextComponent {
1769
- constructor(contentService) {
2042
+ constructor(contentService, linkProcessor) {
1770
2043
  this.contentService = contentService;
2044
+ this.linkProcessor = linkProcessor;
1771
2045
  this.subscription = new Subscription();
1772
2046
  }
1773
2047
  ngOnInit() {
@@ -1811,21 +2085,37 @@ class TextComponent {
1811
2085
  this.displayContent$ = of(this.props.contentFallback || '');
1812
2086
  }
1813
2087
  }
1814
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextComponent, deps: [{ token: ContentService }], target: i0.ɵɵFactoryTarget.Component }); }
1815
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TextComponent, isStandalone: true, selector: "val-text", inputs: { props: "props" }, ngImport: i0, template: `
2088
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextComponent, deps: [{ token: ContentService }, { token: LinkProcessorService }], target: i0.ɵɵFactoryTarget.Component }); }
2089
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TextComponent, isStandalone: true, selector: "val-text", inputs: { props: "props" }, ngImport: i0, template: `
1816
2090
  <ion-text [color]="props.color">
1817
- <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
2091
+ @if (props.processLinks) {
2092
+ <p
2093
+ [class]="props.size"
2094
+ [class.bold]="props.bold"
2095
+ [innerHTML]="displayContent$ | async | processLinks: props.linkConfig"
2096
+ ></p>
2097
+ } @else {
2098
+ <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
2099
+ }
1818
2100
  </ion-text>
1819
- `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}\n"], dependencies: [{ kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2101
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}:host ::ng-deep .processed-link{color:var(--ion-color-primary, #3880ff);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px;transition:color .3s ease}:host ::ng-deep .processed-link:hover{color:var(--ion-color-primary-shade, #3171e0);text-decoration-thickness:2px}:host ::ng-deep .processed-link:active{color:var(--ion-color-primary-tint, #4c8dff)}:host ::ng-deep .external-link:after{content:\" \\2197\";font-size:.8em;opacity:.7}:host ::ng-deep .internal-link{color:var(--ion-color-primary, #0cd1e8)}:host ::ng-deep .internal-link:hover{color:var(--ion-color-primary-shade, #0bb8cc)}\n"], dependencies: [{ kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: ProcessLinksPipe, name: "processLinks" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1820
2102
  }
1821
2103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextComponent, decorators: [{
1822
2104
  type: Component,
1823
- args: [{ selector: 'val-text', standalone: true, imports: [IonText, AsyncPipe], template: `
2105
+ args: [{ selector: 'val-text', standalone: true, imports: [IonText, AsyncPipe, ProcessLinksPipe], template: `
1824
2106
  <ion-text [color]="props.color">
1825
- <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
2107
+ @if (props.processLinks) {
2108
+ <p
2109
+ [class]="props.size"
2110
+ [class.bold]="props.bold"
2111
+ [innerHTML]="displayContent$ | async | processLinks: props.linkConfig"
2112
+ ></p>
2113
+ } @else {
2114
+ <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
2115
+ }
1826
2116
  </ion-text>
1827
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}\n"] }]
1828
- }], ctorParameters: () => [{ type: ContentService }], propDecorators: { props: [{
2117
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@charset \"UTF-8\";:root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}:host ::ng-deep .processed-link{color:var(--ion-color-primary, #3880ff);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px;transition:color .3s ease}:host ::ng-deep .processed-link:hover{color:var(--ion-color-primary-shade, #3171e0);text-decoration-thickness:2px}:host ::ng-deep .processed-link:active{color:var(--ion-color-primary-tint, #4c8dff)}:host ::ng-deep .external-link:after{content:\" \\2197\";font-size:.8em;opacity:.7}:host ::ng-deep .internal-link{color:var(--ion-color-primary, #0cd1e8)}:host ::ng-deep .internal-link:hover{color:var(--ion-color-primary-shade, #0bb8cc)}\n"] }]
2118
+ }], ctorParameters: () => [{ type: ContentService }, { type: LinkProcessorService }], propDecorators: { props: [{
1829
2119
  type: Input
1830
2120
  }] } });
1831
2121
  /**
@@ -2418,7 +2708,7 @@ class CommentInputComponent {
2418
2708
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommentInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2419
2709
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CommentInputComponent, isStandalone: true, selector: "val-comment-input", inputs: { props: "props" }, ngImport: i0, template: `
2420
2710
  <ion-textarea [formControl]="props.control" [counter]="true" [maxlength]="props.range.max"></ion-textarea>
2421
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }] }); }
2711
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }] }); }
2422
2712
  }
2423
2713
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommentInputComponent, decorators: [{
2424
2714
  type: Component,
@@ -2620,7 +2910,7 @@ class DateInputComponent {
2620
2910
  </ion-datetime>
2621
2911
  </ng-template>
2622
2912
  </ion-modal>
2623
- `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.button-container{display:flex;flex-direction:column;align-items:flex-start}.action{margin-top:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "highlightedDates", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "multiple", "name", "preferWheel", "presentation", "readonly", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "titleSelectedDatesFormatter", "value", "yearValues"] }, { kind: "component", type: IonDatetimeButton, selector: "ion-datetime-button", inputs: ["color", "datetime", "disabled", "mode"] }, { kind: "component", type: IonModal, selector: "ion-modal" }] }); }
2913
+ `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.button-container{display:flex;flex-direction:column;align-items:flex-start}.action{margin-top:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "highlightedDates", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "multiple", "name", "preferWheel", "presentation", "readonly", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "titleSelectedDatesFormatter", "value", "yearValues"] }, { kind: "component", type: IonDatetimeButton, selector: "ion-datetime-button", inputs: ["color", "datetime", "disabled", "mode"] }, { kind: "component", type: IonModal, selector: "ion-modal" }] }); }
2624
2914
  }
2625
2915
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DateInputComponent, decorators: [{
2626
2916
  type: Component,
@@ -2667,7 +2957,7 @@ class EmailInputComponent {
2667
2957
  constructor() { }
2668
2958
  ngOnInit() { }
2669
2959
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EmailInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2670
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EmailInputComponent, isStandalone: true, selector: "val-email-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="email" [placeholder]="props.placeholder"></ion-input> `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
2960
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EmailInputComponent, isStandalone: true, selector: "val-email-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="email" [placeholder]="props.placeholder"></ion-input> `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
2671
2961
  }
2672
2962
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EmailInputComponent, decorators: [{
2673
2963
  type: Component,
@@ -2921,7 +3211,7 @@ class HourInputComponent {
2921
3211
  constructor() { }
2922
3212
  ngOnInit() { }
2923
3213
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HourInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2924
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: HourInputComponent, isStandalone: true, selector: "val-hour-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-datetime [formControl]="props.control" presentation="time"></ion-datetime>`, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "highlightedDates", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "multiple", "name", "preferWheel", "presentation", "readonly", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "titleSelectedDatesFormatter", "value", "yearValues"] }] }); }
3214
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: HourInputComponent, isStandalone: true, selector: "val-hour-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-datetime [formControl]="props.control" presentation="time"></ion-datetime>`, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "highlightedDates", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "multiple", "name", "preferWheel", "presentation", "readonly", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "titleSelectedDatesFormatter", "value", "yearValues"] }] }); }
2925
3215
  }
2926
3216
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HourInputComponent, decorators: [{
2927
3217
  type: Component,
@@ -3435,7 +3725,7 @@ class NumberInputComponent {
3435
3725
  }
3436
3726
  }
3437
3727
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3438
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NumberInputComponent, isStandalone: true, selector: "val-number-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="number" [placeholder]="props.placeholder"></ion-input> `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
3728
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NumberInputComponent, isStandalone: true, selector: "val-number-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="number" [placeholder]="props.placeholder"></ion-input> `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
3439
3729
  }
3440
3730
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberInputComponent, decorators: [{
3441
3731
  type: Component,
@@ -3472,7 +3762,7 @@ class PasswordInputComponent {
3472
3762
  <ion-icon slot="icon-only" [name]="hidePassword ? 'eye-off-outline' : 'eye-outline'"></ion-icon>
3473
3763
  </ion-button>
3474
3764
  </div>
3475
- `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.input-container{display:flex;align-items:center;flex-direction:row}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
3765
+ `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.input-container{display:flex;align-items:center;flex-direction:row}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
3476
3766
  }
3477
3767
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PasswordInputComponent, decorators: [{
3478
3768
  type: Component,
@@ -3528,7 +3818,7 @@ class PinInputComponent {
3528
3818
  <div class="otp">
3529
3819
  <ng-otp-input [formCtrl]="props.control" [config]="otpInputConfig"></ng-otp-input>
3530
3820
  </div>
3531
- `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.otp{text-align:center;margin-top:.25rem;font-family:var(--ion-default-font),Arial,sans-serif}.otp-input-box:focus{border-color:#0ff}\n"], dependencies: [{ kind: "ngmodule", type: NgOtpInputModule }, { kind: "component", type: i1$2.NgOtpInputComponent, selector: "ng-otp-input", inputs: ["config", "formCtrl"], outputs: ["onInputChange"] }] }); }
3821
+ `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.otp{text-align:center;margin-top:.25rem;font-family:var(--ion-default-font),Arial,sans-serif}.otp-input-box:focus{border-color:#0ff}\n"], dependencies: [{ kind: "ngmodule", type: NgOtpInputModule }, { kind: "component", type: i1$3.NgOtpInputComponent, selector: "ng-otp-input", inputs: ["config", "formCtrl"], outputs: ["onInputChange"] }] }); }
3532
3822
  }
3533
3823
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PinInputComponent, decorators: [{
3534
3824
  type: Component,
@@ -3764,7 +4054,7 @@ class RadioInputComponent {
3764
4054
  <br />
3765
4055
  </ng-container>
3766
4056
  </ion-radio-group>
3767
- `, isInline: true, styles: [""], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonRadioGroup, selector: "ion-radio-group", inputs: ["allowEmptySelection", "name", "value"] }, { kind: "component", type: IonRadio, selector: "ion-radio", inputs: ["alignment", "color", "disabled", "justify", "labelPlacement", "mode", "name", "value"] }] }); }
4057
+ `, isInline: true, styles: [""], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonRadioGroup, selector: "ion-radio-group", inputs: ["allowEmptySelection", "name", "value"] }, { kind: "component", type: IonRadio, selector: "ion-radio", inputs: ["alignment", "color", "disabled", "justify", "labelPlacement", "mode", "name", "value"] }] }); }
3768
4058
  }
3769
4059
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioInputComponent, decorators: [{
3770
4060
  type: Component,
@@ -3896,7 +4186,7 @@ class SearchSelectorComponent {
3896
4186
  <ion-select-option [value]="o.id">{{ o.name }}</ion-select-option>
3897
4187
  }
3898
4188
  </ion-select>
3899
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "expandedIcon", "fill", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }] }); }
4189
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "expandedIcon", "fill", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }] }); }
3900
4190
  }
3901
4191
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchSelectorComponent, decorators: [{
3902
4192
  type: Component,
@@ -4235,7 +4525,7 @@ class SelectSearchComponent {
4235
4525
  </ion-content>
4236
4526
  </ng-template>
4237
4527
  </ion-modal>
4238
- `, isInline: true, styles: ["ion-header{padding:8px 8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["disabled"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
4528
+ `, isInline: true, styles: ["ion-header{padding:8px 8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["disabled"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
4239
4529
  }
4240
4530
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectSearchComponent, decorators: [{
4241
4531
  type: Component,
@@ -4321,7 +4611,7 @@ class TextInputComponent {
4321
4611
  }
4322
4612
  }
4323
4613
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4324
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TextInputComponent, isStandalone: true, selector: "val-text-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="text" [placeholder]="props.placeholder" /> `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
4614
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TextInputComponent, isStandalone: true, selector: "val-text-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="text" [placeholder]="props.placeholder" /> `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
4325
4615
  }
4326
4616
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, decorators: [{
4327
4617
  type: Component,
@@ -4900,7 +5190,7 @@ class FormComponent {
4900
5190
  }
4901
5191
  return [this.props.actions];
4902
5192
  }
4903
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormComponent, deps: [{ token: i1$1.FormBuilder }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
5193
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormComponent, deps: [{ token: i1$2.FormBuilder }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
4904
5194
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FormComponent, isStandalone: true, selector: "val-form", inputs: { props: "props" }, outputs: { onSubmit: "onSubmit", onInvalid: "onInvalid", onSelectChange: "onSelectChange" }, ngImport: i0, template: `
4905
5195
  <div class="container">
4906
5196
  <form [formGroup]="form">
@@ -4966,7 +5256,7 @@ class FormComponent {
4966
5256
  ></val-button-group>
4967
5257
  </form>
4968
5258
  </div>
4969
- `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input" }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DividerComponent, selector: "val-divider", inputs: ["props"] }, { kind: "component", type: HintComponent, selector: "val-hint", inputs: ["props"] }, { kind: "component", type: CommentInputComponent, selector: "val-comment-input", inputs: ["props"] }, { kind: "component", type: DateInputComponent, selector: "val-date-input", inputs: ["props"] }, { kind: "component", type: FileInputComponent, selector: "val-file-input", inputs: ["props"] }, { kind: "component", type: HourInputComponent, selector: "val-hour-input", inputs: ["props"] }, { kind: "component", type: EmailInputComponent, selector: "val-email-input", inputs: ["props"] }, { kind: "component", type: NumberInputComponent, selector: "val-number-input", inputs: ["props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: PasswordInputComponent, selector: "val-password-input", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: SelectSearchComponent, selector: "val-select-search", inputs: ["label", "labelProperty", "valueProperty", "multiple", "placeholder", "props"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["props"] }] }); }
5259
+ `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input" }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DividerComponent, selector: "val-divider", inputs: ["props"] }, { kind: "component", type: HintComponent, selector: "val-hint", inputs: ["props"] }, { kind: "component", type: CommentInputComponent, selector: "val-comment-input", inputs: ["props"] }, { kind: "component", type: DateInputComponent, selector: "val-date-input", inputs: ["props"] }, { kind: "component", type: FileInputComponent, selector: "val-file-input", inputs: ["props"] }, { kind: "component", type: HourInputComponent, selector: "val-hour-input", inputs: ["props"] }, { kind: "component", type: EmailInputComponent, selector: "val-email-input", inputs: ["props"] }, { kind: "component", type: NumberInputComponent, selector: "val-number-input", inputs: ["props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: PasswordInputComponent, selector: "val-password-input", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: SelectSearchComponent, selector: "val-select-search", inputs: ["label", "labelProperty", "valueProperty", "multiple", "placeholder", "props"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["props"] }] }); }
4970
5260
  }
4971
5261
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormComponent, decorators: [{
4972
5262
  type: Component,
@@ -5057,7 +5347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
5057
5347
  </form>
5058
5348
  </div>
5059
5349
  `, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"] }]
5060
- }], ctorParameters: () => [{ type: i1$1.FormBuilder }, { type: i0.ElementRef }], propDecorators: { props: [{
5350
+ }], ctorParameters: () => [{ type: i1$2.FormBuilder }, { type: i0.ElementRef }], propDecorators: { props: [{
5061
5351
  type: Input
5062
5352
  }], onSubmit: [{
5063
5353
  type: Output
@@ -6259,905 +6549,192 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
6259
6549
  }] });
6260
6550
 
6261
6551
  /**
6262
- * Comprehensive example demonstrating global content usage.
6263
- *
6264
- * This component shows:
6265
- * 1. Global button texts
6266
- * 2. Global state messages
6267
- * 3. Global confirmations with interpolation
6268
- * 4. Mixing global and component-specific content
6269
- * 5. Language switching
6552
+ * LinkProcessingExampleComponent - Componente de ejemplo que demuestra el procesamiento automático de enlaces.
6553
+ *
6554
+ * Este componente muestra diferentes casos de uso para el procesamiento automático de enlaces
6555
+ * en el componente val-text, incluyendo enlaces externos, rutas internas y configuraciones personalizadas.
6556
+ *
6557
+ * @example Uso en template:
6558
+ * ```html
6559
+ * <val-link-processing-example></val-link-processing-example>
6560
+ * ```
6270
6561
  */
6271
- class GlobalContentExampleComponent {
6562
+ class LinkProcessingExampleComponent {
6272
6563
  constructor() {
6273
- this.content = inject(ContentService);
6274
- this.componentContent = this.content.forComponent('GlobalContentExample');
6275
- // Form data
6276
- this.formData = {
6277
- name: '',
6278
- email: '',
6279
- message: '',
6564
+ this.basicTextProps = {
6565
+ content: 'Este texto contiene https://angular.io y /dashboard pero no se procesan como enlaces.',
6566
+ size: 'medium',
6567
+ color: 'dark',
6568
+ bold: false,
6569
+ processLinks: false,
6280
6570
  };
6281
- // Action state
6282
- this.actionPerformed = false;
6283
- // Component-specific content properties
6284
- this.titleProps = {
6285
- contentKey: 'title',
6286
- contentClass: 'GlobalContentExample',
6287
- contentFallback: 'Global Content Example',
6288
- color: 'primary',
6289
- size: 'xlarge',
6290
- bold: true,
6571
+ this.basicLinksProps = {
6572
+ content: 'Visita https://angular.io para documentación o ve a /dashboard para el panel principal.',
6573
+ size: 'medium',
6574
+ color: 'dark',
6575
+ bold: false,
6576
+ processLinks: true,
6291
6577
  };
6292
- this.languageLabel = {
6293
- contentKey: 'languageLabel',
6294
- contentClass: 'GlobalContentExample',
6295
- contentFallback: 'Language:',
6296
- color: 'medium',
6578
+ this.customLinksProps = {
6579
+ content: 'Enlaces personalizados: https://github.com/angular/angular y /profile/settings',
6297
6580
  size: 'medium',
6298
- bold: true,
6581
+ color: 'dark',
6582
+ bold: false,
6583
+ processLinks: true,
6584
+ linkConfig: {
6585
+ openExternalInNewTab: true,
6586
+ openInternalInNewTab: false,
6587
+ linkClass: 'custom-link-style',
6588
+ externalLinkClass: 'external-custom',
6589
+ internalLinkClass: 'internal-custom',
6590
+ },
6299
6591
  };
6300
- this.componentDescriptionProps = {
6301
- contentKey: 'description',
6302
- contentClass: 'GlobalContentExample',
6303
- contentFallback: 'This example demonstrates global and component-specific content.',
6592
+ this.mixedLinksProps = {
6593
+ content: 'Consulta la documentación en https://ionicframework.com/docs, revisa el código en https://github.com/ionic-team/ionic-framework, o navega a /components/buttons para ejemplos internos.',
6594
+ size: 'medium',
6304
6595
  color: 'dark',
6596
+ bold: false,
6597
+ processLinks: true,
6598
+ linkConfig: {
6599
+ openExternalInNewTab: true,
6600
+ openInternalInNewTab: false,
6601
+ linkClass: 'processed-link',
6602
+ externalLinkClass: 'external-link',
6603
+ internalLinkClass: 'internal-link',
6604
+ },
6605
+ };
6606
+ this.sameTabLinksProps = {
6607
+ content: 'Estos enlaces no abren en nueva pestaña: https://example.com y /home',
6305
6608
  size: 'medium',
6609
+ color: 'dark',
6306
6610
  bold: false,
6611
+ processLinks: true,
6612
+ linkConfig: {
6613
+ openExternalInNewTab: false,
6614
+ openInternalInNewTab: false,
6615
+ linkClass: 'same-tab-link',
6616
+ externalLinkClass: 'external-same-tab',
6617
+ internalLinkClass: 'internal-same-tab',
6618
+ },
6307
6619
  };
6308
- // Global button content (reactive)
6309
- this.saveButton$ = this.content.fromContent({ key: 'save' });
6310
- this.editButton$ = this.content.fromContent({ key: 'edit' });
6311
- this.deleteButton$ = this.content.fromContent({ key: 'delete' });
6312
- this.cancelButton$ = this.content.fromContent({ key: 'cancel' });
6313
- this.backButton$ = this.content.fromContent({ key: 'back' });
6314
- this.nextButton$ = this.content.fromContent({ key: 'next' });
6315
- this.okButton$ = this.content.fromContent({ key: 'ok' });
6316
- this.closeButton$ = this.content.fromContent({ key: 'close' });
6317
- // Global action content
6318
- this.addButton$ = this.content.fromContent({ key: 'add' });
6319
- this.removeButton$ = this.content.fromContent({ key: 'remove' });
6320
- this.searchButton$ = this.content.fromContent({ key: 'search' });
6321
- this.filterButton$ = this.content.fromContent({ key: 'filter' });
6322
- this.sortButton$ = this.content.fromContent({ key: 'sort' });
6323
- this.refreshButton$ = this.content.fromContent({ key: 'refresh' });
6324
- // Global state content
6325
- this.loadingText$ = this.content.fromContent({ key: 'loading' });
6326
- this.successText$ = this.content.fromContent({ key: 'success' });
6327
- this.errorText$ = this.content.fromContent({ key: 'error' });
6328
- this.warningText$ = this.content.fromContent({ key: 'warning' });
6329
- this.infoText$ = this.content.fromContent({ key: 'info' });
6330
- this.noDataText$ = this.content.fromContent({ key: 'noData' });
6331
- // Global form content
6332
- this.requiredText$ = this.content.fromContent({ key: 'required' });
6333
- this.optionalText$ = this.content.fromContent({ key: 'optional' });
6334
- this.searchPlaceholder$ = this.content.fromContent({ key: 'searchPlaceholder' });
6335
- // Global confirmation content with interpolation
6336
- this.deleteConfirmation$ = this.content.fromContentWithInterpolation({
6337
- key: 'deleteConfirmation',
6338
- interpolation: { itemName: 'este registro' },
6339
- });
6340
- this.areYouSureText$ = this.content.fromContent({ key: 'areYouSure' });
6341
- this.unsavedChangesText$ = this.content.fromContent({ key: 'unsavedChanges' });
6342
- }
6343
- /**
6344
- * Set language
6345
- */
6346
- setLanguage(lang) {
6347
- this.content.setLang(lang);
6348
- }
6349
- /**
6350
- * Perform an action to demonstrate status messages
6351
- */
6352
- performAction() {
6353
- this.actionPerformed = true;
6354
- setTimeout(() => {
6355
- this.actionPerformed = false;
6356
- }, 3000);
6357
- }
6358
- /**
6359
- * Cancel action
6360
- */
6361
- cancelAction() {
6362
- this.formData = { name: '', email: '', message: '' };
6363
- this.actionPerformed = false;
6364
- }
6365
- /**
6366
- * Example of synchronous global content access
6367
- */
6368
- getOkTextSync() {
6369
- return this.content.getGlobalText('ok');
6370
- }
6371
- /**
6372
- * Example of synchronous global content access using getText
6373
- */
6374
- getCancelTextSync() {
6375
- return this.content.getText('cancel');
6376
- }
6377
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GlobalContentExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6378
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: GlobalContentExampleComponent, isStandalone: true, selector: "val-global-content-example", ngImport: i0, template: `
6379
- <ion-card>
6380
- <ion-card-header>
6381
- <ion-card-title>
6382
- <val-text [props]="titleProps"></val-text>
6383
- </ion-card-title>
6384
- </ion-card-header>
6385
-
6386
- <ion-card-content>
6387
- <!-- Language switcher -->
6388
- <div class="language-section">
6389
- <val-text [props]="languageLabel"></val-text>
6390
- <ion-button fill="outline" size="small" (click)="setLanguage('es')"> Español </ion-button>
6391
- <ion-button fill="outline" size="small" (click)="setLanguage('en')"> English </ion-button>
6392
- </div>
6393
-
6394
- <div class="divider"></div>
6395
-
6396
- <!-- Global buttons demonstration -->
6397
- <div class="section">
6398
- <h3>Global Buttons</h3>
6399
- <div class="button-grid">
6400
- <ion-button color="primary">{{ saveButton$ | async }}</ion-button>
6401
- <ion-button color="secondary">{{ editButton$ | async }}</ion-button>
6402
- <ion-button color="danger">{{ deleteButton$ | async }}</ion-button>
6403
- <ion-button fill="outline">{{ cancelButton$ | async }}</ion-button>
6404
- <ion-button fill="outline">{{ backButton$ | async }}</ion-button>
6405
- <ion-button fill="outline">{{ nextButton$ | async }}</ion-button>
6406
- <ion-button color="success">{{ okButton$ | async }}</ion-button>
6407
- <ion-button fill="clear">{{ closeButton$ | async }}</ion-button>
6408
- </div>
6409
- </div>
6410
-
6411
- <div class="divider"></div>
6412
-
6413
- <!-- Global actions demonstration -->
6414
- <div class="section">
6415
- <h3>Global Actions</h3>
6416
- <div class="button-grid">
6417
- <ion-button size="small">{{ addButton$ | async }}</ion-button>
6418
- <ion-button size="small">{{ removeButton$ | async }}</ion-button>
6419
- <ion-button size="small">{{ searchButton$ | async }}</ion-button>
6420
- <ion-button size="small">{{ filterButton$ | async }}</ion-button>
6421
- <ion-button size="small">{{ sortButton$ | async }}</ion-button>
6422
- <ion-button size="small">{{ refreshButton$ | async }}</ion-button>
6423
- </div>
6424
- </div>
6425
-
6426
- <div class="divider"></div>
6427
-
6428
- <!-- Global states demonstration -->
6429
- <div class="section">
6430
- <h3>Global States</h3>
6431
- <div class="state-messages">
6432
- <div class="state-item loading">
6433
- <val-text
6434
- [props]="{ content: loadingText$ | async, color: 'medium', size: 'small', bold: false }"
6435
- ></val-text>
6436
- </div>
6437
- <div class="state-item success">
6438
- <val-text
6439
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6440
- ></val-text>
6441
- </div>
6442
- <div class="state-item error">
6443
- <val-text
6444
- [props]="{ content: errorText$ | async, color: 'danger', size: 'small', bold: false }"
6445
- ></val-text>
6446
- </div>
6447
- <div class="state-item warning">
6448
- <val-text
6449
- [props]="{ content: warningText$ | async, color: 'warning', size: 'small', bold: false }"
6450
- ></val-text>
6451
- </div>
6452
- <div class="state-item info">
6453
- <val-text
6454
- [props]="{ content: infoText$ | async, color: 'primary', size: 'small', bold: false }"
6455
- ></val-text>
6456
- </div>
6457
- <div class="state-item no-data">
6458
- <val-text
6459
- [props]="{ content: noDataText$ | async, color: 'medium', size: 'small', bold: false }"
6460
- ></val-text>
6461
- </div>
6462
- </div>
6463
- </div>
6464
-
6465
- <div class="divider"></div>
6466
-
6467
- <!-- Form with global placeholders and labels -->
6468
- <div class="section">
6469
- <h3>Form with Global Content</h3>
6470
- <form class="example-form">
6471
- <ion-item>
6472
- <ion-label position="stacked">Name ({{ requiredText$ | async }})</ion-label>
6473
- <ion-input [(ngModel)]="formData.name" [placeholder]="'Enter your name' + '...'" name="name"> </ion-input>
6474
- </ion-item>
6475
-
6476
- <ion-item>
6477
- <ion-label position="stacked">Email ({{ optionalText$ | async }})</ion-label>
6478
- <ion-input [(ngModel)]="formData.email" [placeholder]="'Enter your email' + '...'" name="email">
6479
- </ion-input>
6480
- </ion-item>
6481
-
6482
- <ion-item>
6483
- <ion-label position="stacked">Message</ion-label>
6484
- <ion-textarea [(ngModel)]="formData.message" [placeholder]="searchPlaceholder$ | async" name="message">
6485
- </ion-textarea>
6486
- </ion-item>
6487
- </form>
6488
- </div>
6489
-
6490
- <div class="divider"></div>
6491
-
6492
- <!-- Global confirmations with interpolation -->
6493
- <div class="section">
6494
- <h3>Confirmations with Interpolation</h3>
6495
- <div class="confirmation-examples">
6496
- <p><strong>Delete Confirmation:</strong></p>
6497
- <val-text
6498
- [props]="{ content: deleteConfirmation$ | async, color: 'danger', size: 'medium', bold: false }"
6499
- ></val-text>
6500
-
6501
- <br /><br />
6502
- <p><strong>General Confirmation:</strong></p>
6503
- <val-text
6504
- [props]="{ content: areYouSureText$ | async, color: 'warning', size: 'medium', bold: false }"
6505
- ></val-text>
6506
-
6507
- <br /><br />
6508
- <p><strong>Unsaved Changes:</strong></p>
6509
- <val-text
6510
- [props]="{ content: unsavedChangesText$ | async, color: 'medium', size: 'medium', bold: false }"
6511
- ></val-text>
6512
- </div>
6513
- </div>
6514
-
6515
- <div class="divider"></div>
6516
-
6517
- <!-- Mixed content: Global + Component specific -->
6518
- <div class="section">
6519
- <h3>Mixed Content Example</h3>
6520
- <div class="mixed-content">
6521
- <!-- Component-specific content -->
6522
- <val-text [props]="componentDescriptionProps"></val-text>
6523
-
6524
- <br /><br />
6525
-
6526
- <!-- Action buttons mixing global and component content -->
6527
- <div class="action-buttons">
6528
- <ion-button color="primary" (click)="performAction()">
6529
- {{ saveButton$ | async }}
6530
- </ion-button>
6531
- <ion-button fill="outline" (click)="cancelAction()">
6532
- {{ cancelButton$ | async }}
6533
- </ion-button>
6534
- </div>
6535
-
6536
- <!-- Status message using global content -->
6537
- <div *ngIf="actionPerformed" class="status-message">
6538
- <val-text
6539
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6540
- ></val-text>
6541
- </div>
6542
- </div>
6543
- </div>
6544
-
6545
- <!-- Demo of synchronous global content access -->
6546
- <div class="section">
6547
- <h3>Synchronous Access Example</h3>
6548
- <p>
6549
- OK button text (sync): <strong>{{ getOkTextSync() }}</strong>
6550
- </p>
6551
- <p>
6552
- Cancel button text (sync): <strong>{{ getCancelTextSync() }}</strong>
6553
- </p>
6554
- </div>
6555
- </ion-card-content>
6556
- </ion-card>
6557
- `, isInline: true, styles: [".language-section{display:flex;align-items:center;gap:8px;margin-bottom:16px}.divider{height:1px;background-color:var(--ion-color-light);margin:16px 0}.section{margin-bottom:16px}.section h3{margin:0 0 12px;color:var(--ion-color-primary)}.button-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}.state-messages{display:flex;flex-direction:column;gap:8px}.state-item{padding:8px;border-radius:4px;background-color:var(--ion-color-light-shade)}.state-item.loading{background-color:var(--ion-color-medium-tint)}.state-item.success{background-color:var(--ion-color-success-tint)}.state-item.error{background-color:var(--ion-color-danger-tint)}.state-item.warning{background-color:var(--ion-color-warning-tint)}.state-item.info{background-color:var(--ion-color-primary-tint)}.example-form{margin-top:12px}.confirmation-examples{padding:12px;background-color:var(--ion-color-light-tint);border-radius:8px}.mixed-content{padding:12px;background-color:var(--ion-color-light-shade);border-radius:8px}.action-buttons{display:flex;gap:8px;margin:12px 0}.status-message{padding:8px;background-color:var(--ion-color-success-tint);border-radius:4px;margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { 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: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
6558
- }
6559
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GlobalContentExampleComponent, decorators: [{
6560
- type: Component,
6561
- args: [{ selector: 'val-global-content-example', standalone: true, imports: [
6562
- CommonModule,
6563
- FormsModule,
6564
- IonCard,
6565
- IonCardContent,
6566
- IonCardHeader,
6567
- IonCardTitle,
6568
- IonButton,
6569
- IonItem,
6570
- IonLabel,
6571
- IonInput,
6572
- IonTextarea,
6573
- TextComponent,
6574
- ], template: `
6575
- <ion-card>
6576
- <ion-card-header>
6577
- <ion-card-title>
6578
- <val-text [props]="titleProps"></val-text>
6579
- </ion-card-title>
6580
- </ion-card-header>
6581
-
6582
- <ion-card-content>
6583
- <!-- Language switcher -->
6584
- <div class="language-section">
6585
- <val-text [props]="languageLabel"></val-text>
6586
- <ion-button fill="outline" size="small" (click)="setLanguage('es')"> Español </ion-button>
6587
- <ion-button fill="outline" size="small" (click)="setLanguage('en')"> English </ion-button>
6588
- </div>
6589
-
6590
- <div class="divider"></div>
6591
-
6592
- <!-- Global buttons demonstration -->
6593
- <div class="section">
6594
- <h3>Global Buttons</h3>
6595
- <div class="button-grid">
6596
- <ion-button color="primary">{{ saveButton$ | async }}</ion-button>
6597
- <ion-button color="secondary">{{ editButton$ | async }}</ion-button>
6598
- <ion-button color="danger">{{ deleteButton$ | async }}</ion-button>
6599
- <ion-button fill="outline">{{ cancelButton$ | async }}</ion-button>
6600
- <ion-button fill="outline">{{ backButton$ | async }}</ion-button>
6601
- <ion-button fill="outline">{{ nextButton$ | async }}</ion-button>
6602
- <ion-button color="success">{{ okButton$ | async }}</ion-button>
6603
- <ion-button fill="clear">{{ closeButton$ | async }}</ion-button>
6604
- </div>
6605
- </div>
6606
-
6607
- <div class="divider"></div>
6608
-
6609
- <!-- Global actions demonstration -->
6610
- <div class="section">
6611
- <h3>Global Actions</h3>
6612
- <div class="button-grid">
6613
- <ion-button size="small">{{ addButton$ | async }}</ion-button>
6614
- <ion-button size="small">{{ removeButton$ | async }}</ion-button>
6615
- <ion-button size="small">{{ searchButton$ | async }}</ion-button>
6616
- <ion-button size="small">{{ filterButton$ | async }}</ion-button>
6617
- <ion-button size="small">{{ sortButton$ | async }}</ion-button>
6618
- <ion-button size="small">{{ refreshButton$ | async }}</ion-button>
6619
- </div>
6620
- </div>
6621
-
6622
- <div class="divider"></div>
6623
-
6624
- <!-- Global states demonstration -->
6625
- <div class="section">
6626
- <h3>Global States</h3>
6627
- <div class="state-messages">
6628
- <div class="state-item loading">
6629
- <val-text
6630
- [props]="{ content: loadingText$ | async, color: 'medium', size: 'small', bold: false }"
6631
- ></val-text>
6632
- </div>
6633
- <div class="state-item success">
6634
- <val-text
6635
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6636
- ></val-text>
6637
- </div>
6638
- <div class="state-item error">
6639
- <val-text
6640
- [props]="{ content: errorText$ | async, color: 'danger', size: 'small', bold: false }"
6641
- ></val-text>
6642
- </div>
6643
- <div class="state-item warning">
6644
- <val-text
6645
- [props]="{ content: warningText$ | async, color: 'warning', size: 'small', bold: false }"
6646
- ></val-text>
6647
- </div>
6648
- <div class="state-item info">
6649
- <val-text
6650
- [props]="{ content: infoText$ | async, color: 'primary', size: 'small', bold: false }"
6651
- ></val-text>
6652
- </div>
6653
- <div class="state-item no-data">
6654
- <val-text
6655
- [props]="{ content: noDataText$ | async, color: 'medium', size: 'small', bold: false }"
6656
- ></val-text>
6657
- </div>
6658
- </div>
6659
- </div>
6660
-
6661
- <div class="divider"></div>
6662
-
6663
- <!-- Form with global placeholders and labels -->
6664
- <div class="section">
6665
- <h3>Form with Global Content</h3>
6666
- <form class="example-form">
6667
- <ion-item>
6668
- <ion-label position="stacked">Name ({{ requiredText$ | async }})</ion-label>
6669
- <ion-input [(ngModel)]="formData.name" [placeholder]="'Enter your name' + '...'" name="name"> </ion-input>
6670
- </ion-item>
6671
-
6672
- <ion-item>
6673
- <ion-label position="stacked">Email ({{ optionalText$ | async }})</ion-label>
6674
- <ion-input [(ngModel)]="formData.email" [placeholder]="'Enter your email' + '...'" name="email">
6675
- </ion-input>
6676
- </ion-item>
6677
-
6678
- <ion-item>
6679
- <ion-label position="stacked">Message</ion-label>
6680
- <ion-textarea [(ngModel)]="formData.message" [placeholder]="searchPlaceholder$ | async" name="message">
6681
- </ion-textarea>
6682
- </ion-item>
6683
- </form>
6684
- </div>
6685
-
6686
- <div class="divider"></div>
6687
-
6688
- <!-- Global confirmations with interpolation -->
6689
- <div class="section">
6690
- <h3>Confirmations with Interpolation</h3>
6691
- <div class="confirmation-examples">
6692
- <p><strong>Delete Confirmation:</strong></p>
6693
- <val-text
6694
- [props]="{ content: deleteConfirmation$ | async, color: 'danger', size: 'medium', bold: false }"
6695
- ></val-text>
6696
-
6697
- <br /><br />
6698
- <p><strong>General Confirmation:</strong></p>
6699
- <val-text
6700
- [props]="{ content: areYouSureText$ | async, color: 'warning', size: 'medium', bold: false }"
6701
- ></val-text>
6702
-
6703
- <br /><br />
6704
- <p><strong>Unsaved Changes:</strong></p>
6705
- <val-text
6706
- [props]="{ content: unsavedChangesText$ | async, color: 'medium', size: 'medium', bold: false }"
6707
- ></val-text>
6708
- </div>
6709
- </div>
6710
-
6711
- <div class="divider"></div>
6712
-
6713
- <!-- Mixed content: Global + Component specific -->
6714
- <div class="section">
6715
- <h3>Mixed Content Example</h3>
6716
- <div class="mixed-content">
6717
- <!-- Component-specific content -->
6718
- <val-text [props]="componentDescriptionProps"></val-text>
6719
-
6720
- <br /><br />
6721
-
6722
- <!-- Action buttons mixing global and component content -->
6723
- <div class="action-buttons">
6724
- <ion-button color="primary" (click)="performAction()">
6725
- {{ saveButton$ | async }}
6726
- </ion-button>
6727
- <ion-button fill="outline" (click)="cancelAction()">
6728
- {{ cancelButton$ | async }}
6729
- </ion-button>
6730
- </div>
6731
-
6732
- <!-- Status message using global content -->
6733
- <div *ngIf="actionPerformed" class="status-message">
6734
- <val-text
6735
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6736
- ></val-text>
6737
- </div>
6738
- </div>
6739
- </div>
6740
-
6741
- <!-- Demo of synchronous global content access -->
6742
- <div class="section">
6743
- <h3>Synchronous Access Example</h3>
6744
- <p>
6745
- OK button text (sync): <strong>{{ getOkTextSync() }}</strong>
6746
- </p>
6747
- <p>
6748
- Cancel button text (sync): <strong>{{ getCancelTextSync() }}</strong>
6749
- </p>
6750
- </div>
6751
- </ion-card-content>
6752
- </ion-card>
6753
- `, styles: [".language-section{display:flex;align-items:center;gap:8px;margin-bottom:16px}.divider{height:1px;background-color:var(--ion-color-light);margin:16px 0}.section{margin-bottom:16px}.section h3{margin:0 0 12px;color:var(--ion-color-primary)}.button-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}.state-messages{display:flex;flex-direction:column;gap:8px}.state-item{padding:8px;border-radius:4px;background-color:var(--ion-color-light-shade)}.state-item.loading{background-color:var(--ion-color-medium-tint)}.state-item.success{background-color:var(--ion-color-success-tint)}.state-item.error{background-color:var(--ion-color-danger-tint)}.state-item.warning{background-color:var(--ion-color-warning-tint)}.state-item.info{background-color:var(--ion-color-primary-tint)}.example-form{margin-top:12px}.confirmation-examples{padding:12px;background-color:var(--ion-color-light-tint);border-radius:8px}.mixed-content{padding:12px;background-color:var(--ion-color-light-shade);border-radius:8px}.action-buttons{display:flex;gap:8px;margin:12px 0}.status-message{padding:8px;background-color:var(--ion-color-success-tint);border-radius:4px;margin-top:8px}\n"] }]
6754
- }] });
6755
-
6756
- /**
6757
- * Reactive Content Example Component
6758
- *
6759
- * This component demonstrates various ways to use the new reactive content system with ContentService:
6760
- * 1. Direct reactive content binding with val-text
6761
- * 2. Content with interpolation (dynamic values)
6762
- * 3. Multiple content keys retrieved at once
6763
- * 4. Using the scoped content helper (forComponent)
6764
- * 5. Language switching functionality
6765
- *
6766
- * The component automatically updates all text when the language changes,
6767
- * using the simplified ContentService API that eliminates the need for manual
6768
- * LangService injection and utility function imports.
6769
- *
6770
- * @example Usage patterns:
6771
- * ```typescript
6772
- * // Simple injection
6773
- * content = inject(ContentService);
6774
- *
6775
- * // Scoped helper for this component
6776
- * componentContent = this.content.forComponent('MyComponent');
6777
- *
6778
- * // Get reactive content
6779
- * title$ = this.componentContent.get('title');
6780
- * multipleTexts$ = this.componentContent.getMultiple(['title', 'subtitle']);
6781
- * ```
6782
- * without requiring manual subscriptions or change detection triggers.
6783
- */
6784
- class ReactiveContentExampleComponent {
6785
- constructor() {
6786
- // Use the new ContentService with inject
6787
- this.content = inject(ContentService);
6788
- // Create a scoped content helper for this component
6789
- this.componentContent = this.content.forComponent('ReactiveContentExample');
6790
- // State for confirmation dialog
6791
- this.showConfirmation = false;
6792
- // Example 1: Simple reactive content props for val-text
6793
- this.titleProps = {
6794
- contentKey: 'title',
6795
- contentClass: 'ReactiveContentExample',
6796
- contentFallback: 'Default Title',
6797
- color: 'primary',
6798
- size: 'xlarge',
6799
- bold: true,
6620
+ this.markdownLinksProps = {
6621
+ content: 'Consulta [la documentación de Angular](https://angular.io/docs) y ve a [configuración del perfil](/profile/settings) para más opciones.',
6622
+ size: 'medium',
6623
+ color: 'dark',
6624
+ bold: false,
6625
+ processLinks: true,
6626
+ linkConfig: {
6627
+ openExternalInNewTab: true,
6628
+ openInternalInNewTab: false,
6629
+ processMarkdownLinks: true,
6630
+ linkClass: 'markdown-link',
6631
+ externalLinkClass: 'markdown-external',
6632
+ internalLinkClass: 'markdown-internal',
6633
+ },
6800
6634
  };
6801
- // Example 2: Reactive content with interpolation
6802
- this.greetingProps = {
6803
- contentKey: 'greeting',
6804
- contentClass: 'ReactiveContentExample',
6805
- contentInterpolation: { name: 'Developer', count: 3 },
6806
- contentFallback: 'Hello Developer',
6807
- color: 'secondary',
6808
- size: 'large',
6635
+ this.mixedFormatsProps = {
6636
+ content: 'Aquí hay [documentación oficial](https://angular.io/docs), un enlace directo https://github.com/angular/angular, y una ruta interna /dashboard/analytics. ¡Todos funcionan!',
6637
+ size: 'medium',
6638
+ color: 'dark',
6809
6639
  bold: false,
6640
+ processLinks: true,
6641
+ linkConfig: {
6642
+ openExternalInNewTab: true,
6643
+ openInternalInNewTab: false,
6644
+ processMarkdownLinks: true,
6645
+ linkClass: 'mixed-link',
6646
+ externalLinkClass: 'mixed-external',
6647
+ internalLinkClass: 'mixed-internal',
6648
+ },
6810
6649
  };
6811
6650
  }
6812
- ngOnInit() {
6813
- // Set up reactive observables using ContentService
6814
- this.currentLanguage$ = this.content.currentLang$;
6815
- // Example 3: Get multiple content keys reactively - using the new API
6816
- this.multipleContent$ = this.componentContent.getMultiple(['description', 'dynamicText']);
6817
- // Button text reactive - using the new simplified API with options
6818
- this.buttonText$ = this.componentContent.get('buttonText');
6819
- // Global content observables using unified fromContent method
6820
- this.saveButton$ = this.content.fromContent({ key: 'save' });
6821
- this.cancelButton$ = this.content.fromContent({ key: 'cancel' });
6822
- this.deleteButton$ = this.content.fromContent({ key: 'delete' });
6823
- this.okButton$ = this.content.fromContent({ key: 'ok' });
6824
- this.loadingText$ = this.content.fromContent({ key: 'loading' });
6825
- // Global content with interpolation using unified method
6826
- this.deleteConfirmationText$ = this.content.fromContent({
6827
- key: 'deleteConfirmation',
6828
- interpolation: { itemName: 'este elemento' },
6829
- });
6830
- // Example of synchronous global content access
6831
- console.log('Global save text:', this.content.getText('save'));
6832
- console.log('Global cancel text:', this.content.getGlobalText('cancel'));
6833
- // Example of using new scoped helper with interpolation
6834
- const greetingWithNewAPI$ = this.componentContent.get('greeting', {
6835
- interpolation: { name: 'Developer', count: 3 },
6836
- fallback: 'Hello!',
6837
- });
6838
- console.log('New unified API works!', greetingWithNewAPI$);
6839
- }
6840
- /**
6841
- * Toggle between Spanish and English
6842
- */
6843
- toggleLanguage() {
6844
- const currentLang = this.content.currentLang;
6845
- const newLang = currentLang === LangOption.ES ? LangOption.EN : LangOption.ES;
6846
- this.content.setLang(newLang);
6847
- }
6848
- /**
6849
- * Show delete confirmation dialog
6850
- */
6851
- showDeleteConfirmation() {
6852
- this.showConfirmation = true;
6853
- }
6854
- /**
6855
- * Hide delete confirmation dialog
6856
- */
6857
- hideDeleteConfirmation() {
6858
- this.showConfirmation = false;
6859
- }
6860
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactiveContentExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6861
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReactiveContentExampleComponent, isStandalone: true, selector: "val-reactive-content-example", ngImport: i0, template: `
6862
- <ion-card>
6863
- <ion-card-header>
6864
- <ion-card-title>
6865
- <!-- Example 1: Direct reactive content using val-text -->
6866
- <val-text [props]="titleProps"></val-text>
6867
- </ion-card-title>
6868
- </ion-card-header>
6651
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessingExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6652
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LinkProcessingExampleComponent, isStandalone: true, selector: "val-link-processing-example", ngImport: i0, template: `
6653
+ <div class="link-examples">
6654
+ <h2>Ejemplos de Procesamiento de Enlaces</h2>
6869
6655
 
6870
- <ion-card-content>
6871
- <!-- Example 2: Reactive content with interpolation -->
6872
- <val-text [props]="greetingProps"></val-text>
6873
-
6874
- <div class="example-divider"></div>
6875
-
6876
- <!-- Example 3: Multiple content keys -->
6877
- <div *ngIf="multipleContent$ | async as content">
6878
- <val-text
6879
- [props]="{
6880
- content: content['description'],
6881
- color: 'medium',
6882
- size: 'medium',
6883
- bold: false,
6884
- }"
6885
- ></val-text>
6886
-
6887
- <br /><br />
6888
-
6889
- <val-text
6890
- [props]="{
6891
- content: content['dynamicText'],
6892
- color: 'primary',
6893
- size: 'small',
6894
- bold: true,
6895
- }"
6896
- ></val-text>
6897
- </div>
6898
-
6899
- <div class="example-divider"></div>
6900
-
6901
- <!-- Example 4: Using content helper -->
6902
- <val-text
6903
- [props]="{
6904
- content: componentContent.getText('welcomeMessage'),
6905
- color: 'success',
6906
- size: 'large',
6907
- bold: true,
6908
- }"
6909
- ></val-text>
6910
-
6911
- <div class="example-divider"></div>
6912
-
6913
- <!-- Example 5: Global content - buttons using global text -->
6914
- <div class="button-group">
6915
- <ion-button [fill]="'solid'" [color]="'primary'">
6916
- {{ saveButton$ | async }}
6917
- </ion-button>
6918
- <ion-button [fill]="'outline'" [color]="'secondary'">
6919
- {{ cancelButton$ | async }}
6920
- </ion-button>
6921
- <ion-button [fill]="'outline'" [color]="'danger'" (click)="showDeleteConfirmation()">
6922
- {{ deleteButton$ | async }}
6923
- </ion-button>
6924
- </div>
6656
+ <div class="example-section">
6657
+ <h3>Texto sin procesamiento de enlaces:</h3>
6658
+ <val-text [props]="basicTextProps"></val-text>
6659
+ </div>
6925
6660
 
6926
- <div class="example-divider"></div>
6661
+ <div class="example-section">
6662
+ <h3>Texto con procesamiento básico de enlaces:</h3>
6663
+ <val-text [props]="basicLinksProps"></val-text>
6664
+ </div>
6927
6665
 
6928
- <!-- Example 6: Global content with interpolation -->
6929
- <div *ngIf="showConfirmation" class="confirmation-message">
6930
- <val-text
6931
- [props]="{
6932
- content: deleteConfirmationText$ | async,
6933
- color: 'warning',
6934
- size: 'medium',
6935
- bold: true,
6936
- }"
6937
- ></val-text>
6938
- <br /><br />
6939
- <ion-button [fill]="'solid'" [color]="'danger'" size="small" (click)="hideDeleteConfirmation()">
6940
- {{ okButton$ | async }}
6941
- </ion-button>
6942
- <ion-button [fill]="'clear'" [color]="'medium'" size="small" (click)="hideDeleteConfirmation()">
6943
- {{ cancelButton$ | async }}
6944
- </ion-button>
6945
- </div>
6666
+ <div class="example-section">
6667
+ <h3>Enlaces con configuración personalizada:</h3>
6668
+ <val-text [props]="customLinksProps"></val-text>
6669
+ </div>
6946
6670
 
6947
- <div class="example-divider"></div>
6671
+ <div class="example-section">
6672
+ <h3>Enlaces internos y externos mezclados:</h3>
6673
+ <val-text [props]="mixedLinksProps"></val-text>
6674
+ </div>
6948
6675
 
6949
- <!-- Example 7: Language switching button -->
6950
- <ion-button expand="block" fill="outline" color="tertiary" (click)="toggleLanguage()">
6951
- {{ buttonText$ | async }}
6952
- </ion-button>
6676
+ <div class="example-section">
6677
+ <h3>Enlaces sin abrir en nueva pestaña:</h3>
6678
+ <val-text [props]="sameTabLinksProps"></val-text>
6679
+ </div>
6953
6680
 
6954
- <!-- Example 8: Current language display -->
6955
- <div class="language-info">
6956
- <p>
6957
- Current language:
6958
- <strong>{{ currentLanguage$ | async }}</strong>
6959
- </p>
6681
+ <div class="example-section">
6682
+ <h3>Enlaces estilo Markdown [texto](url):</h3>
6683
+ <val-text [props]="markdownLinksProps"></val-text>
6684
+ </div>
6960
6685
 
6961
- <!-- Example of mixed global and component content -->
6962
- <p>
6963
- <val-text
6964
- [props]="{
6965
- content: loadingText$ | async,
6966
- color: 'medium',
6967
- size: 'small',
6968
- bold: false,
6969
- }"
6970
- ></val-text>
6971
- </p>
6972
- </div>
6973
- </ion-card-content>
6974
- </ion-card>
6975
- `, isInline: true, styles: [":host{display:block;margin:16px}.example-divider{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.language-info{margin-top:24px;padding:16px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.language-info p{margin:0;color:var(--ion-color-dark)}.language-info strong{color:var(--ion-color-primary);text-transform:uppercase}ion-card{margin:0;border-radius:12px;box-shadow:0 4px 16px #0000001a}ion-card-header{padding-bottom:8px}ion-card-title{font-size:1.5rem;font-weight:600}ion-card-content{padding-top:16px}ion-button{margin:16px 0;--border-radius: 8px}ion-card-content{padding:20px}.language-info{margin-top:16px;padding:12px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.content-section{margin:16px 0;padding:12px;border:1px solid var(--ion-color-light);border-radius:8px}.content-section h3{margin-top:0;color:var(--ion-color-primary)}.example-divider{margin:24px 0;height:1px;background-color:var(--ion-color-light)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6686
+ <div class="example-section">
6687
+ <h3>Mezcla de enlaces directos y Markdown:</h3>
6688
+ <val-text [props]="mixedFormatsProps"></val-text>
6689
+ </div>
6690
+ </div>
6691
+ `, isInline: true, styles: [".link-examples{padding:20px;max-width:800px}.example-section{margin-bottom:24px;padding:16px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}h2{color:var(--ion-color-primary, #3880ff);margin-bottom:20px}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px;font-size:16px}\n"], dependencies: [{ kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
6976
6692
  }
6977
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactiveContentExampleComponent, decorators: [{
6693
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessingExampleComponent, decorators: [{
6978
6694
  type: Component,
6979
- args: [{ selector: 'val-reactive-content-example', standalone: true, imports: [AsyncPipe, NgIf, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonButton, TextComponent], template: `
6980
- <ion-card>
6981
- <ion-card-header>
6982
- <ion-card-title>
6983
- <!-- Example 1: Direct reactive content using val-text -->
6984
- <val-text [props]="titleProps"></val-text>
6985
- </ion-card-title>
6986
- </ion-card-header>
6987
-
6988
- <ion-card-content>
6989
- <!-- Example 2: Reactive content with interpolation -->
6990
- <val-text [props]="greetingProps"></val-text>
6991
-
6992
- <div class="example-divider"></div>
6993
-
6994
- <!-- Example 3: Multiple content keys -->
6995
- <div *ngIf="multipleContent$ | async as content">
6996
- <val-text
6997
- [props]="{
6998
- content: content['description'],
6999
- color: 'medium',
7000
- size: 'medium',
7001
- bold: false,
7002
- }"
7003
- ></val-text>
7004
-
7005
- <br /><br />
7006
-
7007
- <val-text
7008
- [props]="{
7009
- content: content['dynamicText'],
7010
- color: 'primary',
7011
- size: 'small',
7012
- bold: true,
7013
- }"
7014
- ></val-text>
7015
- </div>
7016
-
7017
- <div class="example-divider"></div>
7018
-
7019
- <!-- Example 4: Using content helper -->
7020
- <val-text
7021
- [props]="{
7022
- content: componentContent.getText('welcomeMessage'),
7023
- color: 'success',
7024
- size: 'large',
7025
- bold: true,
7026
- }"
7027
- ></val-text>
7028
-
7029
- <div class="example-divider"></div>
7030
-
7031
- <!-- Example 5: Global content - buttons using global text -->
7032
- <div class="button-group">
7033
- <ion-button [fill]="'solid'" [color]="'primary'">
7034
- {{ saveButton$ | async }}
7035
- </ion-button>
7036
- <ion-button [fill]="'outline'" [color]="'secondary'">
7037
- {{ cancelButton$ | async }}
7038
- </ion-button>
7039
- <ion-button [fill]="'outline'" [color]="'danger'" (click)="showDeleteConfirmation()">
7040
- {{ deleteButton$ | async }}
7041
- </ion-button>
7042
- </div>
6695
+ args: [{ selector: 'val-link-processing-example', standalone: true, imports: [TextComponent], template: `
6696
+ <div class="link-examples">
6697
+ <h2>Ejemplos de Procesamiento de Enlaces</h2>
7043
6698
 
7044
- <div class="example-divider"></div>
7045
-
7046
- <!-- Example 6: Global content with interpolation -->
7047
- <div *ngIf="showConfirmation" class="confirmation-message">
7048
- <val-text
7049
- [props]="{
7050
- content: deleteConfirmationText$ | async,
7051
- color: 'warning',
7052
- size: 'medium',
7053
- bold: true,
7054
- }"
7055
- ></val-text>
7056
- <br /><br />
7057
- <ion-button [fill]="'solid'" [color]="'danger'" size="small" (click)="hideDeleteConfirmation()">
7058
- {{ okButton$ | async }}
7059
- </ion-button>
7060
- <ion-button [fill]="'clear'" [color]="'medium'" size="small" (click)="hideDeleteConfirmation()">
7061
- {{ cancelButton$ | async }}
7062
- </ion-button>
7063
- </div>
6699
+ <div class="example-section">
6700
+ <h3>Texto sin procesamiento de enlaces:</h3>
6701
+ <val-text [props]="basicTextProps"></val-text>
6702
+ </div>
7064
6703
 
7065
- <div class="example-divider"></div>
6704
+ <div class="example-section">
6705
+ <h3>Texto con procesamiento básico de enlaces:</h3>
6706
+ <val-text [props]="basicLinksProps"></val-text>
6707
+ </div>
7066
6708
 
7067
- <!-- Example 7: Language switching button -->
7068
- <ion-button expand="block" fill="outline" color="tertiary" (click)="toggleLanguage()">
7069
- {{ buttonText$ | async }}
7070
- </ion-button>
6709
+ <div class="example-section">
6710
+ <h3>Enlaces con configuración personalizada:</h3>
6711
+ <val-text [props]="customLinksProps"></val-text>
6712
+ </div>
7071
6713
 
7072
- <!-- Example 8: Current language display -->
7073
- <div class="language-info">
7074
- <p>
7075
- Current language:
7076
- <strong>{{ currentLanguage$ | async }}</strong>
7077
- </p>
6714
+ <div class="example-section">
6715
+ <h3>Enlaces internos y externos mezclados:</h3>
6716
+ <val-text [props]="mixedLinksProps"></val-text>
6717
+ </div>
7078
6718
 
7079
- <!-- Example of mixed global and component content -->
7080
- <p>
7081
- <val-text
7082
- [props]="{
7083
- content: loadingText$ | async,
7084
- color: 'medium',
7085
- size: 'small',
7086
- bold: false,
7087
- }"
7088
- ></val-text>
7089
- </p>
7090
- </div>
7091
- </ion-card-content>
7092
- </ion-card>
7093
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;margin:16px}.example-divider{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.language-info{margin-top:24px;padding:16px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.language-info p{margin:0;color:var(--ion-color-dark)}.language-info strong{color:var(--ion-color-primary);text-transform:uppercase}ion-card{margin:0;border-radius:12px;box-shadow:0 4px 16px #0000001a}ion-card-header{padding-bottom:8px}ion-card-title{font-size:1.5rem;font-weight:600}ion-card-content{padding-top:16px}ion-button{margin:16px 0;--border-radius: 8px}ion-card-content{padding:20px}.language-info{margin-top:16px;padding:12px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.content-section{margin:16px 0;padding:12px;border:1px solid var(--ion-color-light);border-radius:8px}.content-section h3{margin-top:0;color:var(--ion-color-primary)}.example-divider{margin:24px 0;height:1px;background-color:var(--ion-color-light)}\n"] }]
7094
- }], ctorParameters: () => [] });
6719
+ <div class="example-section">
6720
+ <h3>Enlaces sin abrir en nueva pestaña:</h3>
6721
+ <val-text [props]="sameTabLinksProps"></val-text>
6722
+ </div>
7095
6723
 
7096
- /**
7097
- * Content configuration for the Global Content Example component.
7098
- *
7099
- * This demonstrates component-specific content that works alongside
7100
- * global content to create a comprehensive content management system.
7101
- */
7102
- const globalContentExampleData = {
7103
- title: {
7104
- es: 'Ejemplo de Contenido Global',
7105
- en: 'Global Content Example',
7106
- },
7107
- languageLabel: {
7108
- es: 'Idioma:',
7109
- en: 'Language:',
7110
- },
7111
- description: {
7112
- es: 'Este ejemplo demuestra cómo usar contenido global y específico del componente de manera conjunta.',
7113
- en: 'This example shows how to use global and component-specific content together.',
7114
- },
7115
- };
7116
- var GlobalContentExample = new TextContent(globalContentExampleData);
6724
+ <div class="example-section">
6725
+ <h3>Enlaces estilo Markdown [texto](url):</h3>
6726
+ <val-text [props]="markdownLinksProps"></val-text>
6727
+ </div>
7117
6728
 
7118
- /**
7119
- * Example content configuration for demonstrating the reactive content system.
7120
- *
7121
- * This file shows how to structure content for components that use the reactive
7122
- * language system with the new fromContent pattern.
7123
- */
7124
- // Example content for a sample component
7125
- const exampleComponentContent = {
7126
- es: {
7127
- title: 'Ejemplo de Contenido Reactivo',
7128
- subtitle: 'Este es un subtítulo que cambia automáticamente',
7129
- description: 'Esta descripción se actualiza cuando cambias el idioma sin necesidad de recargar la página.',
7130
- greeting: 'Hola {name}, tienes {count} mensajes nuevos',
7131
- welcomeMessage: 'Bienvenido a la biblioteca de componentes Valtech',
7132
- dynamicText: 'Este texto se actualiza automáticamente cuando cambias el idioma',
7133
- buttonText: 'Cambiar Idioma',
7134
- loadingText: 'Cargando...',
7135
- errorMessage: 'Error: No se pudo cargar el contenido',
7136
- successMessage: 'Contenido cargado exitosamente',
7137
- confirmDialog: '¿Estás seguro de que quieres continuar?',
7138
- cancelButton: 'Cancelar',
7139
- acceptButton: 'Aceptar',
7140
- },
7141
- en: {
7142
- title: 'Reactive Content Example',
7143
- subtitle: 'This is a subtitle that changes automatically',
7144
- description: 'This description updates when you change the language without needing to reload the page.',
7145
- greeting: 'Hello {name}, you have {count} new messages',
7146
- welcomeMessage: 'Welcome to the Valtech component library',
7147
- dynamicText: 'This text updates automatically when you change the language',
7148
- buttonText: 'Change Language',
7149
- loadingText: 'Loading...',
7150
- errorMessage: 'Error: Could not load content',
7151
- successMessage: 'Content loaded successfully',
7152
- confirmDialog: 'Are you sure you want to continue?',
7153
- cancelButton: 'Cancel',
7154
- acceptButton: 'Accept',
7155
- },
7156
- };
7157
- // Export the content as a TextContent instance
7158
- var ReactiveContentExample = new TextContent(exampleComponentContent);
6729
+ <div class="example-section">
6730
+ <h3>Mezcla de enlaces directos y Markdown:</h3>
6731
+ <val-text [props]="mixedFormatsProps"></val-text>
6732
+ </div>
6733
+ </div>
6734
+ `, styles: [".link-examples{padding:20px;max-width:800px}.example-section{margin-bottom:24px;padding:16px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}h2{color:var(--ion-color-primary, #3880ff);margin-bottom:20px}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px;font-size:16px}\n"] }]
6735
+ }] });
7159
6736
 
7160
- const text$1 = {
6737
+ const text = {
7161
6738
  es: {
7162
6739
  spanish: 'Español',
7163
6740
  english: 'Inglés',
@@ -7167,21 +6744,7 @@ const text$1 = {
7167
6744
  english: 'English',
7168
6745
  },
7169
6746
  };
7170
- var LangSettings = new TextContent(text$1);
7171
-
7172
- const text = {
7173
- es: {
7174
- light: 'Siempre claro',
7175
- dark: 'Siempre oscuro',
7176
- auto: 'Automático',
7177
- },
7178
- en: {
7179
- light: 'Always light',
7180
- dark: 'Always dark',
7181
- auto: 'System settings',
7182
- },
7183
- };
7184
- var ThemeSettings = new TextContent(text);
6747
+ var LangSettings = new TextContent(text);
7185
6748
 
7186
6749
  /**
7187
6750
  * Global content that can be used across all components.
@@ -7220,9 +6783,6 @@ const globalContentData = {
7220
6783
  areYouSure: '¿Estás seguro?',
7221
6784
  deleteConfirmation: '¿Estás seguro de que deseas eliminar {itemName}?',
7222
6785
  unsavedChanges: 'Tienes cambios sin guardar. ¿Deseas continuar?',
7223
- // Common form labels
7224
- required: 'Requerido',
7225
- optional: 'Opcional',
7226
6786
  // Common placeholders
7227
6787
  searchPlaceholder: 'Buscar...',
7228
6788
  },
@@ -7257,9 +6817,6 @@ const globalContentData = {
7257
6817
  areYouSure: 'Are you sure?',
7258
6818
  deleteConfirmation: 'Are you sure you want to delete {itemName}?',
7259
6819
  unsavedChanges: 'You have unsaved changes. Do you want to continue?',
7260
- // Common form labels
7261
- required: 'Required',
7262
- optional: 'Optional',
7263
6820
  // Common placeholders
7264
6821
  searchPlaceholder: 'Search...',
7265
6822
  },
@@ -7268,9 +6825,6 @@ const GlobalContent = new TextContent(globalContentData);
7268
6825
  const content = {
7269
6826
  _global: GlobalContent,
7270
6827
  LangSettings,
7271
- ThemeSettings,
7272
- ReactiveContentExample,
7273
- GlobalContentExample,
7274
6828
  };
7275
6829
 
7276
6830
  /**
@@ -7328,5 +6882,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
7328
6882
  * Generated bundle index. Do not edit.
7329
6883
  */
7330
6884
 
7331
- export { ActionType, AlertBoxComponent, AvatarComponent, BannerComponent, BaseDefault, BoxComponent, ButtonComponent, ButtonGroupComponent, CardComponent, CardSection, CardType, CheckInputComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CommentInputComponent, ComponentStates, ContentLoaderComponent, ContentService, CustomContentDemoComponent, DateInputComponent, DisplayComponent, DividerComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FileInputComponent, FooterComponent, FormComponent, FormFooterComponent, GlobalContent, GlobalContentExampleComponent, HeaderComponent, HintComponent, HourInputComponent, HrefComponent, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InputType, ItemListComponent, LangOption, LangService, LayeredCardComponent, LayoutComponent, LinkComponent, LinksCakeComponent, LocalStorageService, MOTION, NavigationService, NoContentComponent, NotesBoxComponent, NumberInputComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PasswordInputComponent, PinInputComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProgressBarComponent, ProgressStatusComponent, PrompterComponent, RadioInputComponent, ReactiveContentExampleComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SelectSearchComponent, SimpleComponent, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, TextComponent, TextContent, TextInputComponent, ThemeOption, ThemeService, TitleBlockComponent, TitleComponent, ToastService, ToolbarActionType, ToolbarComponent, ValtechConfigService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, content, createContentHelper, createTextProps, fromContent, fromContentWithInterpolation, fromMultipleContent, globalContentData, goToTop, interpolateContent, isAtEnd, maxLength, replaceSpecialChars, resolveColor, resolveInputDefaultValue };
6885
+ export { ActionType, AlertBoxComponent, AvatarComponent, BannerComponent, BaseDefault, BoxComponent, ButtonComponent, ButtonGroupComponent, CardComponent, CardSection, CardType, CheckInputComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CommentInputComponent, ComponentStates, ContentLoaderComponent, ContentService, CustomContentDemoComponent, DateInputComponent, DisplayComponent, DividerComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FileInputComponent, FooterComponent, FormComponent, FormFooterComponent, GlobalContent, HeaderComponent, HintComponent, HourInputComponent, HrefComponent, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InputType, ItemListComponent, LangOption, LangService, LayeredCardComponent, LayoutComponent, LinkComponent, LinkProcessingExampleComponent, LinkProcessorService, LinksCakeComponent, LocalStorageService, MOTION, NavigationService, NoContentComponent, NotesBoxComponent, NumberInputComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PasswordInputComponent, PinInputComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProgressBarComponent, ProgressStatusComponent, PrompterComponent, RadioInputComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SelectSearchComponent, SimpleComponent, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, TextComponent, TextContent, TextInputComponent, ThemeOption, ThemeService, TitleBlockComponent, TitleComponent, ToastService, ToolbarActionType, ToolbarComponent, ValtechConfigService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, content, createContentHelper, createTextProps, fromContent, fromContentWithInterpolation, fromMultipleContent, globalContentData, goToTop, interpolateContent, isAtEnd, maxLength, replaceSpecialChars, resolveColor, resolveInputDefaultValue };
7332
6886
  //# sourceMappingURL=valtech-components.mjs.map