valtech-components 2.0.286 → 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 (30) 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/link-processor.service.mjs +147 -0
  8. package/esm2022/lib/shared/pipes/process-links.pipe.mjs +69 -0
  9. package/esm2022/public-api.mjs +5 -4
  10. package/fesm2022/valtech-components.mjs +384 -925
  11. package/fesm2022/valtech-components.mjs.map +1 -1
  12. package/lib/components/atoms/text/text.component.d.ts +5 -1
  13. package/lib/components/atoms/text/types.d.ts +5 -0
  14. package/lib/examples/link-processing-example.component.d.ts +22 -0
  15. package/lib/services/link-processor.service.d.ts +92 -0
  16. package/lib/shared/pipes/process-links.pipe.d.ts +55 -0
  17. package/package.json +1 -1
  18. package/public-api.d.ts +4 -3
  19. package/esm2022/lib/components/_examples/custom-content-demo.component.mjs +0 -291
  20. package/esm2022/lib/components/_examples/global-content-example-content.mjs +0 -23
  21. package/esm2022/lib/components/_examples/global-content-example.component.mjs +0 -504
  22. package/esm2022/lib/components/_examples/reactive-content-example-content.mjs +0 -43
  23. package/esm2022/lib/components/_examples/reactive-content-example.component.mjs +0 -347
  24. package/esm2022/lib/services/lang-provider/components/theme-settings.mjs +0 -15
  25. package/lib/components/_examples/global-content-example-content.d.ts +0 -9
  26. package/lib/components/_examples/global-content-example.component.d.ts +0 -73
  27. package/lib/components/_examples/reactive-content-example-content.d.ts +0 -32
  28. package/lib/components/_examples/reactive-content-example.component.d.ts +0 -47
  29. package/lib/services/lang-provider/components/theme-settings.d.ts +0 -3
  30. /package/lib/{components/_examples → examples}/custom-content-demo.component.d.ts +0 -0
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Component, Input, Output, Injectable, inject, InjectionToken, Inject, ChangeDetectionStrategy, ViewChild, ChangeDetectorRef } from '@angular/core';
2
+ import { EventEmitter, Component, Input, Output, Injectable, inject, Pipe, InjectionToken, Inject, ChangeDetectionStrategy, ViewChild, ChangeDetectorRef } from '@angular/core';
3
3
  import { IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonProgressBar, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonButtons, IonTextarea, IonDatetime, IonDatetimeButton, IonModal, IonInput, IonRadioGroup, IonRadio, IonSearchbar, IonSelect, IonSelectOption, IonToolbar, IonTitle, IonMenuButton, IonFooter, IonHeader, IonList, IonListHeader, IonLabel, IonNote, IonItem, IonContent } from '@ionic/angular/standalone';
4
4
  import * as i1 from '@angular/common';
5
5
  import { CommonModule, NgStyle, AsyncPipe, NgIf, NgFor, NgClass } from '@angular/common';
@@ -8,9 +8,10 @@ import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBa
8
8
  import { Router, RouterLink } from '@angular/router';
9
9
  import { Browser } from '@capacitor/browser';
10
10
  import { map, BehaviorSubject, distinctUntilChanged, Subscription, of } from 'rxjs';
11
- import * as i1$1 from '@angular/forms';
11
+ import * as i1$1 from '@angular/platform-browser';
12
+ import * as i1$2 from '@angular/forms';
12
13
  import { ReactiveFormsModule, FormsModule, Validators } from '@angular/forms';
13
- import * as i1$2 from 'ng-otp-input';
14
+ import * as i1$3 from 'ng-otp-input';
14
15
  import { NgOtpInputComponent, NgOtpInputModule } from 'ng-otp-input';
15
16
  import * as i2 from '@ionic/angular';
16
17
  import { IonicModule } from '@ionic/angular';
@@ -1003,6 +1004,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
@@ -1747,6 +1958,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1747
1958
  * }"></val-text>
1748
1959
  * ```
1749
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
+ *
1750
1978
  * @example Using ContentService helper:
1751
1979
  * ```typescript
1752
1980
  * // In component
@@ -1766,8 +1994,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1766
1994
  * @input props: TextMetadata - Configuration for the text (content, styling, and reactive content options)
1767
1995
  */
1768
1996
  class TextComponent {
1769
- constructor(contentService) {
1997
+ constructor(contentService, linkProcessor) {
1770
1998
  this.contentService = contentService;
1999
+ this.linkProcessor = linkProcessor;
1771
2000
  this.subscription = new Subscription();
1772
2001
  }
1773
2002
  ngOnInit() {
@@ -1811,21 +2040,37 @@ class TextComponent {
1811
2040
  this.displayContent$ = of(this.props.contentFallback || '');
1812
2041
  }
1813
2042
  }
1814
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextComponent, deps: [{ token: ContentService }], target: i0.ɵɵFactoryTarget.Component }); }
1815
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TextComponent, isStandalone: true, selector: "val-text", inputs: { props: "props" }, ngImport: i0, template: `
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: `
1816
2045
  <ion-text [color]="props.color">
1817
- <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
+ }
1818
2055
  </ion-text>
1819
- `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}\n"], dependencies: [{ kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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 }); }
1820
2057
  }
1821
2058
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextComponent, decorators: [{
1822
2059
  type: Component,
1823
- args: [{ selector: 'val-text', standalone: true, imports: [IonText, AsyncPipe], template: `
2060
+ args: [{ selector: 'val-text', standalone: true, imports: [IonText, AsyncPipe, ProcessLinksPipe], template: `
1824
2061
  <ion-text [color]="props.color">
1825
- <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
+ }
1826
2071
  </ion-text>
1827
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}\n"] }]
1828
- }], ctorParameters: () => [{ type: ContentService }], propDecorators: { props: [{
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: [{
1829
2074
  type: Input
1830
2075
  }] } });
1831
2076
  /**
@@ -2418,7 +2663,7 @@ class CommentInputComponent {
2418
2663
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommentInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2419
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: `
2420
2665
  <ion-textarea [formControl]="props.control" [counter]="true" [maxlength]="props.range.max"></ion-textarea>
2421
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }] }); }
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"] }] }); }
2422
2667
  }
2423
2668
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommentInputComponent, decorators: [{
2424
2669
  type: Component,
@@ -2620,7 +2865,7 @@ class DateInputComponent {
2620
2865
  </ion-datetime>
2621
2866
  </ng-template>
2622
2867
  </ion-modal>
2623
- `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.button-container{display:flex;flex-direction:column;align-items:flex-start}.action{margin-top:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "highlightedDates", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "multiple", "name", "preferWheel", "presentation", "readonly", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "titleSelectedDatesFormatter", "value", "yearValues"] }, { kind: "component", type: IonDatetimeButton, selector: "ion-datetime-button", inputs: ["color", "datetime", "disabled", "mode"] }, { kind: "component", type: IonModal, selector: "ion-modal" }] }); }
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" }] }); }
2624
2869
  }
2625
2870
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DateInputComponent, decorators: [{
2626
2871
  type: Component,
@@ -2667,7 +2912,7 @@ class EmailInputComponent {
2667
2912
  constructor() { }
2668
2913
  ngOnInit() { }
2669
2914
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EmailInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2670
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EmailInputComponent, isStandalone: true, selector: "val-email-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="email" [placeholder]="props.placeholder"></ion-input> `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
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"] }] }); }
2671
2916
  }
2672
2917
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EmailInputComponent, decorators: [{
2673
2918
  type: Component,
@@ -2921,7 +3166,7 @@ class HourInputComponent {
2921
3166
  constructor() { }
2922
3167
  ngOnInit() { }
2923
3168
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HourInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2924
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: HourInputComponent, isStandalone: true, selector: "val-hour-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-datetime [formControl]="props.control" presentation="time"></ion-datetime>`, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "highlightedDates", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "multiple", "name", "preferWheel", "presentation", "readonly", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "titleSelectedDatesFormatter", "value", "yearValues"] }] }); }
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"] }] }); }
2925
3170
  }
2926
3171
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HourInputComponent, decorators: [{
2927
3172
  type: Component,
@@ -3435,7 +3680,7 @@ class NumberInputComponent {
3435
3680
  }
3436
3681
  }
3437
3682
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3438
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NumberInputComponent, isStandalone: true, selector: "val-number-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="number" [placeholder]="props.placeholder"></ion-input> `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
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"] }] }); }
3439
3684
  }
3440
3685
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberInputComponent, decorators: [{
3441
3686
  type: Component,
@@ -3472,7 +3717,7 @@ class PasswordInputComponent {
3472
3717
  <ion-icon slot="icon-only" [name]="hidePassword ? 'eye-off-outline' : 'eye-outline'"></ion-icon>
3473
3718
  </ion-button>
3474
3719
  </div>
3475
- `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.input-container{display:flex;align-items:center;flex-direction:row}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
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"] }] }); }
3476
3721
  }
3477
3722
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PasswordInputComponent, decorators: [{
3478
3723
  type: Component,
@@ -3528,7 +3773,7 @@ class PinInputComponent {
3528
3773
  <div class="otp">
3529
3774
  <ng-otp-input [formCtrl]="props.control" [config]="otpInputConfig"></ng-otp-input>
3530
3775
  </div>
3531
- `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.otp{text-align:center;margin-top:.25rem;font-family:var(--ion-default-font),Arial,sans-serif}.otp-input-box:focus{border-color:#0ff}\n"], dependencies: [{ kind: "ngmodule", type: NgOtpInputModule }, { kind: "component", type: i1$2.NgOtpInputComponent, selector: "ng-otp-input", inputs: ["config", "formCtrl"], outputs: ["onInputChange"] }] }); }
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"] }] }); }
3532
3777
  }
3533
3778
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PinInputComponent, decorators: [{
3534
3779
  type: Component,
@@ -3764,7 +4009,7 @@ class RadioInputComponent {
3764
4009
  <br />
3765
4010
  </ng-container>
3766
4011
  </ion-radio-group>
3767
- `, isInline: true, styles: [""], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonRadioGroup, selector: "ion-radio-group", inputs: ["allowEmptySelection", "name", "value"] }, { kind: "component", type: IonRadio, selector: "ion-radio", inputs: ["alignment", "color", "disabled", "justify", "labelPlacement", "mode", "name", "value"] }] }); }
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"] }] }); }
3768
4013
  }
3769
4014
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioInputComponent, decorators: [{
3770
4015
  type: Component,
@@ -3896,7 +4141,7 @@ class SearchSelectorComponent {
3896
4141
  <ion-select-option [value]="o.id">{{ o.name }}</ion-select-option>
3897
4142
  }
3898
4143
  </ion-select>
3899
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "expandedIcon", "fill", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }] }); }
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"] }] }); }
3900
4145
  }
3901
4146
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchSelectorComponent, decorators: [{
3902
4147
  type: Component,
@@ -4235,7 +4480,7 @@ class SelectSearchComponent {
4235
4480
  </ion-content>
4236
4481
  </ng-template>
4237
4482
  </ion-modal>
4238
- `, isInline: true, styles: ["ion-header{padding:8px 8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["disabled"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
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"] }] }); }
4239
4484
  }
4240
4485
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectSearchComponent, decorators: [{
4241
4486
  type: Component,
@@ -4321,7 +4566,7 @@ class TextInputComponent {
4321
4566
  }
4322
4567
  }
4323
4568
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4324
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TextInputComponent, isStandalone: true, selector: "val-text-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="text" [placeholder]="props.placeholder" /> `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
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"] }] }); }
4325
4570
  }
4326
4571
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, decorators: [{
4327
4572
  type: Component,
@@ -4900,7 +5145,7 @@ class FormComponent {
4900
5145
  }
4901
5146
  return [this.props.actions];
4902
5147
  }
4903
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormComponent, deps: [{ token: i1$1.FormBuilder }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
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 }); }
4904
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: `
4905
5150
  <div class="container">
4906
5151
  <form [formGroup]="form">
@@ -4966,7 +5211,7 @@ class FormComponent {
4966
5211
  ></val-button-group>
4967
5212
  </form>
4968
5213
  </div>
4969
- `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input" }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DividerComponent, selector: "val-divider", inputs: ["props"] }, { kind: "component", type: HintComponent, selector: "val-hint", inputs: ["props"] }, { kind: "component", type: CommentInputComponent, selector: "val-comment-input", inputs: ["props"] }, { kind: "component", type: DateInputComponent, selector: "val-date-input", inputs: ["props"] }, { kind: "component", type: FileInputComponent, selector: "val-file-input", inputs: ["props"] }, { kind: "component", type: HourInputComponent, selector: "val-hour-input", inputs: ["props"] }, { kind: "component", type: EmailInputComponent, selector: "val-email-input", inputs: ["props"] }, { kind: "component", type: NumberInputComponent, selector: "val-number-input", inputs: ["props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: PasswordInputComponent, selector: "val-password-input", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: SelectSearchComponent, selector: "val-select-search", inputs: ["label", "labelProperty", "valueProperty", "multiple", "placeholder", "props"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["props"] }] }); }
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"] }] }); }
4970
5215
  }
4971
5216
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormComponent, decorators: [{
4972
5217
  type: Component,
@@ -5057,7 +5302,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
5057
5302
  </form>
5058
5303
  </div>
5059
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"] }]
5060
- }], ctorParameters: () => [{ type: i1$1.FormBuilder }, { type: i0.ElementRef }], propDecorators: { props: [{
5305
+ }], ctorParameters: () => [{ type: i1$2.FormBuilder }, { type: i0.ElementRef }], propDecorators: { props: [{
5061
5306
  type: Input
5062
5307
  }], onSubmit: [{
5063
5308
  type: Output
@@ -6259,905 +6504,142 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
6259
6504
  }] });
6260
6505
 
6261
6506
  /**
6262
- * Comprehensive example demonstrating global content usage.
6263
- *
6264
- * This component shows:
6265
- * 1. Global button texts
6266
- * 2. Global state messages
6267
- * 3. Global confirmations with interpolation
6268
- * 4. Mixing global and component-specific content
6269
- * 5. Language switching
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
+ * ```
6270
6516
  */
6271
- class GlobalContentExampleComponent {
6517
+ class LinkProcessingExampleComponent {
6272
6518
  constructor() {
6273
- this.content = inject(ContentService);
6274
- this.componentContent = this.content.forComponent('GlobalContentExample');
6275
- // Form data
6276
- this.formData = {
6277
- name: '',
6278
- email: '',
6279
- message: '',
6280
- };
6281
- // Action state
6282
- this.actionPerformed = false;
6283
- // Component-specific content properties
6284
- this.titleProps = {
6285
- contentKey: 'title',
6286
- contentClass: 'GlobalContentExample',
6287
- contentFallback: 'Global Content Example',
6288
- color: 'primary',
6289
- size: 'xlarge',
6290
- bold: true,
6291
- };
6292
- this.languageLabel = {
6293
- contentKey: 'languageLabel',
6294
- contentClass: 'GlobalContentExample',
6295
- contentFallback: 'Language:',
6296
- color: 'medium',
6519
+ this.basicTextProps = {
6520
+ content: 'Este texto contiene https://angular.io y /dashboard pero no se procesan como enlaces.',
6297
6521
  size: 'medium',
6298
- bold: true,
6522
+ color: 'dark',
6523
+ bold: false,
6524
+ processLinks: false,
6299
6525
  };
6300
- this.componentDescriptionProps = {
6301
- contentKey: 'description',
6302
- contentClass: 'GlobalContentExample',
6303
- 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',
6304
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',
6305
6535
  size: 'medium',
6536
+ color: 'dark',
6306
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
+ },
6307
6546
  };
6308
- // Global button content (reactive)
6309
- this.saveButton$ = this.content.fromContent({ key: 'save' });
6310
- this.editButton$ = this.content.fromContent({ key: 'edit' });
6311
- this.deleteButton$ = this.content.fromContent({ key: 'delete' });
6312
- this.cancelButton$ = this.content.fromContent({ key: 'cancel' });
6313
- this.backButton$ = this.content.fromContent({ key: 'back' });
6314
- this.nextButton$ = this.content.fromContent({ key: 'next' });
6315
- this.okButton$ = this.content.fromContent({ key: 'ok' });
6316
- this.closeButton$ = this.content.fromContent({ key: 'close' });
6317
- // Global action content
6318
- this.addButton$ = this.content.fromContent({ key: 'add' });
6319
- this.removeButton$ = this.content.fromContent({ key: 'remove' });
6320
- this.searchButton$ = this.content.fromContent({ key: 'search' });
6321
- this.filterButton$ = this.content.fromContent({ key: 'filter' });
6322
- this.sortButton$ = this.content.fromContent({ key: 'sort' });
6323
- this.refreshButton$ = this.content.fromContent({ key: 'refresh' });
6324
- // Global state content
6325
- this.loadingText$ = this.content.fromContent({ key: 'loading' });
6326
- this.successText$ = this.content.fromContent({ key: 'success' });
6327
- this.errorText$ = this.content.fromContent({ key: 'error' });
6328
- this.warningText$ = this.content.fromContent({ key: 'warning' });
6329
- this.infoText$ = this.content.fromContent({ key: 'info' });
6330
- this.noDataText$ = this.content.fromContent({ key: 'noData' });
6331
- // Global form content
6332
- this.requiredText$ = this.content.fromContent({ key: 'required' });
6333
- this.optionalText$ = this.content.fromContent({ key: 'optional' });
6334
- this.searchPlaceholder$ = this.content.fromContent({ key: 'searchPlaceholder' });
6335
- // Global confirmation content with interpolation
6336
- this.deleteConfirmation$ = this.content.fromContentWithInterpolation({
6337
- key: 'deleteConfirmation',
6338
- interpolation: { itemName: 'este registro' },
6339
- });
6340
- this.areYouSureText$ = this.content.fromContent({ key: 'areYouSure' });
6341
- this.unsavedChangesText$ = this.content.fromContent({ key: 'unsavedChanges' });
6342
- }
6343
- /**
6344
- * Set language
6345
- */
6346
- setLanguage(lang) {
6347
- this.content.setLang(lang);
6348
- }
6349
- /**
6350
- * Perform an action to demonstrate status messages
6351
- */
6352
- performAction() {
6353
- this.actionPerformed = true;
6354
- setTimeout(() => {
6355
- this.actionPerformed = false;
6356
- }, 3000);
6357
- }
6358
- /**
6359
- * Cancel action
6360
- */
6361
- cancelAction() {
6362
- this.formData = { name: '', email: '', message: '' };
6363
- this.actionPerformed = false;
6364
- }
6365
- /**
6366
- * Example of synchronous global content access
6367
- */
6368
- getOkTextSync() {
6369
- return this.content.getGlobalText('ok');
6370
- }
6371
- /**
6372
- * Example of synchronous global content access using getText
6373
- */
6374
- getCancelTextSync() {
6375
- return this.content.getText('cancel');
6376
- }
6377
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GlobalContentExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6378
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: GlobalContentExampleComponent, isStandalone: true, selector: "val-global-content-example", ngImport: i0, template: `
6379
- <ion-card>
6380
- <ion-card-header>
6381
- <ion-card-title>
6382
- <val-text [props]="titleProps"></val-text>
6383
- </ion-card-title>
6384
- </ion-card-header>
6385
-
6386
- <ion-card-content>
6387
- <!-- Language switcher -->
6388
- <div class="language-section">
6389
- <val-text [props]="languageLabel"></val-text>
6390
- <ion-button fill="outline" size="small" (click)="setLanguage('es')"> Español </ion-button>
6391
- <ion-button fill="outline" size="small" (click)="setLanguage('en')"> English </ion-button>
6392
- </div>
6393
-
6394
- <div class="divider"></div>
6395
-
6396
- <!-- Global buttons demonstration -->
6397
- <div class="section">
6398
- <h3>Global Buttons</h3>
6399
- <div class="button-grid">
6400
- <ion-button color="primary">{{ saveButton$ | async }}</ion-button>
6401
- <ion-button color="secondary">{{ editButton$ | async }}</ion-button>
6402
- <ion-button color="danger">{{ deleteButton$ | async }}</ion-button>
6403
- <ion-button fill="outline">{{ cancelButton$ | async }}</ion-button>
6404
- <ion-button fill="outline">{{ backButton$ | async }}</ion-button>
6405
- <ion-button fill="outline">{{ nextButton$ | async }}</ion-button>
6406
- <ion-button color="success">{{ okButton$ | async }}</ion-button>
6407
- <ion-button fill="clear">{{ closeButton$ | async }}</ion-button>
6408
- </div>
6409
- </div>
6410
-
6411
- <div class="divider"></div>
6412
-
6413
- <!-- Global actions demonstration -->
6414
- <div class="section">
6415
- <h3>Global Actions</h3>
6416
- <div class="button-grid">
6417
- <ion-button size="small">{{ addButton$ | async }}</ion-button>
6418
- <ion-button size="small">{{ removeButton$ | async }}</ion-button>
6419
- <ion-button size="small">{{ searchButton$ | async }}</ion-button>
6420
- <ion-button size="small">{{ filterButton$ | async }}</ion-button>
6421
- <ion-button size="small">{{ sortButton$ | async }}</ion-button>
6422
- <ion-button size="small">{{ refreshButton$ | async }}</ion-button>
6423
- </div>
6424
- </div>
6425
-
6426
- <div class="divider"></div>
6427
-
6428
- <!-- Global states demonstration -->
6429
- <div class="section">
6430
- <h3>Global States</h3>
6431
- <div class="state-messages">
6432
- <div class="state-item loading">
6433
- <val-text
6434
- [props]="{ content: loadingText$ | async, color: 'medium', size: 'small', bold: false }"
6435
- ></val-text>
6436
- </div>
6437
- <div class="state-item success">
6438
- <val-text
6439
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6440
- ></val-text>
6441
- </div>
6442
- <div class="state-item error">
6443
- <val-text
6444
- [props]="{ content: errorText$ | async, color: 'danger', size: 'small', bold: false }"
6445
- ></val-text>
6446
- </div>
6447
- <div class="state-item warning">
6448
- <val-text
6449
- [props]="{ content: warningText$ | async, color: 'warning', size: 'small', bold: false }"
6450
- ></val-text>
6451
- </div>
6452
- <div class="state-item info">
6453
- <val-text
6454
- [props]="{ content: infoText$ | async, color: 'primary', size: 'small', bold: false }"
6455
- ></val-text>
6456
- </div>
6457
- <div class="state-item no-data">
6458
- <val-text
6459
- [props]="{ content: noDataText$ | async, color: 'medium', size: 'small', bold: false }"
6460
- ></val-text>
6461
- </div>
6462
- </div>
6463
- </div>
6464
-
6465
- <div class="divider"></div>
6466
-
6467
- <!-- Form with global placeholders and labels -->
6468
- <div class="section">
6469
- <h3>Form with Global Content</h3>
6470
- <form class="example-form">
6471
- <ion-item>
6472
- <ion-label position="stacked">Name ({{ requiredText$ | async }})</ion-label>
6473
- <ion-input [(ngModel)]="formData.name" [placeholder]="'Enter your name' + '...'" name="name"> </ion-input>
6474
- </ion-item>
6475
-
6476
- <ion-item>
6477
- <ion-label position="stacked">Email ({{ optionalText$ | async }})</ion-label>
6478
- <ion-input [(ngModel)]="formData.email" [placeholder]="'Enter your email' + '...'" name="email">
6479
- </ion-input>
6480
- </ion-item>
6481
-
6482
- <ion-item>
6483
- <ion-label position="stacked">Message</ion-label>
6484
- <ion-textarea [(ngModel)]="formData.message" [placeholder]="searchPlaceholder$ | async" name="message">
6485
- </ion-textarea>
6486
- </ion-item>
6487
- </form>
6488
- </div>
6489
-
6490
- <div class="divider"></div>
6491
-
6492
- <!-- Global confirmations with interpolation -->
6493
- <div class="section">
6494
- <h3>Confirmations with Interpolation</h3>
6495
- <div class="confirmation-examples">
6496
- <p><strong>Delete Confirmation:</strong></p>
6497
- <val-text
6498
- [props]="{ content: deleteConfirmation$ | async, color: 'danger', size: 'medium', bold: false }"
6499
- ></val-text>
6500
-
6501
- <br /><br />
6502
- <p><strong>General Confirmation:</strong></p>
6503
- <val-text
6504
- [props]="{ content: areYouSureText$ | async, color: 'warning', size: 'medium', bold: false }"
6505
- ></val-text>
6506
-
6507
- <br /><br />
6508
- <p><strong>Unsaved Changes:</strong></p>
6509
- <val-text
6510
- [props]="{ content: unsavedChangesText$ | async, color: 'medium', size: 'medium', bold: false }"
6511
- ></val-text>
6512
- </div>
6513
- </div>
6514
-
6515
- <div class="divider"></div>
6516
-
6517
- <!-- Mixed content: Global + Component specific -->
6518
- <div class="section">
6519
- <h3>Mixed Content Example</h3>
6520
- <div class="mixed-content">
6521
- <!-- Component-specific content -->
6522
- <val-text [props]="componentDescriptionProps"></val-text>
6523
-
6524
- <br /><br />
6525
-
6526
- <!-- Action buttons mixing global and component content -->
6527
- <div class="action-buttons">
6528
- <ion-button color="primary" (click)="performAction()">
6529
- {{ saveButton$ | async }}
6530
- </ion-button>
6531
- <ion-button fill="outline" (click)="cancelAction()">
6532
- {{ cancelButton$ | async }}
6533
- </ion-button>
6534
- </div>
6535
-
6536
- <!-- Status message using global content -->
6537
- <div *ngIf="actionPerformed" class="status-message">
6538
- <val-text
6539
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6540
- ></val-text>
6541
- </div>
6542
- </div>
6543
- </div>
6544
-
6545
- <!-- Demo of synchronous global content access -->
6546
- <div class="section">
6547
- <h3>Synchronous Access Example</h3>
6548
- <p>
6549
- OK button text (sync): <strong>{{ getOkTextSync() }}</strong>
6550
- </p>
6551
- <p>
6552
- Cancel button text (sync): <strong>{{ getCancelTextSync() }}</strong>
6553
- </p>
6554
- </div>
6555
- </ion-card-content>
6556
- </ion-card>
6557
- `, isInline: true, styles: [".language-section{display:flex;align-items:center;gap:8px;margin-bottom:16px}.divider{height:1px;background-color:var(--ion-color-light);margin:16px 0}.section{margin-bottom:16px}.section h3{margin:0 0 12px;color:var(--ion-color-primary)}.button-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}.state-messages{display:flex;flex-direction:column;gap:8px}.state-item{padding:8px;border-radius:4px;background-color:var(--ion-color-light-shade)}.state-item.loading{background-color:var(--ion-color-medium-tint)}.state-item.success{background-color:var(--ion-color-success-tint)}.state-item.error{background-color:var(--ion-color-danger-tint)}.state-item.warning{background-color:var(--ion-color-warning-tint)}.state-item.info{background-color:var(--ion-color-primary-tint)}.example-form{margin-top:12px}.confirmation-examples{padding:12px;background-color:var(--ion-color-light-tint);border-radius:8px}.mixed-content{padding:12px;background-color:var(--ion-color-light-shade);border-radius:8px}.action-buttons{display:flex;gap:8px;margin:12px 0}.status-message{padding:8px;background-color:var(--ion-color-success-tint);border-radius:4px;margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
6558
- }
6559
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GlobalContentExampleComponent, decorators: [{
6560
- type: Component,
6561
- args: [{ selector: 'val-global-content-example', standalone: true, imports: [
6562
- CommonModule,
6563
- FormsModule,
6564
- IonCard,
6565
- IonCardContent,
6566
- IonCardHeader,
6567
- IonCardTitle,
6568
- IonButton,
6569
- IonItem,
6570
- IonLabel,
6571
- IonInput,
6572
- IonTextarea,
6573
- TextComponent,
6574
- ], template: `
6575
- <ion-card>
6576
- <ion-card-header>
6577
- <ion-card-title>
6578
- <val-text [props]="titleProps"></val-text>
6579
- </ion-card-title>
6580
- </ion-card-header>
6581
-
6582
- <ion-card-content>
6583
- <!-- Language switcher -->
6584
- <div class="language-section">
6585
- <val-text [props]="languageLabel"></val-text>
6586
- <ion-button fill="outline" size="small" (click)="setLanguage('es')"> Español </ion-button>
6587
- <ion-button fill="outline" size="small" (click)="setLanguage('en')"> English </ion-button>
6588
- </div>
6589
-
6590
- <div class="divider"></div>
6591
-
6592
- <!-- Global buttons demonstration -->
6593
- <div class="section">
6594
- <h3>Global Buttons</h3>
6595
- <div class="button-grid">
6596
- <ion-button color="primary">{{ saveButton$ | async }}</ion-button>
6597
- <ion-button color="secondary">{{ editButton$ | async }}</ion-button>
6598
- <ion-button color="danger">{{ deleteButton$ | async }}</ion-button>
6599
- <ion-button fill="outline">{{ cancelButton$ | async }}</ion-button>
6600
- <ion-button fill="outline">{{ backButton$ | async }}</ion-button>
6601
- <ion-button fill="outline">{{ nextButton$ | async }}</ion-button>
6602
- <ion-button color="success">{{ okButton$ | async }}</ion-button>
6603
- <ion-button fill="clear">{{ closeButton$ | async }}</ion-button>
6604
- </div>
6605
- </div>
6606
-
6607
- <div class="divider"></div>
6608
-
6609
- <!-- Global actions demonstration -->
6610
- <div class="section">
6611
- <h3>Global Actions</h3>
6612
- <div class="button-grid">
6613
- <ion-button size="small">{{ addButton$ | async }}</ion-button>
6614
- <ion-button size="small">{{ removeButton$ | async }}</ion-button>
6615
- <ion-button size="small">{{ searchButton$ | async }}</ion-button>
6616
- <ion-button size="small">{{ filterButton$ | async }}</ion-button>
6617
- <ion-button size="small">{{ sortButton$ | async }}</ion-button>
6618
- <ion-button size="small">{{ refreshButton$ | async }}</ion-button>
6619
- </div>
6620
- </div>
6621
-
6622
- <div class="divider"></div>
6623
-
6624
- <!-- Global states demonstration -->
6625
- <div class="section">
6626
- <h3>Global States</h3>
6627
- <div class="state-messages">
6628
- <div class="state-item loading">
6629
- <val-text
6630
- [props]="{ content: loadingText$ | async, color: 'medium', size: 'small', bold: false }"
6631
- ></val-text>
6632
- </div>
6633
- <div class="state-item success">
6634
- <val-text
6635
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6636
- ></val-text>
6637
- </div>
6638
- <div class="state-item error">
6639
- <val-text
6640
- [props]="{ content: errorText$ | async, color: 'danger', size: 'small', bold: false }"
6641
- ></val-text>
6642
- </div>
6643
- <div class="state-item warning">
6644
- <val-text
6645
- [props]="{ content: warningText$ | async, color: 'warning', size: 'small', bold: false }"
6646
- ></val-text>
6647
- </div>
6648
- <div class="state-item info">
6649
- <val-text
6650
- [props]="{ content: infoText$ | async, color: 'primary', size: 'small', bold: false }"
6651
- ></val-text>
6652
- </div>
6653
- <div class="state-item no-data">
6654
- <val-text
6655
- [props]="{ content: noDataText$ | async, color: 'medium', size: 'small', bold: false }"
6656
- ></val-text>
6657
- </div>
6658
- </div>
6659
- </div>
6660
-
6661
- <div class="divider"></div>
6662
-
6663
- <!-- Form with global placeholders and labels -->
6664
- <div class="section">
6665
- <h3>Form with Global Content</h3>
6666
- <form class="example-form">
6667
- <ion-item>
6668
- <ion-label position="stacked">Name ({{ requiredText$ | async }})</ion-label>
6669
- <ion-input [(ngModel)]="formData.name" [placeholder]="'Enter your name' + '...'" name="name"> </ion-input>
6670
- </ion-item>
6671
-
6672
- <ion-item>
6673
- <ion-label position="stacked">Email ({{ optionalText$ | async }})</ion-label>
6674
- <ion-input [(ngModel)]="formData.email" [placeholder]="'Enter your email' + '...'" name="email">
6675
- </ion-input>
6676
- </ion-item>
6677
-
6678
- <ion-item>
6679
- <ion-label position="stacked">Message</ion-label>
6680
- <ion-textarea [(ngModel)]="formData.message" [placeholder]="searchPlaceholder$ | async" name="message">
6681
- </ion-textarea>
6682
- </ion-item>
6683
- </form>
6684
- </div>
6685
-
6686
- <div class="divider"></div>
6687
-
6688
- <!-- Global confirmations with interpolation -->
6689
- <div class="section">
6690
- <h3>Confirmations with Interpolation</h3>
6691
- <div class="confirmation-examples">
6692
- <p><strong>Delete Confirmation:</strong></p>
6693
- <val-text
6694
- [props]="{ content: deleteConfirmation$ | async, color: 'danger', size: 'medium', bold: false }"
6695
- ></val-text>
6696
-
6697
- <br /><br />
6698
- <p><strong>General Confirmation:</strong></p>
6699
- <val-text
6700
- [props]="{ content: areYouSureText$ | async, color: 'warning', size: 'medium', bold: false }"
6701
- ></val-text>
6702
-
6703
- <br /><br />
6704
- <p><strong>Unsaved Changes:</strong></p>
6705
- <val-text
6706
- [props]="{ content: unsavedChangesText$ | async, color: 'medium', size: 'medium', bold: false }"
6707
- ></val-text>
6708
- </div>
6709
- </div>
6710
-
6711
- <div class="divider"></div>
6712
-
6713
- <!-- Mixed content: Global + Component specific -->
6714
- <div class="section">
6715
- <h3>Mixed Content Example</h3>
6716
- <div class="mixed-content">
6717
- <!-- Component-specific content -->
6718
- <val-text [props]="componentDescriptionProps"></val-text>
6719
-
6720
- <br /><br />
6721
-
6722
- <!-- Action buttons mixing global and component content -->
6723
- <div class="action-buttons">
6724
- <ion-button color="primary" (click)="performAction()">
6725
- {{ saveButton$ | async }}
6726
- </ion-button>
6727
- <ion-button fill="outline" (click)="cancelAction()">
6728
- {{ cancelButton$ | async }}
6729
- </ion-button>
6730
- </div>
6731
-
6732
- <!-- Status message using global content -->
6733
- <div *ngIf="actionPerformed" class="status-message">
6734
- <val-text
6735
- [props]="{ content: successText$ | async, color: 'success', size: 'small', bold: false }"
6736
- ></val-text>
6737
- </div>
6738
- </div>
6739
- </div>
6740
-
6741
- <!-- Demo of synchronous global content access -->
6742
- <div class="section">
6743
- <h3>Synchronous Access Example</h3>
6744
- <p>
6745
- OK button text (sync): <strong>{{ getOkTextSync() }}</strong>
6746
- </p>
6747
- <p>
6748
- Cancel button text (sync): <strong>{{ getCancelTextSync() }}</strong>
6749
- </p>
6750
- </div>
6751
- </ion-card-content>
6752
- </ion-card>
6753
- `, styles: [".language-section{display:flex;align-items:center;gap:8px;margin-bottom:16px}.divider{height:1px;background-color:var(--ion-color-light);margin:16px 0}.section{margin-bottom:16px}.section h3{margin:0 0 12px;color:var(--ion-color-primary)}.button-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}.state-messages{display:flex;flex-direction:column;gap:8px}.state-item{padding:8px;border-radius:4px;background-color:var(--ion-color-light-shade)}.state-item.loading{background-color:var(--ion-color-medium-tint)}.state-item.success{background-color:var(--ion-color-success-tint)}.state-item.error{background-color:var(--ion-color-danger-tint)}.state-item.warning{background-color:var(--ion-color-warning-tint)}.state-item.info{background-color:var(--ion-color-primary-tint)}.example-form{margin-top:12px}.confirmation-examples{padding:12px;background-color:var(--ion-color-light-tint);border-radius:8px}.mixed-content{padding:12px;background-color:var(--ion-color-light-shade);border-radius:8px}.action-buttons{display:flex;gap:8px;margin:12px 0}.status-message{padding:8px;background-color:var(--ion-color-success-tint);border-radius:4px;margin-top:8px}\n"] }]
6754
- }] });
6755
-
6756
- /**
6757
- * Reactive Content Example Component
6758
- *
6759
- * This component demonstrates various ways to use the new reactive content system with ContentService:
6760
- * 1. Direct reactive content binding with val-text
6761
- * 2. Content with interpolation (dynamic values)
6762
- * 3. Multiple content keys retrieved at once
6763
- * 4. Using the scoped content helper (forComponent)
6764
- * 5. Language switching functionality
6765
- *
6766
- * The component automatically updates all text when the language changes,
6767
- * using the simplified ContentService API that eliminates the need for manual
6768
- * LangService injection and utility function imports.
6769
- *
6770
- * @example Usage patterns:
6771
- * ```typescript
6772
- * // Simple injection
6773
- * content = inject(ContentService);
6774
- *
6775
- * // Scoped helper for this component
6776
- * componentContent = this.content.forComponent('MyComponent');
6777
- *
6778
- * // Get reactive content
6779
- * title$ = this.componentContent.get('title');
6780
- * multipleTexts$ = this.componentContent.getMultiple(['title', 'subtitle']);
6781
- * ```
6782
- * without requiring manual subscriptions or change detection triggers.
6783
- */
6784
- class ReactiveContentExampleComponent {
6785
- constructor() {
6786
- // Use the new ContentService with inject
6787
- this.content = inject(ContentService);
6788
- // Create a scoped content helper for this component
6789
- this.componentContent = this.content.forComponent('ReactiveContentExample');
6790
- // State for confirmation dialog
6791
- this.showConfirmation = false;
6792
- // Example 1: Simple reactive content props for val-text
6793
- this.titleProps = {
6794
- contentKey: 'title',
6795
- contentClass: 'ReactiveContentExample',
6796
- contentFallback: 'Default Title',
6797
- color: 'primary',
6798
- size: 'xlarge',
6799
- bold: true,
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
+ },
6800
6560
  };
6801
- // Example 2: Reactive content with interpolation
6802
- this.greetingProps = {
6803
- contentKey: 'greeting',
6804
- contentClass: 'ReactiveContentExample',
6805
- contentInterpolation: { name: 'Developer', count: 3 },
6806
- contentFallback: 'Hello Developer',
6807
- color: 'secondary',
6808
- size: 'large',
6561
+ this.sameTabLinksProps = {
6562
+ content: 'Estos enlaces no abren en nueva pestaña: https://example.com y /home',
6563
+ size: 'medium',
6564
+ color: 'dark',
6809
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
+ },
6810
6574
  };
6811
6575
  }
6812
- ngOnInit() {
6813
- // Set up reactive observables using ContentService
6814
- this.currentLanguage$ = this.content.currentLang$;
6815
- // Example 3: Get multiple content keys reactively - using the new API
6816
- this.multipleContent$ = this.componentContent.getMultiple(['description', 'dynamicText']);
6817
- // Button text reactive - using the new simplified API with options
6818
- this.buttonText$ = this.componentContent.get('buttonText');
6819
- // Global content observables using unified fromContent method
6820
- this.saveButton$ = this.content.fromContent({ key: 'save' });
6821
- this.cancelButton$ = this.content.fromContent({ key: 'cancel' });
6822
- this.deleteButton$ = this.content.fromContent({ key: 'delete' });
6823
- this.okButton$ = this.content.fromContent({ key: 'ok' });
6824
- this.loadingText$ = this.content.fromContent({ key: 'loading' });
6825
- // Global content with interpolation using unified method
6826
- this.deleteConfirmationText$ = this.content.fromContent({
6827
- key: 'deleteConfirmation',
6828
- interpolation: { itemName: 'este elemento' },
6829
- });
6830
- // Example of synchronous global content access
6831
- console.log('Global save text:', this.content.getText('save'));
6832
- console.log('Global cancel text:', this.content.getGlobalText('cancel'));
6833
- // Example of using new scoped helper with interpolation
6834
- const greetingWithNewAPI$ = this.componentContent.get('greeting', {
6835
- interpolation: { name: 'Developer', count: 3 },
6836
- fallback: 'Hello!',
6837
- });
6838
- console.log('New unified API works!', greetingWithNewAPI$);
6839
- }
6840
- /**
6841
- * Toggle between Spanish and English
6842
- */
6843
- toggleLanguage() {
6844
- const currentLang = this.content.currentLang;
6845
- const newLang = currentLang === LangOption.ES ? LangOption.EN : LangOption.ES;
6846
- this.content.setLang(newLang);
6847
- }
6848
- /**
6849
- * Show delete confirmation dialog
6850
- */
6851
- showDeleteConfirmation() {
6852
- this.showConfirmation = true;
6853
- }
6854
- /**
6855
- * Hide delete confirmation dialog
6856
- */
6857
- hideDeleteConfirmation() {
6858
- this.showConfirmation = false;
6859
- }
6860
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactiveContentExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6861
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReactiveContentExampleComponent, isStandalone: true, selector: "val-reactive-content-example", ngImport: i0, template: `
6862
- <ion-card>
6863
- <ion-card-header>
6864
- <ion-card-title>
6865
- <!-- Example 1: Direct reactive content using val-text -->
6866
- <val-text [props]="titleProps"></val-text>
6867
- </ion-card-title>
6868
- </ion-card-header>
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>
6869
6580
 
6870
- <ion-card-content>
6871
- <!-- Example 2: Reactive content with interpolation -->
6872
- <val-text [props]="greetingProps"></val-text>
6873
-
6874
- <div class="example-divider"></div>
6875
-
6876
- <!-- Example 3: Multiple content keys -->
6877
- <div *ngIf="multipleContent$ | async as content">
6878
- <val-text
6879
- [props]="{
6880
- content: content['description'],
6881
- color: 'medium',
6882
- size: 'medium',
6883
- bold: false,
6884
- }"
6885
- ></val-text>
6886
-
6887
- <br /><br />
6888
-
6889
- <val-text
6890
- [props]="{
6891
- content: content['dynamicText'],
6892
- color: 'primary',
6893
- size: 'small',
6894
- bold: true,
6895
- }"
6896
- ></val-text>
6897
- </div>
6898
-
6899
- <div class="example-divider"></div>
6900
-
6901
- <!-- Example 4: Using content helper -->
6902
- <val-text
6903
- [props]="{
6904
- content: componentContent.getText('welcomeMessage'),
6905
- color: 'success',
6906
- size: 'large',
6907
- bold: true,
6908
- }"
6909
- ></val-text>
6910
-
6911
- <div class="example-divider"></div>
6912
-
6913
- <!-- Example 5: Global content - buttons using global text -->
6914
- <div class="button-group">
6915
- <ion-button [fill]="'solid'" [color]="'primary'">
6916
- {{ saveButton$ | async }}
6917
- </ion-button>
6918
- <ion-button [fill]="'outline'" [color]="'secondary'">
6919
- {{ cancelButton$ | async }}
6920
- </ion-button>
6921
- <ion-button [fill]="'outline'" [color]="'danger'" (click)="showDeleteConfirmation()">
6922
- {{ deleteButton$ | async }}
6923
- </ion-button>
6924
- </div>
6925
-
6926
- <div class="example-divider"></div>
6927
-
6928
- <!-- Example 6: Global content with interpolation -->
6929
- <div *ngIf="showConfirmation" class="confirmation-message">
6930
- <val-text
6931
- [props]="{
6932
- content: deleteConfirmationText$ | async,
6933
- color: 'warning',
6934
- size: 'medium',
6935
- bold: true,
6936
- }"
6937
- ></val-text>
6938
- <br /><br />
6939
- <ion-button [fill]="'solid'" [color]="'danger'" size="small" (click)="hideDeleteConfirmation()">
6940
- {{ okButton$ | async }}
6941
- </ion-button>
6942
- <ion-button [fill]="'clear'" [color]="'medium'" size="small" (click)="hideDeleteConfirmation()">
6943
- {{ cancelButton$ | async }}
6944
- </ion-button>
6945
- </div>
6581
+ <div class="example-section">
6582
+ <h3>Texto sin procesamiento de enlaces:</h3>
6583
+ <val-text [props]="basicTextProps"></val-text>
6584
+ </div>
6946
6585
 
6947
- <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>
6948
6590
 
6949
- <!-- Example 7: Language switching button -->
6950
- <ion-button expand="block" fill="outline" color="tertiary" (click)="toggleLanguage()">
6951
- {{ buttonText$ | async }}
6952
- </ion-button>
6591
+ <div class="example-section">
6592
+ <h3>Enlaces con configuración personalizada:</h3>
6593
+ <val-text [props]="customLinksProps"></val-text>
6594
+ </div>
6953
6595
 
6954
- <!-- Example 8: Current language display -->
6955
- <div class="language-info">
6956
- <p>
6957
- Current language:
6958
- <strong>{{ currentLanguage$ | async }}</strong>
6959
- </p>
6596
+ <div class="example-section">
6597
+ <h3>Enlaces internos y externos mezclados:</h3>
6598
+ <val-text [props]="mixedLinksProps"></val-text>
6599
+ </div>
6960
6600
 
6961
- <!-- Example of mixed global and component content -->
6962
- <p>
6963
- <val-text
6964
- [props]="{
6965
- content: loadingText$ | async,
6966
- color: 'medium',
6967
- size: 'small',
6968
- bold: false,
6969
- }"
6970
- ></val-text>
6971
- </p>
6972
- </div>
6973
- </ion-card-content>
6974
- </ion-card>
6975
- `, isInline: true, styles: [":host{display:block;margin:16px}.example-divider{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.language-info{margin-top:24px;padding:16px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.language-info p{margin:0;color:var(--ion-color-dark)}.language-info strong{color:var(--ion-color-primary);text-transform:uppercase}ion-card{margin:0;border-radius:12px;box-shadow:0 4px 16px #0000001a}ion-card-header{padding-bottom:8px}ion-card-title{font-size:1.5rem;font-weight:600}ion-card-content{padding-top:16px}ion-button{margin:16px 0;--border-radius: 8px}ion-card-content{padding:20px}.language-info{margin-top:16px;padding:12px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.content-section{margin:16px 0;padding:12px;border:1px solid var(--ion-color-light);border-radius:8px}.content-section h3{margin-top:0;color:var(--ion-color-primary)}.example-divider{margin:24px 0;height:1px;background-color:var(--ion-color-light)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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"] }] }); }
6976
6607
  }
6977
- 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: [{
6978
6609
  type: Component,
6979
- args: [{ selector: 'val-reactive-content-example', standalone: true, imports: [AsyncPipe, NgIf, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonButton, TextComponent], template: `
6980
- <ion-card>
6981
- <ion-card-header>
6982
- <ion-card-title>
6983
- <!-- Example 1: Direct reactive content using val-text -->
6984
- <val-text [props]="titleProps"></val-text>
6985
- </ion-card-title>
6986
- </ion-card-header>
6987
-
6988
- <ion-card-content>
6989
- <!-- Example 2: Reactive content with interpolation -->
6990
- <val-text [props]="greetingProps"></val-text>
6991
-
6992
- <div class="example-divider"></div>
6993
-
6994
- <!-- Example 3: Multiple content keys -->
6995
- <div *ngIf="multipleContent$ | async as content">
6996
- <val-text
6997
- [props]="{
6998
- content: content['description'],
6999
- color: 'medium',
7000
- size: 'medium',
7001
- bold: false,
7002
- }"
7003
- ></val-text>
7004
-
7005
- <br /><br />
7006
-
7007
- <val-text
7008
- [props]="{
7009
- content: content['dynamicText'],
7010
- color: 'primary',
7011
- size: 'small',
7012
- bold: true,
7013
- }"
7014
- ></val-text>
7015
- </div>
7016
-
7017
- <div class="example-divider"></div>
7018
-
7019
- <!-- Example 4: Using content helper -->
7020
- <val-text
7021
- [props]="{
7022
- content: componentContent.getText('welcomeMessage'),
7023
- color: 'success',
7024
- size: 'large',
7025
- bold: true,
7026
- }"
7027
- ></val-text>
7028
-
7029
- <div class="example-divider"></div>
7030
-
7031
- <!-- Example 5: Global content - buttons using global text -->
7032
- <div class="button-group">
7033
- <ion-button [fill]="'solid'" [color]="'primary'">
7034
- {{ saveButton$ | async }}
7035
- </ion-button>
7036
- <ion-button [fill]="'outline'" [color]="'secondary'">
7037
- {{ cancelButton$ | async }}
7038
- </ion-button>
7039
- <ion-button [fill]="'outline'" [color]="'danger'" (click)="showDeleteConfirmation()">
7040
- {{ deleteButton$ | async }}
7041
- </ion-button>
7042
- </div>
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>
7043
6613
 
7044
- <div class="example-divider"></div>
7045
-
7046
- <!-- Example 6: Global content with interpolation -->
7047
- <div *ngIf="showConfirmation" class="confirmation-message">
7048
- <val-text
7049
- [props]="{
7050
- content: deleteConfirmationText$ | async,
7051
- color: 'warning',
7052
- size: 'medium',
7053
- bold: true,
7054
- }"
7055
- ></val-text>
7056
- <br /><br />
7057
- <ion-button [fill]="'solid'" [color]="'danger'" size="small" (click)="hideDeleteConfirmation()">
7058
- {{ okButton$ | async }}
7059
- </ion-button>
7060
- <ion-button [fill]="'clear'" [color]="'medium'" size="small" (click)="hideDeleteConfirmation()">
7061
- {{ cancelButton$ | async }}
7062
- </ion-button>
7063
- </div>
7064
-
7065
- <div class="example-divider"></div>
7066
-
7067
- <!-- Example 7: Language switching button -->
7068
- <ion-button expand="block" fill="outline" color="tertiary" (click)="toggleLanguage()">
7069
- {{ buttonText$ | async }}
7070
- </ion-button>
6614
+ <div class="example-section">
6615
+ <h3>Texto sin procesamiento de enlaces:</h3>
6616
+ <val-text [props]="basicTextProps"></val-text>
6617
+ </div>
7071
6618
 
7072
- <!-- Example 8: Current language display -->
7073
- <div class="language-info">
7074
- <p>
7075
- Current language:
7076
- <strong>{{ currentLanguage$ | async }}</strong>
7077
- </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>
7078
6623
 
7079
- <!-- Example of mixed global and component content -->
7080
- <p>
7081
- <val-text
7082
- [props]="{
7083
- content: loadingText$ | async,
7084
- color: 'medium',
7085
- size: 'small',
7086
- bold: false,
7087
- }"
7088
- ></val-text>
7089
- </p>
7090
- </div>
7091
- </ion-card-content>
7092
- </ion-card>
7093
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;margin:16px}.example-divider{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.language-info{margin-top:24px;padding:16px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.language-info p{margin:0;color:var(--ion-color-dark)}.language-info strong{color:var(--ion-color-primary);text-transform:uppercase}ion-card{margin:0;border-radius:12px;box-shadow:0 4px 16px #0000001a}ion-card-header{padding-bottom:8px}ion-card-title{font-size:1.5rem;font-weight:600}ion-card-content{padding-top:16px}ion-button{margin:16px 0;--border-radius: 8px}ion-card-content{padding:20px}.language-info{margin-top:16px;padding:12px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.content-section{margin:16px 0;padding:12px;border:1px solid var(--ion-color-light);border-radius:8px}.content-section h3{margin-top:0;color:var(--ion-color-primary)}.example-divider{margin:24px 0;height:1px;background-color:var(--ion-color-light)}\n"] }]
7094
- }], ctorParameters: () => [] });
6624
+ <div class="example-section">
6625
+ <h3>Enlaces con configuración personalizada:</h3>
6626
+ <val-text [props]="customLinksProps"></val-text>
6627
+ </div>
7095
6628
 
7096
- /**
7097
- * Content configuration for the Global Content Example component.
7098
- *
7099
- * This demonstrates component-specific content that works alongside
7100
- * global content to create a comprehensive content management system.
7101
- */
7102
- const globalContentExampleData = {
7103
- title: {
7104
- es: 'Ejemplo de Contenido Global',
7105
- en: 'Global Content Example',
7106
- },
7107
- languageLabel: {
7108
- es: 'Idioma:',
7109
- en: 'Language:',
7110
- },
7111
- description: {
7112
- es: 'Este ejemplo demuestra cómo usar contenido global y específico del componente de manera conjunta.',
7113
- en: 'This example shows how to use global and component-specific content together.',
7114
- },
7115
- };
7116
- var GlobalContentExample = new TextContent(globalContentExampleData);
6629
+ <div class="example-section">
6630
+ <h3>Enlaces internos y externos mezclados:</h3>
6631
+ <val-text [props]="mixedLinksProps"></val-text>
6632
+ </div>
7117
6633
 
7118
- /**
7119
- * Example content configuration for demonstrating the reactive content system.
7120
- *
7121
- * This file shows how to structure content for components that use the reactive
7122
- * language system with the new fromContent pattern.
7123
- */
7124
- // Example content for a sample component
7125
- const exampleComponentContent = {
7126
- es: {
7127
- title: 'Ejemplo de Contenido Reactivo',
7128
- subtitle: 'Este es un subtítulo que cambia automáticamente',
7129
- description: 'Esta descripción se actualiza cuando cambias el idioma sin necesidad de recargar la página.',
7130
- greeting: 'Hola {name}, tienes {count} mensajes nuevos',
7131
- welcomeMessage: 'Bienvenido a la biblioteca de componentes Valtech',
7132
- dynamicText: 'Este texto se actualiza automáticamente cuando cambias el idioma',
7133
- buttonText: 'Cambiar Idioma',
7134
- loadingText: 'Cargando...',
7135
- errorMessage: 'Error: No se pudo cargar el contenido',
7136
- successMessage: 'Contenido cargado exitosamente',
7137
- confirmDialog: '¿Estás seguro de que quieres continuar?',
7138
- cancelButton: 'Cancelar',
7139
- acceptButton: 'Aceptar',
7140
- },
7141
- en: {
7142
- title: 'Reactive Content Example',
7143
- subtitle: 'This is a subtitle that changes automatically',
7144
- description: 'This description updates when you change the language without needing to reload the page.',
7145
- greeting: 'Hello {name}, you have {count} new messages',
7146
- welcomeMessage: 'Welcome to the Valtech component library',
7147
- dynamicText: 'This text updates automatically when you change the language',
7148
- buttonText: 'Change Language',
7149
- loadingText: 'Loading...',
7150
- errorMessage: 'Error: Could not load content',
7151
- successMessage: 'Content loaded successfully',
7152
- confirmDialog: 'Are you sure you want to continue?',
7153
- cancelButton: 'Cancel',
7154
- acceptButton: 'Accept',
7155
- },
7156
- };
7157
- // Export the content as a TextContent instance
7158
- var ReactiveContentExample = new TextContent(exampleComponentContent);
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
+ }] });
7159
6641
 
7160
- const text$1 = {
6642
+ const text = {
7161
6643
  es: {
7162
6644
  spanish: 'Español',
7163
6645
  english: 'Inglés',
@@ -7167,21 +6649,7 @@ const text$1 = {
7167
6649
  english: 'English',
7168
6650
  },
7169
6651
  };
7170
- var LangSettings = new TextContent(text$1);
7171
-
7172
- const text = {
7173
- es: {
7174
- light: 'Siempre claro',
7175
- dark: 'Siempre oscuro',
7176
- auto: 'Automático',
7177
- },
7178
- en: {
7179
- light: 'Always light',
7180
- dark: 'Always dark',
7181
- auto: 'System settings',
7182
- },
7183
- };
7184
- var ThemeSettings = new TextContent(text);
6652
+ var LangSettings = new TextContent(text);
7185
6653
 
7186
6654
  /**
7187
6655
  * Global content that can be used across all components.
@@ -7220,9 +6688,6 @@ const globalContentData = {
7220
6688
  areYouSure: '¿Estás seguro?',
7221
6689
  deleteConfirmation: '¿Estás seguro de que deseas eliminar {itemName}?',
7222
6690
  unsavedChanges: 'Tienes cambios sin guardar. ¿Deseas continuar?',
7223
- // Common form labels
7224
- required: 'Requerido',
7225
- optional: 'Opcional',
7226
6691
  // Common placeholders
7227
6692
  searchPlaceholder: 'Buscar...',
7228
6693
  },
@@ -7257,9 +6722,6 @@ const globalContentData = {
7257
6722
  areYouSure: 'Are you sure?',
7258
6723
  deleteConfirmation: 'Are you sure you want to delete {itemName}?',
7259
6724
  unsavedChanges: 'You have unsaved changes. Do you want to continue?',
7260
- // Common form labels
7261
- required: 'Required',
7262
- optional: 'Optional',
7263
6725
  // Common placeholders
7264
6726
  searchPlaceholder: 'Search...',
7265
6727
  },
@@ -7268,9 +6730,6 @@ const GlobalContent = new TextContent(globalContentData);
7268
6730
  const content = {
7269
6731
  _global: GlobalContent,
7270
6732
  LangSettings,
7271
- ThemeSettings,
7272
- ReactiveContentExample,
7273
- GlobalContentExample,
7274
6733
  };
7275
6734
 
7276
6735
  /**
@@ -7328,5 +6787,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
7328
6787
  * Generated bundle index. Do not edit.
7329
6788
  */
7330
6789
 
7331
- export { ActionType, AlertBoxComponent, AvatarComponent, BannerComponent, BaseDefault, BoxComponent, ButtonComponent, ButtonGroupComponent, CardComponent, CardSection, CardType, CheckInputComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CommentInputComponent, ComponentStates, ContentLoaderComponent, ContentService, CustomContentDemoComponent, DateInputComponent, DisplayComponent, DividerComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FileInputComponent, FooterComponent, FormComponent, FormFooterComponent, GlobalContent, GlobalContentExampleComponent, HeaderComponent, HintComponent, HourInputComponent, HrefComponent, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InputType, ItemListComponent, LangOption, LangService, LayeredCardComponent, LayoutComponent, LinkComponent, LinksCakeComponent, LocalStorageService, MOTION, NavigationService, NoContentComponent, NotesBoxComponent, NumberInputComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PasswordInputComponent, PinInputComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProgressBarComponent, ProgressStatusComponent, PrompterComponent, RadioInputComponent, ReactiveContentExampleComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SelectSearchComponent, SimpleComponent, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, TextComponent, TextContent, TextInputComponent, ThemeOption, ThemeService, TitleBlockComponent, TitleComponent, ToastService, ToolbarActionType, ToolbarComponent, ValtechConfigService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, content, createContentHelper, createTextProps, fromContent, fromContentWithInterpolation, fromMultipleContent, globalContentData, goToTop, interpolateContent, isAtEnd, maxLength, replaceSpecialChars, resolveColor, resolveInputDefaultValue };
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 };
7332
6791
  //# sourceMappingURL=valtech-components.mjs.map