valtech-components 2.0.284 → 2.0.288

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 (32) hide show
  1. package/README.md +54 -14
  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 +139 -0
  6. package/esm2022/lib/services/lang-provider/content.mjs +1 -13
  7. package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +7 -9
  8. package/esm2022/lib/services/link-processor.service.mjs +147 -0
  9. package/esm2022/lib/shared/pipes/process-links.pipe.mjs +69 -0
  10. package/esm2022/public-api.mjs +5 -4
  11. package/fesm2022/valtech-components.mjs +418 -935
  12. package/fesm2022/valtech-components.mjs.map +1 -1
  13. package/lib/components/atoms/text/text.component.d.ts +5 -1
  14. package/lib/components/atoms/text/types.d.ts +5 -0
  15. package/lib/examples/link-processing-example.component.d.ts +22 -0
  16. package/lib/services/lang-provider/lang-provider.service.d.ts +5 -7
  17. package/lib/services/link-processor.service.d.ts +92 -0
  18. package/lib/shared/pipes/process-links.pipe.d.ts +55 -0
  19. package/package.json +1 -1
  20. package/public-api.d.ts +4 -3
  21. package/esm2022/lib/components/_examples/custom-content-demo.component.mjs +0 -265
  22. package/esm2022/lib/components/_examples/global-content-example-content.mjs +0 -23
  23. package/esm2022/lib/components/_examples/global-content-example.component.mjs +0 -504
  24. package/esm2022/lib/components/_examples/reactive-content-example-content.mjs +0 -43
  25. package/esm2022/lib/components/_examples/reactive-content-example.component.mjs +0 -347
  26. package/esm2022/lib/services/lang-provider/components/theme-settings.mjs +0 -15
  27. package/lib/components/_examples/global-content-example-content.d.ts +0 -9
  28. package/lib/components/_examples/global-content-example.component.d.ts +0 -73
  29. package/lib/components/_examples/reactive-content-example-content.d.ts +0 -32
  30. package/lib/components/_examples/reactive-content-example.component.d.ts +0 -47
  31. package/lib/services/lang-provider/components/theme-settings.d.ts +0 -3
  32. /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,216 @@ 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) and internal routes (starting with /)
1011
+ * 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 or go to /profile';
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)
1028
+ this.urlRegex = /(https?:\/\/[^\s]+)/g;
1029
+ // Regex para detectar rutas internas (empiezan con / pero no son URLs completas)
1030
+ this.internalRouteRegex = /(\s|^)(\/[^\s]*)/g;
1031
+ }
1032
+ /**
1033
+ * Procesa texto para convertir enlaces en elementos <a> clickeables.
1034
+ * Detecta automáticamente URLs externas e internas y las convierte en enlaces.
1035
+ *
1036
+ * @param text - Texto a procesar
1037
+ * @param config - Configuración del procesamiento
1038
+ * @returns SafeHtml con enlaces procesados o string original
1039
+ *
1040
+ * @example
1041
+ * ```typescript
1042
+ * const result = this.linkProcessor.processLinks(
1043
+ * 'Visit https://example.com or /profile',
1044
+ * {
1045
+ * openExternalInNewTab: true,
1046
+ * openInternalInNewTab: false,
1047
+ * linkClass: 'custom-link'
1048
+ * }
1049
+ * );
1050
+ * ```
1051
+ */
1052
+ processLinks(text, config = {}) {
1053
+ if (!text)
1054
+ return '';
1055
+ const { openExternalInNewTab = true, openInternalInNewTab = false, linkClass = 'processed-link', externalLinkClass = 'external-link', internalLinkClass = 'internal-link', } = config;
1056
+ let hasLinks = false;
1057
+ let processedText = text;
1058
+ // Procesar URLs externas primero
1059
+ if (this.urlRegex.test(text)) {
1060
+ hasLinks = true;
1061
+ this.urlRegex.lastIndex = 0; // Reset regex
1062
+ processedText = processedText.replace(this.urlRegex, url => {
1063
+ const target = openExternalInNewTab ? ' target="_blank" rel="noopener noreferrer"' : '';
1064
+ const classes = `${linkClass} ${externalLinkClass}`.trim();
1065
+ return `<a href="${url}"${target} class="${classes}">${url}</a>`;
1066
+ });
1067
+ }
1068
+ // Procesar rutas internas después
1069
+ if (this.internalRouteRegex.test(processedText)) {
1070
+ hasLinks = true;
1071
+ this.internalRouteRegex.lastIndex = 0; // Reset regex
1072
+ processedText = processedText.replace(this.internalRouteRegex, (match, prefix, route) => {
1073
+ // Solo procesar si no está ya dentro de un enlace
1074
+ if (processedText.indexOf(`href="${route}"`) === -1) {
1075
+ const target = openInternalInNewTab ? ' target="_blank"' : '';
1076
+ const classes = `${linkClass} ${internalLinkClass}`.trim();
1077
+ return `${prefix}<a href="${route}"${target} class="${classes}">${route}</a>`;
1078
+ }
1079
+ return match;
1080
+ });
1081
+ }
1082
+ // Si hay enlaces, sanitizar el HTML
1083
+ if (hasLinks) {
1084
+ return this.sanitizer.bypassSecurityTrustHtml(processedText);
1085
+ }
1086
+ return text;
1087
+ }
1088
+ /**
1089
+ * Detecta si un texto contiene enlaces (URLs o rutas internas).
1090
+ *
1091
+ * @param text - Texto a analizar
1092
+ * @returns true si contiene enlaces
1093
+ *
1094
+ * @example
1095
+ * ```typescript
1096
+ * const hasLinks = this.linkProcessor.hasLinks('Visit https://example.com');
1097
+ * // Returns: true
1098
+ * ```
1099
+ */
1100
+ hasLinks(text) {
1101
+ if (!text)
1102
+ return false;
1103
+ // Reset regex indices
1104
+ this.urlRegex.lastIndex = 0;
1105
+ this.internalRouteRegex.lastIndex = 0;
1106
+ return this.urlRegex.test(text) || this.internalRouteRegex.test(text);
1107
+ }
1108
+ /**
1109
+ * Extrae todos los enlaces de un texto.
1110
+ *
1111
+ * @param text - Texto a analizar
1112
+ * @returns Array de enlaces encontrados con su tipo
1113
+ *
1114
+ * @example
1115
+ * ```typescript
1116
+ * const links = this.linkProcessor.extractLinks('Visit https://example.com or /profile');
1117
+ * // Returns: [
1118
+ * // { url: 'https://example.com', type: 'external' },
1119
+ * // { url: '/profile', type: 'internal' }
1120
+ * // ]
1121
+ * ```
1122
+ */
1123
+ extractLinks(text) {
1124
+ if (!text)
1125
+ return [];
1126
+ const links = [];
1127
+ // Reset regex indices
1128
+ this.urlRegex.lastIndex = 0;
1129
+ this.internalRouteRegex.lastIndex = 0;
1130
+ // Extraer URLs externas
1131
+ let match;
1132
+ while ((match = this.urlRegex.exec(text)) !== null) {
1133
+ links.push({ url: match[1], type: 'external' });
1134
+ }
1135
+ // Extraer rutas internas
1136
+ while ((match = this.internalRouteRegex.exec(text)) !== null) {
1137
+ links.push({ url: match[2], type: 'internal' });
1138
+ }
1139
+ return links;
1140
+ }
1141
+ 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 }); }
1142
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessorService, providedIn: 'root' }); }
1143
+ }
1144
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessorService, decorators: [{
1145
+ type: Injectable,
1146
+ args: [{
1147
+ providedIn: 'root',
1148
+ }]
1149
+ }], ctorParameters: () => [{ type: i1$1.DomSanitizer }] });
1150
+
1151
+ /**
1152
+ * ProcessLinksPipe - Pipe para procesar texto y convertir URLs en enlaces clickeables.
1153
+ *
1154
+ * Este pipe standalone detecta automáticamente URLs externas (http/https) y rutas internas
1155
+ * (que empiezan con /) y las convierte en elementos HTML anchor con los atributos apropiados.
1156
+ *
1157
+ * @example Uso básico:
1158
+ * ```html
1159
+ * <div [innerHTML]="'Visit https://example.com or go to /profile' | processLinks"></div>
1160
+ * ```
1161
+ *
1162
+ * @example Con configuración personalizada:
1163
+ * ```html
1164
+ * <div [innerHTML]="text | processLinks:linkConfig"></div>
1165
+ * ```
1166
+ *
1167
+ * @example En TypeScript:
1168
+ * ```typescript
1169
+ * export class MyComponent {
1170
+ * linkConfig: LinkProcessorConfig = {
1171
+ * openExternalInNewTab: true,
1172
+ * openInternalInNewTab: false,
1173
+ * linkClass: 'my-link',
1174
+ * externalLinkClass: 'external',
1175
+ * internalLinkClass: 'internal'
1176
+ * };
1177
+ * }
1178
+ * ```
1179
+ */
1180
+ class ProcessLinksPipe {
1181
+ constructor() {
1182
+ this.linkProcessor = inject(LinkProcessorService);
1183
+ }
1184
+ /**
1185
+ * Transforma texto procesando URLs y rutas internas para convertirlas en enlaces.
1186
+ *
1187
+ * @param value - El texto a procesar
1188
+ * @param config - Configuración opcional para el procesamiento de enlaces
1189
+ * @returns SafeHtml con enlaces procesados o string original si no hay enlaces
1190
+ *
1191
+ * @example
1192
+ * ```html
1193
+ * <!-- Uso básico -->
1194
+ * <p [innerHTML]="'Check out https://angular.io' | processLinks"></p>
1195
+ *
1196
+ * <!-- Con configuración -->
1197
+ * <p [innerHTML]="message | processLinks:{ openExternalInNewTab: false }"></p>
1198
+ * ```
1199
+ */
1200
+ transform(value, config) {
1201
+ if (!value) {
1202
+ return '';
1203
+ }
1204
+ return this.linkProcessor.processLinks(value, config);
1205
+ }
1206
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinksPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
1207
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinksPipe, isStandalone: true, name: "processLinks" }); }
1208
+ }
1209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinksPipe, decorators: [{
1210
+ type: Pipe,
1211
+ args: [{
1212
+ name: 'processLinks',
1213
+ standalone: true,
1214
+ }]
1215
+ }] });
1216
+
1006
1217
  /**
1007
1218
  * Create a reactive content observable from a content key.
1008
1219
  * This is the primary utility for the `fromContent` pattern with unified support
@@ -1278,7 +1489,7 @@ class LangService {
1278
1489
  }
1279
1490
  /**
1280
1491
  * Observable that emits the current language whenever it changes.
1281
- * Use this to react to language changes in components.
1492
+ * Use this to subscribe to language changes in components.
1282
1493
  */
1283
1494
  get currentLang$() {
1284
1495
  return this.selectedLang.asObservable().pipe(distinctUntilChanged());
@@ -1290,8 +1501,8 @@ class LangService {
1290
1501
  return this.selectedLang.value;
1291
1502
  }
1292
1503
  /**
1293
- * Set the current language and persist it to local storage.
1294
- * This will trigger updates in all components subscribed to reactive content.
1504
+ * Set the current language and persist it to localStorage.
1505
+ * This will trigger updates in all reactive content subscriptions.
1295
1506
  *
1296
1507
  * @param lang - The language to set
1297
1508
  */
@@ -1300,17 +1511,15 @@ class LangService {
1300
1511
  LocalStorageService.set(LANG, lang);
1301
1512
  }
1302
1513
  /**
1303
- * Get all text content for a component class (legacy method for compatibility).
1514
+ * Get content for a component class and key (legacy method).
1304
1515
  *
1305
- * @param className - The component class name
1306
- * @returns The language text object for the current language
1307
1516
  * @deprecated Use getText() or getContent() for better type safety
1308
1517
  */
1309
1518
  Text(className) {
1310
- return this.content[className]?.Content[this.selectedLang.value] || {};
1519
+ return this.content[className].Content[this.selectedLang.value];
1311
1520
  }
1312
1521
  /**
1313
- * Get a specific text value synchronously for the current language.
1522
+ * Get a single content string synchronously for the current language.
1314
1523
  *
1315
1524
  * @param className - The component class name
1316
1525
  * @param key - The text key
@@ -1749,6 +1958,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1749
1958
  * }"></val-text>
1750
1959
  * ```
1751
1960
  *
1961
+ * @example With automatic link processing:
1962
+ * ```html
1963
+ * <val-text [props]="{
1964
+ * content: 'Visit https://example.com or go to /profile for more info',
1965
+ * processLinks: true,
1966
+ * linkConfig: {
1967
+ * openExternalInNewTab: true,
1968
+ * openInternalInNewTab: false,
1969
+ * linkClass: 'custom-link',
1970
+ * externalLinkClass: 'external',
1971
+ * internalLinkClass: 'internal'
1972
+ * },
1973
+ * color: 'primary',
1974
+ * size: 'medium'
1975
+ * }"></val-text>
1976
+ * ```
1977
+ *
1752
1978
  * @example Using ContentService helper:
1753
1979
  * ```typescript
1754
1980
  * // In component
@@ -1768,8 +1994,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1768
1994
  * @input props: TextMetadata - Configuration for the text (content, styling, and reactive content options)
1769
1995
  */
1770
1996
  class TextComponent {
1771
- constructor(contentService) {
1997
+ constructor(contentService, linkProcessor) {
1772
1998
  this.contentService = contentService;
1999
+ this.linkProcessor = linkProcessor;
1773
2000
  this.subscription = new Subscription();
1774
2001
  }
1775
2002
  ngOnInit() {
@@ -1813,21 +2040,37 @@ class TextComponent {
1813
2040
  this.displayContent$ = of(this.props.contentFallback || '');
1814
2041
  }
1815
2042
  }
1816
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextComponent, deps: [{ token: ContentService }], target: i0.ɵɵFactoryTarget.Component }); }
1817
- 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: `
2043
+ 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 }); }
2044
+ 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: `
1818
2045
  <ion-text [color]="props.color">
1819
- <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
2046
+ @if (props.processLinks) {
2047
+ <p
2048
+ [class]="props.size"
2049
+ [class.bold]="props.bold"
2050
+ [innerHTML]="displayContent$ | async | processLinks: props.linkConfig"
2051
+ ></p>
2052
+ } @else {
2053
+ <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
2054
+ }
1820
2055
  </ion-text>
1821
- `, 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 }); }
2056
+ `, 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-secondary, #0cd1e8)}:host ::ng-deep .internal-link:hover{color:var(--ion-color-secondary-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 }); }
1822
2057
  }
1823
2058
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextComponent, decorators: [{
1824
2059
  type: Component,
1825
- args: [{ selector: 'val-text', standalone: true, imports: [IonText, AsyncPipe], template: `
2060
+ args: [{ selector: 'val-text', standalone: true, imports: [IonText, AsyncPipe, ProcessLinksPipe], template: `
1826
2061
  <ion-text [color]="props.color">
1827
- <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
2062
+ @if (props.processLinks) {
2063
+ <p
2064
+ [class]="props.size"
2065
+ [class.bold]="props.bold"
2066
+ [innerHTML]="displayContent$ | async | processLinks: props.linkConfig"
2067
+ ></p>
2068
+ } @else {
2069
+ <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
2070
+ }
1828
2071
  </ion-text>
1829
- `, 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"] }]
1830
- }], ctorParameters: () => [{ type: ContentService }], propDecorators: { props: [{
2072
+ `, 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-secondary, #0cd1e8)}:host ::ng-deep .internal-link:hover{color:var(--ion-color-secondary-shade, #0bb8cc)}\n"] }]
2073
+ }], ctorParameters: () => [{ type: ContentService }, { type: LinkProcessorService }], propDecorators: { props: [{
1831
2074
  type: Input
1832
2075
  }] } });
1833
2076
  /**
@@ -2420,7 +2663,7 @@ class CommentInputComponent {
2420
2663
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommentInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2421
2664
  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: `
2422
2665
  <ion-textarea [formControl]="props.control" [counter]="true" [maxlength]="props.range.max"></ion-textarea>
2423
- `, 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"] }] }); }
2666
+ `, 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"] }] }); }
2424
2667
  }
2425
2668
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommentInputComponent, decorators: [{
2426
2669
  type: Component,
@@ -2622,7 +2865,7 @@ class DateInputComponent {
2622
2865
  </ion-datetime>
2623
2866
  </ng-template>
2624
2867
  </ion-modal>
2625
- `, 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" }] }); }
2868
+ `, 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" }] }); }
2626
2869
  }
2627
2870
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DateInputComponent, decorators: [{
2628
2871
  type: Component,
@@ -2669,7 +2912,7 @@ class EmailInputComponent {
2669
2912
  constructor() { }
2670
2913
  ngOnInit() { }
2671
2914
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EmailInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2672
- 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"] }] }); }
2915
+ 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"] }] }); }
2673
2916
  }
2674
2917
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EmailInputComponent, decorators: [{
2675
2918
  type: Component,
@@ -2923,7 +3166,7 @@ class HourInputComponent {
2923
3166
  constructor() { }
2924
3167
  ngOnInit() { }
2925
3168
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HourInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2926
- 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"] }] }); }
3169
+ 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"] }] }); }
2927
3170
  }
2928
3171
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HourInputComponent, decorators: [{
2929
3172
  type: Component,
@@ -3437,7 +3680,7 @@ class NumberInputComponent {
3437
3680
  }
3438
3681
  }
3439
3682
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3440
- 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"] }] }); }
3683
+ 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"] }] }); }
3441
3684
  }
3442
3685
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberInputComponent, decorators: [{
3443
3686
  type: Component,
@@ -3474,7 +3717,7 @@ class PasswordInputComponent {
3474
3717
  <ion-icon slot="icon-only" [name]="hidePassword ? 'eye-off-outline' : 'eye-outline'"></ion-icon>
3475
3718
  </ion-button>
3476
3719
  </div>
3477
- `, 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"] }] }); }
3720
+ `, 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"] }] }); }
3478
3721
  }
3479
3722
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PasswordInputComponent, decorators: [{
3480
3723
  type: Component,
@@ -3530,7 +3773,7 @@ class PinInputComponent {
3530
3773
  <div class="otp">
3531
3774
  <ng-otp-input [formCtrl]="props.control" [config]="otpInputConfig"></ng-otp-input>
3532
3775
  </div>
3533
- `, 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"] }] }); }
3776
+ `, 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"] }] }); }
3534
3777
  }
3535
3778
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PinInputComponent, decorators: [{
3536
3779
  type: Component,
@@ -3766,7 +4009,7 @@ class RadioInputComponent {
3766
4009
  <br />
3767
4010
  </ng-container>
3768
4011
  </ion-radio-group>
3769
- `, 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"] }] }); }
4012
+ `, 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"] }] }); }
3770
4013
  }
3771
4014
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioInputComponent, decorators: [{
3772
4015
  type: Component,
@@ -3898,7 +4141,7 @@ class SearchSelectorComponent {
3898
4141
  <ion-select-option [value]="o.id">{{ o.name }}</ion-select-option>
3899
4142
  }
3900
4143
  </ion-select>
3901
- `, 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"] }] }); }
4144
+ `, 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"] }] }); }
3902
4145
  }
3903
4146
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchSelectorComponent, decorators: [{
3904
4147
  type: Component,
@@ -4237,7 +4480,7 @@ class SelectSearchComponent {
4237
4480
  </ion-content>
4238
4481
  </ng-template>
4239
4482
  </ion-modal>
4240
- `, 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"] }] }); }
4483
+ `, 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"] }] }); }
4241
4484
  }
4242
4485
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectSearchComponent, decorators: [{
4243
4486
  type: Component,
@@ -4323,7 +4566,7 @@ class TextInputComponent {
4323
4566
  }
4324
4567
  }
4325
4568
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4326
- 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"] }] }); }
4569
+ 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"] }] }); }
4327
4570
  }
4328
4571
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, decorators: [{
4329
4572
  type: Component,
@@ -4902,7 +5145,7 @@ class FormComponent {
4902
5145
  }
4903
5146
  return [this.props.actions];
4904
5147
  }
4905
- 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 }); }
5148
+ 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 }); }
4906
5149
  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: `
4907
5150
  <div class="container">
4908
5151
  <form [formGroup]="form">
@@ -4968,7 +5211,7 @@ class FormComponent {
4968
5211
  ></val-button-group>
4969
5212
  </form>
4970
5213
  </div>
4971
- `, 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"] }] }); }
5214
+ `, 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"] }] }); }
4972
5215
  }
4973
5216
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormComponent, decorators: [{
4974
5217
  type: Component,
@@ -5059,7 +5302,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
5059
5302
  </form>
5060
5303
  </div>
5061
5304
  `, 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"] }]
5062
- }], ctorParameters: () => [{ type: i1$1.FormBuilder }, { type: i0.ElementRef }], propDecorators: { props: [{
5305
+ }], ctorParameters: () => [{ type: i1$2.FormBuilder }, { type: i0.ElementRef }], propDecorators: { props: [{
5063
5306
  type: Input
5064
5307
  }], onSubmit: [{
5065
5308
  type: Output
@@ -6034,8 +6277,18 @@ class CustomContentDemoComponent {
6034
6277
  this.saveTextSync = this.content.getText('save');
6035
6278
  // Tu contenido global personalizado
6036
6279
  this.dashboardTextSync = this.content.getText('dashboard');
6037
- // Contenido específico del componente
6038
- this.languageDescSync = this.content.getText('Language', 'description');
6280
+ // Contenido específico del componente - SOLUCIÓN TEMPORAL
6281
+ // En lugar de usar getText, acceder directamente
6282
+ try {
6283
+ const langService = this.content.langService;
6284
+ const languageContent = langService.content['Language'];
6285
+ const currentLang = langService.selectedLang?.value || 'es';
6286
+ const classContent = languageContent?.Content?.[currentLang];
6287
+ this.languageDescSync = classContent?.['description'] || 'No encontrado';
6288
+ }
6289
+ catch (error) {
6290
+ this.languageDescSync = `Error: ${error}`;
6291
+ }
6039
6292
  }
6040
6293
  diagnoseConfiguration() {
6041
6294
  console.log('=== DIAGNÓSTICO DE CONFIGURACIÓN ===');
@@ -6090,6 +6343,14 @@ class CustomContentDemoComponent {
6090
6343
  try {
6091
6344
  const spanishText = this.content.getText('Language', 'spanish');
6092
6345
  console.log('✅ Componente Language (spanish):', spanishText);
6346
+ // 🔍 Debug paso a paso para spanish
6347
+ const langService = this.content.langService;
6348
+ const languageContent = langService.content['Language'];
6349
+ const currentLang = langService.selectedLang?.value;
6350
+ const classContent = languageContent?.Content[currentLang];
6351
+ console.log('🔍 Debug spanish - currentLang:', currentLang);
6352
+ console.log('🔍 Debug spanish - classContent:', classContent);
6353
+ console.log('🔍 Debug spanish - classContent["spanish"]:', classContent?.['spanish']);
6093
6354
  }
6094
6355
  catch (error) {
6095
6356
  console.log('❌ Error componente Language (spanish):', error);
@@ -6098,6 +6359,14 @@ class CustomContentDemoComponent {
6098
6359
  try {
6099
6360
  const descriptionText = this.content.getText('Language', 'description');
6100
6361
  console.log('✅ Componente Language (description):', descriptionText);
6362
+ // 🔍 Debug paso a paso para description
6363
+ const langService = this.content.langService;
6364
+ const languageContent = langService.content['Language'];
6365
+ const currentLang = langService.selectedLang?.value;
6366
+ const classContent = languageContent?.Content[currentLang];
6367
+ console.log('🔍 Debug description - currentLang:', currentLang);
6368
+ console.log('🔍 Debug description - classContent:', classContent);
6369
+ console.log('🔍 Debug description - classContent["description"]:', classContent?.['description']);
6101
6370
  }
6102
6371
  catch (error) {
6103
6372
  console.log('❌ Error componente Language (description):', error);
@@ -6235,905 +6504,142 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
6235
6504
  }] });
6236
6505
 
6237
6506
  /**
6238
- * Comprehensive example demonstrating global content usage.
6239
- *
6240
- * This component shows:
6241
- * 1. Global button texts
6242
- * 2. Global state messages
6243
- * 3. Global confirmations with interpolation
6244
- * 4. Mixing global and component-specific content
6245
- * 5. Language switching
6507
+ * LinkProcessingExampleComponent - Componente de ejemplo que demuestra el procesamiento automático de enlaces.
6508
+ *
6509
+ * Este componente muestra diferentes casos de uso para el procesamiento automático de enlaces
6510
+ * en el componente val-text, incluyendo enlaces externos, rutas internas y configuraciones personalizadas.
6511
+ *
6512
+ * @example Uso en template:
6513
+ * ```html
6514
+ * <val-link-processing-example></val-link-processing-example>
6515
+ * ```
6246
6516
  */
6247
- class GlobalContentExampleComponent {
6517
+ class LinkProcessingExampleComponent {
6248
6518
  constructor() {
6249
- this.content = inject(ContentService);
6250
- this.componentContent = this.content.forComponent('GlobalContentExample');
6251
- // Form data
6252
- this.formData = {
6253
- name: '',
6254
- email: '',
6255
- message: '',
6256
- };
6257
- // Action state
6258
- this.actionPerformed = false;
6259
- // Component-specific content properties
6260
- this.titleProps = {
6261
- contentKey: 'title',
6262
- contentClass: 'GlobalContentExample',
6263
- contentFallback: 'Global Content Example',
6264
- color: 'primary',
6265
- size: 'xlarge',
6266
- bold: true,
6267
- };
6268
- this.languageLabel = {
6269
- contentKey: 'languageLabel',
6270
- contentClass: 'GlobalContentExample',
6271
- contentFallback: 'Language:',
6272
- color: 'medium',
6519
+ this.basicTextProps = {
6520
+ content: 'Este texto contiene https://angular.io y /dashboard pero no se procesan como enlaces.',
6273
6521
  size: 'medium',
6274
- bold: true,
6522
+ color: 'dark',
6523
+ bold: false,
6524
+ processLinks: false,
6275
6525
  };
6276
- this.componentDescriptionProps = {
6277
- contentKey: 'description',
6278
- contentClass: 'GlobalContentExample',
6279
- contentFallback: 'This example demonstrates global and component-specific content.',
6526
+ this.basicLinksProps = {
6527
+ content: 'Visita https://angular.io para documentación o ve a /dashboard para el panel principal.',
6528
+ size: 'medium',
6280
6529
  color: 'dark',
6530
+ bold: false,
6531
+ processLinks: true,
6532
+ };
6533
+ this.customLinksProps = {
6534
+ content: 'Enlaces personalizados: https://github.com/angular/angular y /profile/settings',
6281
6535
  size: 'medium',
6536
+ color: 'dark',
6282
6537
  bold: false,
6538
+ processLinks: true,
6539
+ linkConfig: {
6540
+ openExternalInNewTab: true,
6541
+ openInternalInNewTab: false,
6542
+ linkClass: 'custom-link-style',
6543
+ externalLinkClass: 'external-custom',
6544
+ internalLinkClass: 'internal-custom',
6545
+ },
6283
6546
  };
6284
- // Global button content (reactive)
6285
- this.saveButton$ = this.content.fromContent({ key: 'save' });
6286
- this.editButton$ = this.content.fromContent({ key: 'edit' });
6287
- this.deleteButton$ = this.content.fromContent({ key: 'delete' });
6288
- this.cancelButton$ = this.content.fromContent({ key: 'cancel' });
6289
- this.backButton$ = this.content.fromContent({ key: 'back' });
6290
- this.nextButton$ = this.content.fromContent({ key: 'next' });
6291
- this.okButton$ = this.content.fromContent({ key: 'ok' });
6292
- this.closeButton$ = this.content.fromContent({ key: 'close' });
6293
- // Global action content
6294
- this.addButton$ = this.content.fromContent({ key: 'add' });
6295
- this.removeButton$ = this.content.fromContent({ key: 'remove' });
6296
- this.searchButton$ = this.content.fromContent({ key: 'search' });
6297
- this.filterButton$ = this.content.fromContent({ key: 'filter' });
6298
- this.sortButton$ = this.content.fromContent({ key: 'sort' });
6299
- this.refreshButton$ = this.content.fromContent({ key: 'refresh' });
6300
- // Global state content
6301
- this.loadingText$ = this.content.fromContent({ key: 'loading' });
6302
- this.successText$ = this.content.fromContent({ key: 'success' });
6303
- this.errorText$ = this.content.fromContent({ key: 'error' });
6304
- this.warningText$ = this.content.fromContent({ key: 'warning' });
6305
- this.infoText$ = this.content.fromContent({ key: 'info' });
6306
- this.noDataText$ = this.content.fromContent({ key: 'noData' });
6307
- // Global form content
6308
- this.requiredText$ = this.content.fromContent({ key: 'required' });
6309
- this.optionalText$ = this.content.fromContent({ key: 'optional' });
6310
- this.searchPlaceholder$ = this.content.fromContent({ key: 'searchPlaceholder' });
6311
- // Global confirmation content with interpolation
6312
- this.deleteConfirmation$ = this.content.fromContentWithInterpolation({
6313
- key: 'deleteConfirmation',
6314
- interpolation: { itemName: 'este registro' },
6315
- });
6316
- this.areYouSureText$ = this.content.fromContent({ key: 'areYouSure' });
6317
- this.unsavedChangesText$ = this.content.fromContent({ key: 'unsavedChanges' });
6318
- }
6319
- /**
6320
- * Set language
6321
- */
6322
- setLanguage(lang) {
6323
- this.content.setLang(lang);
6324
- }
6325
- /**
6326
- * Perform an action to demonstrate status messages
6327
- */
6328
- performAction() {
6329
- this.actionPerformed = true;
6330
- setTimeout(() => {
6331
- this.actionPerformed = false;
6332
- }, 3000);
6333
- }
6334
- /**
6335
- * Cancel action
6336
- */
6337
- cancelAction() {
6338
- this.formData = { name: '', email: '', message: '' };
6339
- this.actionPerformed = false;
6340
- }
6341
- /**
6342
- * Example of synchronous global content access
6343
- */
6344
- getOkTextSync() {
6345
- return this.content.getGlobalText('ok');
6346
- }
6347
- /**
6348
- * Example of synchronous global content access using getText
6349
- */
6350
- getCancelTextSync() {
6351
- return this.content.getText('cancel');
6352
- }
6353
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GlobalContentExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6354
- 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: `
6355
- <ion-card>
6356
- <ion-card-header>
6357
- <ion-card-title>
6358
- <val-text [props]="titleProps"></val-text>
6359
- </ion-card-title>
6360
- </ion-card-header>
6361
-
6362
- <ion-card-content>
6363
- <!-- Language switcher -->
6364
- <div class="language-section">
6365
- <val-text [props]="languageLabel"></val-text>
6366
- <ion-button fill="outline" size="small" (click)="setLanguage('es')"> Español </ion-button>
6367
- <ion-button fill="outline" size="small" (click)="setLanguage('en')"> English </ion-button>
6368
- </div>
6369
-
6370
- <div class="divider"></div>
6371
-
6372
- <!-- Global buttons demonstration -->
6373
- <div class="section">
6374
- <h3>Global Buttons</h3>
6375
- <div class="button-grid">
6376
- <ion-button color="primary">{{ saveButton$ | async }}</ion-button>
6377
- <ion-button color="secondary">{{ editButton$ | async }}</ion-button>
6378
- <ion-button color="danger">{{ deleteButton$ | async }}</ion-button>
6379
- <ion-button fill="outline">{{ cancelButton$ | async }}</ion-button>
6380
- <ion-button fill="outline">{{ backButton$ | async }}</ion-button>
6381
- <ion-button fill="outline">{{ nextButton$ | async }}</ion-button>
6382
- <ion-button color="success">{{ okButton$ | async }}</ion-button>
6383
- <ion-button fill="clear">{{ closeButton$ | async }}</ion-button>
6384
- </div>
6385
- </div>
6386
-
6387
- <div class="divider"></div>
6388
-
6389
- <!-- Global actions demonstration -->
6390
- <div class="section">
6391
- <h3>Global Actions</h3>
6392
- <div class="button-grid">
6393
- <ion-button size="small">{{ addButton$ | async }}</ion-button>
6394
- <ion-button size="small">{{ removeButton$ | async }}</ion-button>
6395
- <ion-button size="small">{{ searchButton$ | async }}</ion-button>
6396
- <ion-button size="small">{{ filterButton$ | async }}</ion-button>
6397
- <ion-button size="small">{{ sortButton$ | async }}</ion-button>
6398
- <ion-button size="small">{{ refreshButton$ | async }}</ion-button>
6399
- </div>
6400
- </div>
6401
-
6402
- <div class="divider"></div>
6403
-
6404
- <!-- Global states demonstration -->
6405
- <div class="section">
6406
- <h3>Global States</h3>
6407
- <div class="state-messages">
6408
- <div class="state-item loading">
6409
- <val-text
6410
- [props]="{ content: loadingText$ | async, color: 'medium', size: 'small', bold: false }"
6411
- ></val-text>
6412
- </div>
6413
- <div class="state-item success">
6414
- <val-text
6415
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6416
- ></val-text>
6417
- </div>
6418
- <div class="state-item error">
6419
- <val-text
6420
- [props]="{ content: errorText$ | async, color: 'danger', size: 'small', bold: false }"
6421
- ></val-text>
6422
- </div>
6423
- <div class="state-item warning">
6424
- <val-text
6425
- [props]="{ content: warningText$ | async, color: 'warning', size: 'small', bold: false }"
6426
- ></val-text>
6427
- </div>
6428
- <div class="state-item info">
6429
- <val-text
6430
- [props]="{ content: infoText$ | async, color: 'primary', size: 'small', bold: false }"
6431
- ></val-text>
6432
- </div>
6433
- <div class="state-item no-data">
6434
- <val-text
6435
- [props]="{ content: noDataText$ | async, color: 'medium', size: 'small', bold: false }"
6436
- ></val-text>
6437
- </div>
6438
- </div>
6439
- </div>
6440
-
6441
- <div class="divider"></div>
6442
-
6443
- <!-- Form with global placeholders and labels -->
6444
- <div class="section">
6445
- <h3>Form with Global Content</h3>
6446
- <form class="example-form">
6447
- <ion-item>
6448
- <ion-label position="stacked">Name ({{ requiredText$ | async }})</ion-label>
6449
- <ion-input [(ngModel)]="formData.name" [placeholder]="'Enter your name' + '...'" name="name"> </ion-input>
6450
- </ion-item>
6451
-
6452
- <ion-item>
6453
- <ion-label position="stacked">Email ({{ optionalText$ | async }})</ion-label>
6454
- <ion-input [(ngModel)]="formData.email" [placeholder]="'Enter your email' + '...'" name="email">
6455
- </ion-input>
6456
- </ion-item>
6457
-
6458
- <ion-item>
6459
- <ion-label position="stacked">Message</ion-label>
6460
- <ion-textarea [(ngModel)]="formData.message" [placeholder]="searchPlaceholder$ | async" name="message">
6461
- </ion-textarea>
6462
- </ion-item>
6463
- </form>
6464
- </div>
6465
-
6466
- <div class="divider"></div>
6467
-
6468
- <!-- Global confirmations with interpolation -->
6469
- <div class="section">
6470
- <h3>Confirmations with Interpolation</h3>
6471
- <div class="confirmation-examples">
6472
- <p><strong>Delete Confirmation:</strong></p>
6473
- <val-text
6474
- [props]="{ content: deleteConfirmation$ | async, color: 'danger', size: 'medium', bold: false }"
6475
- ></val-text>
6476
-
6477
- <br /><br />
6478
- <p><strong>General Confirmation:</strong></p>
6479
- <val-text
6480
- [props]="{ content: areYouSureText$ | async, color: 'warning', size: 'medium', bold: false }"
6481
- ></val-text>
6482
-
6483
- <br /><br />
6484
- <p><strong>Unsaved Changes:</strong></p>
6485
- <val-text
6486
- [props]="{ content: unsavedChangesText$ | async, color: 'medium', size: 'medium', bold: false }"
6487
- ></val-text>
6488
- </div>
6489
- </div>
6490
-
6491
- <div class="divider"></div>
6492
-
6493
- <!-- Mixed content: Global + Component specific -->
6494
- <div class="section">
6495
- <h3>Mixed Content Example</h3>
6496
- <div class="mixed-content">
6497
- <!-- Component-specific content -->
6498
- <val-text [props]="componentDescriptionProps"></val-text>
6499
-
6500
- <br /><br />
6501
-
6502
- <!-- Action buttons mixing global and component content -->
6503
- <div class="action-buttons">
6504
- <ion-button color="primary" (click)="performAction()">
6505
- {{ saveButton$ | async }}
6506
- </ion-button>
6507
- <ion-button fill="outline" (click)="cancelAction()">
6508
- {{ cancelButton$ | async }}
6509
- </ion-button>
6510
- </div>
6511
-
6512
- <!-- Status message using global content -->
6513
- <div *ngIf="actionPerformed" class="status-message">
6514
- <val-text
6515
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6516
- ></val-text>
6517
- </div>
6518
- </div>
6519
- </div>
6520
-
6521
- <!-- Demo of synchronous global content access -->
6522
- <div class="section">
6523
- <h3>Synchronous Access Example</h3>
6524
- <p>
6525
- OK button text (sync): <strong>{{ getOkTextSync() }}</strong>
6526
- </p>
6527
- <p>
6528
- Cancel button text (sync): <strong>{{ getCancelTextSync() }}</strong>
6529
- </p>
6530
- </div>
6531
- </ion-card-content>
6532
- </ion-card>
6533
- `, 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"] }] }); }
6534
- }
6535
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GlobalContentExampleComponent, decorators: [{
6536
- type: Component,
6537
- args: [{ selector: 'val-global-content-example', standalone: true, imports: [
6538
- CommonModule,
6539
- FormsModule,
6540
- IonCard,
6541
- IonCardContent,
6542
- IonCardHeader,
6543
- IonCardTitle,
6544
- IonButton,
6545
- IonItem,
6546
- IonLabel,
6547
- IonInput,
6548
- IonTextarea,
6549
- TextComponent,
6550
- ], template: `
6551
- <ion-card>
6552
- <ion-card-header>
6553
- <ion-card-title>
6554
- <val-text [props]="titleProps"></val-text>
6555
- </ion-card-title>
6556
- </ion-card-header>
6557
-
6558
- <ion-card-content>
6559
- <!-- Language switcher -->
6560
- <div class="language-section">
6561
- <val-text [props]="languageLabel"></val-text>
6562
- <ion-button fill="outline" size="small" (click)="setLanguage('es')"> Español </ion-button>
6563
- <ion-button fill="outline" size="small" (click)="setLanguage('en')"> English </ion-button>
6564
- </div>
6565
-
6566
- <div class="divider"></div>
6567
-
6568
- <!-- Global buttons demonstration -->
6569
- <div class="section">
6570
- <h3>Global Buttons</h3>
6571
- <div class="button-grid">
6572
- <ion-button color="primary">{{ saveButton$ | async }}</ion-button>
6573
- <ion-button color="secondary">{{ editButton$ | async }}</ion-button>
6574
- <ion-button color="danger">{{ deleteButton$ | async }}</ion-button>
6575
- <ion-button fill="outline">{{ cancelButton$ | async }}</ion-button>
6576
- <ion-button fill="outline">{{ backButton$ | async }}</ion-button>
6577
- <ion-button fill="outline">{{ nextButton$ | async }}</ion-button>
6578
- <ion-button color="success">{{ okButton$ | async }}</ion-button>
6579
- <ion-button fill="clear">{{ closeButton$ | async }}</ion-button>
6580
- </div>
6581
- </div>
6582
-
6583
- <div class="divider"></div>
6584
-
6585
- <!-- Global actions demonstration -->
6586
- <div class="section">
6587
- <h3>Global Actions</h3>
6588
- <div class="button-grid">
6589
- <ion-button size="small">{{ addButton$ | async }}</ion-button>
6590
- <ion-button size="small">{{ removeButton$ | async }}</ion-button>
6591
- <ion-button size="small">{{ searchButton$ | async }}</ion-button>
6592
- <ion-button size="small">{{ filterButton$ | async }}</ion-button>
6593
- <ion-button size="small">{{ sortButton$ | async }}</ion-button>
6594
- <ion-button size="small">{{ refreshButton$ | async }}</ion-button>
6595
- </div>
6596
- </div>
6597
-
6598
- <div class="divider"></div>
6599
-
6600
- <!-- Global states demonstration -->
6601
- <div class="section">
6602
- <h3>Global States</h3>
6603
- <div class="state-messages">
6604
- <div class="state-item loading">
6605
- <val-text
6606
- [props]="{ content: loadingText$ | async, color: 'medium', size: 'small', bold: false }"
6607
- ></val-text>
6608
- </div>
6609
- <div class="state-item success">
6610
- <val-text
6611
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6612
- ></val-text>
6613
- </div>
6614
- <div class="state-item error">
6615
- <val-text
6616
- [props]="{ content: errorText$ | async, color: 'danger', size: 'small', bold: false }"
6617
- ></val-text>
6618
- </div>
6619
- <div class="state-item warning">
6620
- <val-text
6621
- [props]="{ content: warningText$ | async, color: 'warning', size: 'small', bold: false }"
6622
- ></val-text>
6623
- </div>
6624
- <div class="state-item info">
6625
- <val-text
6626
- [props]="{ content: infoText$ | async, color: 'primary', size: 'small', bold: false }"
6627
- ></val-text>
6628
- </div>
6629
- <div class="state-item no-data">
6630
- <val-text
6631
- [props]="{ content: noDataText$ | async, color: 'medium', size: 'small', bold: false }"
6632
- ></val-text>
6633
- </div>
6634
- </div>
6635
- </div>
6636
-
6637
- <div class="divider"></div>
6638
-
6639
- <!-- Form with global placeholders and labels -->
6640
- <div class="section">
6641
- <h3>Form with Global Content</h3>
6642
- <form class="example-form">
6643
- <ion-item>
6644
- <ion-label position="stacked">Name ({{ requiredText$ | async }})</ion-label>
6645
- <ion-input [(ngModel)]="formData.name" [placeholder]="'Enter your name' + '...'" name="name"> </ion-input>
6646
- </ion-item>
6647
-
6648
- <ion-item>
6649
- <ion-label position="stacked">Email ({{ optionalText$ | async }})</ion-label>
6650
- <ion-input [(ngModel)]="formData.email" [placeholder]="'Enter your email' + '...'" name="email">
6651
- </ion-input>
6652
- </ion-item>
6653
-
6654
- <ion-item>
6655
- <ion-label position="stacked">Message</ion-label>
6656
- <ion-textarea [(ngModel)]="formData.message" [placeholder]="searchPlaceholder$ | async" name="message">
6657
- </ion-textarea>
6658
- </ion-item>
6659
- </form>
6660
- </div>
6661
-
6662
- <div class="divider"></div>
6663
-
6664
- <!-- Global confirmations with interpolation -->
6665
- <div class="section">
6666
- <h3>Confirmations with Interpolation</h3>
6667
- <div class="confirmation-examples">
6668
- <p><strong>Delete Confirmation:</strong></p>
6669
- <val-text
6670
- [props]="{ content: deleteConfirmation$ | async, color: 'danger', size: 'medium', bold: false }"
6671
- ></val-text>
6672
-
6673
- <br /><br />
6674
- <p><strong>General Confirmation:</strong></p>
6675
- <val-text
6676
- [props]="{ content: areYouSureText$ | async, color: 'warning', size: 'medium', bold: false }"
6677
- ></val-text>
6678
-
6679
- <br /><br />
6680
- <p><strong>Unsaved Changes:</strong></p>
6681
- <val-text
6682
- [props]="{ content: unsavedChangesText$ | async, color: 'medium', size: 'medium', bold: false }"
6683
- ></val-text>
6684
- </div>
6685
- </div>
6686
-
6687
- <div class="divider"></div>
6688
-
6689
- <!-- Mixed content: Global + Component specific -->
6690
- <div class="section">
6691
- <h3>Mixed Content Example</h3>
6692
- <div class="mixed-content">
6693
- <!-- Component-specific content -->
6694
- <val-text [props]="componentDescriptionProps"></val-text>
6695
-
6696
- <br /><br />
6697
-
6698
- <!-- Action buttons mixing global and component content -->
6699
- <div class="action-buttons">
6700
- <ion-button color="primary" (click)="performAction()">
6701
- {{ saveButton$ | async }}
6702
- </ion-button>
6703
- <ion-button fill="outline" (click)="cancelAction()">
6704
- {{ cancelButton$ | async }}
6705
- </ion-button>
6706
- </div>
6707
-
6708
- <!-- Status message using global content -->
6709
- <div *ngIf="actionPerformed" class="status-message">
6710
- <val-text
6711
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6712
- ></val-text>
6713
- </div>
6714
- </div>
6715
- </div>
6716
-
6717
- <!-- Demo of synchronous global content access -->
6718
- <div class="section">
6719
- <h3>Synchronous Access Example</h3>
6720
- <p>
6721
- OK button text (sync): <strong>{{ getOkTextSync() }}</strong>
6722
- </p>
6723
- <p>
6724
- Cancel button text (sync): <strong>{{ getCancelTextSync() }}</strong>
6725
- </p>
6726
- </div>
6727
- </ion-card-content>
6728
- </ion-card>
6729
- `, 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"] }]
6730
- }] });
6731
-
6732
- /**
6733
- * Reactive Content Example Component
6734
- *
6735
- * This component demonstrates various ways to use the new reactive content system with ContentService:
6736
- * 1. Direct reactive content binding with val-text
6737
- * 2. Content with interpolation (dynamic values)
6738
- * 3. Multiple content keys retrieved at once
6739
- * 4. Using the scoped content helper (forComponent)
6740
- * 5. Language switching functionality
6741
- *
6742
- * The component automatically updates all text when the language changes,
6743
- * using the simplified ContentService API that eliminates the need for manual
6744
- * LangService injection and utility function imports.
6745
- *
6746
- * @example Usage patterns:
6747
- * ```typescript
6748
- * // Simple injection
6749
- * content = inject(ContentService);
6750
- *
6751
- * // Scoped helper for this component
6752
- * componentContent = this.content.forComponent('MyComponent');
6753
- *
6754
- * // Get reactive content
6755
- * title$ = this.componentContent.get('title');
6756
- * multipleTexts$ = this.componentContent.getMultiple(['title', 'subtitle']);
6757
- * ```
6758
- * without requiring manual subscriptions or change detection triggers.
6759
- */
6760
- class ReactiveContentExampleComponent {
6761
- constructor() {
6762
- // Use the new ContentService with inject
6763
- this.content = inject(ContentService);
6764
- // Create a scoped content helper for this component
6765
- this.componentContent = this.content.forComponent('ReactiveContentExample');
6766
- // State for confirmation dialog
6767
- this.showConfirmation = false;
6768
- // Example 1: Simple reactive content props for val-text
6769
- this.titleProps = {
6770
- contentKey: 'title',
6771
- contentClass: 'ReactiveContentExample',
6772
- contentFallback: 'Default Title',
6773
- color: 'primary',
6774
- size: 'xlarge',
6775
- bold: true,
6547
+ this.mixedLinksProps = {
6548
+ 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.',
6549
+ size: 'medium',
6550
+ color: 'dark',
6551
+ bold: false,
6552
+ processLinks: true,
6553
+ linkConfig: {
6554
+ openExternalInNewTab: true,
6555
+ openInternalInNewTab: false,
6556
+ linkClass: 'processed-link',
6557
+ externalLinkClass: 'external-link',
6558
+ internalLinkClass: 'internal-link',
6559
+ },
6776
6560
  };
6777
- // Example 2: Reactive content with interpolation
6778
- this.greetingProps = {
6779
- contentKey: 'greeting',
6780
- contentClass: 'ReactiveContentExample',
6781
- contentInterpolation: { name: 'Developer', count: 3 },
6782
- contentFallback: 'Hello Developer',
6783
- color: 'secondary',
6784
- size: 'large',
6561
+ this.sameTabLinksProps = {
6562
+ content: 'Estos enlaces no abren en nueva pestaña: https://example.com y /home',
6563
+ size: 'medium',
6564
+ color: 'dark',
6785
6565
  bold: false,
6566
+ processLinks: true,
6567
+ linkConfig: {
6568
+ openExternalInNewTab: false,
6569
+ openInternalInNewTab: false,
6570
+ linkClass: 'same-tab-link',
6571
+ externalLinkClass: 'external-same-tab',
6572
+ internalLinkClass: 'internal-same-tab',
6573
+ },
6786
6574
  };
6787
6575
  }
6788
- ngOnInit() {
6789
- // Set up reactive observables using ContentService
6790
- this.currentLanguage$ = this.content.currentLang$;
6791
- // Example 3: Get multiple content keys reactively - using the new API
6792
- this.multipleContent$ = this.componentContent.getMultiple(['description', 'dynamicText']);
6793
- // Button text reactive - using the new simplified API with options
6794
- this.buttonText$ = this.componentContent.get('buttonText');
6795
- // Global content observables using unified fromContent method
6796
- this.saveButton$ = this.content.fromContent({ key: 'save' });
6797
- this.cancelButton$ = this.content.fromContent({ key: 'cancel' });
6798
- this.deleteButton$ = this.content.fromContent({ key: 'delete' });
6799
- this.okButton$ = this.content.fromContent({ key: 'ok' });
6800
- this.loadingText$ = this.content.fromContent({ key: 'loading' });
6801
- // Global content with interpolation using unified method
6802
- this.deleteConfirmationText$ = this.content.fromContent({
6803
- key: 'deleteConfirmation',
6804
- interpolation: { itemName: 'este elemento' },
6805
- });
6806
- // Example of synchronous global content access
6807
- console.log('Global save text:', this.content.getText('save'));
6808
- console.log('Global cancel text:', this.content.getGlobalText('cancel'));
6809
- // Example of using new scoped helper with interpolation
6810
- const greetingWithNewAPI$ = this.componentContent.get('greeting', {
6811
- interpolation: { name: 'Developer', count: 3 },
6812
- fallback: 'Hello!',
6813
- });
6814
- console.log('New unified API works!', greetingWithNewAPI$);
6815
- }
6816
- /**
6817
- * Toggle between Spanish and English
6818
- */
6819
- toggleLanguage() {
6820
- const currentLang = this.content.currentLang;
6821
- const newLang = currentLang === LangOption.ES ? LangOption.EN : LangOption.ES;
6822
- this.content.setLang(newLang);
6823
- }
6824
- /**
6825
- * Show delete confirmation dialog
6826
- */
6827
- showDeleteConfirmation() {
6828
- this.showConfirmation = true;
6829
- }
6830
- /**
6831
- * Hide delete confirmation dialog
6832
- */
6833
- hideDeleteConfirmation() {
6834
- this.showConfirmation = false;
6835
- }
6836
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactiveContentExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6837
- 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: `
6838
- <ion-card>
6839
- <ion-card-header>
6840
- <ion-card-title>
6841
- <!-- Example 1: Direct reactive content using val-text -->
6842
- <val-text [props]="titleProps"></val-text>
6843
- </ion-card-title>
6844
- </ion-card-header>
6576
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessingExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6577
+ 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: `
6578
+ <div class="link-examples">
6579
+ <h2>Ejemplos de Procesamiento de Enlaces</h2>
6845
6580
 
6846
- <ion-card-content>
6847
- <!-- Example 2: Reactive content with interpolation -->
6848
- <val-text [props]="greetingProps"></val-text>
6849
-
6850
- <div class="example-divider"></div>
6851
-
6852
- <!-- Example 3: Multiple content keys -->
6853
- <div *ngIf="multipleContent$ | async as content">
6854
- <val-text
6855
- [props]="{
6856
- content: content['description'],
6857
- color: 'medium',
6858
- size: 'medium',
6859
- bold: false,
6860
- }"
6861
- ></val-text>
6862
-
6863
- <br /><br />
6864
-
6865
- <val-text
6866
- [props]="{
6867
- content: content['dynamicText'],
6868
- color: 'primary',
6869
- size: 'small',
6870
- bold: true,
6871
- }"
6872
- ></val-text>
6873
- </div>
6874
-
6875
- <div class="example-divider"></div>
6876
-
6877
- <!-- Example 4: Using content helper -->
6878
- <val-text
6879
- [props]="{
6880
- content: componentContent.getText('welcomeMessage'),
6881
- color: 'success',
6882
- size: 'large',
6883
- bold: true,
6884
- }"
6885
- ></val-text>
6886
-
6887
- <div class="example-divider"></div>
6888
-
6889
- <!-- Example 5: Global content - buttons using global text -->
6890
- <div class="button-group">
6891
- <ion-button [fill]="'solid'" [color]="'primary'">
6892
- {{ saveButton$ | async }}
6893
- </ion-button>
6894
- <ion-button [fill]="'outline'" [color]="'secondary'">
6895
- {{ cancelButton$ | async }}
6896
- </ion-button>
6897
- <ion-button [fill]="'outline'" [color]="'danger'" (click)="showDeleteConfirmation()">
6898
- {{ deleteButton$ | async }}
6899
- </ion-button>
6900
- </div>
6901
-
6902
- <div class="example-divider"></div>
6903
-
6904
- <!-- Example 6: Global content with interpolation -->
6905
- <div *ngIf="showConfirmation" class="confirmation-message">
6906
- <val-text
6907
- [props]="{
6908
- content: deleteConfirmationText$ | async,
6909
- color: 'warning',
6910
- size: 'medium',
6911
- bold: true,
6912
- }"
6913
- ></val-text>
6914
- <br /><br />
6915
- <ion-button [fill]="'solid'" [color]="'danger'" size="small" (click)="hideDeleteConfirmation()">
6916
- {{ okButton$ | async }}
6917
- </ion-button>
6918
- <ion-button [fill]="'clear'" [color]="'medium'" size="small" (click)="hideDeleteConfirmation()">
6919
- {{ cancelButton$ | async }}
6920
- </ion-button>
6921
- </div>
6581
+ <div class="example-section">
6582
+ <h3>Texto sin procesamiento de enlaces:</h3>
6583
+ <val-text [props]="basicTextProps"></val-text>
6584
+ </div>
6922
6585
 
6923
- <div class="example-divider"></div>
6586
+ <div class="example-section">
6587
+ <h3>Texto con procesamiento básico de enlaces:</h3>
6588
+ <val-text [props]="basicLinksProps"></val-text>
6589
+ </div>
6924
6590
 
6925
- <!-- Example 7: Language switching button -->
6926
- <ion-button expand="block" fill="outline" color="tertiary" (click)="toggleLanguage()">
6927
- {{ buttonText$ | async }}
6928
- </ion-button>
6591
+ <div class="example-section">
6592
+ <h3>Enlaces con configuración personalizada:</h3>
6593
+ <val-text [props]="customLinksProps"></val-text>
6594
+ </div>
6929
6595
 
6930
- <!-- Example 8: Current language display -->
6931
- <div class="language-info">
6932
- <p>
6933
- Current language:
6934
- <strong>{{ currentLanguage$ | async }}</strong>
6935
- </p>
6596
+ <div class="example-section">
6597
+ <h3>Enlaces internos y externos mezclados:</h3>
6598
+ <val-text [props]="mixedLinksProps"></val-text>
6599
+ </div>
6936
6600
 
6937
- <!-- Example of mixed global and component content -->
6938
- <p>
6939
- <val-text
6940
- [props]="{
6941
- content: loadingText$ | async,
6942
- color: 'medium',
6943
- size: 'small',
6944
- bold: false,
6945
- }"
6946
- ></val-text>
6947
- </p>
6948
- </div>
6949
- </ion-card-content>
6950
- </ion-card>
6951
- `, 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 }); }
6601
+ <div class="example-section">
6602
+ <h3>Enlaces sin abrir en nueva pestaña:</h3>
6603
+ <val-text [props]="sameTabLinksProps"></val-text>
6604
+ </div>
6605
+ </div>
6606
+ `, 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"] }] }); }
6952
6607
  }
6953
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactiveContentExampleComponent, decorators: [{
6608
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessingExampleComponent, decorators: [{
6954
6609
  type: Component,
6955
- args: [{ selector: 'val-reactive-content-example', standalone: true, imports: [AsyncPipe, NgIf, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonButton, TextComponent], template: `
6956
- <ion-card>
6957
- <ion-card-header>
6958
- <ion-card-title>
6959
- <!-- Example 1: Direct reactive content using val-text -->
6960
- <val-text [props]="titleProps"></val-text>
6961
- </ion-card-title>
6962
- </ion-card-header>
6963
-
6964
- <ion-card-content>
6965
- <!-- Example 2: Reactive content with interpolation -->
6966
- <val-text [props]="greetingProps"></val-text>
6967
-
6968
- <div class="example-divider"></div>
6969
-
6970
- <!-- Example 3: Multiple content keys -->
6971
- <div *ngIf="multipleContent$ | async as content">
6972
- <val-text
6973
- [props]="{
6974
- content: content['description'],
6975
- color: 'medium',
6976
- size: 'medium',
6977
- bold: false,
6978
- }"
6979
- ></val-text>
6980
-
6981
- <br /><br />
6982
-
6983
- <val-text
6984
- [props]="{
6985
- content: content['dynamicText'],
6986
- color: 'primary',
6987
- size: 'small',
6988
- bold: true,
6989
- }"
6990
- ></val-text>
6991
- </div>
6992
-
6993
- <div class="example-divider"></div>
6994
-
6995
- <!-- Example 4: Using content helper -->
6996
- <val-text
6997
- [props]="{
6998
- content: componentContent.getText('welcomeMessage'),
6999
- color: 'success',
7000
- size: 'large',
7001
- bold: true,
7002
- }"
7003
- ></val-text>
7004
-
7005
- <div class="example-divider"></div>
7006
-
7007
- <!-- Example 5: Global content - buttons using global text -->
7008
- <div class="button-group">
7009
- <ion-button [fill]="'solid'" [color]="'primary'">
7010
- {{ saveButton$ | async }}
7011
- </ion-button>
7012
- <ion-button [fill]="'outline'" [color]="'secondary'">
7013
- {{ cancelButton$ | async }}
7014
- </ion-button>
7015
- <ion-button [fill]="'outline'" [color]="'danger'" (click)="showDeleteConfirmation()">
7016
- {{ deleteButton$ | async }}
7017
- </ion-button>
7018
- </div>
7019
-
7020
- <div class="example-divider"></div>
7021
-
7022
- <!-- Example 6: Global content with interpolation -->
7023
- <div *ngIf="showConfirmation" class="confirmation-message">
7024
- <val-text
7025
- [props]="{
7026
- content: deleteConfirmationText$ | async,
7027
- color: 'warning',
7028
- size: 'medium',
7029
- bold: true,
7030
- }"
7031
- ></val-text>
7032
- <br /><br />
7033
- <ion-button [fill]="'solid'" [color]="'danger'" size="small" (click)="hideDeleteConfirmation()">
7034
- {{ okButton$ | async }}
7035
- </ion-button>
7036
- <ion-button [fill]="'clear'" [color]="'medium'" size="small" (click)="hideDeleteConfirmation()">
7037
- {{ cancelButton$ | async }}
7038
- </ion-button>
7039
- </div>
7040
-
7041
- <div class="example-divider"></div>
6610
+ args: [{ selector: 'val-link-processing-example', standalone: true, imports: [TextComponent], template: `
6611
+ <div class="link-examples">
6612
+ <h2>Ejemplos de Procesamiento de Enlaces</h2>
7042
6613
 
7043
- <!-- Example 7: Language switching button -->
7044
- <ion-button expand="block" fill="outline" color="tertiary" (click)="toggleLanguage()">
7045
- {{ buttonText$ | async }}
7046
- </ion-button>
6614
+ <div class="example-section">
6615
+ <h3>Texto sin procesamiento de enlaces:</h3>
6616
+ <val-text [props]="basicTextProps"></val-text>
6617
+ </div>
7047
6618
 
7048
- <!-- Example 8: Current language display -->
7049
- <div class="language-info">
7050
- <p>
7051
- Current language:
7052
- <strong>{{ currentLanguage$ | async }}</strong>
7053
- </p>
6619
+ <div class="example-section">
6620
+ <h3>Texto con procesamiento básico de enlaces:</h3>
6621
+ <val-text [props]="basicLinksProps"></val-text>
6622
+ </div>
7054
6623
 
7055
- <!-- Example of mixed global and component content -->
7056
- <p>
7057
- <val-text
7058
- [props]="{
7059
- content: loadingText$ | async,
7060
- color: 'medium',
7061
- size: 'small',
7062
- bold: false,
7063
- }"
7064
- ></val-text>
7065
- </p>
7066
- </div>
7067
- </ion-card-content>
7068
- </ion-card>
7069
- `, 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"] }]
7070
- }], ctorParameters: () => [] });
6624
+ <div class="example-section">
6625
+ <h3>Enlaces con configuración personalizada:</h3>
6626
+ <val-text [props]="customLinksProps"></val-text>
6627
+ </div>
7071
6628
 
7072
- /**
7073
- * Content configuration for the Global Content Example component.
7074
- *
7075
- * This demonstrates component-specific content that works alongside
7076
- * global content to create a comprehensive content management system.
7077
- */
7078
- const globalContentExampleData = {
7079
- title: {
7080
- es: 'Ejemplo de Contenido Global',
7081
- en: 'Global Content Example',
7082
- },
7083
- languageLabel: {
7084
- es: 'Idioma:',
7085
- en: 'Language:',
7086
- },
7087
- description: {
7088
- es: 'Este ejemplo demuestra cómo usar contenido global y específico del componente de manera conjunta.',
7089
- en: 'This example shows how to use global and component-specific content together.',
7090
- },
7091
- };
7092
- var GlobalContentExample = new TextContent(globalContentExampleData);
6629
+ <div class="example-section">
6630
+ <h3>Enlaces internos y externos mezclados:</h3>
6631
+ <val-text [props]="mixedLinksProps"></val-text>
6632
+ </div>
7093
6633
 
7094
- /**
7095
- * Example content configuration for demonstrating the reactive content system.
7096
- *
7097
- * This file shows how to structure content for components that use the reactive
7098
- * language system with the new fromContent pattern.
7099
- */
7100
- // Example content for a sample component
7101
- const exampleComponentContent = {
7102
- es: {
7103
- title: 'Ejemplo de Contenido Reactivo',
7104
- subtitle: 'Este es un subtítulo que cambia automáticamente',
7105
- description: 'Esta descripción se actualiza cuando cambias el idioma sin necesidad de recargar la página.',
7106
- greeting: 'Hola {name}, tienes {count} mensajes nuevos',
7107
- welcomeMessage: 'Bienvenido a la biblioteca de componentes Valtech',
7108
- dynamicText: 'Este texto se actualiza automáticamente cuando cambias el idioma',
7109
- buttonText: 'Cambiar Idioma',
7110
- loadingText: 'Cargando...',
7111
- errorMessage: 'Error: No se pudo cargar el contenido',
7112
- successMessage: 'Contenido cargado exitosamente',
7113
- confirmDialog: '¿Estás seguro de que quieres continuar?',
7114
- cancelButton: 'Cancelar',
7115
- acceptButton: 'Aceptar',
7116
- },
7117
- en: {
7118
- title: 'Reactive Content Example',
7119
- subtitle: 'This is a subtitle that changes automatically',
7120
- description: 'This description updates when you change the language without needing to reload the page.',
7121
- greeting: 'Hello {name}, you have {count} new messages',
7122
- welcomeMessage: 'Welcome to the Valtech component library',
7123
- dynamicText: 'This text updates automatically when you change the language',
7124
- buttonText: 'Change Language',
7125
- loadingText: 'Loading...',
7126
- errorMessage: 'Error: Could not load content',
7127
- successMessage: 'Content loaded successfully',
7128
- confirmDialog: 'Are you sure you want to continue?',
7129
- cancelButton: 'Cancel',
7130
- acceptButton: 'Accept',
7131
- },
7132
- };
7133
- // Export the content as a TextContent instance
7134
- var ReactiveContentExample = new TextContent(exampleComponentContent);
6634
+ <div class="example-section">
6635
+ <h3>Enlaces sin abrir en nueva pestaña:</h3>
6636
+ <val-text [props]="sameTabLinksProps"></val-text>
6637
+ </div>
6638
+ </div>
6639
+ `, 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"] }]
6640
+ }] });
7135
6641
 
7136
- const text$1 = {
6642
+ const text = {
7137
6643
  es: {
7138
6644
  spanish: 'Español',
7139
6645
  english: 'Inglés',
@@ -7143,21 +6649,7 @@ const text$1 = {
7143
6649
  english: 'English',
7144
6650
  },
7145
6651
  };
7146
- var LangSettings = new TextContent(text$1);
7147
-
7148
- const text = {
7149
- es: {
7150
- light: 'Siempre claro',
7151
- dark: 'Siempre oscuro',
7152
- auto: 'Automático',
7153
- },
7154
- en: {
7155
- light: 'Always light',
7156
- dark: 'Always dark',
7157
- auto: 'System settings',
7158
- },
7159
- };
7160
- var ThemeSettings = new TextContent(text);
6652
+ var LangSettings = new TextContent(text);
7161
6653
 
7162
6654
  /**
7163
6655
  * Global content that can be used across all components.
@@ -7196,9 +6688,6 @@ const globalContentData = {
7196
6688
  areYouSure: '¿Estás seguro?',
7197
6689
  deleteConfirmation: '¿Estás seguro de que deseas eliminar {itemName}?',
7198
6690
  unsavedChanges: 'Tienes cambios sin guardar. ¿Deseas continuar?',
7199
- // Common form labels
7200
- required: 'Requerido',
7201
- optional: 'Opcional',
7202
6691
  // Common placeholders
7203
6692
  searchPlaceholder: 'Buscar...',
7204
6693
  },
@@ -7233,9 +6722,6 @@ const globalContentData = {
7233
6722
  areYouSure: 'Are you sure?',
7234
6723
  deleteConfirmation: 'Are you sure you want to delete {itemName}?',
7235
6724
  unsavedChanges: 'You have unsaved changes. Do you want to continue?',
7236
- // Common form labels
7237
- required: 'Required',
7238
- optional: 'Optional',
7239
6725
  // Common placeholders
7240
6726
  searchPlaceholder: 'Search...',
7241
6727
  },
@@ -7244,9 +6730,6 @@ const GlobalContent = new TextContent(globalContentData);
7244
6730
  const content = {
7245
6731
  _global: GlobalContent,
7246
6732
  LangSettings,
7247
- ThemeSettings,
7248
- ReactiveContentExample,
7249
- GlobalContentExample,
7250
6733
  };
7251
6734
 
7252
6735
  /**
@@ -7304,5 +6787,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
7304
6787
  * Generated bundle index. Do not edit.
7305
6788
  */
7306
6789
 
7307
- 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 };
6790
+ 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 };
7308
6791
  //# sourceMappingURL=valtech-components.mjs.map