valtech-components 2.0.284 → 2.0.288

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +54 -14
  2. package/esm2022/lib/components/atoms/text/text.component.mjs +46 -10
  3. package/esm2022/lib/components/atoms/text/types.mjs +1 -1
  4. package/esm2022/lib/examples/custom-content-demo.component.mjs +291 -0
  5. package/esm2022/lib/examples/link-processing-example.component.mjs +139 -0
  6. package/esm2022/lib/services/lang-provider/content.mjs +1 -13
  7. package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +7 -9
  8. package/esm2022/lib/services/link-processor.service.mjs +147 -0
  9. package/esm2022/lib/shared/pipes/process-links.pipe.mjs +69 -0
  10. package/esm2022/public-api.mjs +5 -4
  11. package/fesm2022/valtech-components.mjs +418 -935
  12. package/fesm2022/valtech-components.mjs.map +1 -1
  13. package/lib/components/atoms/text/text.component.d.ts +5 -1
  14. package/lib/components/atoms/text/types.d.ts +5 -0
  15. package/lib/examples/link-processing-example.component.d.ts +22 -0
  16. package/lib/services/lang-provider/lang-provider.service.d.ts +5 -7
  17. package/lib/services/link-processor.service.d.ts +92 -0
  18. package/lib/shared/pipes/process-links.pipe.d.ts +55 -0
  19. package/package.json +1 -1
  20. package/public-api.d.ts +4 -3
  21. package/esm2022/lib/components/_examples/custom-content-demo.component.mjs +0 -265
  22. package/esm2022/lib/components/_examples/global-content-example-content.mjs +0 -23
  23. package/esm2022/lib/components/_examples/global-content-example.component.mjs +0 -504
  24. package/esm2022/lib/components/_examples/reactive-content-example-content.mjs +0 -43
  25. package/esm2022/lib/components/_examples/reactive-content-example.component.mjs +0 -347
  26. package/esm2022/lib/services/lang-provider/components/theme-settings.mjs +0 -15
  27. package/lib/components/_examples/global-content-example-content.d.ts +0 -9
  28. package/lib/components/_examples/global-content-example.component.d.ts +0 -73
  29. package/lib/components/_examples/reactive-content-example-content.d.ts +0 -32
  30. package/lib/components/_examples/reactive-content-example.component.d.ts +0 -47
  31. package/lib/services/lang-provider/components/theme-settings.d.ts +0 -3
  32. /package/lib/{components/_examples → examples}/custom-content-demo.component.d.ts +0 -0
@@ -1,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,22 @@
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
+ static ɵfac: i0.ɵɵFactoryDeclaration<LinkProcessingExampleComponent, never>;
21
+ static ɵcmp: i0.ɵɵComponentDeclaration<LinkProcessingExampleComponent, "val-link-processing-example", never, {}, {}, never, never, true, never>;
22
+ }
@@ -33,7 +33,7 @@ export declare class LangService {
33
33
  constructor(config: ValtechConfig);
34
34
  /**
35
35
  * Observable that emits the current language whenever it changes.
36
- * Use this to react to language changes in components.
36
+ * Use this to subscribe to language changes in components.
37
37
  */
38
38
  get currentLang$(): Observable<LangOption>;
39
39
  /**
@@ -41,22 +41,20 @@ export declare class LangService {
41
41
  */
42
42
  get currentLang(): LangOption;
43
43
  /**
44
- * Set the current language and persist it to local storage.
45
- * This will trigger updates in all components subscribed to reactive content.
44
+ * Set the current language and persist it to localStorage.
45
+ * This will trigger updates in all reactive content subscriptions.
46
46
  *
47
47
  * @param lang - The language to set
48
48
  */
49
49
  setLang(lang: LangOption): void;
50
50
  /**
51
- * Get all text content for a component class (legacy method for compatibility).
51
+ * Get content for a component class and key (legacy method).
52
52
  *
53
- * @param className - The component class name
54
- * @returns The language text object for the current language
55
53
  * @deprecated Use getText() or getContent() for better type safety
56
54
  */
57
55
  Text(className: string): LanguageText;
58
56
  /**
59
- * Get a specific text value synchronously for the current language.
57
+ * Get a single content string synchronously for the current language.
60
58
  *
61
59
  * @param className - The component class name
62
60
  * @param key - The text key
@@ -0,0 +1,92 @@
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
+ }
15
+ /**
16
+ * LinkProcessorService - Service for processing text content to convert URLs and internal routes into clickable links.
17
+ *
18
+ * This service automatically detects external URLs (http/https) and internal routes (starting with /)
19
+ * and converts them into HTML anchor elements with appropriate attributes.
20
+ *
21
+ * @example Basic usage:
22
+ * ```typescript
23
+ * constructor(private linkProcessor: LinkProcessorService) {}
24
+ *
25
+ * processText() {
26
+ * const text = 'Visit https://example.com or go to /profile';
27
+ * const processed = this.linkProcessor.processLinks(text);
28
+ * // Returns SafeHtml with clickable links
29
+ * }
30
+ * ```
31
+ */
32
+ export declare class LinkProcessorService {
33
+ private sanitizer;
34
+ private readonly urlRegex;
35
+ private readonly internalRouteRegex;
36
+ constructor(sanitizer: DomSanitizer);
37
+ /**
38
+ * Procesa texto para convertir enlaces en elementos <a> clickeables.
39
+ * Detecta automáticamente URLs externas e internas y las convierte en enlaces.
40
+ *
41
+ * @param text - Texto a procesar
42
+ * @param config - Configuración del procesamiento
43
+ * @returns SafeHtml con enlaces procesados o string original
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * const result = this.linkProcessor.processLinks(
48
+ * 'Visit https://example.com or /profile',
49
+ * {
50
+ * openExternalInNewTab: true,
51
+ * openInternalInNewTab: false,
52
+ * linkClass: 'custom-link'
53
+ * }
54
+ * );
55
+ * ```
56
+ */
57
+ processLinks(text: string, config?: LinkProcessorConfig): SafeHtml | string;
58
+ /**
59
+ * Detecta si un texto contiene enlaces (URLs o rutas internas).
60
+ *
61
+ * @param text - Texto a analizar
62
+ * @returns true si contiene enlaces
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const hasLinks = this.linkProcessor.hasLinks('Visit https://example.com');
67
+ * // Returns: true
68
+ * ```
69
+ */
70
+ hasLinks(text: string): boolean;
71
+ /**
72
+ * Extrae todos los enlaces de un texto.
73
+ *
74
+ * @param text - Texto a analizar
75
+ * @returns Array de enlaces encontrados con su tipo
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * const links = this.linkProcessor.extractLinks('Visit https://example.com or /profile');
80
+ * // Returns: [
81
+ * // { url: 'https://example.com', type: 'external' },
82
+ * // { url: '/profile', type: 'internal' }
83
+ * // ]
84
+ * ```
85
+ */
86
+ extractLinks(text: string): Array<{
87
+ url: string;
88
+ type: 'external' | 'internal';
89
+ }>;
90
+ static ɵfac: i0.ɵɵFactoryDeclaration<LinkProcessorService, never>;
91
+ static ɵprov: i0.ɵɵInjectableDeclaration<LinkProcessorService>;
92
+ }
@@ -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.284",
3
+ "version": "2.0.288",
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,265 +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
67
- this.languageDescSync = this.content.getText('Language', 'description');
68
- }
69
- diagnoseConfiguration() {
70
- console.log('=== DIAGNÓSTICO DE CONFIGURACIÓN ===');
71
- // Verificar acceso directo al servicio
72
- console.log('ContentService available:', !!this.content);
73
- console.log('Current language:', this.content.currentLang);
74
- // 🔍 Diagnóstico detallado del contenido Language
75
- console.log('\n--- DIAGNÓSTICO DETALLADO LANGUAGE ---');
76
- try {
77
- // Acceder directamente al LangService
78
- const langService = this.content.langService;
79
- console.log('LangService available:', !!langService);
80
- // Verificar si existe el contenido Language
81
- const languageContent = langService.content['Language'];
82
- console.log('Language content exists:', !!languageContent);
83
- if (languageContent) {
84
- console.log('Language content structure:', languageContent);
85
- console.log('Language content.Content:', languageContent.Content);
86
- // Verificar contenido en español
87
- const esContent = languageContent.Content?.es;
88
- console.log('ES content:', esContent);
89
- console.log('ES description:', esContent?.description);
90
- // Verificar contenido en inglés
91
- const enContent = languageContent.Content?.en;
92
- console.log('EN content:', enContent);
93
- console.log('EN description:', enContent?.description);
94
- }
95
- // Verificar current lang
96
- const currentLang = langService.selectedLang?.value;
97
- console.log('Current selected language:', currentLang);
98
- }
99
- catch (error) {
100
- console.log('❌ Error accessing LangService:', error);
101
- }
102
- // Intentar acceso síncrono a contenido global predefinido
103
- try {
104
- const saveText = this.content.getText('save');
105
- console.log('✅ Global predefinido (save):', saveText);
106
- }
107
- catch (error) {
108
- console.log('❌ Error global predefinido (save):', error);
109
- }
110
- // Intentar acceso síncrono a contenido global personalizado
111
- try {
112
- const dashboardText = this.content.getText('dashboard');
113
- console.log('✅ Global personalizado (dashboard):', dashboardText);
114
- }
115
- catch (error) {
116
- console.log('❌ Error global personalizado (dashboard):', error);
117
- }
118
- // Intentar acceso síncrono a contenido de componente
119
- try {
120
- const spanishText = this.content.getText('Language', 'spanish');
121
- console.log('✅ Componente Language (spanish):', spanishText);
122
- }
123
- catch (error) {
124
- console.log('❌ Error componente Language (spanish):', error);
125
- }
126
- // Intentar acceso síncrono a contenido de componente
127
- try {
128
- const descriptionText = this.content.getText('Language', 'description');
129
- console.log('✅ Componente Language (description):', descriptionText);
130
- }
131
- catch (error) {
132
- console.log('❌ Error componente Language (description):', error);
133
- }
134
- }
135
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomContentDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
136
- 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: `
137
- <ion-card>
138
- <ion-card-header>
139
- <ion-card-title>Demo de Contenido Personalizado</ion-card-title>
140
- </ion-card-header>
141
-
142
- <ion-card-content>
143
- <!-- Contenido global predefinido -->
144
- <div style="margin-bottom: 20px;">
145
- <h3>Contenido Global Predefinido:</h3>
146
- <ion-button>{{ saveText$ | async }}</ion-button>
147
- <ion-button color="medium">{{ cancelText$ | async }}</ion-button>
148
- <ion-button color="danger">{{ deleteText$ | async }}</ion-button>
149
- <p><strong>Estado:</strong> {{ loadingText$ | async }}</p>
150
- </div>
151
-
152
- <!-- Tu contenido global personalizado -->
153
- <div style="margin-bottom: 20px;">
154
- <h3>Tu Contenido Global Personalizado:</h3>
155
- <p><strong>Sección:</strong> {{ dashboardText$ | async }}</p>
156
- <p><strong>Usuario:</strong> {{ profileText$ | async }}</p>
157
- <p><strong>Config:</strong> {{ settingsText$ | async }}</p>
158
- <p>{{ welcomeText$ | async }}</p>
159
- </div>
160
-
161
- <!-- Contenido específico del componente Language -->
162
- <div style="margin-bottom: 20px;">
163
- <h3>Contenido del Componente Language:</h3>
164
- <ion-item>
165
- <ion-label> <strong>Español:</strong> {{ spanishText$ | async }} </ion-label>
166
- </ion-item>
167
- <ion-item>
168
- <ion-label> <strong>Inglés:</strong> {{ englishText$ | async }} </ion-label>
169
- </ion-item>
170
- <p>
171
- <em>{{ descriptionText$ | async }}</em>
172
- </p>
173
- </div>
174
-
175
- <!-- Botón para cambiar idioma -->
176
- <div>
177
- <h3>Control de Idioma:</h3>
178
- <ion-button (click)="switchLanguage()" color="secondary">
179
- Cambiar a {{ currentLang === 'es' ? 'English' : 'Español' }}
180
- </ion-button>
181
- <p>
182
- <small>Idioma actual: {{ currentLang }}</small>
183
- </p>
184
- </div>
185
-
186
- <!-- Debug info -->
187
- <div style="margin-top: 20px; padding: 10px; background: #f5f5f5; border-radius: 4px;">
188
- <h4>Debug Info:</h4>
189
- <p><strong>Save (sync):</strong> {{ saveTextSync }}</p>
190
- <p><strong>Dashboard (sync):</strong> {{ dashboardTextSync }}</p>
191
- <p><strong>Language Description (sync):</strong> {{ languageDescSync }}</p>
192
- </div>
193
- </ion-card-content>
194
- </ion-card>
195
- `, 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"] }] }); }
196
- }
197
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomContentDemoComponent, decorators: [{
198
- type: Component,
199
- args: [{
200
- selector: 'app-custom-content-demo',
201
- standalone: true,
202
- imports: [CommonModule, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonButton, IonItem, IonLabel],
203
- template: `
204
- <ion-card>
205
- <ion-card-header>
206
- <ion-card-title>Demo de Contenido Personalizado</ion-card-title>
207
- </ion-card-header>
208
-
209
- <ion-card-content>
210
- <!-- Contenido global predefinido -->
211
- <div style="margin-bottom: 20px;">
212
- <h3>Contenido Global Predefinido:</h3>
213
- <ion-button>{{ saveText$ | async }}</ion-button>
214
- <ion-button color="medium">{{ cancelText$ | async }}</ion-button>
215
- <ion-button color="danger">{{ deleteText$ | async }}</ion-button>
216
- <p><strong>Estado:</strong> {{ loadingText$ | async }}</p>
217
- </div>
218
-
219
- <!-- Tu contenido global personalizado -->
220
- <div style="margin-bottom: 20px;">
221
- <h3>Tu Contenido Global Personalizado:</h3>
222
- <p><strong>Sección:</strong> {{ dashboardText$ | async }}</p>
223
- <p><strong>Usuario:</strong> {{ profileText$ | async }}</p>
224
- <p><strong>Config:</strong> {{ settingsText$ | async }}</p>
225
- <p>{{ welcomeText$ | async }}</p>
226
- </div>
227
-
228
- <!-- Contenido específico del componente Language -->
229
- <div style="margin-bottom: 20px;">
230
- <h3>Contenido del Componente Language:</h3>
231
- <ion-item>
232
- <ion-label> <strong>Español:</strong> {{ spanishText$ | async }} </ion-label>
233
- </ion-item>
234
- <ion-item>
235
- <ion-label> <strong>Inglés:</strong> {{ englishText$ | async }} </ion-label>
236
- </ion-item>
237
- <p>
238
- <em>{{ descriptionText$ | async }}</em>
239
- </p>
240
- </div>
241
-
242
- <!-- Botón para cambiar idioma -->
243
- <div>
244
- <h3>Control de Idioma:</h3>
245
- <ion-button (click)="switchLanguage()" color="secondary">
246
- Cambiar a {{ currentLang === 'es' ? 'English' : 'Español' }}
247
- </ion-button>
248
- <p>
249
- <small>Idioma actual: {{ currentLang }}</small>
250
- </p>
251
- </div>
252
-
253
- <!-- Debug info -->
254
- <div style="margin-top: 20px; padding: 10px; background: #f5f5f5; border-radius: 4px;">
255
- <h4>Debug Info:</h4>
256
- <p><strong>Save (sync):</strong> {{ saveTextSync }}</p>
257
- <p><strong>Dashboard (sync):</strong> {{ dashboardTextSync }}</p>
258
- <p><strong>Language Description (sync):</strong> {{ languageDescSync }}</p>
259
- </div>
260
- </ion-card-content>
261
- </ion-card>
262
- `,
263
- }]
264
- }] });
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNvbnRlbnQtZGVtby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL19leGFtcGxlcy9jdXN0b20tY29udGVudC1kZW1vLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsY0FBYyxFQUNkLGFBQWEsRUFDYixZQUFZLEVBQ1osT0FBTyxFQUNQLFFBQVEsR0FDVCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7OztBQW1FaEUsTUFBTSxPQUFPLDBCQUEwQjtJQWpFdkM7UUFrRVUsWUFBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6QyxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQiwrQ0FBK0M7UUFDL0MsY0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsZ0JBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFELGdCQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMxRCxpQkFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxD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TyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELHFEQUFxRDtRQUNyRCxJQUFJLENBQUM7WUFDSCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDeEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7K0dBaEpVLDBCQUEwQjttR0FBMUIsMEJBQTBCLG1GQTdEM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRULDJEQTVEUyxZQUFZLG9GQUFFLE9BQU8seUxBQUUsY0FBYywrRUFBRSxhQUFhLHNHQUFFLFlBQVksc0ZBQUUsU0FBUyxvUEFBRSxPQUFPLDBOQUFFLFFBQVE7OzRGQThEL0YsMEJBQTBCO2tCQWpFdEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQztvQkFDM0csUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJEVDtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBJb25CdXR0b24sXG4gIElvbkNhcmQsXG4gIElvbkNhcmRDb250ZW50LFxuICBJb25DYXJkSGVhZGVyLFxuICBJb25DYXJkVGl0bGUsXG4gIElvbkl0ZW0sXG4gIElvbkxhYmVsLFxufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IExhbmdPcHRpb24gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWN1c3RvbS1jb250ZW50LWRlbW8nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25DYXJkLCBJb25DYXJkQ29udGVudCwgSW9uQ2FyZEhlYWRlciwgSW9uQ2FyZFRpdGxlLCBJb25CdXR0b24sIElvbkl0ZW0sIElvbkxhYmVsXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW9uLWNhcmQ+XG4gICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICA8aW9uLWNhcmQtdGl0bGU+RGVtbyBkZSBDb250ZW5pZG8gUGVyc29uYWxpemFkbzwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cblxuICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgIDwhLS0gQ29udGVuaWRvIGdsb2JhbCBwcmVkZWZpbmlkbyAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDIwcHg7XCI+XG4gICAgICAgICAgPGgzPkNvbnRlbmlkbyBHbG9iYWwgUHJlZGVmaW5pZG86PC9oMz5cbiAgICAgICAgICA8aW9uLWJ1dHRvbj57eyBzYXZlVGV4dCQgfCBhc3luYyB9fTwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBjb2xvcj1cIm1lZGl1bVwiPnt7IGNhbmNlbFRleHQkIHwgYXN5bmMgfX08L2lvbi1idXR0b24+XG4gICAgICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJkYW5nZXJcIj57eyBkZWxldGVUZXh0JCB8IGFzeW5jIH19PC9pb24tYnV0dG9uPlxuICAgICAgICAgIDxwPjxzdHJvbmc+RXN0YWRvOjwvc3Ryb25nPiB7eyBsb2FkaW5nVGV4dCQgfCBhc3luYyB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUdSBjb250ZW5pZG8gZ2xvYmFsIHBlcnNvbmFsaXphZG8gLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4O1wiPlxuICAgICAgICAgIDxoMz5UdSBDb250ZW5pZG8gR2xvYmFsIFBlcnNvbmFsaXphZG86PC9oMz5cbiAgICAgICAgICA8cD48c3Ryb25nPlNlY2Npw7NuOjwvc3Ryb25nPiB7eyBkYXNoYm9hcmRUZXh0JCB8IGFzeW5jIH19PC9wPlxuICAgICAgICAgIDxwPjxzdHJvbmc+VXN1YXJpbzo8L3N0cm9uZz4ge3sgcHJvZmlsZVRleHQkIHwgYXN5bmMgfX08L3A+XG4gICAgICAgICAgPHA+PHN0cm9uZz5Db25maWc6PC9zdHJvbmc+IHt7IHNldHRpbmdzVGV4dCQgfCBhc3luYyB9fTwvcD5cbiAgICAgICAgICA8cD57eyB3ZWxjb21lVGV4dCQgfCBhc3luYyB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBDb250ZW5pZG8gZXNwZWPDrWZpY28gZGVsIGNvbXBvbmVudGUgTGFuZ3VhZ2UgLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4O1wiPlxuICAgICAgICAgIDxoMz5Db250ZW5pZG8gZGVsIENvbXBvbmVudGUgTGFuZ3VhZ2U6PC9oMz5cbiAgICAgICAgICA8aW9uLWl0ZW0+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPiA8c3Ryb25nPkVzcGHDsW9sOjwvc3Ryb25nPiB7eyBzcGFuaXNoVGV4dCQgfCBhc3luYyB9fSA8L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgIDxpb24taXRlbT5cbiAgICAgICAgICAgIDxpb24tbGFiZWw+IDxzdHJvbmc+SW5nbMOpczo8L3N0cm9uZz4ge3sgZW5nbGlzaFRleHQkIHwgYXN5bmMgfX0gPC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxlbT57eyBkZXNjcmlwdGlvblRleHQkIHwgYXN5bmMgfX08L2VtPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBCb3TDs24gcGFyYSBjYW1iaWFyIGlkaW9tYSAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDM+Q29udHJvbCBkZSBJZGlvbWE6PC9oMz5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwic3dpdGNoTGFuZ3VhZ2UoKVwiIGNvbG9yPVwic2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICBDYW1iaWFyIGEge3sgY3VycmVudExhbmcgPT09ICdlcycgPyAnRW5nbGlzaCcgOiAnRXNwYcOxb2wnIH19XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAgPHNtYWxsPklkaW9tYSBhY3R1YWw6IHt7IGN1cnJlbnRMYW5nIH19PC9zbWFsbD5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRGVidWcgaW5mbyAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDIwcHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6ICNmNWY1ZjU7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICA8aDQ+RGVidWcgSW5mbzo8L2g0PlxuICAgICAgICAgIDxwPjxzdHJvbmc+U2F2ZSAoc3luYyk6PC9zdHJvbmc+IHt7IHNhdmVUZXh0U3luYyB9fTwvcD5cbiAgICAgICAgICA8cD48c3Ryb25nPkRhc2hib2FyZCAoc3luYyk6PC9zdHJvbmc+IHt7IGRhc2hib2FyZFRleHRTeW5jIH19PC9wPlxuICAgICAgICAgIDxwPjxzdHJvbmc+TGFuZ3VhZ2UgRGVzY3JpcHRpb24gKHN5bmMpOjwvc3Ryb25nPiB7eyBsYW5ndWFnZURlc2NTeW5jIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21Db250ZW50RGVtb0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgY29udGVudCA9IGluamVjdChDb250ZW50U2VydmljZSk7XG5cbiAgY3VycmVudExhbmcgPSAnZXMnO1xuXG4gIC8vIENvbnRlbmlkbyBnbG9iYWwgcHJlZGVmaW5pZG8gKHNpbiBjbGFzc05hbWUpXG4gIHNhdmVUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ3NhdmUnIH0pO1xuICBjYW5jZWxUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ2NhbmNlbCcgfSk7XG4gIGRlbGV0ZVRleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnZGVsZXRlJyB9KTtcbiAgbG9hZGluZ1RleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnbG9hZGluZycgfSk7XG5cbiAgLy8gVHUgY29udGVuaWRvIGdsb2JhbCBwZXJzb25hbGl6YWRvIChzaW4gY2xhc3NOYW1lKVxuICBkYXNoYm9hcmRUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ2Rhc2hib2FyZCcgfSk7XG4gIHByb2ZpbGVUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ3Byb2ZpbGUnIH0pO1xuICBzZXR0aW5nc1RleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnc2V0dGluZ3MnIH0pO1xuICB3ZWxjb21lVGV4dCQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoe1xuICAgIGtleTogJ3dlbGNvbWUnLFxuICAgIGludGVycG9sYXRpb246IHsgYXBwTmFtZTogJ01pIEFwbGljYWNpw7NuJyB9LFxuICB9KTtcblxuICAvLyBDb250ZW5pZG8gZXNwZWPDrWZpY28gZGVsIGNvbXBvbmVudGUgTGFuZ3VhZ2UgKGNvbiBjbGFzc05hbWUpXG4gIHNwYW5pc2hUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7XG4gICAgY2xhc3NOYW1lOiAnTGFuZ3VhZ2UnLFxuICAgIGtleTogJ3NwYW5pc2gnLFxuICB9KTtcbiAgZW5nbGlzaFRleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHtcbiAgICBjbGFzc05hbWU6ICdMYW5ndWFnZScsXG4gICAga2V5OiAnZW5nbGlzaCcsXG4gIH0pO1xuICBkZXNjcmlwdGlvblRleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHtcbiAgICBjbGFzc05hbWU6ICdMYW5ndWFnZScsXG4gICAga2V5OiAnZGVzY3JpcHRpb24nLFxuICB9KTtcblxuICAvLyBQYXJhIGRlYnVnIC0gdGV4dG8gc8OtbmNyb25vXG4gIHNhdmVUZXh0U3luYyA9ICcnO1xuICBkYXNoYm9hcmRUZXh0U3luYyA9ICcnO1xuICBsYW5ndWFnZURlc2NTeW5jID0gJyc7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gT2J0ZW5lciBpZGlvbWEgYWN0dWFsXG4gICAgdGhpcy5jb250ZW50LmN1cnJlbnRMYW5nJC5zdWJzY3JpYmUobGFuZyA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRMYW5nID0gbGFuZztcbiAgICB9KTtcblxuICAgIC8vIE9idGVuZXIgdGV4dG9zIHPDrW5jcm9ub3MgcGFyYSBkZWJ1Z1xuICAgIHRoaXMudXBkYXRlU3luY1RleHRzKCk7XG5cbiAgICAvLyDwn5SNIERJQUdOw5NTVElDTzogVmVyaWZpY2FyIGNvbmZpZ3VyYWNpw7NuXG4gICAgdGhpcy5kaWFnbm9zZUNvbmZpZ3VyYXRpb24oKTtcbiAgfVxuXG4gIHN3aXRjaExhbmd1YWdlKCkge1xuICAgIGNvbnN0IG5ld0xhbmcgPSB0aGlzLmN1cnJlbnRMYW5nID09PSAnZXMnID8gTGFuZ09wdGlvbi5FTiA6IExhbmdPcHRpb24uRVM7XG4gICAgdGhpcy5jb250ZW50LnNldExhbmcobmV3TGFuZyk7XG5cbiAgICAvLyBBY3R1YWxpemFyIHRleHRvcyBzw61uY3Jvbm9zIGRlc3B1w6lzIGRlbCBjYW1iaW9cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlU3luY1RleHRzKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3luY1RleHRzKCkge1xuICAgIC8vIENvbnRlbmlkbyBnbG9iYWwgcHJlZGVmaW5pZG9cbiAgICB0aGlzLnNhdmVUZXh0U3luYyA9IHRoaXMuY29udGVudC5nZXRUZXh0KCdzYXZlJyk7XG5cbiAgICAvLyBUdSBjb250ZW5pZG8gZ2xvYmFsIHBlcnNvbmFsaXphZG9cbiAgICB0aGlzLmRhc2hib2FyZFRleHRTeW5jID0gdGhpcy5jb250ZW50LmdldFRleHQoJ2Rhc2hib2FyZCcpO1xuXG4gICAgLy8gQ29udGVuaWRvIGVzcGVjw61maWNvIGRlbCBjb21wb25lbnRlXG4gICAgdGhpcy5sYW5ndWFnZURlc2NTeW5jID0gdGhpcy5jb250ZW50LmdldFRleHQoJ0xhbmd1YWdlJywgJ2Rlc2NyaXB0aW9uJyk7XG4gIH1cblxuICBwcml2YXRlIGRpYWdub3NlQ29uZmlndXJhdGlvbigpIHtcbiAgICBjb25zb2xlLmxvZygnPT09IERJQUdOw5NTVElDTyBERSBDT05GSUdVUkFDScOTTiA9PT0nKTtcblxuICAgIC8vIFZlcmlmaWNhciBhY2Nlc28gZGlyZWN0byBhbCBzZXJ2aWNpb1xuICAgIGNvbnNvbGUubG9nKCdDb250ZW50U2VydmljZSBhdmFpbGFibGU6JywgISF0aGlzLmNvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKCdDdXJyZW50IGxhbmd1YWdlOicsIHRoaXMuY29udGVudC5jdXJyZW50TGFuZyk7XG5cbiAgICAvLyDwn5SNIERpYWduw7NzdGljbyBkZXRhbGxhZG8gZGVsIGNvbnRlbmlkbyBMYW5ndWFnZVxuICAgIGNvbnNvbGUubG9nKCdcXG4tLS0gRElBR07Dk1NUSUNPIERFVEFMTEFETyBMQU5HVUFHRSAtLS0nKTtcbiAgICB0cnkge1xuICAgICAgLy8gQWNjZWRlciBkaXJlY3RhbWVudGUgYWwgTGFuZ1NlcnZpY2VcbiAgICAgIGNvbnN0IGxhbmdTZXJ2aWNlID0gKHRoaXMuY29udGVudCBhcyBhbnkpLmxhbmdTZXJ2aWNlO1xuICAgICAgY29uc29sZS5sb2coJ0xhbmdTZXJ2aWNlIGF2YWlsYWJsZTonLCAhIWxhbmdTZXJ2aWNlKTtcblxuICAgICAgLy8gVmVyaWZpY2FyIHNpIGV4aXN0ZSBlbCBjb250ZW5pZG8gTGFuZ3VhZ2VcbiAgICAgIGNvbnN0IGxhbmd1YWdlQ29udGVudCA9IGxhbmdTZXJ2aWNlLmNvbnRlbnRbJ0xhbmd1YWdlJ107XG4gICAgICBjb25zb2xlLmxvZygnTGFuZ3VhZ2UgY29udGVudCBleGlzdHM6JywgISFsYW5ndWFnZUNvbnRlbnQpO1xuXG4gICAgICBpZiAobGFuZ3VhZ2VDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdMYW5ndWFnZSBjb250ZW50IHN0cnVjdHVyZTonLCBsYW5ndWFnZUNvbnRlbnQpO1xuICAgICAgICBjb25zb2xlLmxvZygnTGFuZ3VhZ2UgY29udGVudC5Db250ZW50OicsIGxhbmd1YWdlQ29udGVudC5Db250ZW50KTtcblxuICAgICAgICAvLyBWZXJpZmljYXIgY29udGVuaWRvIGVuIGVzcGHDsW9sXG4gICAgICAgIGNvbnN0IGVzQ29udGVudCA9IGxhbmd1YWdlQ29udGVudC5Db250ZW50Py5lcztcbiAgICAgICAgY29uc29sZS5sb2coJ0VTIGNvbnRlbnQ6JywgZXNDb250ZW50KTtcbiAgICAgICAgY29uc29sZS5sb2coJ0VTIGRlc2NyaXB0aW9uOicsIGVzQ29udGVudD8uZGVzY3JpcHRpb24pO1xuXG4gICAgICAgIC8vIFZlcmlmaWNhciBjb250ZW5pZG8gZW4gaW5nbMOpc1xuICAgICAgICBjb25zdCBlbkNvbnRlbnQgPSBsYW5ndWFnZUNvbnRlbnQuQ29udGVudD8uZW47XG4gICAgICAgIGNvbnNvbGUubG9nKCdFTiBjb250ZW50OicsIGVuQ29udGVudCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdFTiBkZXNjcmlwdGlvbjonLCBlbkNvbnRlbnQ/LmRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZpY2FyIGN1cnJlbnQgbGFuZ1xuICAgICAgY29uc3QgY3VycmVudExhbmcgPSBsYW5nU2VydmljZS5zZWxlY3RlZExhbmc/LnZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ0N1cnJlbnQgc2VsZWN0ZWQgbGFuZ3VhZ2U6JywgY3VycmVudExhbmcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZygn4p2MIEVycm9yIGFjY2Vzc2luZyBMYW5nU2VydmljZTonLCBlcnJvcik7XG4gICAgfVxuXG4gICAgLy8gSW50ZW50YXIgYWNjZXNvIHPDrW5jcm9ubyBhIGNvbnRlbmlkbyBnbG9iYWwgcHJlZGVmaW5pZG9cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2F2ZVRleHQgPSB0aGlzLmNvbnRlbnQuZ2V0VGV4dCgnc2F2ZScpO1xuICAgICAgY29uc29sZS5sb2coJ+KchSBHbG9iYWwgcHJlZGVmaW5pZG8gKHNhdmUpOicsIHNhdmVUZXh0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coJ+KdjCBFcnJvciBnbG9iYWwgcHJlZGVmaW5pZG8gKHNhdmUpOicsIGVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBJbnRlbnRhciBhY2Nlc28gc8OtbmNyb25vIGEgY29udGVuaWRvIGdsb2JhbCBwZXJzb25hbGl6YWRvXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhc2hib2FyZFRleHQgPSB0aGlzLmNvbnRlbnQuZ2V0VGV4dCgnZGFzaGJvYXJkJyk7XG4gICAgICBjb25zb2xlLmxvZygn4pyFIEdsb2JhbCBwZXJzb25hbGl6YWRvIChkYXNoYm9hcmQpOicsIGRhc2hib2FyZFRleHQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZygn4p2MIEVycm9yIGdsb2JhbCBwZXJzb25hbGl6YWRvIChkYXNoYm9hcmQpOicsIGVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBJbnRlbnRhciBhY2Nlc28gc8OtbmNyb25vIGEgY29udGVuaWRvIGRlIGNvbXBvbmVudGVcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3BhbmlzaFRleHQgPSB0aGlzLmNvbnRlbnQuZ2V0VGV4dCgnTGFuZ3VhZ2UnLCAnc3BhbmlzaCcpO1xuICAgICAgY29uc29sZS5sb2coJ+KchSBDb21wb25lbnRlIExhbmd1YWdlIChzcGFuaXNoKTonLCBzcGFuaXNoVGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfinYwgRXJyb3IgY29tcG9uZW50ZSBMYW5ndWFnZSAoc3BhbmlzaCk6JywgZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIEludGVudGFyIGFjY2VzbyBzw61uY3Jvbm8gYSBjb250ZW5pZG8gZGUgY29tcG9uZW50ZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvblRleHQgPSB0aGlzLmNvbnRlbnQuZ2V0VGV4dCgnTGFuZ3VhZ2UnLCAnZGVzY3JpcHRpb24nKTtcbiAgICAgIGNvbnNvbGUubG9nKCfinIUgQ29tcG9uZW50ZSBMYW5ndWFnZSAoZGVzY3JpcHRpb24pOicsIGRlc2NyaXB0aW9uVGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfinYwgRXJyb3IgY29tcG9uZW50ZSBMYW5ndWFnZSAoZGVzY3JpcHRpb24pOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -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==