valtech-components 2.0.286 → 2.0.289

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +61 -21
  2. package/esm2022/lib/components/atoms/text/text.component.mjs +46 -10
  3. package/esm2022/lib/components/atoms/text/types.mjs +1 -1
  4. package/esm2022/lib/examples/custom-content-demo.component.mjs +291 -0
  5. package/esm2022/lib/examples/link-processing-example.component.mjs +189 -0
  6. package/esm2022/lib/services/lang-provider/content.mjs +1 -13
  7. package/esm2022/lib/services/link-processor.service.mjs +192 -0
  8. package/esm2022/lib/shared/pipes/process-links.pipe.mjs +69 -0
  9. package/esm2022/public-api.mjs +5 -4
  10. package/fesm2022/valtech-components.mjs +473 -919
  11. package/fesm2022/valtech-components.mjs.map +1 -1
  12. package/lib/components/atoms/text/text.component.d.ts +5 -1
  13. package/lib/components/atoms/text/types.d.ts +5 -0
  14. package/lib/examples/link-processing-example.component.d.ts +24 -0
  15. package/lib/services/link-processor.service.d.ts +98 -0
  16. package/lib/shared/pipes/process-links.pipe.d.ts +55 -0
  17. package/package.json +1 -1
  18. package/public-api.d.ts +4 -3
  19. package/esm2022/lib/components/_examples/custom-content-demo.component.mjs +0 -291
  20. package/esm2022/lib/components/_examples/global-content-example-content.mjs +0 -23
  21. package/esm2022/lib/components/_examples/global-content-example.component.mjs +0 -504
  22. package/esm2022/lib/components/_examples/reactive-content-example-content.mjs +0 -43
  23. package/esm2022/lib/components/_examples/reactive-content-example.component.mjs +0 -347
  24. package/esm2022/lib/services/lang-provider/components/theme-settings.mjs +0 -15
  25. package/lib/components/_examples/global-content-example-content.d.ts +0 -9
  26. package/lib/components/_examples/global-content-example.component.d.ts +0 -73
  27. package/lib/components/_examples/reactive-content-example-content.d.ts +0 -32
  28. package/lib/components/_examples/reactive-content-example.component.d.ts +0 -47
  29. package/lib/services/lang-provider/components/theme-settings.d.ts +0 -3
  30. /package/lib/{components/_examples → examples}/custom-content-demo.component.d.ts +0 -0
@@ -1,10 +1,12 @@
1
1
  import { OnDestroy, OnInit } from '@angular/core';
2
2
  import { Observable } from 'rxjs';
3
3
  import { ContentService } from '../../../services/content.service';
4
+ import { LinkProcessorService } from '../../../services/link-processor.service';
4
5
  import { TextContentConfig, TextMetadata } from './types';
5
6
  import * as i0 from "@angular/core";
6
7
  export declare class TextComponent implements OnInit, OnDestroy {
7
8
  private contentService;
9
+ private linkProcessor;
8
10
  /**
9
11
  * Text configuration object.
10
12
  * @type {TextMetadata}
@@ -22,6 +24,8 @@ export declare class TextComponent implements OnInit, OnDestroy {
22
24
  * @property color - The text color (Ionic color string)
23
25
  * @property size - The text size ('small' | 'medium' | 'large' | 'xlarge')
24
26
  * @property bold - Whether the text is bold
27
+ * @property processLinks - Whether to automatically process and convert links in text (default: false)
28
+ * @property linkConfig - Configuration for link processing (colors, target behavior, etc.)
25
29
  */
26
30
  props: TextMetadata;
27
31
  /**
@@ -30,7 +34,7 @@ export declare class TextComponent implements OnInit, OnDestroy {
30
34
  */
31
35
  displayContent$: Observable<string>;
32
36
  private subscription;
33
- constructor(contentService: ContentService);
37
+ constructor(contentService: ContentService, linkProcessor: LinkProcessorService);
34
38
  ngOnInit(): void;
35
39
  ngOnDestroy(): void;
36
40
  /**
@@ -1,4 +1,5 @@
1
1
  import { Color } from '@ionic/core';
2
+ import { LinkProcessorConfig } from '../../../services/link-processor.service';
2
3
  /**
3
4
  * Props for val-text component.
4
5
  *
@@ -13,6 +14,8 @@ import { Color } from '@ionic/core';
13
14
  * @property color - The text color (Ionic color string)
14
15
  * @property size - The text size ('small' | 'medium' | 'large' | 'xlarge')
15
16
  * @property bold - Whether the text is bold
17
+ * @property processLinks - Whether to automatically process and convert links in the text (default: false)
18
+ * @property linkConfig - Configuration for link processing (colors, target behavior, etc.)
16
19
  */
17
20
  export interface TextMetadata {
18
21
  size: 'small' | 'medium' | 'large' | 'xlarge';
@@ -23,6 +26,8 @@ export interface TextMetadata {
23
26
  contentClass?: string;
24
27
  contentFallback?: string;
25
28
  contentInterpolation?: Record<string, string | number>;
29
+ processLinks?: boolean;
30
+ linkConfig?: LinkProcessorConfig;
26
31
  }
27
32
  /**
28
33
  * Configuration for reactive content in val-text component.
@@ -0,0 +1,24 @@
1
+ import { TextMetadata } from '../components/atoms/text/types';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * LinkProcessingExampleComponent - Componente de ejemplo que demuestra el procesamiento automático de enlaces.
5
+ *
6
+ * Este componente muestra diferentes casos de uso para el procesamiento automático de enlaces
7
+ * en el componente val-text, incluyendo enlaces externos, rutas internas y configuraciones personalizadas.
8
+ *
9
+ * @example Uso en template:
10
+ * ```html
11
+ * <val-link-processing-example></val-link-processing-example>
12
+ * ```
13
+ */
14
+ export declare class LinkProcessingExampleComponent {
15
+ basicTextProps: TextMetadata;
16
+ basicLinksProps: TextMetadata;
17
+ customLinksProps: TextMetadata;
18
+ mixedLinksProps: TextMetadata;
19
+ sameTabLinksProps: TextMetadata;
20
+ markdownLinksProps: TextMetadata;
21
+ mixedFormatsProps: TextMetadata;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<LinkProcessingExampleComponent, never>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<LinkProcessingExampleComponent, "val-link-processing-example", never, {}, {}, never, never, true, never>;
24
+ }
@@ -0,0 +1,98 @@
1
+ import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
2
+ import * as i0 from "@angular/core";
3
+ export interface LinkProcessorConfig {
4
+ /** Whether to open external links in new tab (default: true) */
5
+ openExternalInNewTab?: boolean;
6
+ /** Whether to open internal links in new tab (default: false) */
7
+ openInternalInNewTab?: boolean;
8
+ /** Custom CSS classes for links */
9
+ linkClass?: string;
10
+ /** Custom CSS classes for external links */
11
+ externalLinkClass?: string;
12
+ /** Custom CSS classes for internal links */
13
+ internalLinkClass?: string;
14
+ /** Whether to process Markdown-style links [text](url) (default: true) */
15
+ processMarkdownLinks?: boolean;
16
+ }
17
+ /**
18
+ * LinkProcessorService - Service for processing text content to convert URLs and internal routes into clickable links.
19
+ *
20
+ * This service automatically detects external URLs (http/https), internal routes (starting with /),
21
+ * and Markdown-style links [text](url) and converts them into HTML anchor elements with appropriate attributes.
22
+ *
23
+ * @example Basic usage:
24
+ * ```typescript
25
+ * constructor(private linkProcessor: LinkProcessorService) {}
26
+ *
27
+ * processText() {
28
+ * const text = 'Visit https://example.com, go to /profile, or [check docs](https://docs.example.com)';
29
+ * const processed = this.linkProcessor.processLinks(text);
30
+ * // Returns SafeHtml with clickable links
31
+ * }
32
+ * ```
33
+ */
34
+ export declare class LinkProcessorService {
35
+ private sanitizer;
36
+ private readonly urlRegex;
37
+ private readonly internalRouteRegex;
38
+ private readonly markdownLinkRegex;
39
+ constructor(sanitizer: DomSanitizer);
40
+ /**
41
+ * Procesa texto para convertir enlaces en elementos <a> clickeables.
42
+ * Detecta automáticamente URLs externas, rutas internas y enlaces estilo Markdown.
43
+ *
44
+ * @param text - Texto a procesar
45
+ * @param config - Configuración del procesamiento
46
+ * @returns SafeHtml con enlaces procesados o string original
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const result = this.linkProcessor.processLinks(
51
+ * 'Visit https://example.com, go to /profile, or [check docs](https://docs.example.com)',
52
+ * {
53
+ * openExternalInNewTab: true,
54
+ * openInternalInNewTab: false,
55
+ * processMarkdownLinks: true,
56
+ * linkClass: 'custom-link'
57
+ * }
58
+ * );
59
+ * ```
60
+ */
61
+ processLinks(text: string, config?: LinkProcessorConfig): SafeHtml | string;
62
+ /**
63
+ * Detecta si un texto contiene enlaces (URLs, rutas internas o enlaces Markdown).
64
+ *
65
+ * @param text - Texto a analizar
66
+ * @returns true si contiene enlaces
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * const hasLinks = this.linkProcessor.hasLinks('Visit https://example.com or [docs](https://docs.com)');
71
+ * // Returns: true
72
+ * ```
73
+ */
74
+ hasLinks(text: string): boolean;
75
+ /**
76
+ * Extrae todos los enlaces de un texto.
77
+ *
78
+ * @param text - Texto a analizar
79
+ * @returns Array de enlaces encontrados con su tipo y texto (si es Markdown)
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const links = this.linkProcessor.extractLinks('Visit https://example.com, /profile, or [docs](https://docs.com)');
84
+ * // Returns: [
85
+ * // { url: 'https://example.com', type: 'external', text: 'https://example.com' },
86
+ * // { url: '/profile', type: 'internal', text: '/profile' },
87
+ * // { url: 'https://docs.com', type: 'external', text: 'docs' }
88
+ * // ]
89
+ * ```
90
+ */
91
+ extractLinks(text: string): Array<{
92
+ url: string;
93
+ type: 'external' | 'internal';
94
+ text: string;
95
+ }>;
96
+ static ɵfac: i0.ɵɵFactoryDeclaration<LinkProcessorService, never>;
97
+ static ɵprov: i0.ɵɵInjectableDeclaration<LinkProcessorService>;
98
+ }
@@ -0,0 +1,55 @@
1
+ import { PipeTransform } from '@angular/core';
2
+ import { SafeHtml } from '@angular/platform-browser';
3
+ import { LinkProcessorConfig } from '../../services/link-processor.service';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * ProcessLinksPipe - Pipe para procesar texto y convertir URLs en enlaces clickeables.
7
+ *
8
+ * Este pipe standalone detecta automáticamente URLs externas (http/https) y rutas internas
9
+ * (que empiezan con /) y las convierte en elementos HTML anchor con los atributos apropiados.
10
+ *
11
+ * @example Uso básico:
12
+ * ```html
13
+ * <div [innerHTML]="'Visit https://example.com or go to /profile' | processLinks"></div>
14
+ * ```
15
+ *
16
+ * @example Con configuración personalizada:
17
+ * ```html
18
+ * <div [innerHTML]="text | processLinks:linkConfig"></div>
19
+ * ```
20
+ *
21
+ * @example En TypeScript:
22
+ * ```typescript
23
+ * export class MyComponent {
24
+ * linkConfig: LinkProcessorConfig = {
25
+ * openExternalInNewTab: true,
26
+ * openInternalInNewTab: false,
27
+ * linkClass: 'my-link',
28
+ * externalLinkClass: 'external',
29
+ * internalLinkClass: 'internal'
30
+ * };
31
+ * }
32
+ * ```
33
+ */
34
+ export declare class ProcessLinksPipe implements PipeTransform {
35
+ private linkProcessor;
36
+ /**
37
+ * Transforma texto procesando URLs y rutas internas para convertirlas en enlaces.
38
+ *
39
+ * @param value - El texto a procesar
40
+ * @param config - Configuración opcional para el procesamiento de enlaces
41
+ * @returns SafeHtml con enlaces procesados o string original si no hay enlaces
42
+ *
43
+ * @example
44
+ * ```html
45
+ * <!-- Uso básico -->
46
+ * <p [innerHTML]="'Check out https://angular.io' | processLinks"></p>
47
+ *
48
+ * <!-- Con configuración -->
49
+ * <p [innerHTML]="message | processLinks:{ openExternalInNewTab: false }"></p>
50
+ * ```
51
+ */
52
+ transform(value: string, config?: LinkProcessorConfig): SafeHtml | string;
53
+ static ɵfac: i0.ɵɵFactoryDeclaration<ProcessLinksPipe, never>;
54
+ static ɵpipe: i0.ɵɵPipeDeclaration<ProcessLinksPipe, "processLinks", true>;
55
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "2.0.286",
3
+ "version": "2.0.289",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^18.0.0",
6
6
  "@angular/core": "^18.0.0",
package/public-api.d.ts CHANGED
@@ -79,9 +79,8 @@ export * from './lib/components/organisms/wizard/wizard.component';
79
79
  export * from './lib/components/templates/layout/layout.component';
80
80
  export * from './lib/components/templates/simple/simple.component';
81
81
  export * from './lib/components/templates/simple/types';
82
- export * from './lib/components/_examples/custom-content-demo.component';
83
- export * from './lib/components/_examples/global-content-example.component';
84
- export * from './lib/components/_examples/reactive-content-example.component';
82
+ export * from './lib/examples/custom-content-demo.component';
83
+ export * from './lib/examples/link-processing-example.component';
85
84
  export * from './lib/services/content.service';
86
85
  export * from './lib/services/download.service';
87
86
  export * from './lib/services/icons.service';
@@ -89,12 +88,14 @@ export * from './lib/services/in-app-browser.service';
89
88
  export * from './lib/services/lang-provider/content';
90
89
  export * from './lib/services/lang-provider/lang-provider.service';
91
90
  export * from './lib/services/lang-provider/types';
91
+ export * from './lib/services/link-processor.service';
92
92
  export * from './lib/services/local-storage.service';
93
93
  export * from './lib/services/navigation.service';
94
94
  export * from './lib/services/theme.service';
95
95
  export * from './lib/services/toast.service';
96
96
  export * from './lib/services/types';
97
97
  export * from './lib/components/types';
98
+ export * from './lib/shared/pipes/process-links.pipe';
98
99
  export * from './lib/shared/utils/content';
99
100
  export * from './lib/shared/utils/dom';
100
101
  export * from './lib/shared/utils/form-defaults';
@@ -1,291 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, inject } from '@angular/core';
3
- import { IonButton, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonItem, IonLabel, } from '@ionic/angular/standalone';
4
- import { ContentService } from '../../services/content.service';
5
- import { LangOption } from '../../services/lang-provider/types';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/common";
8
- export class CustomContentDemoComponent {
9
- constructor() {
10
- this.content = inject(ContentService);
11
- this.currentLang = 'es';
12
- // Contenido global predefinido (sin className)
13
- this.saveText$ = this.content.fromContent({ key: 'save' });
14
- this.cancelText$ = this.content.fromContent({ key: 'cancel' });
15
- this.deleteText$ = this.content.fromContent({ key: 'delete' });
16
- this.loadingText$ = this.content.fromContent({ key: 'loading' });
17
- // Tu contenido global personalizado (sin className)
18
- this.dashboardText$ = this.content.fromContent({ key: 'dashboard' });
19
- this.profileText$ = this.content.fromContent({ key: 'profile' });
20
- this.settingsText$ = this.content.fromContent({ key: 'settings' });
21
- this.welcomeText$ = this.content.fromContent({
22
- key: 'welcome',
23
- interpolation: { appName: 'Mi Aplicación' },
24
- });
25
- // Contenido específico del componente Language (con className)
26
- this.spanishText$ = this.content.fromContent({
27
- className: 'Language',
28
- key: 'spanish',
29
- });
30
- this.englishText$ = this.content.fromContent({
31
- className: 'Language',
32
- key: 'english',
33
- });
34
- this.descriptionText$ = this.content.fromContent({
35
- className: 'Language',
36
- key: 'description',
37
- });
38
- // Para debug - texto síncrono
39
- this.saveTextSync = '';
40
- this.dashboardTextSync = '';
41
- this.languageDescSync = '';
42
- }
43
- ngOnInit() {
44
- // Obtener idioma actual
45
- this.content.currentLang$.subscribe(lang => {
46
- this.currentLang = lang;
47
- });
48
- // Obtener textos síncronos para debug
49
- this.updateSyncTexts();
50
- // 🔍 DIAGNÓSTICO: Verificar configuración
51
- this.diagnoseConfiguration();
52
- }
53
- switchLanguage() {
54
- const newLang = this.currentLang === 'es' ? LangOption.EN : LangOption.ES;
55
- this.content.setLang(newLang);
56
- // Actualizar textos síncronos después del cambio
57
- setTimeout(() => {
58
- this.updateSyncTexts();
59
- }, 100);
60
- }
61
- updateSyncTexts() {
62
- // Contenido global predefinido
63
- this.saveTextSync = this.content.getText('save');
64
- // Tu contenido global personalizado
65
- this.dashboardTextSync = this.content.getText('dashboard');
66
- // Contenido específico del componente - SOLUCIÓN TEMPORAL
67
- // En lugar de usar getText, acceder directamente
68
- try {
69
- const langService = this.content.langService;
70
- const languageContent = langService.content['Language'];
71
- const currentLang = langService.selectedLang?.value || 'es';
72
- const classContent = languageContent?.Content?.[currentLang];
73
- this.languageDescSync = classContent?.['description'] || 'No encontrado';
74
- }
75
- catch (error) {
76
- this.languageDescSync = `Error: ${error}`;
77
- }
78
- }
79
- diagnoseConfiguration() {
80
- console.log('=== DIAGNÓSTICO DE CONFIGURACIÓN ===');
81
- // Verificar acceso directo al servicio
82
- console.log('ContentService available:', !!this.content);
83
- console.log('Current language:', this.content.currentLang);
84
- // 🔍 Diagnóstico detallado del contenido Language
85
- console.log('\n--- DIAGNÓSTICO DETALLADO LANGUAGE ---');
86
- try {
87
- // Acceder directamente al LangService
88
- const langService = this.content.langService;
89
- console.log('LangService available:', !!langService);
90
- // Verificar si existe el contenido Language
91
- const languageContent = langService.content['Language'];
92
- console.log('Language content exists:', !!languageContent);
93
- if (languageContent) {
94
- console.log('Language content structure:', languageContent);
95
- console.log('Language content.Content:', languageContent.Content);
96
- // Verificar contenido en español
97
- const esContent = languageContent.Content?.es;
98
- console.log('ES content:', esContent);
99
- console.log('ES description:', esContent?.description);
100
- // Verificar contenido en inglés
101
- const enContent = languageContent.Content?.en;
102
- console.log('EN content:', enContent);
103
- console.log('EN description:', enContent?.description);
104
- }
105
- // Verificar current lang
106
- const currentLang = langService.selectedLang?.value;
107
- console.log('Current selected language:', currentLang);
108
- }
109
- catch (error) {
110
- console.log('❌ Error accessing LangService:', error);
111
- }
112
- // Intentar acceso síncrono a contenido global predefinido
113
- try {
114
- const saveText = this.content.getText('save');
115
- console.log('✅ Global predefinido (save):', saveText);
116
- }
117
- catch (error) {
118
- console.log('❌ Error global predefinido (save):', error);
119
- }
120
- // Intentar acceso síncrono a contenido global personalizado
121
- try {
122
- const dashboardText = this.content.getText('dashboard');
123
- console.log('✅ Global personalizado (dashboard):', dashboardText);
124
- }
125
- catch (error) {
126
- console.log('❌ Error global personalizado (dashboard):', error);
127
- }
128
- // Intentar acceso síncrono a contenido de componente
129
- try {
130
- const spanishText = this.content.getText('Language', 'spanish');
131
- console.log('✅ Componente Language (spanish):', spanishText);
132
- // 🔍 Debug paso a paso para spanish
133
- const langService = this.content.langService;
134
- const languageContent = langService.content['Language'];
135
- const currentLang = langService.selectedLang?.value;
136
- const classContent = languageContent?.Content[currentLang];
137
- console.log('🔍 Debug spanish - currentLang:', currentLang);
138
- console.log('🔍 Debug spanish - classContent:', classContent);
139
- console.log('🔍 Debug spanish - classContent["spanish"]:', classContent?.['spanish']);
140
- }
141
- catch (error) {
142
- console.log('❌ Error componente Language (spanish):', error);
143
- }
144
- // Intentar acceso síncrono a contenido de componente
145
- try {
146
- const descriptionText = this.content.getText('Language', 'description');
147
- console.log('✅ Componente Language (description):', descriptionText);
148
- // 🔍 Debug paso a paso para description
149
- const langService = this.content.langService;
150
- const languageContent = langService.content['Language'];
151
- const currentLang = langService.selectedLang?.value;
152
- const classContent = languageContent?.Content[currentLang];
153
- console.log('🔍 Debug description - currentLang:', currentLang);
154
- console.log('🔍 Debug description - classContent:', classContent);
155
- console.log('🔍 Debug description - classContent["description"]:', classContent?.['description']);
156
- }
157
- catch (error) {
158
- console.log('❌ Error componente Language (description):', error);
159
- }
160
- }
161
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomContentDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
162
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CustomContentDemoComponent, isStandalone: true, selector: "app-custom-content-demo", ngImport: i0, template: `
163
- <ion-card>
164
- <ion-card-header>
165
- <ion-card-title>Demo de Contenido Personalizado</ion-card-title>
166
- </ion-card-header>
167
-
168
- <ion-card-content>
169
- <!-- Contenido global predefinido -->
170
- <div style="margin-bottom: 20px;">
171
- <h3>Contenido Global Predefinido:</h3>
172
- <ion-button>{{ saveText$ | async }}</ion-button>
173
- <ion-button color="medium">{{ cancelText$ | async }}</ion-button>
174
- <ion-button color="danger">{{ deleteText$ | async }}</ion-button>
175
- <p><strong>Estado:</strong> {{ loadingText$ | async }}</p>
176
- </div>
177
-
178
- <!-- Tu contenido global personalizado -->
179
- <div style="margin-bottom: 20px;">
180
- <h3>Tu Contenido Global Personalizado:</h3>
181
- <p><strong>Sección:</strong> {{ dashboardText$ | async }}</p>
182
- <p><strong>Usuario:</strong> {{ profileText$ | async }}</p>
183
- <p><strong>Config:</strong> {{ settingsText$ | async }}</p>
184
- <p>{{ welcomeText$ | async }}</p>
185
- </div>
186
-
187
- <!-- Contenido específico del componente Language -->
188
- <div style="margin-bottom: 20px;">
189
- <h3>Contenido del Componente Language:</h3>
190
- <ion-item>
191
- <ion-label> <strong>Español:</strong> {{ spanishText$ | async }} </ion-label>
192
- </ion-item>
193
- <ion-item>
194
- <ion-label> <strong>Inglés:</strong> {{ englishText$ | async }} </ion-label>
195
- </ion-item>
196
- <p>
197
- <em>{{ descriptionText$ | async }}</em>
198
- </p>
199
- </div>
200
-
201
- <!-- Botón para cambiar idioma -->
202
- <div>
203
- <h3>Control de Idioma:</h3>
204
- <ion-button (click)="switchLanguage()" color="secondary">
205
- Cambiar a {{ currentLang === 'es' ? 'English' : 'Español' }}
206
- </ion-button>
207
- <p>
208
- <small>Idioma actual: {{ currentLang }}</small>
209
- </p>
210
- </div>
211
-
212
- <!-- Debug info -->
213
- <div style="margin-top: 20px; padding: 10px; background: #f5f5f5; border-radius: 4px;">
214
- <h4>Debug Info:</h4>
215
- <p><strong>Save (sync):</strong> {{ saveTextSync }}</p>
216
- <p><strong>Dashboard (sync):</strong> {{ dashboardTextSync }}</p>
217
- <p><strong>Language Description (sync):</strong> {{ languageDescSync }}</p>
218
- </div>
219
- </ion-card-content>
220
- </ion-card>
221
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { 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"] }] }); }
222
- }
223
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomContentDemoComponent, decorators: [{
224
- type: Component,
225
- args: [{
226
- selector: 'app-custom-content-demo',
227
- standalone: true,
228
- imports: [CommonModule, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonButton, IonItem, IonLabel],
229
- template: `
230
- <ion-card>
231
- <ion-card-header>
232
- <ion-card-title>Demo de Contenido Personalizado</ion-card-title>
233
- </ion-card-header>
234
-
235
- <ion-card-content>
236
- <!-- Contenido global predefinido -->
237
- <div style="margin-bottom: 20px;">
238
- <h3>Contenido Global Predefinido:</h3>
239
- <ion-button>{{ saveText$ | async }}</ion-button>
240
- <ion-button color="medium">{{ cancelText$ | async }}</ion-button>
241
- <ion-button color="danger">{{ deleteText$ | async }}</ion-button>
242
- <p><strong>Estado:</strong> {{ loadingText$ | async }}</p>
243
- </div>
244
-
245
- <!-- Tu contenido global personalizado -->
246
- <div style="margin-bottom: 20px;">
247
- <h3>Tu Contenido Global Personalizado:</h3>
248
- <p><strong>Sección:</strong> {{ dashboardText$ | async }}</p>
249
- <p><strong>Usuario:</strong> {{ profileText$ | async }}</p>
250
- <p><strong>Config:</strong> {{ settingsText$ | async }}</p>
251
- <p>{{ welcomeText$ | async }}</p>
252
- </div>
253
-
254
- <!-- Contenido específico del componente Language -->
255
- <div style="margin-bottom: 20px;">
256
- <h3>Contenido del Componente Language:</h3>
257
- <ion-item>
258
- <ion-label> <strong>Español:</strong> {{ spanishText$ | async }} </ion-label>
259
- </ion-item>
260
- <ion-item>
261
- <ion-label> <strong>Inglés:</strong> {{ englishText$ | async }} </ion-label>
262
- </ion-item>
263
- <p>
264
- <em>{{ descriptionText$ | async }}</em>
265
- </p>
266
- </div>
267
-
268
- <!-- Botón para cambiar idioma -->
269
- <div>
270
- <h3>Control de Idioma:</h3>
271
- <ion-button (click)="switchLanguage()" color="secondary">
272
- Cambiar a {{ currentLang === 'es' ? 'English' : 'Español' }}
273
- </ion-button>
274
- <p>
275
- <small>Idioma actual: {{ currentLang }}</small>
276
- </p>
277
- </div>
278
-
279
- <!-- Debug info -->
280
- <div style="margin-top: 20px; padding: 10px; background: #f5f5f5; border-radius: 4px;">
281
- <h4>Debug Info:</h4>
282
- <p><strong>Save (sync):</strong> {{ saveTextSync }}</p>
283
- <p><strong>Dashboard (sync):</strong> {{ dashboardTextSync }}</p>
284
- <p><strong>Language Description (sync):</strong> {{ languageDescSync }}</p>
285
- </div>
286
- </ion-card-content>
287
- </ion-card>
288
- `,
289
- }]
290
- }] });
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNvbnRlbnQtZGVtby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL19leGFtcGxlcy9jdXN0b20tY29udGVudC1kZW1vLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsY0FBYyxFQUNkLGFBQWEsRUFDYixZQUFZLEVBQ1osT0FBTyxFQUNQLFFBQVEsR0FDVCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7OztBQW1FaEUsTUFBTSxPQUFPLDBCQUEwQjtJQWpFdkM7UUFrRVUsWUFBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6QyxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQiwrQ0FBK0M7UUFDL0MsY0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsZ0JBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFELGdCQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMxRCxpQkFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxD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QUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUM7b0JBQzNHLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyRFQ7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSW9uQnV0dG9uLFxuICBJb25DYXJkLFxuICBJb25DYXJkQ29udGVudCxcbiAgSW9uQ2FyZEhlYWRlcixcbiAgSW9uQ2FyZFRpdGxlLFxuICBJb25JdGVtLFxuICBJb25MYWJlbCxcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBDb250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBMYW5nT3B0aW9uIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbGFuZy1wcm92aWRlci90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jdXN0b20tY29udGVudC1kZW1vJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW9uQ2FyZCwgSW9uQ2FyZENvbnRlbnQsIElvbkNhcmRIZWFkZXIsIElvbkNhcmRUaXRsZSwgSW9uQnV0dG9uLCBJb25JdGVtLCBJb25MYWJlbF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1jYXJkPlxuICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgPGlvbi1jYXJkLXRpdGxlPkRlbW8gZGUgQ29udGVuaWRvIFBlcnNvbmFsaXphZG88L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG5cbiAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICA8IS0tIENvbnRlbmlkbyBnbG9iYWwgcHJlZGVmaW5pZG8gLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4O1wiPlxuICAgICAgICAgIDxoMz5Db250ZW5pZG8gR2xvYmFsIFByZWRlZmluaWRvOjwvaDM+XG4gICAgICAgICAgPGlvbi1idXR0b24+e3sgc2F2ZVRleHQkIHwgYXN5bmMgfX08L2lvbi1idXR0b24+XG4gICAgICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJtZWRpdW1cIj57eyBjYW5jZWxUZXh0JCB8IGFzeW5jIH19PC9pb24tYnV0dG9uPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGNvbG9yPVwiZGFuZ2VyXCI+e3sgZGVsZXRlVGV4dCQgfCBhc3luYyB9fTwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8cD48c3Ryb25nPkVzdGFkbzo8L3N0cm9uZz4ge3sgbG9hZGluZ1RleHQkIHwgYXN5bmMgfX08L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVHUgY29udGVuaWRvIGdsb2JhbCBwZXJzb25hbGl6YWRvIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMjBweDtcIj5cbiAgICAgICAgICA8aDM+VHUgQ29udGVuaWRvIEdsb2JhbCBQZXJzb25hbGl6YWRvOjwvaDM+XG4gICAgICAgICAgPHA+PHN0cm9uZz5TZWNjacOzbjo8L3N0cm9uZz4ge3sgZGFzaGJvYXJkVGV4dCQgfCBhc3luYyB9fTwvcD5cbiAgICAgICAgICA8cD48c3Ryb25nPlVzdWFyaW86PC9zdHJvbmc+IHt7IHByb2ZpbGVUZXh0JCB8IGFzeW5jIH19PC9wPlxuICAgICAgICAgIDxwPjxzdHJvbmc+Q29uZmlnOjwvc3Ryb25nPiB7eyBzZXR0aW5nc1RleHQkIHwgYXN5bmMgfX08L3A+XG4gICAgICAgICAgPHA+e3sgd2VsY29tZVRleHQkIHwgYXN5bmMgfX08L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ29udGVuaWRvIGVzcGVjw61maWNvIGRlbCBjb21wb25lbnRlIExhbmd1YWdlIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMjBweDtcIj5cbiAgICAgICAgICA8aDM+Q29udGVuaWRvIGRlbCBDb21wb25lbnRlIExhbmd1YWdlOjwvaDM+XG4gICAgICAgICAgPGlvbi1pdGVtPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD4gPHN0cm9uZz5Fc3Bhw7FvbDo8L3N0cm9uZz4ge3sgc3BhbmlzaFRleHQkIHwgYXN5bmMgfX0gPC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICA8aW9uLWl0ZW0+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPiA8c3Ryb25nPkluZ2zDqXM6PC9zdHJvbmc+IHt7IGVuZ2xpc2hUZXh0JCB8IGFzeW5jIH19IDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICA8ZW0+e3sgZGVzY3JpcHRpb25UZXh0JCB8IGFzeW5jIH19PC9lbT5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQm90w7NuIHBhcmEgY2FtYmlhciBpZGlvbWEgLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzPkNvbnRyb2wgZGUgSWRpb21hOjwvaDM+XG4gICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInN3aXRjaExhbmd1YWdlKClcIiBjb2xvcj1cInNlY29uZGFyeVwiPlxuICAgICAgICAgICAgQ2FtYmlhciBhIHt7IGN1cnJlbnRMYW5nID09PSAnZXMnID8gJ0VuZ2xpc2gnIDogJ0VzcGHDsW9sJyB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxzbWFsbD5JZGlvbWEgYWN0dWFsOiB7eyBjdXJyZW50TGFuZyB9fTwvc21hbGw+XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERlYnVnIGluZm8gLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAyMHB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiAjZjVmNWY1OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgPGg0PkRlYnVnIEluZm86PC9oND5cbiAgICAgICAgICA8cD48c3Ryb25nPlNhdmUgKHN5bmMpOjwvc3Ryb25nPiB7eyBzYXZlVGV4dFN5bmMgfX08L3A+XG4gICAgICAgICAgPHA+PHN0cm9uZz5EYXNoYm9hcmQgKHN5bmMpOjwvc3Ryb25nPiB7eyBkYXNoYm9hcmRUZXh0U3luYyB9fTwvcD5cbiAgICAgICAgICA8cD48c3Ryb25nPkxhbmd1YWdlIERlc2NyaXB0aW9uIChzeW5jKTo8L3N0cm9uZz4ge3sgbGFuZ3VhZ2VEZXNjU3luYyB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgPC9pb24tY2FyZD5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tQ29udGVudERlbW9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIGNvbnRlbnQgPSBpbmplY3QoQ29udGVudFNlcnZpY2UpO1xuXG4gIGN1cnJlbnRMYW5nID0gJ2VzJztcblxuICAvLyBDb250ZW5pZG8gZ2xvYmFsIHByZWRlZmluaWRvIChzaW4gY2xhc3NOYW1lKVxuICBzYXZlVGV4dCQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoeyBrZXk6ICdzYXZlJyB9KTtcbiAgY2FuY2VsVGV4dCQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoeyBrZXk6ICdjYW5jZWwnIH0pO1xuICBkZWxldGVUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ2RlbGV0ZScgfSk7XG4gIGxvYWRpbmdUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ2xvYWRpbmcnIH0pO1xuXG4gIC8vIFR1IGNvbnRlbmlkbyBnbG9iYWwgcGVyc29uYWxpemFkbyAoc2luIGNsYXNzTmFtZSlcbiAgZGFzaGJvYXJkVGV4dCQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoeyBrZXk6ICdkYXNoYm9hcmQnIH0pO1xuICBwcm9maWxlVGV4dCQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoeyBrZXk6ICdwcm9maWxlJyB9KTtcbiAgc2V0dGluZ3NUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ3NldHRpbmdzJyB9KTtcbiAgd2VsY29tZVRleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHtcbiAgICBrZXk6ICd3ZWxjb21lJyxcbiAgICBpbnRlcnBvbGF0aW9uOiB7IGFwcE5hbWU6ICdNaSBBcGxpY2FjacOzbicgfSxcbiAgfSk7XG5cbiAgLy8gQ29udGVuaWRvIGVzcGVjw61maWNvIGRlbCBjb21wb25lbnRlIExhbmd1YWdlIChjb24gY2xhc3NOYW1lKVxuICBzcGFuaXNoVGV4dCQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoe1xuICAgIGNsYXNzTmFtZTogJ0xhbmd1YWdlJyxcbiAgICBrZXk6ICdzcGFuaXNoJyxcbiAgfSk7XG4gIGVuZ2xpc2hUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7XG4gICAgY2xhc3NOYW1lOiAnTGFuZ3VhZ2UnLFxuICAgIGtleTogJ2VuZ2xpc2gnLFxuICB9KTtcbiAgZGVzY3JpcHRpb25UZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7XG4gICAgY2xhc3NOYW1lOiAnTGFuZ3VhZ2UnLFxuICAgIGtleTogJ2Rlc2NyaXB0aW9uJyxcbiAgfSk7XG5cbiAgLy8gUGFyYSBkZWJ1ZyAtIHRleHRvIHPDrW5jcm9ub1xuICBzYXZlVGV4dFN5bmMgPSAnJztcbiAgZGFzaGJvYXJkVGV4dFN5bmMgPSAnJztcbiAgbGFuZ3VhZ2VEZXNjU3luYyA9ICcnO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIE9idGVuZXIgaWRpb21hIGFjdHVhbFxuICAgIHRoaXMuY29udGVudC5jdXJyZW50TGFuZyQuc3Vic2NyaWJlKGxhbmcgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50TGFuZyA9IGxhbmc7XG4gICAgfSk7XG5cbiAgICAvLyBPYnRlbmVyIHRleHRvcyBzw61uY3Jvbm9zIHBhcmEgZGVidWdcbiAgICB0aGlzLnVwZGF0ZVN5bmNUZXh0cygpO1xuXG4gICAgLy8g8J+UjSBESUFHTsOTU1RJQ086IFZlcmlmaWNhciBjb25maWd1cmFjacOzblxuICAgIHRoaXMuZGlhZ25vc2VDb25maWd1cmF0aW9uKCk7XG4gIH1cblxuICBzd2l0Y2hMYW5ndWFnZSgpIHtcbiAgICBjb25zdCBuZXdMYW5nID0gdGhpcy5jdXJyZW50TGFuZyA9PT0gJ2VzJyA/IExhbmdPcHRpb24uRU4gOiBMYW5nT3B0aW9uLkVTO1xuICAgIHRoaXMuY29udGVudC5zZXRMYW5nKG5ld0xhbmcpO1xuXG4gICAgLy8gQWN0dWFsaXphciB0ZXh0b3Mgc8OtbmNyb25vcyBkZXNwdcOpcyBkZWwgY2FtYmlvXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVN5bmNUZXh0cygpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN5bmNUZXh0cygpIHtcbiAgICAvLyBDb250ZW5pZG8gZ2xvYmFsIHByZWRlZmluaWRvXG4gICAgdGhpcy5zYXZlVGV4dFN5bmMgPSB0aGlzLmNvbnRlbnQuZ2V0VGV4dCgnc2F2ZScpO1xuXG4gICAgLy8gVHUgY29udGVuaWRvIGdsb2JhbCBwZXJzb25hbGl6YWRvXG4gICAgdGhpcy5kYXNoYm9hcmRUZXh0U3luYyA9IHRoaXMuY29udGVudC5nZXRUZXh0KCdkYXNoYm9hcmQnKTtcblxuICAgIC8vIENvbnRlbmlkbyBlc3BlY8OtZmljbyBkZWwgY29tcG9uZW50ZSAtIFNPTFVDScOTTiBURU1QT1JBTFxuICAgIC8vIEVuIGx1Z2FyIGRlIHVzYXIgZ2V0VGV4dCwgYWNjZWRlciBkaXJlY3RhbWVudGVcbiAgICB0cnkge1xuICAgICAgY29uc3QgbGFuZ1NlcnZpY2UgPSAodGhpcy5jb250ZW50IGFzIGFueSkubGFuZ1NlcnZpY2U7XG4gICAgICBjb25zdCBsYW5ndWFnZUNvbnRlbnQgPSBsYW5nU2VydmljZS5jb250ZW50WydMYW5ndWFnZSddO1xuICAgICAgY29uc3QgY3VycmVudExhbmcgPSBsYW5nU2VydmljZS5zZWxlY3RlZExhbmc/LnZhbHVlIHx8ICdlcyc7XG4gICAgICBjb25zdCBjbGFzc0NvbnRlbnQgPSBsYW5ndWFnZUNvbnRlbnQ/LkNvbnRlbnQ/LltjdXJyZW50TGFuZ107XG4gICAgICB0aGlzLmxhbmd1YWdlRGVzY1N5bmMgPSBjbGFzc0NvbnRlbnQ/LlsnZGVzY3JpcHRpb24nXSB8fCAnTm8gZW5jb250cmFkbyc7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubGFuZ3VhZ2VEZXNjU3luYyA9IGBFcnJvcjogJHtlcnJvcn1gO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlhZ25vc2VDb25maWd1cmF0aW9uKCkge1xuICAgIGNvbnNvbGUubG9nKCc9PT0gRElBR07Dk1NUSUNPIERFIENPTkZJR1VSQUNJw5NOID09PScpO1xuXG4gICAgLy8gVmVyaWZpY2FyIGFjY2VzbyBkaXJlY3RvIGFsIHNlcnZpY2lvXG4gICAgY29uc29sZS5sb2coJ0NvbnRlbnRTZXJ2aWNlIGF2YWlsYWJsZTonLCAhIXRoaXMuY29udGVudCk7XG4gICAgY29uc29sZS5sb2coJ0N1cnJlbnQgbGFuZ3VhZ2U6JywgdGhpcy5jb250ZW50LmN1cnJlbnRMYW5nKTtcblxuICAgIC8vIPCflI0gRGlhZ27Ds3N0aWNvIGRldGFsbGFkbyBkZWwgY29udGVuaWRvIExhbmd1YWdlXG4gICAgY29uc29sZS5sb2coJ1xcbi0tLSBESUFHTsOTU1RJQ08gREVUQUxMQURPIExBTkdVQUdFIC0tLScpO1xuICAgIHRyeSB7XG4gICAgICAvLyBBY2NlZGVyIGRpcmVjdGFtZW50ZSBhbCBMYW5nU2VydmljZVxuICAgICAgY29uc3QgbGFuZ1NlcnZpY2UgPSAodGhpcy5jb250ZW50IGFzIGFueSkubGFuZ1NlcnZpY2U7XG4gICAgICBjb25zb2xlLmxvZygnTGFuZ1NlcnZpY2UgYXZhaWxhYmxlOicsICEhbGFuZ1NlcnZpY2UpO1xuXG4gICAgICAvLyBWZXJpZmljYXIgc2kgZXhpc3RlIGVsIGNvbnRlbmlkbyBMYW5ndWFnZVxuICAgICAgY29uc3QgbGFuZ3VhZ2VDb250ZW50ID0gbGFuZ1NlcnZpY2UuY29udGVudFsnTGFuZ3VhZ2UnXTtcbiAgICAgIGNvbnNvbGUubG9nKCdMYW5ndWFnZSBjb250ZW50IGV4aXN0czonLCAhIWxhbmd1YWdlQ29udGVudCk7XG5cbiAgICAgIGlmIChsYW5ndWFnZUNvbnRlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0xhbmd1YWdlIGNvbnRlbnQgc3RydWN0dXJlOicsIGxhbmd1YWdlQ29udGVudCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdMYW5ndWFnZSBjb250ZW50LkNvbnRlbnQ6JywgbGFuZ3VhZ2VDb250ZW50LkNvbnRlbnQpO1xuXG4gICAgICAgIC8vIFZlcmlmaWNhciBjb250ZW5pZG8gZW4gZXNwYcOxb2xcbiAgICAgICAgY29uc3QgZXNDb250ZW50ID0gbGFuZ3VhZ2VDb250ZW50LkNvbnRlbnQ/LmVzO1xuICAgICAgICBjb25zb2xlLmxvZygnRVMgY29udGVudDonLCBlc0NvbnRlbnQpO1xuICAgICAgICBjb25zb2xlLmxvZygnRVMgZGVzY3JpcHRpb246JywgZXNDb250ZW50Py5kZXNjcmlwdGlvbik7XG5cbiAgICAgICAgLy8gVmVyaWZpY2FyIGNvbnRlbmlkbyBlbiBpbmdsw6lzXG4gICAgICAgIGNvbnN0IGVuQ29udGVudCA9IGxhbmd1YWdlQ29udGVudC5Db250ZW50Py5lbjtcbiAgICAgICAgY29uc29sZS5sb2coJ0VOIGNvbnRlbnQ6JywgZW5Db250ZW50KTtcbiAgICAgICAgY29uc29sZS5sb2coJ0VOIGRlc2NyaXB0aW9uOicsIGVuQ29udGVudD8uZGVzY3JpcHRpb24pO1xuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZmljYXIgY3VycmVudCBsYW5nXG4gICAgICBjb25zdCBjdXJyZW50TGFuZyA9IGxhbmdTZXJ2aWNlLnNlbGVjdGVkTGFuZz8udmFsdWU7XG4gICAgICBjb25zb2xlLmxvZygnQ3VycmVudCBzZWxlY3RlZCBsYW5ndWFnZTonLCBjdXJyZW50TGFuZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfinYwgRXJyb3IgYWNjZXNzaW5nIExhbmdTZXJ2aWNlOicsIGVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBJbnRlbnRhciBhY2Nlc28gc8OtbmNyb25vIGEgY29udGVuaWRvIGdsb2JhbCBwcmVkZWZpbmlkb1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYXZlVGV4dCA9IHRoaXMuY29udGVudC5nZXRUZXh0KCdzYXZlJyk7XG4gICAgICBjb25zb2xlLmxvZygn4pyFIEdsb2JhbCBwcmVkZWZpbmlkbyAoc2F2ZSk6Jywgc2F2ZVRleHQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZygn4p2MIEVycm9yIGdsb2JhbCBwcmVkZWZpbmlkbyAoc2F2ZSk6JywgZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIEludGVudGFyIGFjY2VzbyBzw61uY3Jvbm8gYSBjb250ZW5pZG8gZ2xvYmFsIHBlcnNvbmFsaXphZG9cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGFzaGJvYXJkVGV4dCA9IHRoaXMuY29udGVudC5nZXRUZXh0KCdkYXNoYm9hcmQnKTtcbiAgICAgIGNvbnNvbGUubG9nKCfinIUgR2xvYmFsIHBlcnNvbmFsaXphZG8gKGRhc2hib2FyZCk6JywgZGFzaGJvYXJkVGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfinYwgRXJyb3IgZ2xvYmFsIHBlcnNvbmFsaXphZG8gKGRhc2hib2FyZCk6JywgZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIEludGVudGFyIGFjY2VzbyBzw61uY3Jvbm8gYSBjb250ZW5pZG8gZGUgY29tcG9uZW50ZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzcGFuaXNoVGV4dCA9IHRoaXMuY29udGVudC5nZXRUZXh0KCdMYW5ndWFnZScsICdzcGFuaXNoJyk7XG4gICAgICBjb25zb2xlLmxvZygn4pyFIENvbXBvbmVudGUgTGFuZ3VhZ2UgKHNwYW5pc2gpOicsIHNwYW5pc2hUZXh0KTtcblxuICAgICAgLy8g8J+UjSBEZWJ1ZyBwYXNvIGEgcGFzbyBwYXJhIHNwYW5pc2hcbiAgICAgIGNvbnN0IGxhbmdTZXJ2aWNlID0gKHRoaXMuY29udGVudCBhcyBhbnkpLmxhbmdTZXJ2aWNlO1xuICAgICAgY29uc3QgbGFuZ3VhZ2VDb250ZW50ID0gbGFuZ1NlcnZpY2UuY29udGVudFsnTGFuZ3VhZ2UnXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gbGFuZ1NlcnZpY2Uuc2VsZWN0ZWRMYW5nPy52YWx1ZTtcbiAgICAgIGNvbnN0IGNsYXNzQ29udGVudCA9IGxhbmd1YWdlQ29udGVudD8uQ29udGVudFtjdXJyZW50TGFuZ107XG4gICAgICBjb25zb2xlLmxvZygn8J+UjSBEZWJ1ZyBzcGFuaXNoIC0gY3VycmVudExhbmc6JywgY3VycmVudExhbmcpO1xuICAgICAgY29uc29sZS5sb2coJ/CflI0gRGVidWcgc3BhbmlzaCAtIGNsYXNzQ29udGVudDonLCBjbGFzc0NvbnRlbnQpO1xuICAgICAgY29uc29sZS5sb2coJ/CflI0gRGVidWcgc3BhbmlzaCAtIGNsYXNzQ29udGVudFtcInNwYW5pc2hcIl06JywgY2xhc3NDb250ZW50Py5bJ3NwYW5pc2gnXSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfinYwgRXJyb3IgY29tcG9uZW50ZSBMYW5ndWFnZSAoc3BhbmlzaCk6JywgZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIEludGVudGFyIGFjY2VzbyBzw61uY3Jvbm8gYSBjb250ZW5pZG8gZGUgY29tcG9uZW50ZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvblRleHQgPSB0aGlzLmNvbnRlbnQuZ2V0VGV4dCgnTGFuZ3VhZ2UnLCAnZGVzY3JpcHRpb24nKTtcbiAgICAgIGNvbnNvbGUubG9nKCfinIUgQ29tcG9uZW50ZSBMYW5ndWFnZSAoZGVzY3JpcHRpb24pOicsIGRlc2NyaXB0aW9uVGV4dCk7XG5cbiAgICAgIC8vIPCflI0gRGVidWcgcGFzbyBhIHBhc28gcGFyYSBkZXNjcmlwdGlvblxuICAgICAgY29uc3QgbGFuZ1NlcnZpY2UgPSAodGhpcy5jb250ZW50IGFzIGFueSkubGFuZ1NlcnZpY2U7XG4gICAgICBjb25zdCBsYW5ndWFnZUNvbnRlbnQgPSBsYW5nU2VydmljZS5jb250ZW50WydMYW5ndWFnZSddO1xuICAgICAgY29uc3QgY3VycmVudExhbmcgPSBsYW5nU2VydmljZS5zZWxlY3RlZExhbmc/LnZhbHVlO1xuICAgICAgY29uc3QgY2xhc3NDb250ZW50ID0gbGFuZ3VhZ2VDb250ZW50Py5Db250ZW50W2N1cnJlbnRMYW5nXTtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SNIERlYnVnIGRlc2NyaXB0aW9uIC0gY3VycmVudExhbmc6JywgY3VycmVudExhbmcpO1xuICAgICAgY29uc29sZS5sb2coJ/CflI0gRGVidWcgZGVzY3JpcHRpb24gLSBjbGFzc0NvbnRlbnQ6JywgY2xhc3NDb250ZW50KTtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SNIERlYnVnIGRlc2NyaXB0aW9uIC0gY2xhc3NDb250ZW50W1wiZGVzY3JpcHRpb25cIl06JywgY2xhc3NDb250ZW50Py5bJ2Rlc2NyaXB0aW9uJ10pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZygn4p2MIEVycm9yIGNvbXBvbmVudGUgTGFuZ3VhZ2UgKGRlc2NyaXB0aW9uKTonLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,23 +0,0 @@
1
- /**
2
- * Content configuration for the Global Content Example component.
3
- *
4
- * This demonstrates component-specific content that works alongside
5
- * global content to create a comprehensive content management system.
6
- */
7
- import { TextContent } from '../../services/lang-provider/types';
8
- const globalContentExampleData = {
9
- title: {
10
- es: 'Ejemplo de Contenido Global',
11
- en: 'Global Content Example',
12
- },
13
- languageLabel: {
14
- es: 'Idioma:',
15
- en: 'Language:',
16
- },
17
- description: {
18
- es: 'Este ejemplo demuestra cómo usar contenido global y específico del componente de manera conjunta.',
19
- en: 'This example shows how to use global and component-specific content together.',
20
- },
21
- };
22
- export default new TextContent(globalContentExampleData);
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWNvbnRlbnQtZXhhbXBsZS1jb250ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGVjaC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9fZXhhbXBsZXMvZ2xvYmFsLWNvbnRlbnQtZXhhbXBsZS1jb250ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFvQixXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRixNQUFNLHdCQUF3QixHQUFxQjtJQUNqRCxLQUFLLEVBQUU7UUFDTCxFQUFFLEVBQUUsNkJBQTZCO1FBQ2pDLEVBQUUsRUFBRSx3QkFBd0I7S0FDN0I7SUFDRCxhQUFhLEVBQUU7UUFDYixFQUFFLEVBQUUsU0FBUztRQUNiLEVBQUUsRUFBRSxXQUFXO0tBQ2hCO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsRUFBRSxFQUFFLG1HQUFtRztRQUN2RyxFQUFFLEVBQUUsK0VBQStFO0tBQ3BGO0NBQ0YsQ0FBQztBQUVGLGVBQWUsSUFBSSxXQUFXLENBQUMsd0JBQXdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29udGVudCBjb25maWd1cmF0aW9uIGZvciB0aGUgR2xvYmFsIENvbnRlbnQgRXhhbXBsZSBjb21wb25lbnQuXG4gKlxuICogVGhpcyBkZW1vbnN0cmF0ZXMgY29tcG9uZW50LXNwZWNpZmljIGNvbnRlbnQgdGhhdCB3b3JrcyBhbG9uZ3NpZGVcbiAqIGdsb2JhbCBjb250ZW50IHRvIGNyZWF0ZSBhIGNvbXByZWhlbnNpdmUgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbS5cbiAqL1xuXG5pbXBvcnQgeyBMYW5ndWFnZXNDb250ZW50LCBUZXh0Q29udGVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xhbmctcHJvdmlkZXIvdHlwZXMnO1xuXG5jb25zdCBnbG9iYWxDb250ZW50RXhhbXBsZURhdGE6IExhbmd1YWdlc0NvbnRlbnQgPSB7XG4gIHRpdGxlOiB7XG4gICAgZXM6ICdFamVtcGxvIGRlIENvbnRlbmlkbyBHbG9iYWwnLFxuICAgIGVuOiAnR2xvYmFsIENvbnRlbnQgRXhhbXBsZScsXG4gIH0sXG4gIGxhbmd1YWdlTGFiZWw6IHtcbiAgICBlczogJ0lkaW9tYTonLFxuICAgIGVuOiAnTGFuZ3VhZ2U6JyxcbiAgfSxcbiAgZGVzY3JpcHRpb246IHtcbiAgICBlczogJ0VzdGUgZWplbXBsbyBkZW11ZXN0cmEgY8OzbW8gdXNhciBjb250ZW5pZG8gZ2xvYmFsIHkgZXNwZWPDrWZpY28gZGVsIGNvbXBvbmVudGUgZGUgbWFuZXJhIGNvbmp1bnRhLicsXG4gICAgZW46ICdUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBnbG9iYWwgYW5kIGNvbXBvbmVudC1zcGVjaWZpYyBjb250ZW50IHRvZ2V0aGVyLicsXG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgVGV4dENvbnRlbnQoZ2xvYmFsQ29udGVudEV4YW1wbGVEYXRhKTtcbiJdfQ==