valtech-components 2.0.289 → 2.0.291

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.
@@ -1024,13 +1024,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1024
1024
  class LinkProcessorService {
1025
1025
  constructor(sanitizer) {
1026
1026
  this.sanitizer = sanitizer;
1027
- // Regex para detectar URLs completas (http/https) - excluye caracteres de puntuación al final
1028
- this.urlRegex = /(https?:\/\/[^\s,;.!?()]+)/g;
1029
- // Regex para detectar rutas internas (empiezan con / pero no son URLs completas) - excluye puntuación
1030
- this.internalRouteRegex = /(\s|^)(\/[^\s,;.!?()]*)/g;
1027
+ // Regex para detectar URLs completas (http/https) - captura toda la URL y luego limpiamos puntuación
1028
+ this.urlRegex = /(https?:\/\/[^\s]+)/g;
1029
+ // Regex para detectar rutas internas - captura toda la ruta y luego limpiamos puntuación
1030
+ this.internalRouteRegex = /(\s|^)(\/[^\s]*)/g;
1031
1031
  // Regex para detectar enlaces estilo Markdown [texto](url)
1032
1032
  this.markdownLinkRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
1033
1033
  }
1034
+ /**
1035
+ * Limpia la puntuación del final de una URL.
1036
+ * Mantiene caracteres válidos de URL pero remueve signos de puntuación comunes al final.
1037
+ * Preserva parámetros de consulta, fragmentos y caracteres válidos en URLs.
1038
+ */
1039
+ cleanUrlPunctuation(url) {
1040
+ // Caracteres que consideramos puntuación al final de oración, pero NO parte de URLs
1041
+ // No incluimos & o = que son parte de query params, ni # que es parte de fragmentos
1042
+ const trailingPunctuation = /[.,;!?)]+$/;
1043
+ // Casos especiales: si la URL termina con paréntesis pero no tiene paréntesis de apertura
1044
+ // probablemente el paréntesis no es parte de la URL
1045
+ const hasOpeningParen = url.includes('(');
1046
+ const endsWithClosingParen = url.endsWith(')');
1047
+ if (endsWithClosingParen && !hasOpeningParen) {
1048
+ // Remover el paréntesis de cierre si no hay uno de apertura
1049
+ url = url.replace(/\)$/, '');
1050
+ }
1051
+ return url.replace(trailingPunctuation, '');
1052
+ }
1034
1053
  /**
1035
1054
  * Procesa texto para convertir enlaces en elementos <a> clickeables.
1036
1055
  * Detecta automáticamente URLs externas, rutas internas y enlaces estilo Markdown.
@@ -1059,10 +1078,15 @@ class LinkProcessorService {
1059
1078
  let hasLinks = false;
1060
1079
  let processedText = text;
1061
1080
  // 1. Procesar enlaces estilo Markdown [texto](url) primero
1062
- if (processMarkdownLinks && this.markdownLinkRegex.test(text)) {
1063
- hasLinks = true;
1064
- this.markdownLinkRegex.lastIndex = 0; // Reset regex
1065
- processedText = processedText.replace(this.markdownLinkRegex, (match, linkText, url) => {
1081
+ if (processMarkdownLinks) {
1082
+ const markdownMatches = Array.from(processedText.matchAll(this.markdownLinkRegex));
1083
+ // Procesar de atrás hacia adelante para mantener las posiciones
1084
+ for (let i = markdownMatches.length - 1; i >= 0; i--) {
1085
+ const match = markdownMatches[i];
1086
+ const [fullMatch, linkText, url] = match;
1087
+ const startIndex = match.index;
1088
+ const endIndex = startIndex + fullMatch.length;
1089
+ hasLinks = true;
1066
1090
  const isExternal = /^https?:\/\//.test(url);
1067
1091
  const target = (isExternal ? openExternalInNewTab : openInternalInNewTab)
1068
1092
  ? isExternal
@@ -1071,38 +1095,63 @@ class LinkProcessorService {
1071
1095
  : '';
1072
1096
  const typeClass = isExternal ? externalLinkClass : internalLinkClass;
1073
1097
  const classes = `${linkClass} ${typeClass}`.trim();
1074
- return `<a href="${url}"${target} class="${classes}">${linkText}</a>`;
1075
- });
1098
+ const linkHtml = `<a href="${url}"${target} class="${classes}">${linkText}</a>`;
1099
+ processedText =
1100
+ processedText.substring(0, startIndex) + linkHtml + processedText.substring(endIndex);
1101
+ }
1076
1102
  }
1077
1103
  // 2. Procesar URLs externas directas
1078
- if (this.urlRegex.test(processedText)) {
1104
+ const urlMatches = Array.from(processedText.matchAll(this.urlRegex));
1105
+ // Procesar de atrás hacia adelante para mantener las posiciones
1106
+ for (let i = urlMatches.length - 1; i >= 0; i--) {
1107
+ const match = urlMatches[i];
1108
+ const [fullMatch, url] = match;
1109
+ const startIndex = match.index;
1110
+ const endIndex = startIndex + fullMatch.length;
1111
+ // Verificar que no esté ya dentro de un enlace HTML existente
1112
+ const textBefore = processedText.substring(0, startIndex);
1113
+ const lastOpenTag = textBefore.lastIndexOf('<a ');
1114
+ const lastCloseTag = textBefore.lastIndexOf('</a>');
1115
+ // Si hay un tag <a abierto sin cerrar, no procesamos
1116
+ if (lastOpenTag > lastCloseTag) {
1117
+ continue;
1118
+ }
1119
+ // Limpiar puntuación del final de la URL
1120
+ const cleanUrl = this.cleanUrlPunctuation(url);
1121
+ const punctuationRemoved = url !== cleanUrl;
1122
+ const punctuation = punctuationRemoved ? url.substring(cleanUrl.length) : '';
1079
1123
  hasLinks = true;
1080
- this.urlRegex.lastIndex = 0; // Reset regex
1081
- processedText = processedText.replace(this.urlRegex, url => {
1082
- // Verificar que no esté ya dentro de un enlace procesado
1083
- const beforeMatch = processedText.substring(0, processedText.indexOf(url));
1084
- if (beforeMatch.includes('<a href="' + url + '"')) {
1085
- return url; // Ya está procesado como Markdown link
1086
- }
1087
- const target = openExternalInNewTab ? ' target="_blank" rel="noopener noreferrer"' : '';
1088
- const classes = `${linkClass} ${externalLinkClass}`.trim();
1089
- return `<a href="${url}"${target} class="${classes}">${url}</a>`;
1090
- });
1124
+ const target = openExternalInNewTab ? ' target="_blank" rel="noopener noreferrer"' : '';
1125
+ const classes = `${linkClass} ${externalLinkClass}`.trim();
1126
+ const linkHtml = `<a href="${cleanUrl}"${target} class="${classes}">${cleanUrl}</a>`;
1127
+ // Reemplazar el URL original con el enlace + puntuación si existía
1128
+ const replacement = punctuationRemoved ? linkHtml + punctuation : linkHtml;
1129
+ processedText =
1130
+ processedText.substring(0, startIndex) + replacement + processedText.substring(endIndex);
1091
1131
  }
1092
- // 3. Procesar rutas internas después
1093
- if (this.internalRouteRegex.test(processedText)) {
1132
+ // 3. Procesar rutas internas
1133
+ const internalMatches = Array.from(processedText.matchAll(this.internalRouteRegex));
1134
+ // Procesar de atrás hacia adelante para mantener las posiciones
1135
+ for (let i = internalMatches.length - 1; i >= 0; i--) {
1136
+ const match = internalMatches[i];
1137
+ const [fullMatch, prefix, route] = match;
1138
+ const startIndex = match.index;
1139
+ const endIndex = startIndex + fullMatch.length;
1140
+ // Verificar que no esté ya dentro de un enlace HTML existente
1141
+ const textBefore = processedText.substring(0, startIndex);
1142
+ const lastOpenTag = textBefore.lastIndexOf('<a ');
1143
+ const lastCloseTag = textBefore.lastIndexOf('</a>');
1144
+ // Si hay un tag <a abierto sin cerrar, no procesamos
1145
+ if (lastOpenTag > lastCloseTag) {
1146
+ continue;
1147
+ }
1094
1148
  hasLinks = true;
1095
- this.internalRouteRegex.lastIndex = 0; // Reset regex
1096
- processedText = processedText.replace(this.internalRouteRegex, (match, prefix, route) => {
1097
- // Solo procesar si no está ya dentro de un enlace
1098
- const beforeMatch = processedText.substring(0, processedText.indexOf(match));
1099
- if (beforeMatch.includes(`href="${route}"`)) {
1100
- return match; // Ya está procesado
1101
- }
1102
- const target = openInternalInNewTab ? ' target="_blank"' : '';
1103
- const classes = `${linkClass} ${internalLinkClass}`.trim();
1104
- return `${prefix}<a href="${route}"${target} class="${classes}">${route}</a>`;
1105
- });
1149
+ const target = openInternalInNewTab ? ' target="_blank"' : '';
1150
+ const classes = `${linkClass} ${internalLinkClass}`.trim();
1151
+ const linkHtml = `<a href="${route}"${target} class="${classes}">${route}</a>`;
1152
+ const replacement = `${prefix}${linkHtml}`;
1153
+ processedText =
1154
+ processedText.substring(0, startIndex) + replacement + processedText.substring(endIndex);
1106
1155
  }
1107
1156
  // Si hay enlaces, sanitizar el HTML
1108
1157
  if (hasLinks) {
@@ -2098,7 +2147,7 @@ class TextComponent {
2098
2147
  <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
2099
2148
  }
2100
2149
  </ion-text>
2101
- `, isInline: true, styles: ["@charset \"UTF-8\";:root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}:host ::ng-deep .processed-link{color:var(--ion-color-primary, #3880ff);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px;transition:color .3s ease}:host ::ng-deep .processed-link:hover{color:var(--ion-color-primary-shade, #3171e0);text-decoration-thickness:2px}:host ::ng-deep .processed-link:active{color:var(--ion-color-primary-tint, #4c8dff)}:host ::ng-deep .external-link:after{content:\" \\2197\";font-size:.8em;opacity:.7}:host ::ng-deep .internal-link{color:var(--ion-color-primary, #0cd1e8)}:host ::ng-deep .internal-link:hover{color:var(--ion-color-primary-shade, #0bb8cc)}\n"], dependencies: [{ kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: ProcessLinksPipe, name: "processLinks" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2150
+ `, 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" }, { kind: "pipe", type: ProcessLinksPipe, name: "processLinks" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2102
2151
  }
2103
2152
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextComponent, decorators: [{
2104
2153
  type: Component,
@@ -2114,7 +2163,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2114
2163
  <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
2115
2164
  }
2116
2165
  </ion-text>
2117
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@charset \"UTF-8\";:root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}:host ::ng-deep .processed-link{color:var(--ion-color-primary, #3880ff);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px;transition:color .3s ease}:host ::ng-deep .processed-link:hover{color:var(--ion-color-primary-shade, #3171e0);text-decoration-thickness:2px}:host ::ng-deep .processed-link:active{color:var(--ion-color-primary-tint, #4c8dff)}:host ::ng-deep .external-link:after{content:\" \\2197\";font-size:.8em;opacity:.7}:host ::ng-deep .internal-link{color:var(--ion-color-primary, #0cd1e8)}:host ::ng-deep .internal-link:hover{color:var(--ion-color-primary-shade, #0bb8cc)}\n"] }]
2166
+ `, 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"] }]
2118
2167
  }], ctorParameters: () => [{ type: ContentService }, { type: LinkProcessorService }], propDecorators: { props: [{
2119
2168
  type: Input
2120
2169
  }] } });
@@ -6264,6 +6313,211 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
6264
6313
  type: Output
6265
6314
  }] } });
6266
6315
 
6316
+ /**
6317
+ * ComprehensiveLinkTestComponent - Componente de prueba exhaustiva para el procesamiento de enlaces.
6318
+ *
6319
+ * Este componente demuestra todos los casos edge y escenarios complejos de procesamiento de enlaces,
6320
+ * incluyendo puntuación, URLs complejas, y mezclas de formatos.
6321
+ *
6322
+ * @example Uso en template:
6323
+ * ```html
6324
+ * <val-comprehensive-link-test></val-comprehensive-link-test>
6325
+ * ```
6326
+ */
6327
+ class ComprehensiveLinkTestComponent {
6328
+ constructor() {
6329
+ this.punctuationProps = {
6330
+ content: 'Diferentes puntuaciones: https://angular.io, también https://github.com! ¿Conoces https://typescript.org? Final: https://rxjs.dev. Entre paréntesis (https://zone.js) y con comillas "https://ionic.io".',
6331
+ size: 'medium',
6332
+ color: 'dark',
6333
+ bold: false,
6334
+ processLinks: true,
6335
+ linkConfig: {
6336
+ openExternalInNewTab: true,
6337
+ linkClass: 'test-punctuation',
6338
+ externalLinkClass: 'test-external',
6339
+ },
6340
+ };
6341
+ this.complexUrlProps = {
6342
+ content: 'URLs complejas: https://api.github.com/repos/angular/angular/issues?state=open&sort=updated&per_page=50, búsqueda https://google.com/search?q=angular+ionic+components#results, y documentación https://angular.io/guide/getting-started#development-environment.',
6343
+ size: 'medium',
6344
+ color: 'dark',
6345
+ bold: false,
6346
+ processLinks: true,
6347
+ linkConfig: {
6348
+ openExternalInNewTab: true,
6349
+ linkClass: 'test-complex',
6350
+ externalLinkClass: 'test-external',
6351
+ },
6352
+ };
6353
+ this.parenthesesProps = {
6354
+ content: 'Paréntesis de contexto (ver https://docs.angular.io) vs URLs con paréntesis https://example.com/api/method(param) en el contenido. También funciona (https://ionic.io/docs).',
6355
+ size: 'medium',
6356
+ color: 'dark',
6357
+ bold: false,
6358
+ processLinks: true,
6359
+ linkConfig: {
6360
+ openExternalInNewTab: true,
6361
+ linkClass: 'test-parentheses',
6362
+ externalLinkClass: 'test-external',
6363
+ },
6364
+ };
6365
+ this.mixedFormatsProps = {
6366
+ content: 'Formatos mezclados: [Documentación oficial](https://angular.io/docs), enlace directo https://github.com/angular/angular, ruta interna /dashboard/settings, [guía de inicio](/getting-started), y API https://api.example.com/v1/users?active=true.',
6367
+ size: 'medium',
6368
+ color: 'dark',
6369
+ bold: false,
6370
+ processLinks: true,
6371
+ linkConfig: {
6372
+ openExternalInNewTab: true,
6373
+ openInternalInNewTab: false,
6374
+ processMarkdownLinks: true,
6375
+ linkClass: 'test-mixed',
6376
+ externalLinkClass: 'test-external',
6377
+ internalLinkClass: 'test-internal',
6378
+ },
6379
+ };
6380
+ this.edgeCasesProps = {
6381
+ content: 'Casos extremos: "https://quoted-url.com", múltiple puntuación https://example.com?!!, URL al final de oración https://final-url.org. También consecutivos: https://first.com y https://second.com.',
6382
+ size: 'medium',
6383
+ color: 'dark',
6384
+ bold: false,
6385
+ processLinks: true,
6386
+ linkConfig: {
6387
+ openExternalInNewTab: true,
6388
+ linkClass: 'test-edge',
6389
+ externalLinkClass: 'test-external',
6390
+ },
6391
+ };
6392
+ this.devUrlsProps = {
6393
+ content: 'URLs de desarrollo: http://localhost:4200/dashboard, servidor local https://127.0.0.1:8080/api/status, desarrollo http://dev.example.com:3000/debug?verbose=true, y túnel https://abc123.ngrok.io/webhook.',
6394
+ size: 'medium',
6395
+ color: 'dark',
6396
+ bold: false,
6397
+ processLinks: true,
6398
+ linkConfig: {
6399
+ openExternalInNewTab: false, // Para desarrollo, puede ser útil no abrir en nueva pestaña
6400
+ linkClass: 'test-dev',
6401
+ externalLinkClass: 'test-dev-external',
6402
+ },
6403
+ };
6404
+ }
6405
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ComprehensiveLinkTestComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6406
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ComprehensiveLinkTestComponent, isStandalone: true, selector: "val-comprehensive-link-test", ngImport: i0, template: `
6407
+ <div class="comprehensive-test">
6408
+ <h2>Prueba Exhaustiva de Procesamiento de Enlaces</h2>
6409
+
6410
+ <div class="test-section">
6411
+ <h3>✅ Puntuación Final - SOLUCIONADO</h3>
6412
+ <val-text [props]="punctuationProps"></val-text>
6413
+ <p class="note">
6414
+ <strong>Esperado:</strong> Los enlaces no incluyen puntuación final (.,;!?), pero la puntuación se preserva
6415
+ como texto después del enlace.
6416
+ </p>
6417
+ </div>
6418
+
6419
+ <div class="test-section">
6420
+ <h3>✅ URLs Complejas con Parámetros - SOLUCIONADO</h3>
6421
+ <val-text [props]="complexUrlProps"></val-text>
6422
+ <p class="note">
6423
+ <strong>Esperado:</strong> URLs con query params, fragmentos y rutas complejas se preservan completamente.
6424
+ </p>
6425
+ </div>
6426
+
6427
+ <div class="test-section">
6428
+ <h3>✅ Paréntesis Inteligentes - SOLUCIONADO</h3>
6429
+ <val-text [props]="parenthesesProps"></val-text>
6430
+ <p class="note">
6431
+ <strong>Esperado:</strong> Paréntesis de contexto (texto) vs paréntesis de URL se manejan correctamente.
6432
+ </p>
6433
+ </div>
6434
+
6435
+ <div class="test-section">
6436
+ <h3>✅ Mezcla de Formatos - SOLUCIONADO</h3>
6437
+ <val-text [props]="mixedFormatsProps"></val-text>
6438
+ <p class="note">
6439
+ <strong>Esperado:</strong> Enlaces Markdown, URLs directas y rutas internas coexisten sin conflictos.
6440
+ </p>
6441
+ </div>
6442
+
6443
+ <div class="test-section">
6444
+ <h3>✅ Casos Extremos - SOLUCIONADO</h3>
6445
+ <val-text [props]="edgeCasesProps"></val-text>
6446
+ <p class="note">
6447
+ <strong>Esperado:</strong> Comillas, múltiple puntuación, y URLs al final de oraciones se procesan
6448
+ correctamente.
6449
+ </p>
6450
+ </div>
6451
+
6452
+ <div class="test-section">
6453
+ <h3>✅ URLs de Desarrollo - SOLUCIONADO</h3>
6454
+ <val-text [props]="devUrlsProps"></val-text>
6455
+ <p class="note">
6456
+ <strong>Esperado:</strong> URLs de localhost, puertos, y rutas de desarrollo se detectan correctamente.
6457
+ </p>
6458
+ </div>
6459
+ </div>
6460
+ `, isInline: true, styles: [".comprehensive-test{padding:20px;max-width:1000px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.test-section{margin-bottom:32px;padding:20px;border:2px solid var(--ion-color-success, #2dd36f);border-radius:12px;background:var(--ion-color-success-tint, #42d77d) 10}h2{color:var(--ion-color-primary, #3880ff);margin-bottom:24px;text-align:center}h3{color:var(--ion-color-success, #2dd36f);margin-bottom:16px;font-size:18px;display:flex;align-items:center;gap:8px}.note{margin-top:12px;padding:12px;background:var(--ion-color-light, #f4f5f8);border-radius:8px;font-size:14px;color:var(--ion-color-medium, #92949c);border-left:4px solid var(--ion-color-primary, #3880ff)}.note strong{color:var(--ion-color-dark, #222428)}\n"], dependencies: [{ kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
6461
+ }
6462
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ComprehensiveLinkTestComponent, decorators: [{
6463
+ type: Component,
6464
+ args: [{ selector: 'val-comprehensive-link-test', standalone: true, imports: [TextComponent], template: `
6465
+ <div class="comprehensive-test">
6466
+ <h2>Prueba Exhaustiva de Procesamiento de Enlaces</h2>
6467
+
6468
+ <div class="test-section">
6469
+ <h3>✅ Puntuación Final - SOLUCIONADO</h3>
6470
+ <val-text [props]="punctuationProps"></val-text>
6471
+ <p class="note">
6472
+ <strong>Esperado:</strong> Los enlaces no incluyen puntuación final (.,;!?), pero la puntuación se preserva
6473
+ como texto después del enlace.
6474
+ </p>
6475
+ </div>
6476
+
6477
+ <div class="test-section">
6478
+ <h3>✅ URLs Complejas con Parámetros - SOLUCIONADO</h3>
6479
+ <val-text [props]="complexUrlProps"></val-text>
6480
+ <p class="note">
6481
+ <strong>Esperado:</strong> URLs con query params, fragmentos y rutas complejas se preservan completamente.
6482
+ </p>
6483
+ </div>
6484
+
6485
+ <div class="test-section">
6486
+ <h3>✅ Paréntesis Inteligentes - SOLUCIONADO</h3>
6487
+ <val-text [props]="parenthesesProps"></val-text>
6488
+ <p class="note">
6489
+ <strong>Esperado:</strong> Paréntesis de contexto (texto) vs paréntesis de URL se manejan correctamente.
6490
+ </p>
6491
+ </div>
6492
+
6493
+ <div class="test-section">
6494
+ <h3>✅ Mezcla de Formatos - SOLUCIONADO</h3>
6495
+ <val-text [props]="mixedFormatsProps"></val-text>
6496
+ <p class="note">
6497
+ <strong>Esperado:</strong> Enlaces Markdown, URLs directas y rutas internas coexisten sin conflictos.
6498
+ </p>
6499
+ </div>
6500
+
6501
+ <div class="test-section">
6502
+ <h3>✅ Casos Extremos - SOLUCIONADO</h3>
6503
+ <val-text [props]="edgeCasesProps"></val-text>
6504
+ <p class="note">
6505
+ <strong>Esperado:</strong> Comillas, múltiple puntuación, y URLs al final de oraciones se procesan
6506
+ correctamente.
6507
+ </p>
6508
+ </div>
6509
+
6510
+ <div class="test-section">
6511
+ <h3>✅ URLs de Desarrollo - SOLUCIONADO</h3>
6512
+ <val-text [props]="devUrlsProps"></val-text>
6513
+ <p class="note">
6514
+ <strong>Esperado:</strong> URLs de localhost, puertos, y rutas de desarrollo se detectan correctamente.
6515
+ </p>
6516
+ </div>
6517
+ </div>
6518
+ `, styles: [".comprehensive-test{padding:20px;max-width:1000px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.test-section{margin-bottom:32px;padding:20px;border:2px solid var(--ion-color-success, #2dd36f);border-radius:12px;background:var(--ion-color-success-tint, #42d77d) 10}h2{color:var(--ion-color-primary, #3880ff);margin-bottom:24px;text-align:center}h3{color:var(--ion-color-success, #2dd36f);margin-bottom:16px;font-size:18px;display:flex;align-items:center;gap:8px}.note{margin-top:12px;padding:12px;background:var(--ion-color-light, #f4f5f8);border-radius:8px;font-size:14px;color:var(--ion-color-medium, #92949c);border-left:4px solid var(--ion-color-primary, #3880ff)}.note strong{color:var(--ion-color-dark, #222428)}\n"] }]
6519
+ }] });
6520
+
6267
6521
  class CustomContentDemoComponent {
6268
6522
  constructor() {
6269
6523
  this.content = inject(ContentService);
@@ -6647,6 +6901,30 @@ class LinkProcessingExampleComponent {
6647
6901
  internalLinkClass: 'mixed-internal',
6648
6902
  },
6649
6903
  };
6904
+ this.punctuationTestProps = {
6905
+ content: 'URLs con puntuación final: https://ionicframework.com/docs, también https://angular.io! Pregunta sobre https://github.com/angular? Y punto final: https://typescript.org. Paréntesis (https://rxjs.dev) y comillas "https://zone.js". ¡Todos funcionan!',
6906
+ size: 'medium',
6907
+ color: 'dark',
6908
+ bold: false,
6909
+ processLinks: true,
6910
+ linkConfig: {
6911
+ openExternalInNewTab: true,
6912
+ linkClass: 'punctuation-test',
6913
+ externalLinkClass: 'external-punct',
6914
+ },
6915
+ };
6916
+ this.complexUrlsProps = {
6917
+ content: 'URLs complejas: https://example.com/path?param=value&other=123#section, búsqueda en https://google.com/search?q=angular+components, y API https://api.github.com/repos/owner/repo/issues?state=open. Todos con parámetros y fragmentos.',
6918
+ size: 'medium',
6919
+ color: 'dark',
6920
+ bold: false,
6921
+ processLinks: true,
6922
+ linkConfig: {
6923
+ openExternalInNewTab: true,
6924
+ linkClass: 'complex-url',
6925
+ externalLinkClass: 'complex-external',
6926
+ },
6927
+ };
6650
6928
  }
6651
6929
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessingExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6652
6930
  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: `
@@ -6687,8 +6965,18 @@ class LinkProcessingExampleComponent {
6687
6965
  <h3>Mezcla de enlaces directos y Markdown:</h3>
6688
6966
  <val-text [props]="mixedFormatsProps"></val-text>
6689
6967
  </div>
6968
+
6969
+ <div class="example-section">
6970
+ <h3>Corrección de puntuación en URLs:</h3>
6971
+ <val-text [props]="punctuationTestProps"></val-text>
6972
+ </div>
6973
+
6974
+ <div class="example-section">
6975
+ <h3>URLs complejas con parámetros y fragmentos:</h3>
6976
+ <val-text [props]="complexUrlsProps"></val-text>
6977
+ </div>
6690
6978
  </div>
6691
- `, isInline: true, styles: [".link-examples{padding:20px;max-width:800px}.example-section{margin-bottom:24px;padding:16px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}h2{color:var(--ion-color-primary, #3880ff);margin-bottom:20px}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px;font-size:16px}\n"], dependencies: [{ kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
6979
+ `, isInline: true, styles: [".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"] }] }); }
6692
6980
  }
6693
6981
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessingExampleComponent, decorators: [{
6694
6982
  type: Component,
@@ -6730,8 +7018,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
6730
7018
  <h3>Mezcla de enlaces directos y Markdown:</h3>
6731
7019
  <val-text [props]="mixedFormatsProps"></val-text>
6732
7020
  </div>
7021
+
7022
+ <div class="example-section">
7023
+ <h3>Corrección de puntuación en URLs:</h3>
7024
+ <val-text [props]="punctuationTestProps"></val-text>
7025
+ </div>
7026
+
7027
+ <div class="example-section">
7028
+ <h3>URLs complejas con parámetros y fragmentos:</h3>
7029
+ <val-text [props]="complexUrlsProps"></val-text>
7030
+ </div>
6733
7031
  </div>
6734
- `, styles: [".link-examples{padding:20px;max-width:800px}.example-section{margin-bottom:24px;padding:16px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}h2{color:var(--ion-color-primary, #3880ff);margin-bottom:20px}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px;font-size:16px}\n"] }]
7032
+ `, styles: [".example-section{margin-bottom:24px;padding:16px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}h2{color:var(--ion-color-primary, #3880ff);margin-bottom:20px}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px;font-size:16px}\n"] }]
6735
7033
  }] });
6736
7034
 
6737
7035
  const text = {
@@ -6882,5 +7180,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
6882
7180
  * Generated bundle index. Do not edit.
6883
7181
  */
6884
7182
 
6885
- export { ActionType, AlertBoxComponent, AvatarComponent, BannerComponent, BaseDefault, BoxComponent, ButtonComponent, ButtonGroupComponent, CardComponent, CardSection, CardType, CheckInputComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CommentInputComponent, ComponentStates, ContentLoaderComponent, ContentService, CustomContentDemoComponent, DateInputComponent, DisplayComponent, DividerComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FileInputComponent, FooterComponent, FormComponent, FormFooterComponent, GlobalContent, HeaderComponent, HintComponent, HourInputComponent, HrefComponent, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InputType, ItemListComponent, LangOption, LangService, LayeredCardComponent, LayoutComponent, LinkComponent, LinkProcessingExampleComponent, LinkProcessorService, LinksCakeComponent, LocalStorageService, MOTION, NavigationService, NoContentComponent, NotesBoxComponent, NumberInputComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PasswordInputComponent, PinInputComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProgressBarComponent, ProgressStatusComponent, PrompterComponent, RadioInputComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SelectSearchComponent, SimpleComponent, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, TextComponent, TextContent, TextInputComponent, ThemeOption, ThemeService, TitleBlockComponent, TitleComponent, ToastService, ToolbarActionType, ToolbarComponent, ValtechConfigService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, content, createContentHelper, createTextProps, fromContent, fromContentWithInterpolation, fromMultipleContent, globalContentData, goToTop, interpolateContent, isAtEnd, maxLength, replaceSpecialChars, resolveColor, resolveInputDefaultValue };
7183
+ export { ActionType, AlertBoxComponent, AvatarComponent, BannerComponent, BaseDefault, BoxComponent, ButtonComponent, ButtonGroupComponent, CardComponent, CardSection, CardType, CheckInputComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CommentInputComponent, ComponentStates, ComprehensiveLinkTestComponent, 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 };
6886
7184
  //# sourceMappingURL=valtech-components.mjs.map