valtech-components 2.0.291 → 2.0.293

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 (73) hide show
  1. package/esm2022/lib/components/atoms/avatar/avatar.component.mjs +3 -3
  2. package/esm2022/lib/components/atoms/box/box.component.mjs +3 -3
  3. package/esm2022/lib/components/atoms/button/button.component.mjs +45 -12
  4. package/esm2022/lib/components/atoms/display/display.component.mjs +47 -11
  5. package/esm2022/lib/components/atoms/display/types.mjs +1 -1
  6. package/esm2022/lib/components/atoms/divider/divider.component.mjs +3 -3
  7. package/esm2022/lib/components/atoms/href/href.component.mjs +3 -3
  8. package/esm2022/lib/components/atoms/icon/icon.component.mjs +3 -3
  9. package/esm2022/lib/components/atoms/image/image.component.mjs +3 -3
  10. package/esm2022/lib/components/atoms/progress-bar/progress-bar.component.mjs +3 -3
  11. package/esm2022/lib/components/atoms/text/text.component.mjs +3 -3
  12. package/esm2022/lib/components/atoms/title/title.component.mjs +77 -23
  13. package/esm2022/lib/components/atoms/title/types.mjs +30 -2
  14. package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +57 -10
  15. package/esm2022/lib/components/molecules/alert-box/types.mjs +1 -1
  16. package/esm2022/lib/components/molecules/button-group/button-group.component.mjs +3 -3
  17. package/esm2022/lib/components/molecules/card/card.component.mjs +3 -3
  18. package/esm2022/lib/components/molecules/content-loader/content-loader.component.mjs +3 -3
  19. package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +3 -3
  20. package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +3 -3
  21. package/esm2022/lib/components/molecules/hint/hint.component.mjs +3 -3
  22. package/esm2022/lib/components/molecules/layered-card/layered-card.component.mjs +3 -3
  23. package/esm2022/lib/components/molecules/link/link.component.mjs +3 -3
  24. package/esm2022/lib/components/molecules/links-cake/links-cake.component.mjs +3 -3
  25. package/esm2022/lib/components/molecules/notes-box/notes-box.component.mjs +3 -3
  26. package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +3 -3
  27. package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +3 -3
  28. package/esm2022/lib/components/molecules/progress-status/progress-status.component.mjs +3 -3
  29. package/esm2022/lib/components/molecules/prompter/prompter.component.mjs +3 -3
  30. package/esm2022/lib/components/molecules/searchbar/searchbar.component.mjs +3 -3
  31. package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +3 -3
  32. package/esm2022/lib/components/molecules/title-block/title-block.component.mjs +3 -3
  33. package/esm2022/lib/components/organisms/banner/banner.component.mjs +3 -3
  34. package/esm2022/lib/components/organisms/form/form.component.mjs +3 -3
  35. package/esm2022/lib/components/organisms/header/header.component.mjs +3 -3
  36. package/esm2022/lib/components/organisms/item-list/item-list.component.mjs +3 -3
  37. package/esm2022/lib/components/organisms/item-list/types.mjs +1 -1
  38. package/esm2022/lib/components/organisms/no-content/no-content.component.mjs +3 -3
  39. package/esm2022/lib/components/organisms/toolbar/toolbar.component.mjs +3 -3
  40. package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +3 -3
  41. package/esm2022/lib/components/templates/layout/layout.component.mjs +2 -2
  42. package/esm2022/lib/components/types.mjs +1 -1
  43. package/esm2022/lib/examples/custom-content-demo.component.mjs +3 -3
  44. package/esm2022/lib/examples/display-demo.component.mjs +518 -0
  45. package/esm2022/lib/examples/display-simple-example.component.mjs +202 -0
  46. package/esm2022/lib/examples/multi-language-demo.component.mjs +304 -0
  47. package/esm2022/lib/services/lang-provider/content.mjs +34 -2
  48. package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +199 -13
  49. package/esm2022/lib/services/lang-provider/types.mjs +15 -6
  50. package/esm2022/lib/shared/utils/reactive-content.mjs +117 -0
  51. package/esm2022/public-api.mjs +5 -1
  52. package/fesm2022/valtech-components.mjs +3895 -2358
  53. package/fesm2022/valtech-components.mjs.map +1 -1
  54. package/lib/components/atoms/button/button.component.d.ts +10 -3
  55. package/lib/components/atoms/display/display.component.d.ts +12 -4
  56. package/lib/components/atoms/display/types.d.ts +13 -3
  57. package/lib/components/atoms/title/title.component.d.ts +6 -1
  58. package/lib/components/atoms/title/types.d.ts +29 -3
  59. package/lib/components/molecules/alert-box/alert-box.component.d.ts +17 -9
  60. package/lib/components/molecules/alert-box/types.d.ts +29 -0
  61. package/lib/components/organisms/item-list/types.d.ts +54 -9
  62. package/lib/components/types.d.ts +12 -3
  63. package/lib/examples/display-demo.component.d.ts +59 -0
  64. package/lib/examples/display-simple-example.component.d.ts +23 -0
  65. package/lib/examples/multi-language-demo.component.d.ts +34 -0
  66. package/lib/services/lang-provider/content.d.ts +4 -1
  67. package/lib/services/lang-provider/lang-provider.service.d.ts +64 -2
  68. package/lib/services/lang-provider/types.d.ts +19 -4
  69. package/lib/shared/utils/reactive-content.d.ts +109 -0
  70. package/package.json +4 -2
  71. package/public-api.d.ts +4 -0
  72. package/src/lib/components/styles/overrides.scss +583 -0
  73. package/src/lib/components/styles/variables.scss +7 -3
@@ -0,0 +1,202 @@
1
+ import { Component } from '@angular/core';
2
+ import { DisplayComponent } from '../components/atoms/display/display.component';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Ejemplo rápido de uso del componente val-display con contenido reactivo
6
+ */
7
+ export class DisplayExampleComponent {
8
+ constructor() {
9
+ // ✅ Ejemplos de contenido estático
10
+ this.staticTitle = {
11
+ content: 'Este es un título estático',
12
+ color: 'primary',
13
+ size: 'xlarge',
14
+ };
15
+ this.staticSubtitle = {
16
+ content: 'Este es un subtítulo que no cambia',
17
+ color: 'medium',
18
+ size: 'large',
19
+ };
20
+ // ✅ Ejemplos de contenido reactivo (requiere configuración de i18n)
21
+ this.reactiveWelcome = {
22
+ contentConfig: {
23
+ className: 'displayExample',
24
+ key: 'welcome.title',
25
+ fallback: 'Bienvenido a la aplicación',
26
+ },
27
+ color: 'primary',
28
+ size: 'xlarge',
29
+ };
30
+ this.reactiveDescription = {
31
+ contentConfig: {
32
+ className: 'displayExample',
33
+ key: 'welcome.description',
34
+ fallback: 'Esta descripción cambia según el idioma',
35
+ },
36
+ color: 'dark',
37
+ size: 'medium',
38
+ };
39
+ // ✅ Ejemplos con interpolación de variables
40
+ this.userGreeting = {
41
+ contentConfig: {
42
+ className: 'displayExample',
43
+ key: 'user.greeting',
44
+ fallback: 'Hola, {{name}}! Tienes {{messages}} mensajes.',
45
+ interpolation: {
46
+ name: 'María',
47
+ messages: 5,
48
+ },
49
+ },
50
+ color: 'tertiary',
51
+ size: 'large',
52
+ };
53
+ this.statusMessage = {
54
+ contentConfig: {
55
+ className: 'displayExample',
56
+ key: 'status.online',
57
+ fallback: 'Estado: {{status}} desde {{time}}',
58
+ interpolation: {
59
+ status: 'En línea',
60
+ time: '10:30 AM',
61
+ },
62
+ },
63
+ color: 'success',
64
+ size: 'small',
65
+ };
66
+ // ✅ Ejemplos de diferentes tamaños
67
+ this.smallText = {
68
+ content: 'Texto pequeño (small)',
69
+ color: 'dark',
70
+ size: 'small',
71
+ };
72
+ this.mediumText = {
73
+ content: 'Texto mediano (medium)',
74
+ color: 'dark',
75
+ size: 'medium',
76
+ };
77
+ this.largeText = {
78
+ content: 'Texto grande (large)',
79
+ color: 'dark',
80
+ size: 'large',
81
+ };
82
+ this.xlargeText = {
83
+ content: 'Texto extra grande (xlarge)',
84
+ color: 'dark',
85
+ size: 'xlarge',
86
+ };
87
+ // ✅ Ejemplos de diferentes colores
88
+ this.primaryText = {
89
+ content: 'Texto color primary',
90
+ color: 'primary',
91
+ size: 'medium',
92
+ };
93
+ this.successText = {
94
+ content: 'Texto color success',
95
+ color: 'success',
96
+ size: 'medium',
97
+ };
98
+ this.warningText = {
99
+ content: 'Texto color warning',
100
+ color: 'warning',
101
+ size: 'medium',
102
+ };
103
+ this.dangerText = {
104
+ content: 'Texto color danger',
105
+ color: 'danger',
106
+ size: 'medium',
107
+ };
108
+ }
109
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DisplayExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
110
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DisplayExampleComponent, isStandalone: true, selector: "app-display-example", ngImport: i0, template: `
111
+ <div class="display-examples">
112
+ <h2>Ejemplos de val-display</h2>
113
+
114
+ <!-- Contenido estático -->
115
+ <div class="section">
116
+ <h3>Contenido Estático</h3>
117
+ <val-display [props]="staticTitle"></val-display>
118
+ <val-display [props]="staticSubtitle"></val-display>
119
+ </div>
120
+
121
+ <!-- Contenido reactivo -->
122
+ <div class="section">
123
+ <h3>Contenido Reactivo</h3>
124
+ <val-display [props]="reactiveWelcome"></val-display>
125
+ <val-display [props]="reactiveDescription"></val-display>
126
+ </div>
127
+
128
+ <!-- Contenido con interpolación -->
129
+ <div class="section">
130
+ <h3>Contenido con Variables</h3>
131
+ <val-display [props]="userGreeting"></val-display>
132
+ <val-display [props]="statusMessage"></val-display>
133
+ </div>
134
+
135
+ <!-- Diferentes tamaños -->
136
+ <div class="section">
137
+ <h3>Diferentes Tamaños</h3>
138
+ <val-display [props]="smallText"></val-display>
139
+ <val-display [props]="mediumText"></val-display>
140
+ <val-display [props]="largeText"></val-display>
141
+ <val-display [props]="xlargeText"></val-display>
142
+ </div>
143
+
144
+ <!-- Diferentes colores -->
145
+ <div class="section">
146
+ <h3>Diferentes Colores</h3>
147
+ <val-display [props]="primaryText"></val-display>
148
+ <val-display [props]="successText"></val-display>
149
+ <val-display [props]="warningText"></val-display>
150
+ <val-display [props]="dangerText"></val-display>
151
+ </div>
152
+ </div>
153
+ `, isInline: true, styles: [".display-examples{padding:20px;max-width:800px;margin:0 auto}.section{margin:30px 0;padding:20px;border:1px solid var(--ion-color-light);border-radius:8px;background:var(--ion-color-step-50)}.section h3{margin:0 0 15px;color:var(--ion-color-primary)}val-display{display:block;margin:10px 0}\n"], dependencies: [{ kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }] }); }
154
+ }
155
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DisplayExampleComponent, decorators: [{
156
+ type: Component,
157
+ args: [{ selector: 'app-display-example', standalone: true, imports: [DisplayComponent], template: `
158
+ <div class="display-examples">
159
+ <h2>Ejemplos de val-display</h2>
160
+
161
+ <!-- Contenido estático -->
162
+ <div class="section">
163
+ <h3>Contenido Estático</h3>
164
+ <val-display [props]="staticTitle"></val-display>
165
+ <val-display [props]="staticSubtitle"></val-display>
166
+ </div>
167
+
168
+ <!-- Contenido reactivo -->
169
+ <div class="section">
170
+ <h3>Contenido Reactivo</h3>
171
+ <val-display [props]="reactiveWelcome"></val-display>
172
+ <val-display [props]="reactiveDescription"></val-display>
173
+ </div>
174
+
175
+ <!-- Contenido con interpolación -->
176
+ <div class="section">
177
+ <h3>Contenido con Variables</h3>
178
+ <val-display [props]="userGreeting"></val-display>
179
+ <val-display [props]="statusMessage"></val-display>
180
+ </div>
181
+
182
+ <!-- Diferentes tamaños -->
183
+ <div class="section">
184
+ <h3>Diferentes Tamaños</h3>
185
+ <val-display [props]="smallText"></val-display>
186
+ <val-display [props]="mediumText"></val-display>
187
+ <val-display [props]="largeText"></val-display>
188
+ <val-display [props]="xlargeText"></val-display>
189
+ </div>
190
+
191
+ <!-- Diferentes colores -->
192
+ <div class="section">
193
+ <h3>Diferentes Colores</h3>
194
+ <val-display [props]="primaryText"></val-display>
195
+ <val-display [props]="successText"></val-display>
196
+ <val-display [props]="warningText"></val-display>
197
+ <val-display [props]="dangerText"></val-display>
198
+ </div>
199
+ </div>
200
+ `, styles: [".display-examples{padding:20px;max-width:800px;margin:0 auto}.section{margin:30px 0;padding:20px;border:1px solid var(--ion-color-light);border-radius:8px;background:var(--ion-color-step-50)}.section h3{margin:0 0 15px;color:var(--ion-color-primary)}val-display{display:block;margin:10px 0}\n"] }]
201
+ }] });
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS1zaW1wbGUtZXhhbXBsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9leGFtcGxlcy9kaXNwbGF5LXNpbXBsZS1leGFtcGxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDOztBQUdqRjs7R0FFRztBQTZFSCxNQUFNLE9BQU8sdUJBQXVCO0lBNUVwQztRQTZFRSxtQ0FBbUM7UUFDbkMsZ0JBQVcsR0FBb0I7WUFDN0IsT0FBTyxFQUFFLDRCQUE0QjtZQUNyQyxLQUFLLEVBQUUsU0FBUztZQUNoQixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7UUFFRixtQkFBYyxHQUFvQjtZQUNoQyxPQUFPLEVBQUUsb0NBQW9DO1lBQzdDLEtBQUssRUFBRSxRQUFRO1lBQ2YsSUFBSSxFQUFFLE9BQU87U0FDZCxDQUFDO1FBRUYsb0VBQW9FO1FBQ3BFLG9CQUFlLEdBQW9CO1lBQ2pDLGFBQWEsRUFBRTtnQkFDYixTQUFTLEVBQUUsZ0JBQWdCO2dCQUMzQixHQUFHLEVBQUUsZUFBZTtnQkFDcEIsUUFBUSxFQUFFLDRCQUE0QjthQUN2QztZQUNELEtBQUssRUFBRSxTQUFTO1lBQ2hCLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztRQUVGLHdCQUFtQixHQUFvQjtZQUNyQyxhQUFhLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFLGdCQUFnQjtnQkFDM0IsR0FBRyxFQUFFLHFCQUFxQjtnQkFDMUIsUUFBUSxFQUFFLHlDQUF5QzthQUNwRDtZQUNELEtBQUssRUFBRSxNQUFNO1lBQ2IsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO1FBRUYsNENBQTRDO1FBQzVDLGlCQUFZLEdBQW9CO1lBQzlCLGFBQWEsRUFBRTtnQkFDYixTQUFTLEVBQUUsZ0JBQWdCO2dCQUMzQixHQUFHLEVBQUUsZUFBZTtnQkFDcEIsUUFBUSxFQUFFLCtDQUErQztnQkFDekQsYUFBYSxFQUFFO29CQUNiLElBQUksRUFBRSxPQUFPO29CQUNiLFFBQVEsRUFBRSxDQUFDO2lCQUNaO2FBQ0Y7WUFDRCxLQUFLLEVBQUUsVUFBVTtZQUNqQixJQUFJLEVBQUUsT0FBTztTQUNkLENBQUM7UUFFRixrQkFBYSxHQUFvQjtZQUMvQixhQUFhLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFLGdCQUFnQjtnQkFDM0IsR0FBRyxFQUFFLGVBQWU7Z0JBQ3BCLFFBQVEsRUFBRSxtQ0FBbUM7Z0JBQzdDLGFBQWEsRUFBRTtvQkFDYixNQUFNLEVBQUUsVUFBVTtvQkFDbEIsSUFBSSxFQUFFLFVBQVU7aUJBQ2pCO2FBQ0Y7WUFDRCxLQUFLLEVBQUUsU0FBUztZQUNoQixJQUFJLEVBQUUsT0FBTztTQUNkLENBQUM7UUFFRixtQ0FBbUM7UUFDbkMsY0FBUyxHQUFvQjtZQUMzQixPQUFPLEVBQUUsdUJBQXVCO1lBQ2hDLEtBQUssRUFBRSxNQUFNO1lBQ2IsSUFBSSxFQUFFLE9BQU87U0FDZCxDQUFDO1FBRUYsZUFBVSxHQUFvQjtZQUM1QixPQUFPLEVBQUUsd0JBQXdCO1lBQ2pDLEtBQUssRUFBRSxNQUFNO1lBQ2IsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO1FBRUYsY0FBUyxHQUFvQjtZQUMzQixPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLEtBQUssRUFBRSxNQUFNO1lBQ2IsSUFBSSxFQUFFLE9BQU87U0FDZCxDQUFDO1FBRUYsZUFBVSxHQUFvQjtZQUM1QixPQUFPLEVBQUUsNkJBQTZCO1lBQ3RDLEtBQUssRUFBRSxNQUFNO1lBQ2IsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO1FBRUYsbUNBQW1DO1FBQ25DLGdCQUFXLEdBQW9CO1lBQzdCLE9BQU8sRUFBRSxxQkFBcUI7WUFDOUIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO1FBRUYsZ0JBQVcsR0FBb0I7WUFDN0IsT0FBTyxFQUFFLHFCQUFxQjtZQUM5QixLQUFLLEVBQUUsU0FBUztZQUNoQixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7UUFFRixnQkFBVyxHQUFvQjtZQUM3QixPQUFPLEVBQUUscUJBQXFCO1lBQzlCLEtBQUssRUFBRSxTQUFTO1lBQ2hCLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztRQUVGLGVBQVUsR0FBb0I7WUFDNUIsT0FBTyxFQUFFLG9CQUFvQjtZQUM3QixLQUFLLEVBQUUsUUFBUTtZQUNmLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIOytHQWpIWSx1QkFBdUI7bUdBQXZCLHVCQUF1QiwrRUF4RXhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkNULDhXQTVDUyxnQkFBZ0I7OzRGQXlFZix1QkFBdUI7a0JBNUVuQyxTQUFTOytCQUNFLHFCQUFxQixjQUNuQixJQUFJLFdBQ1AsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUNqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJDVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGlzcGxheUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXRvbXMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaXNwbGF5TWV0YWRhdGEgfSBmcm9tICcuLi9jb21wb25lbnRzL2F0b21zL2Rpc3BsYXkvdHlwZXMnO1xuXG4vKipcbiAqIEVqZW1wbG8gcsOhcGlkbyBkZSB1c28gZGVsIGNvbXBvbmVudGUgdmFsLWRpc3BsYXkgY29uIGNvbnRlbmlkbyByZWFjdGl2b1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGlzcGxheS1leGFtcGxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0Rpc3BsYXlDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5LWV4YW1wbGVzXCI+XG4gICAgICA8aDI+RWplbXBsb3MgZGUgdmFsLWRpc3BsYXk8L2gyPlxuXG4gICAgICA8IS0tIENvbnRlbmlkbyBlc3TDoXRpY28gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICA8aDM+Q29udGVuaWRvIEVzdMOhdGljbzwvaDM+XG4gICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwic3RhdGljVGl0bGVcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInN0YXRpY1N1YnRpdGxlXCI+PC92YWwtZGlzcGxheT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENvbnRlbmlkbyByZWFjdGl2byAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uXCI+XG4gICAgICAgIDxoMz5Db250ZW5pZG8gUmVhY3Rpdm88L2gzPlxuICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInJlYWN0aXZlV2VsY29tZVwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwicmVhY3RpdmVEZXNjcmlwdGlvblwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDb250ZW5pZG8gY29uIGludGVycG9sYWNpw7NuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgPGgzPkNvbnRlbmlkbyBjb24gVmFyaWFibGVzPC9oMz5cbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ1c2VyR3JlZXRpbmdcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInN0YXR1c01lc3NhZ2VcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRGlmZXJlbnRlcyB0YW1hw7FvcyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uXCI+XG4gICAgICAgIDxoMz5EaWZlcmVudGVzIFRhbWHDsW9zPC9oMz5cbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJzbWFsbFRleHRcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cIm1lZGl1bVRleHRcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cImxhcmdlVGV4dFwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwieGxhcmdlVGV4dFwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBEaWZlcmVudGVzIGNvbG9yZXMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICA8aDM+RGlmZXJlbnRlcyBDb2xvcmVzPC9oMz5cbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJwcmltYXJ5VGV4dFwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwic3VjY2Vzc1RleHRcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cIndhcm5pbmdUZXh0XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJkYW5nZXJUZXh0XCI+PC92YWwtZGlzcGxheT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuZGlzcGxheS1leGFtcGxlcyB7XG4gICAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICAgIG1heC13aWR0aDogODAwcHg7XG4gICAgICAgIG1hcmdpbjogMCBhdXRvO1xuICAgICAgfVxuXG4gICAgICAuc2VjdGlvbiB7XG4gICAgICAgIG1hcmdpbjogMzBweCAwO1xuICAgICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1pb24tY29sb3ItbGlnaHQpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1zdGVwLTUwKTtcbiAgICAgIH1cblxuICAgICAgLnNlY3Rpb24gaDMge1xuICAgICAgICBtYXJnaW46IDAgMCAxNXB4IDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICB9XG5cbiAgICAgIHZhbC1kaXNwbGF5IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbjogMTBweCAwO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERpc3BsYXlFeGFtcGxlQ29tcG9uZW50IHtcbiAgLy8g4pyFIEVqZW1wbG9zIGRlIGNvbnRlbmlkbyBlc3TDoXRpY29cbiAgc3RhdGljVGl0bGU6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnRXN0ZSBlcyB1biB0w610dWxvIGVzdMOhdGljbycsXG4gICAgY29sb3I6ICdwcmltYXJ5JyxcbiAgICBzaXplOiAneGxhcmdlJyxcbiAgfTtcblxuICBzdGF0aWNTdWJ0aXRsZTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnQ6ICdFc3RlIGVzIHVuIHN1YnTDrXR1bG8gcXVlIG5vIGNhbWJpYScsXG4gICAgY29sb3I6ICdtZWRpdW0nLFxuICAgIHNpemU6ICdsYXJnZScsXG4gIH07XG5cbiAgLy8g4pyFIEVqZW1wbG9zIGRlIGNvbnRlbmlkbyByZWFjdGl2byAocmVxdWllcmUgY29uZmlndXJhY2nDs24gZGUgaTE4bilcbiAgcmVhY3RpdmVXZWxjb21lOiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudENvbmZpZzoge1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheUV4YW1wbGUnLFxuICAgICAga2V5OiAnd2VsY29tZS50aXRsZScsXG4gICAgICBmYWxsYmFjazogJ0JpZW52ZW5pZG8gYSBsYSBhcGxpY2FjacOzbicsXG4gICAgfSxcbiAgICBjb2xvcjogJ3ByaW1hcnknLFxuICAgIHNpemU6ICd4bGFyZ2UnLFxuICB9O1xuXG4gIHJlYWN0aXZlRGVzY3JpcHRpb246IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50Q29uZmlnOiB7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RXhhbXBsZScsXG4gICAgICBrZXk6ICd3ZWxjb21lLmRlc2NyaXB0aW9uJyxcbiAgICAgIGZhbGxiYWNrOiAnRXN0YSBkZXNjcmlwY2nDs24gY2FtYmlhIHNlZ8O6biBlbCBpZGlvbWEnLFxuICAgIH0sXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgfTtcblxuICAvLyDinIUgRWplbXBsb3MgY29uIGludGVycG9sYWNpw7NuIGRlIHZhcmlhYmxlc1xuICB1c2VyR3JlZXRpbmc6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50Q29uZmlnOiB7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RXhhbXBsZScsXG4gICAgICBrZXk6ICd1c2VyLmdyZWV0aW5nJyxcbiAgICAgIGZhbGxiYWNrOiAnSG9sYSwge3tuYW1lfX0hIFRpZW5lcyB7e21lc3NhZ2VzfX0gbWVuc2FqZXMuJyxcbiAgICAgIGludGVycG9sYXRpb246IHtcbiAgICAgICAgbmFtZTogJ01hcsOtYScsXG4gICAgICAgIG1lc3NhZ2VzOiA1LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbG9yOiAndGVydGlhcnknLFxuICAgIHNpemU6ICdsYXJnZScsXG4gIH07XG5cbiAgc3RhdHVzTWVzc2FnZTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnRDb25maWc6IHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlFeGFtcGxlJyxcbiAgICAgIGtleTogJ3N0YXR1cy5vbmxpbmUnLFxuICAgICAgZmFsbGJhY2s6ICdFc3RhZG86IHt7c3RhdHVzfX0gZGVzZGUge3t0aW1lfX0nLFxuICAgICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgICBzdGF0dXM6ICdFbiBsw61uZWEnLFxuICAgICAgICB0aW1lOiAnMTA6MzAgQU0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbG9yOiAnc3VjY2VzcycsXG4gICAgc2l6ZTogJ3NtYWxsJyxcbiAgfTtcblxuICAvLyDinIUgRWplbXBsb3MgZGUgZGlmZXJlbnRlcyB0YW1hw7Fvc1xuICBzbWFsbFRleHQ6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gcGVxdWXDsW8gKHNtYWxsKScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAnc21hbGwnLFxuICB9O1xuXG4gIG1lZGl1bVRleHQ6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gbWVkaWFubyAobWVkaXVtKScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgfTtcblxuICBsYXJnZVRleHQ6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gZ3JhbmRlIChsYXJnZSknLFxuICAgIGNvbG9yOiAnZGFyaycsXG4gICAgc2l6ZTogJ2xhcmdlJyxcbiAgfTtcblxuICB4bGFyZ2VUZXh0OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudDogJ1RleHRvIGV4dHJhIGdyYW5kZSAoeGxhcmdlKScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAneGxhcmdlJyxcbiAgfTtcblxuICAvLyDinIUgRWplbXBsb3MgZGUgZGlmZXJlbnRlcyBjb2xvcmVzXG4gIHByaW1hcnlUZXh0OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudDogJ1RleHRvIGNvbG9yIHByaW1hcnknLFxuICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gIH07XG5cbiAgc3VjY2Vzc1RleHQ6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gY29sb3Igc3VjY2VzcycsXG4gICAgY29sb3I6ICdzdWNjZXNzJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgfTtcblxuICB3YXJuaW5nVGV4dDogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnQ6ICdUZXh0byBjb2xvciB3YXJuaW5nJyxcbiAgICBjb2xvcjogJ3dhcm5pbmcnLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICB9O1xuXG4gIGRhbmdlclRleHQ6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gY29sb3IgZGFuZ2VyJyxcbiAgICBjb2xvcjogJ2RhbmdlcicsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,304 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component } from '@angular/core';
3
+ import { ButtonComponent } from '../components/atoms/button/button.component';
4
+ import { TextComponent } from '../components/atoms/text/text.component';
5
+ import { LANGUAGES } from '../services/lang-provider/types';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../services/content.service";
8
+ import * as i2 from "../services/lang-provider/lang-provider.service";
9
+ import * as i3 from "@angular/common";
10
+ /**
11
+ * MultiLanguageDemoComponent - Demuestra el sistema de idiomas flexible.
12
+ *
13
+ * Este componente muestra cómo el sistema maneja múltiples idiomas,
14
+ * fallbacks automáticos y warnings por traducciones faltantes.
15
+ */
16
+ export class MultiLanguageDemoComponent {
17
+ constructor(content, langService) {
18
+ this.content = content;
19
+ this.langService = langService;
20
+ this.availableLanguages = [];
21
+ this.analysisResults = null;
22
+ // Global content observables
23
+ this.okButton$ = this.content.fromContent({ key: 'ok' });
24
+ this.cancelButton$ = this.content.fromContent({ key: 'cancel' });
25
+ this.saveButton$ = this.content.fromContent({ key: 'save' });
26
+ this.deleteButton$ = this.content.fromContent({ key: 'delete' });
27
+ // Content that might have missing translations
28
+ this.nextButton$ = this.content.fromContent({ key: 'next', fallback: 'Next' });
29
+ this.finishButton$ = this.content.fromContent({ key: 'finish', fallback: 'Finish' });
30
+ this.searchPlaceholder$ = this.content.fromContent({ key: 'searchPlaceholder', fallback: 'Search...' });
31
+ this.noDataMessage$ = this.content.fromContent({ key: 'noData', fallback: 'No data available' });
32
+ }
33
+ ngOnInit() {
34
+ this.availableLanguages = this.langService.availableLangs;
35
+ }
36
+ switchLanguage(lang) {
37
+ console.log(`Switching to language: ${lang}`);
38
+ this.langService.setLang(lang);
39
+ this.analysisResults = null; // Reset analysis when language changes
40
+ }
41
+ getLanguageName(lang) {
42
+ const names = {
43
+ [LANGUAGES.ES]: 'Español',
44
+ [LANGUAGES.EN]: 'English',
45
+ [LANGUAGES.FR]: 'Français',
46
+ [LANGUAGES.DE]: 'Deutsch',
47
+ pt: 'Português',
48
+ };
49
+ return names[lang] || lang.toUpperCase();
50
+ }
51
+ analyzeCurrentComponent() {
52
+ const componentName = '_global'; // Analyzing global content for this demo
53
+ const availableLanguages = this.langService.getAvailableLanguagesForComponent(componentName);
54
+ const missingKeys = this.langService.getMissingContentKeys(componentName, this.langService.currentLang);
55
+ this.analysisResults = {
56
+ availableLanguages,
57
+ missingKeys,
58
+ };
59
+ console.log('Component analysis results:', this.analysisResults);
60
+ }
61
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiLanguageDemoComponent, deps: [{ token: i1.ContentService }, { token: i2.LangService }], target: i0.ɵɵFactoryTarget.Component }); }
62
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiLanguageDemoComponent, isStandalone: true, selector: "val-multi-language-demo", ngImport: i0, template: `
63
+ <div class="multi-lang-demo">
64
+ <h2>Sistema de Idiomas Flexible</h2>
65
+
66
+ <div class="language-info">
67
+ <h3>Información del Sistema:</h3>
68
+ <p><strong>Idioma actual:</strong> {{ langService.currentLang }}</p>
69
+ <p><strong>Idioma por defecto:</strong> {{ langService.defaultLanguage }}</p>
70
+ <p><strong>Idiomas disponibles:</strong> {{ langService.availableLangs.join(', ') }}</p>
71
+ </div>
72
+
73
+ <div class="language-switcher">
74
+ <h3>Cambiar Idioma:</h3>
75
+ <div class="button-group">
76
+ <button
77
+ *ngFor="let lang of availableLanguages"
78
+ [class.active]="lang === langService.currentLang"
79
+ (click)="switchLanguage(lang)"
80
+ >
81
+ {{ getLanguageName(lang) }}
82
+ </button>
83
+ <!-- Ejemplo de idioma no disponible -->
84
+ <button (click)="switchLanguage('pt')">Português (no disponible)</button>
85
+ </div>
86
+ </div>
87
+
88
+ <div class="content-examples">
89
+ <h3>Contenido Global:</h3>
90
+ <div class="example-grid">
91
+ <val-text
92
+ [props]="{ content: okButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
93
+ ></val-text>
94
+ <val-text
95
+ [props]="{
96
+ content: cancelButton$ | async,
97
+ size: 'medium',
98
+ color: 'dark',
99
+ bold: false,
100
+ processLinks: false,
101
+ }"
102
+ ></val-text>
103
+ <val-text
104
+ [props]="{ content: saveButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
105
+ ></val-text>
106
+ <val-text
107
+ [props]="{
108
+ content: deleteButton$ | async,
109
+ size: 'medium',
110
+ color: 'dark',
111
+ bold: false,
112
+ processLinks: false,
113
+ }"
114
+ ></val-text>
115
+ </div>
116
+
117
+ <h3>Contenido con Fallback (algunas traducciones faltantes):</h3>
118
+ <div class="example-grid">
119
+ <val-text
120
+ [props]="{ content: nextButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
121
+ ></val-text>
122
+ <val-text
123
+ [props]="{
124
+ content: finishButton$ | async,
125
+ size: 'medium',
126
+ color: 'dark',
127
+ bold: false,
128
+ processLinks: false,
129
+ }"
130
+ ></val-text>
131
+ <val-text
132
+ [props]="{
133
+ content: searchPlaceholder$ | async,
134
+ size: 'medium',
135
+ color: 'dark',
136
+ bold: false,
137
+ processLinks: false,
138
+ }"
139
+ ></val-text>
140
+ <val-text
141
+ [props]="{
142
+ content: noDataMessage$ | async,
143
+ size: 'medium',
144
+ color: 'dark',
145
+ bold: false,
146
+ processLinks: false,
147
+ }"
148
+ ></val-text>
149
+ </div>
150
+ </div>
151
+
152
+ <div class="warning-info">
153
+ <h3>Información de Warnings:</h3>
154
+ <p>
155
+ Abre la consola del navegador para ver los warnings cuando cambies a idiomas con traducciones incompletas
156
+ (francés, alemán).
157
+ </p>
158
+ <p>El sistema automáticamente usará el idioma por defecto o el primer idioma disponible como fallback.</p>
159
+ </div>
160
+
161
+ <div class="component-analysis">
162
+ <h3>Análisis del Componente:</h3>
163
+ <button (click)="analyzeCurrentComponent()">Analizar Contenido</button>
164
+ <div *ngIf="analysisResults" class="analysis-results">
165
+ <p>
166
+ <strong>Idiomas disponibles para este componente:</strong>
167
+ {{ analysisResults.availableLanguages.join(', ') }}
168
+ </p>
169
+ <div *ngIf="analysisResults.missingKeys.length > 0">
170
+ <p>
171
+ <strong>Claves faltantes en {{ langService.currentLang }}:</strong>
172
+ </p>
173
+ <ul>
174
+ <li *ngFor="let key of analysisResults.missingKeys">{{ key }}</li>
175
+ </ul>
176
+ </div>
177
+ </div>
178
+ </div>
179
+ </div>
180
+ `, isInline: true, styles: [".multi-lang-demo{padding:20px;max-width:800px}.language-info,.content-examples,.warning-info,.component-analysis{margin:20px 0;padding:15px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}.button-group{display:flex;gap:10px;flex-wrap:wrap}.button-group button{padding:8px 16px;border:1px solid var(--ion-color-primary, #3880ff);background:#fff;color:var(--ion-color-primary, #3880ff);border-radius:4px;cursor:pointer;transition:all .2s}.button-group button:hover{background:var(--ion-color-primary-tint, #4992ff);color:#fff}.button-group button.active{background:var(--ion-color-primary, #3880ff);color:#fff}.example-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;margin-top:10px}.analysis-results{margin-top:10px;padding:10px;background:#fff;border-radius:4px}h2{color:var(--ion-color-primary, #3880ff)}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
181
+ }
182
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiLanguageDemoComponent, decorators: [{
183
+ type: Component,
184
+ args: [{ selector: 'val-multi-language-demo', standalone: true, imports: [CommonModule, TextComponent, ButtonComponent], template: `
185
+ <div class="multi-lang-demo">
186
+ <h2>Sistema de Idiomas Flexible</h2>
187
+
188
+ <div class="language-info">
189
+ <h3>Información del Sistema:</h3>
190
+ <p><strong>Idioma actual:</strong> {{ langService.currentLang }}</p>
191
+ <p><strong>Idioma por defecto:</strong> {{ langService.defaultLanguage }}</p>
192
+ <p><strong>Idiomas disponibles:</strong> {{ langService.availableLangs.join(', ') }}</p>
193
+ </div>
194
+
195
+ <div class="language-switcher">
196
+ <h3>Cambiar Idioma:</h3>
197
+ <div class="button-group">
198
+ <button
199
+ *ngFor="let lang of availableLanguages"
200
+ [class.active]="lang === langService.currentLang"
201
+ (click)="switchLanguage(lang)"
202
+ >
203
+ {{ getLanguageName(lang) }}
204
+ </button>
205
+ <!-- Ejemplo de idioma no disponible -->
206
+ <button (click)="switchLanguage('pt')">Português (no disponible)</button>
207
+ </div>
208
+ </div>
209
+
210
+ <div class="content-examples">
211
+ <h3>Contenido Global:</h3>
212
+ <div class="example-grid">
213
+ <val-text
214
+ [props]="{ content: okButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
215
+ ></val-text>
216
+ <val-text
217
+ [props]="{
218
+ content: cancelButton$ | async,
219
+ size: 'medium',
220
+ color: 'dark',
221
+ bold: false,
222
+ processLinks: false,
223
+ }"
224
+ ></val-text>
225
+ <val-text
226
+ [props]="{ content: saveButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
227
+ ></val-text>
228
+ <val-text
229
+ [props]="{
230
+ content: deleteButton$ | async,
231
+ size: 'medium',
232
+ color: 'dark',
233
+ bold: false,
234
+ processLinks: false,
235
+ }"
236
+ ></val-text>
237
+ </div>
238
+
239
+ <h3>Contenido con Fallback (algunas traducciones faltantes):</h3>
240
+ <div class="example-grid">
241
+ <val-text
242
+ [props]="{ content: nextButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
243
+ ></val-text>
244
+ <val-text
245
+ [props]="{
246
+ content: finishButton$ | async,
247
+ size: 'medium',
248
+ color: 'dark',
249
+ bold: false,
250
+ processLinks: false,
251
+ }"
252
+ ></val-text>
253
+ <val-text
254
+ [props]="{
255
+ content: searchPlaceholder$ | async,
256
+ size: 'medium',
257
+ color: 'dark',
258
+ bold: false,
259
+ processLinks: false,
260
+ }"
261
+ ></val-text>
262
+ <val-text
263
+ [props]="{
264
+ content: noDataMessage$ | async,
265
+ size: 'medium',
266
+ color: 'dark',
267
+ bold: false,
268
+ processLinks: false,
269
+ }"
270
+ ></val-text>
271
+ </div>
272
+ </div>
273
+
274
+ <div class="warning-info">
275
+ <h3>Información de Warnings:</h3>
276
+ <p>
277
+ Abre la consola del navegador para ver los warnings cuando cambies a idiomas con traducciones incompletas
278
+ (francés, alemán).
279
+ </p>
280
+ <p>El sistema automáticamente usará el idioma por defecto o el primer idioma disponible como fallback.</p>
281
+ </div>
282
+
283
+ <div class="component-analysis">
284
+ <h3>Análisis del Componente:</h3>
285
+ <button (click)="analyzeCurrentComponent()">Analizar Contenido</button>
286
+ <div *ngIf="analysisResults" class="analysis-results">
287
+ <p>
288
+ <strong>Idiomas disponibles para este componente:</strong>
289
+ {{ analysisResults.availableLanguages.join(', ') }}
290
+ </p>
291
+ <div *ngIf="analysisResults.missingKeys.length > 0">
292
+ <p>
293
+ <strong>Claves faltantes en {{ langService.currentLang }}:</strong>
294
+ </p>
295
+ <ul>
296
+ <li *ngFor="let key of analysisResults.missingKeys">{{ key }}</li>
297
+ </ul>
298
+ </div>
299
+ </div>
300
+ </div>
301
+ </div>
302
+ `, styles: [".multi-lang-demo{padding:20px;max-width:800px}.language-info,.content-examples,.warning-info,.component-analysis{margin:20px 0;padding:15px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}.button-group{display:flex;gap:10px;flex-wrap:wrap}.button-group button{padding:8px 16px;border:1px solid var(--ion-color-primary, #3880ff);background:#fff;color:var(--ion-color-primary, #3880ff);border-radius:4px;cursor:pointer;transition:all .2s}.button-group button:hover{background:var(--ion-color-primary-tint, #4992ff);color:#fff}.button-group button.active{background:var(--ion-color-primary, #3880ff);color:#fff}.example-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;margin-top:10px}.analysis-results{margin-top:10px;padding:10px;background:#fff;border-radius:4px}h2{color:var(--ion-color-primary, #3880ff)}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px}\n"] }]
303
+ }], ctorParameters: () => [{ type: i1.ContentService }, { type: i2.LangService }] });
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGFuZ3VhZ2UtZGVtby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9leGFtcGxlcy9tdWx0aS1sYW5ndWFnZS1kZW1vLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBR3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFFNUQ7Ozs7O0dBS0c7QUFpTUgsTUFBTSxPQUFPLDBCQUEwQjtJQWdCckMsWUFDUyxPQUF1QixFQUN2QixXQUF3QjtRQUR4QixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQWpCakMsdUJBQWtCLEdBQWEsRUFBRSxDQUFDO1FBQ2xDLG9CQUFlLEdBQW1FLElBQUksQ0FBQztRQUV2Riw2QkFBNkI7UUFDN0IsY0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEQsa0JBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVELGdCQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN4RCxrQkFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFNUQsK0NBQStDO1FBQy9DLGdCQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLGtCQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLHVCQUFrQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ25HLG1CQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUM7SUFLekYsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUM7SUFDNUQsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsQ0FBQyx1Q0FBdUM7SUFDdEUsQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUFZO1FBQzFCLE1BQU0sS0FBSyxHQUEyQjtZQUNwQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTO1lBQ3pCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVM7WUFDekIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVTtZQUMxQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTO1lBQ3pCLEVBQUUsRUFBRSxXQUFXO1NBQ2hCLENBQUM7UUFDRixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsQ0FBQyx5Q0FBeUM7UUFDMUUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGlDQUFpQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFeEcsSUFBSSxDQUFDLGVBQWUsR0FBRztZQUNyQixrQkFBa0I7WUFDbEIsV0FBVztTQUNaLENBQUM7UUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuRSxDQUFDOytHQXJEVSwwQkFBMEI7bUdBQTFCLDBCQUEwQixtRkE1TDNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0hULGtoQ0F2SFMsWUFBWSxxVEFBRSxhQUFhOzs0RkE2TDFCLDBCQUEwQjtrQkFoTXRDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDLFlBQzdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0hUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2F0b21zL3RleHQvdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTGFuZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL2xhbmctcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMQU5HVUFHRVMgfSBmcm9tICcuLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL3R5cGVzJztcblxuLyoqXG4gKiBNdWx0aUxhbmd1YWdlRGVtb0NvbXBvbmVudCAtIERlbXVlc3RyYSBlbCBzaXN0ZW1hIGRlIGlkaW9tYXMgZmxleGlibGUuXG4gKlxuICogRXN0ZSBjb21wb25lbnRlIG11ZXN0cmEgY8OzbW8gZWwgc2lzdGVtYSBtYW5lamEgbcO6bHRpcGxlcyBpZGlvbWFzLFxuICogZmFsbGJhY2tzIGF1dG9tw6F0aWNvcyB5IHdhcm5pbmdzIHBvciB0cmFkdWNjaW9uZXMgZmFsdGFudGVzLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtbXVsdGktbGFuZ3VhZ2UtZGVtbycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRleHRDb21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cIm11bHRpLWxhbmctZGVtb1wiPlxuICAgICAgPGgyPlNpc3RlbWEgZGUgSWRpb21hcyBGbGV4aWJsZTwvaDI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1pbmZvXCI+XG4gICAgICAgIDxoMz5JbmZvcm1hY2nDs24gZGVsIFNpc3RlbWE6PC9oMz5cbiAgICAgICAgPHA+PHN0cm9uZz5JZGlvbWEgYWN0dWFsOjwvc3Ryb25nPiB7eyBsYW5nU2VydmljZS5jdXJyZW50TGFuZyB9fTwvcD5cbiAgICAgICAgPHA+PHN0cm9uZz5JZGlvbWEgcG9yIGRlZmVjdG86PC9zdHJvbmc+IHt7IGxhbmdTZXJ2aWNlLmRlZmF1bHRMYW5ndWFnZSB9fTwvcD5cbiAgICAgICAgPHA+PHN0cm9uZz5JZGlvbWFzIGRpc3BvbmlibGVzOjwvc3Ryb25nPiB7eyBsYW5nU2VydmljZS5hdmFpbGFibGVMYW5ncy5qb2luKCcsICcpIH19PC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1zd2l0Y2hlclwiPlxuICAgICAgICA8aDM+Q2FtYmlhciBJZGlvbWE6PC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1ncm91cFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsYW5nIG9mIGF2YWlsYWJsZUxhbmd1YWdlc1wiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImxhbmcgPT09IGxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzd2l0Y2hMYW5ndWFnZShsYW5nKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0TGFuZ3VhZ2VOYW1lKGxhbmcpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPCEtLSBFamVtcGxvIGRlIGlkaW9tYSBubyBkaXNwb25pYmxlIC0tPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInN3aXRjaExhbmd1YWdlKCdwdCcpXCI+UG9ydHVndcOqcyAobm8gZGlzcG9uaWJsZSk8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZXhhbXBsZXNcIj5cbiAgICAgICAgPGgzPkNvbnRlbmlkbyBHbG9iYWw6PC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZ3JpZFwiPlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cInsgY29udGVudDogb2tCdXR0b24kIHwgYXN5bmMsIHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgcHJvY2Vzc0xpbmtzOiBmYWxzZSB9XCJcbiAgICAgICAgICA+PC92YWwtdGV4dD5cbiAgICAgICAgICA8dmFsLXRleHRcbiAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGNhbmNlbEJ1dHRvbiQgfCBhc3luYyxcbiAgICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICBwcm9jZXNzTGlua3M6IGZhbHNlLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwieyBjb250ZW50OiBzYXZlQnV0dG9uJCB8IGFzeW5jLCBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIHByb2Nlc3NMaW5rczogZmFsc2UgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICBjb250ZW50OiBkZWxldGVCdXR0b24kIHwgYXN5bmMsXG4gICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcHJvY2Vzc0xpbmtzOiBmYWxzZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L3ZhbC10ZXh0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aDM+Q29udGVuaWRvIGNvbiBGYWxsYmFjayAoYWxndW5hcyB0cmFkdWNjaW9uZXMgZmFsdGFudGVzKTo8L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1ncmlkXCI+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwieyBjb250ZW50OiBuZXh0QnV0dG9uJCB8IGFzeW5jLCBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIHByb2Nlc3NMaW5rczogZmFsc2UgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICBjb250ZW50OiBmaW5pc2hCdXR0b24kIHwgYXN5bmMsXG4gICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcHJvY2Vzc0xpbmtzOiBmYWxzZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L3ZhbC10ZXh0PlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgY29udGVudDogc2VhcmNoUGxhY2Vob2xkZXIkIHwgYXN5bmMsXG4gICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcHJvY2Vzc0xpbmtzOiBmYWxzZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L3ZhbC10ZXh0PlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgY29udGVudDogbm9EYXRhTWVzc2FnZSQgfCBhc3luYyxcbiAgICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICBwcm9jZXNzTGlua3M6IGZhbHNlLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3YXJuaW5nLWluZm9cIj5cbiAgICAgICAgPGgzPkluZm9ybWFjacOzbiBkZSBXYXJuaW5nczo8L2gzPlxuICAgICAgICA8cD5cbiAgICAgICAgICBBYnJlIGxhIGNvbnNvbGEgZGVsIG5hdmVnYWRvciBwYXJhIHZlciBsb3Mgd2FybmluZ3MgY3VhbmRvIGNhbWJpZXMgYSBpZGlvbWFzIGNvbiB0cmFkdWNjaW9uZXMgaW5jb21wbGV0YXNcbiAgICAgICAgICAoZnJhbmPDqXMsIGFsZW3DoW4pLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPkVsIHNpc3RlbWEgYXV0b23DoXRpY2FtZW50ZSB1c2Fyw6EgZWwgaWRpb21hIHBvciBkZWZlY3RvIG8gZWwgcHJpbWVyIGlkaW9tYSBkaXNwb25pYmxlIGNvbW8gZmFsbGJhY2suPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtYW5hbHlzaXNcIj5cbiAgICAgICAgPGgzPkFuw6FsaXNpcyBkZWwgQ29tcG9uZW50ZTo8L2gzPlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhbmFseXplQ3VycmVudENvbXBvbmVudCgpXCI+QW5hbGl6YXIgQ29udGVuaWRvPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJhbmFseXNpc1Jlc3VsdHNcIiBjbGFzcz1cImFuYWx5c2lzLXJlc3VsdHNcIj5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxzdHJvbmc+SWRpb21hcyBkaXNwb25pYmxlcyBwYXJhIGVzdGUgY29tcG9uZW50ZTo8L3N0cm9uZz5cbiAgICAgICAgICAgIHt7IGFuYWx5c2lzUmVzdWx0cy5hdmFpbGFibGVMYW5ndWFnZXMuam9pbignLCAnKSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYW5hbHlzaXNSZXN1bHRzLm1pc3NpbmdLZXlzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICA8c3Ryb25nPkNsYXZlcyBmYWx0YW50ZXMgZW4ge3sgbGFuZ1NlcnZpY2UuY3VycmVudExhbmcgfX06PC9zdHJvbmc+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQga2V5IG9mIGFuYWx5c2lzUmVzdWx0cy5taXNzaW5nS2V5c1wiPnt7IGtleSB9fTwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAubXVsdGktbGFuZy1kZW1vIHtcbiAgICAgICAgcGFkZGluZzogMjBweDtcbiAgICAgICAgbWF4LXdpZHRoOiA4MDBweDtcbiAgICAgIH1cblxuICAgICAgLmxhbmd1YWdlLWluZm8sXG4gICAgICAuY29udGVudC1leGFtcGxlcyxcbiAgICAgIC53YXJuaW5nLWluZm8sXG4gICAgICAuY29tcG9uZW50LWFuYWx5c2lzIHtcbiAgICAgICAgbWFyZ2luOiAyMHB4IDA7XG4gICAgICAgIHBhZGRpbmc6IDE1cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1jb2xvci1saWdodCwgI2Y0ZjVmOCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0LXRpbnQsICNmNWY2ZjkpO1xuICAgICAgfVxuXG4gICAgICAuYnV0dG9uLWdyb3VwIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICB9XG5cbiAgICAgIC5idXR0b24tZ3JvdXAgYnV0dG9uIHtcbiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1jb2xvci1wcmltYXJ5LCAjMzg4MGZmKTtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzM4ODBmZik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycztcbiAgICAgIH1cblxuICAgICAgLmJ1dHRvbi1ncm91cCBidXR0b246aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeS10aW50LCAjNDk5MmZmKTtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgfVxuXG4gICAgICAuYnV0dG9uLWdyb3VwIGJ1dHRvbi5hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzM4ODBmZik7XG4gICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgIH1cblxuICAgICAgLmV4YW1wbGUtZ3JpZCB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjAwcHgsIDFmcikpO1xuICAgICAgICBnYXA6IDEwcHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICB9XG5cbiAgICAgIC5hbmFseXNpcy1yZXN1bHRzIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICAgICAgcGFkZGluZzogMTBweDtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIH1cblxuICAgICAgaDIge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXByaW1hcnksICMzODgwZmYpO1xuICAgICAgfVxuXG4gICAgICBoMyB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFyaywgIzIyMjQyOCk7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlMYW5ndWFnZURlbW9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBhdmFpbGFibGVMYW5ndWFnZXM6IHN0cmluZ1tdID0gW107XG4gIGFuYWx5c2lzUmVzdWx0czogeyBhdmFpbGFibGVMYW5ndWFnZXM6IHN0cmluZ1tdOyBtaXNzaW5nS2V5czogc3RyaW5nW10gfSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIEdsb2JhbCBjb250ZW50IG9ic2VydmFibGVzXG4gIG9rQnV0dG9uJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ29rJyB9KTtcbiAgY2FuY2VsQnV0dG9uJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ2NhbmNlbCcgfSk7XG4gIHNhdmVCdXR0b24kID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnc2F2ZScgfSk7XG4gIGRlbGV0ZUJ1dHRvbiQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoeyBrZXk6ICdkZWxldGUnIH0pO1xuXG4gIC8vIENvbnRlbnQgdGhhdCBtaWdodCBoYXZlIG1pc3NpbmcgdHJhbnNsYXRpb25zXG4gIG5leHRCdXR0b24kID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnbmV4dCcsIGZhbGxiYWNrOiAnTmV4dCcgfSk7XG4gIGZpbmlzaEJ1dHRvbiQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoeyBrZXk6ICdmaW5pc2gnLCBmYWxsYmFjazogJ0ZpbmlzaCcgfSk7XG4gIHNlYXJjaFBsYWNlaG9sZGVyJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ3NlYXJjaFBsYWNlaG9sZGVyJywgZmFsbGJhY2s6ICdTZWFyY2guLi4nIH0pO1xuICBub0RhdGFNZXNzYWdlJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ25vRGF0YScsIGZhbGxiYWNrOiAnTm8gZGF0YSBhdmFpbGFibGUnIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb250ZW50OiBDb250ZW50U2VydmljZSxcbiAgICBwdWJsaWMgbGFuZ1NlcnZpY2U6IExhbmdTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyA9IHRoaXMubGFuZ1NlcnZpY2UuYXZhaWxhYmxlTGFuZ3M7XG4gIH1cblxuICBzd2l0Y2hMYW5ndWFnZShsYW5nOiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZyhgU3dpdGNoaW5nIHRvIGxhbmd1YWdlOiAke2xhbmd9YCk7XG4gICAgdGhpcy5sYW5nU2VydmljZS5zZXRMYW5nKGxhbmcpO1xuICAgIHRoaXMuYW5hbHlzaXNSZXN1bHRzID0gbnVsbDsgLy8gUmVzZXQgYW5hbHlzaXMgd2hlbiBsYW5ndWFnZSBjaGFuZ2VzXG4gIH1cblxuICBnZXRMYW5ndWFnZU5hbWUobGFuZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFtMQU5HVUFHRVMuRVNdOiAnRXNwYcOxb2wnLFxuICAgICAgW0xBTkdVQUdFUy5FTl06ICdFbmdsaXNoJyxcbiAgICAgIFtMQU5HVUFHRVMuRlJdOiAnRnJhbsOnYWlzJyxcbiAgICAgIFtMQU5HVUFHRVMuREVdOiAnRGV1dHNjaCcsXG4gICAgICBwdDogJ1BvcnR1Z3XDqnMnLFxuICAgIH07XG4gICAgcmV0dXJuIG5hbWVzW2xhbmddIHx8IGxhbmcudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIGFuYWx5emVDdXJyZW50Q29tcG9uZW50KCkge1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSAnX2dsb2JhbCc7IC8vIEFuYWx5emluZyBnbG9iYWwgY29udGVudCBmb3IgdGhpcyBkZW1vXG4gICAgY29uc3QgYXZhaWxhYmxlTGFuZ3VhZ2VzID0gdGhpcy5sYW5nU2VydmljZS5nZXRBdmFpbGFibGVMYW5ndWFnZXNGb3JDb21wb25lbnQoY29tcG9uZW50TmFtZSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSB0aGlzLmxhbmdTZXJ2aWNlLmdldE1pc3NpbmdDb250ZW50S2V5cyhjb21wb25lbnROYW1lLCB0aGlzLmxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nKTtcblxuICAgIHRoaXMuYW5hbHlzaXNSZXN1bHRzID0ge1xuICAgICAgYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgbWlzc2luZ0tleXMsXG4gICAgfTtcblxuICAgIGNvbnNvbGUubG9nKCdDb21wb25lbnQgYW5hbHlzaXMgcmVzdWx0czonLCB0aGlzLmFuYWx5c2lzUmVzdWx0cyk7XG4gIH1cbn1cbiJdfQ==
@@ -3,7 +3,10 @@ import { TextContent } from './types';
3
3
  /**
4
4
  * Global content that can be used across all components.
5
5
  * These are common texts like buttons, actions, states, etc.
6
- * Structure: {es: {key1: 'value1', key2: 'value2'}, en: {key1: 'value1', key2: 'value2'}}
6
+ * Structure: {es: {key1: 'value1', key2: 'value2'}, en: {key1: 'value1', key2: 'value2'}, fr: {...}}
7
+ *
8
+ * Note: You can add any language code. The system will automatically detect available languages
9
+ * and provide intelligent fallbacks with warnings for missing translations.
7
10
  */
8
11
  const globalContentData = {
9
12
  es: {
@@ -33,6 +36,7 @@ const globalContentData = {
33
36
  success: 'Éxito',
34
37
  warning: 'Advertencia',
35
38
  info: 'Información',
39
+ language: 'Idioma',
36
40
  // Common confirmations
37
41
  areYouSure: '¿Estás seguro?',
38
42
  deleteConfirmation: '¿Estás seguro de que deseas eliminar {itemName}?',
@@ -74,6 +78,34 @@ const globalContentData = {
74
78
  // Common placeholders
75
79
  searchPlaceholder: 'Search...',
76
80
  },
81
+ fr: {
82
+ // Common buttons - Example of partial translation (missing some keys intentionally)
83
+ ok: 'OK',
84
+ cancel: 'Annuler',
85
+ save: 'Sauvegarder',
86
+ delete: 'Supprimer',
87
+ edit: 'Modifier',
88
+ close: 'Fermer',
89
+ back: 'Retour',
90
+ // Common states and messages (intentionally incomplete to show fallback behavior)
91
+ loading: 'Chargement...',
92
+ error: 'Erreur',
93
+ success: 'Succès',
94
+ // Common confirmations
95
+ areYouSure: 'Êtes-vous sûr?',
96
+ },
97
+ de: {
98
+ // Common buttons - Another example of partial translation
99
+ ok: 'OK',
100
+ cancel: 'Abbrechen',
101
+ save: 'Speichern',
102
+ delete: 'Löschen',
103
+ // Common states and messages
104
+ loading: 'Laden...',
105
+ error: 'Fehler',
106
+ // Common confirmations
107
+ areYouSure: 'Sind Sie sicher?',
108
+ },
77
109
  };
78
110
  const GlobalContent = new TextContent(globalContentData);
79
111
  const content = {
@@ -83,4 +115,4 @@ const content = {
83
115
  export default content;
84
116
  // Export named exports for user convenience
85
117
  export { content, GlobalContent, globalContentData };
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRlY2gtY29tcG9uZW50cy9zcmMvbGliL3NlcnZpY2VzL2xhbmctcHJvdmlkZXIvY29udGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFlBQVksTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQW9CLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQU14RDs7OztHQUlHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBcUI7SUFDMUMsRUFBRSxFQUFFO1FBQ0YsaUJBQWlCO1FBQ2pCLEVBQUUsRUFBRSxTQUFTO1FBQ2IsTUFBTSxFQUFFLFVBQVU7UUFDbEIsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNLEVBQUUsVUFBVTtRQUNsQixJQUFJLEVBQUUsUUFBUTtRQUNkLEtBQUssRUFBRSxRQUFRO1FBQ2YsSUFBSSxFQUFFLFFBQVE7UUFDZCxJQUFJLEVBQUUsV0FBVztRQUNqQixRQUFRLEVBQUUsVUFBVTtRQUNwQixNQUFNLEVBQUUsV0FBVztRQUNuQixRQUFRLEVBQUUsV0FBVztRQUVyQixpQkFBaUI7UUFDakIsR0FBRyxFQUFFLFNBQVM7UUFDZCxNQUFNLEVBQUUsUUFBUTtRQUNoQixNQUFNLEVBQUUsUUFBUTtRQUNoQixNQUFNLEVBQUUsU0FBUztRQUNqQixJQUFJLEVBQUUsU0FBUztRQUNmLE9BQU8sRUFBRSxZQUFZO1FBRXJCLDZCQUE2QjtRQUM3QixPQUFPLEVBQUUsYUFBYTtRQUN0QixNQUFNLEVBQUUsMEJBQTBCO1FBQ2xDLEtBQUssRUFBRSxPQUFPO1FBQ2QsT0FBTyxFQUFFLE9BQU87UUFDaEIsT0FBTyxFQUFFLGFBQWE7UUFDdEIsSUFBSSxFQUFFLGFBQWE7UUFFbkIsdUJBQXVCO1FBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsa0JBQWtCLEVBQUUsa0RBQWtEO1FBQ3RFLGNBQWMsRUFBRSxnREFBZ0Q7UUFFaEUsc0JBQXNCO1FBQ3RCLGlCQUFpQixFQUFFLFdBQVc7S0FDL0I7SUFDRCxFQUFFLEVBQUU7UUFDRixpQkFBaUI7UUFDakIsRUFBRSxFQUFFLElBQUk7UUFDUixNQUFNLEVBQUUsUUFBUTtRQUNoQixJQUFJLEVBQUUsTUFBTTtRQUNaLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLElBQUksRUFBRSxNQUFNO1FBQ1osS0FBSyxFQUFFLE9BQU87UUFDZCxJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRSxNQUFNO1FBQ1osUUFBUSxFQUFFLFVBQVU7UUFDcEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsUUFBUSxFQUFFLFVBQVU7UUFFcEIsaUJBQWlCO1FBQ2pCLEdBQUcsRUFBRSxLQUFLO1FBQ1YsTUFBTSxFQUFFLFFBQVE7UUFDaEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsSUFBSSxFQUFFLE1BQU07UUFDWixPQUFPLEVBQUUsU0FBUztRQUVsQiw2QkFBNkI7UUFDN0IsT0FBTyxFQUFFLFlBQVk7UUFDckIsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixLQUFLLEVBQUUsT0FBTztRQUNkLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLElBQUksRUFBRSxhQUFhO1FBRW5CLHVCQUF1QjtRQUN2QixVQUFVLEVBQUUsZUFBZTtRQUMzQixrQkFBa0IsRUFBRSw2Q0FBNkM7UUFDakUsY0FBYyxFQUFFLG9EQUFvRDtRQUVwRSxzQkFBc0I7UUFDdEIsaUJBQWlCLEVBQUUsV0FBVztLQUMvQjtDQUNGLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRXpELE1BQU0sT0FBTyxHQUFhO0lBQ3hCLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFlBQVk7Q0FDYixDQUFDO0FBRUYsZUFBZSxPQUFPLENBQUM7QUFFdkIsNENBQTRDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTGFuZ1NldHRpbmdzIGZyb20gJy4vY29tcG9uZW50cy9sYW5nLXNldHRpbmdzJztcbmltcG9ydCB7IExhbmd1YWdlc0NvbnRlbnQsIFRleHRDb250ZW50IH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXIge1xuICBbeDogc3RyaW5nXTogVGV4dENvbnRlbnQ7XG59XG5cbi8qKlxuICogR2xvYmFsIGNvbnRlbnQgdGhhdCBjYW4gYmUgdXNlZCBhY3Jvc3MgYWxsIGNvbXBvbmVudHMuXG4gKiBUaGVzZSBhcmUgY29tbW9uIHRleHRzIGxpa2UgYnV0dG9ucywgYWN0aW9ucywgc3RhdGVzLCBldGMuXG4gKiBTdHJ1Y3R1cmU6IHtlczoge2tleTE6ICd2YWx1ZTEnLCBrZXkyOiAndmFsdWUyJ30sIGVuOiB7a2V5MTogJ3ZhbHVlMScsIGtleTI6ICd2YWx1ZTInfX1cbiAqL1xuY29uc3QgZ2xvYmFsQ29udGVudERhdGE6IExhbmd1YWdlc0NvbnRlbnQgPSB7XG4gIGVzOiB7XG4gICAgLy8gQ29tbW9uIGJ1dHRvbnNcbiAgICBvazogJ0FjZXB0YXInLFxuICAgIGNhbmNlbDogJ0NhbmNlbGFyJyxcbiAgICBzYXZlOiAnR3VhcmRhcicsXG4gICAgZGVsZXRlOiAnRWxpbWluYXInLFxuICAgIGVkaXQ6ICdFZGl0YXInLFxuICAgIGNsb3NlOiAnQ2VycmFyJyxcbiAgICBiYWNrOiAnVm9sdmVyJyxcbiAgICBuZXh0OiAnU2lndWllbnRlJyxcbiAgICBwcmV2aW91czogJ0FudGVyaW9yJyxcbiAgICBmaW5pc2g6ICdGaW5hbGl6YXInLFxuICAgIGNvbnRpbnVlOiAnQ29udGludWFyJyxcblxuICAgIC8vIENvbW1vbiBhY3Rpb25zXG4gICAgYWRkOiAnQWdyZWdhcicsXG4gICAgcmVtb3ZlOiAnUXVpdGFyJyxcbiAgICBzZWFyY2g6ICdCdXNjYXInLFxuICAgIGZpbHRlcjogJ0ZpbHRyYXInLFxuICAgIHNvcnQ6ICdPcmRlbmFyJyxcbiAgICByZWZyZXNoOiAnQWN0dWFsaXphcicsXG5cbiAgICAvLyBDb21tb24gc3RhdGVzIGFuZCBtZXNzYWdlc1xuICAgIGxvYWRpbmc6ICdDYXJnYW5kby4uLicsXG4gICAgbm9EYXRhOiAnTm8gaGF5IGRhdG9zIGRpc3BvbmlibGVzJyxcbiAgICBlcnJvcjogJ0Vycm9yJyxcbiAgICBzdWNjZXNzOiAnw4l4aXRvJyxcbiAgICB3YXJuaW5nOiAnQWR2ZXJ0ZW5jaWEnLFxuICAgIGluZm86ICdJbmZvcm1hY2nDs24nLFxuXG4gICAgLy8gQ29tbW9uIGNvbmZpcm1hdGlvbnNcbiAgICBhcmVZb3VTdXJlOiAnwr9Fc3TDoXMgc2VndXJvPycsXG4gICAgZGVsZXRlQ29uZmlybWF0aW9uOiAnwr9Fc3TDoXMgc2VndXJvIGRlIHF1ZSBkZXNlYXMgZWxpbWluYXIge2l0ZW1OYW1lfT8nLFxuICAgIHVuc2F2ZWRDaGFuZ2VzOiAnVGllbmVzIGNhbWJpb3Mgc2luIGd1YXJkYXIuIMK/RGVzZWFzIGNvbnRpbnVhcj8nLFxuXG4gICAgLy8gQ29tbW9uIHBsYWNlaG9sZGVyc1xuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnQnVzY2FyLi4uJyxcbiAgfSxcbiAgZW46IHtcbiAgICAvLyBDb21tb24gYnV0dG9uc1xuICAgIG9rOiAnT0snLFxuICAgIGNhbmNlbDogJ0NhbmNlbCcsXG4gICAgc2F2ZTogJ1NhdmUnLFxuICAgIGRlbGV0ZTogJ0RlbGV0ZScsXG4gICAgZWRpdDogJ0VkaXQnLFxuICAgIGNsb3NlOiAnQ2xvc2UnLFxuICAgIGJhY2s6ICdCYWNrJyxcbiAgICBuZXh0OiAnTmV4dCcsXG4gICAgcHJldmlvdXM6ICdQcmV2aW91cycsXG4gICAgZmluaXNoOiAnRmluaXNoJyxcbiAgICBjb250aW51ZTogJ0NvbnRpbnVlJyxcblxuICAgIC8vIENvbW1vbiBhY3Rpb25zXG4gICAgYWRkOiAnQWRkJyxcbiAgICByZW1vdmU6ICdSZW1vdmUnLFxuICAgIHNlYXJjaDogJ1NlYXJjaCcsXG4gICAgZmlsdGVyOiAnRmlsdGVyJyxcbiAgICBzb3J0OiAnU29ydCcsXG4gICAgcmVmcmVzaDogJ1JlZnJlc2gnLFxuXG4gICAgLy8gQ29tbW9uIHN0YXRlcyBhbmQgbWVzc2FnZXNcbiAgICBsb2FkaW5nOiAnTG9hZGluZy4uLicsXG4gICAgbm9EYXRhOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgIGVycm9yOiAnRXJyb3InLFxuICAgIHN1Y2Nlc3M6ICdTdWNjZXNzJyxcbiAgICB3YXJuaW5nOiAnV2FybmluZycsXG4gICAgaW5mbzogJ0luZm9ybWF0aW9uJyxcblxuICAgIC8vIENvbW1vbiBjb25maXJtYXRpb25zXG4gICAgYXJlWW91U3VyZTogJ0FyZSB5b3Ugc3VyZT8nLFxuICAgIGRlbGV0ZUNvbmZpcm1hdGlvbjogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUge2l0ZW1OYW1lfT8nLFxuICAgIHVuc2F2ZWRDaGFuZ2VzOiAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8nLFxuXG4gICAgLy8gQ29tbW9uIHBsYWNlaG9sZGVyc1xuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnU2VhcmNoLi4uJyxcbiAgfSxcbn07XG5cbmNvbnN0IEdsb2JhbENvbnRlbnQgPSBuZXcgVGV4dENvbnRlbnQoZ2xvYmFsQ29udGVudERhdGEpO1xuXG5jb25zdCBjb250ZW50OiBQcm92aWRlciA9IHtcbiAgX2dsb2JhbDogR2xvYmFsQ29udGVudCxcbiAgTGFuZ1NldHRpbmdzLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29udGVudDtcblxuLy8gRXhwb3J0IG5hbWVkIGV4cG9ydHMgZm9yIHVzZXIgY29udmVuaWVuY2VcbmV4cG9ydCB7IGNvbnRlbnQsIEdsb2JhbENvbnRlbnQsIGdsb2JhbENvbnRlbnREYXRhIH07XG4iXX0=
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRlY2gtY29tcG9uZW50cy9zcmMvbGliL3NlcnZpY2VzL2xhbmctcHJvdmlkZXIvY29udGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFlBQVksTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQW9CLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQU14RDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxpQkFBaUIsR0FBcUI7SUFDMUMsRUFBRSxFQUFFO1FBQ0YsaUJBQWlCO1FBQ2pCLEVBQUUsRUFBRSxTQUFTO1FBQ2IsTUFBTSxFQUFFLFVBQVU7UUFDbEIsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNLEVBQUUsVUFBVTtRQUNsQixJQUFJLEVBQUUsUUFBUTtRQUNkLEtBQUssRUFBRSxRQUFRO1FBQ2YsSUFBSSxFQUFFLFFBQVE7UUFDZCxJQUFJLEVBQUUsV0FBVztRQUNqQixRQUFRLEVBQUUsVUFBVTtRQUNwQixNQUFNLEVBQUUsV0FBVztRQUNuQixRQUFRLEVBQUUsV0FBVztRQUVyQixpQkFBaUI7UUFDakIsR0FBRyxFQUFFLFNBQVM7UUFDZCxNQUFNLEVBQUUsUUFBUTtRQUNoQixNQUFNLEVBQUUsUUFBUTtRQUNoQixNQUFNLEVBQUUsU0FBUztRQUNqQixJQUFJLEVBQUUsU0FBUztRQUNmLE9BQU8sRUFBRSxZQUFZO1FBRXJCLDZCQUE2QjtRQUM3QixPQUFPLEVBQUUsYUFBYTtRQUN0QixNQUFNLEVBQUUsMEJBQTBCO1FBQ2xDLEtBQUssRUFBRSxPQUFPO1FBQ2QsT0FBTyxFQUFFLE9BQU87UUFDaEIsT0FBTyxFQUFFLGFBQWE7UUFDdEIsSUFBSSxFQUFFLGFBQWE7UUFDbkIsUUFBUSxFQUFFLFFBQVE7UUFFbEIsdUJBQXVCO1FBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsa0JBQWtCLEVBQUUsa0RBQWtEO1FBQ3RFLGNBQWMsRUFBRSxnREFBZ0Q7UUFFaEUsc0JBQXNCO1FBQ3RCLGlCQUFpQixFQUFFLFdBQVc7S0FDL0I7SUFDRCxFQUFFLEVBQUU7UUFDRixpQkFBaUI7UUFDakIsRUFBRSxFQUFFLElBQUk7UUFDUixNQUFNLEVBQUUsUUFBUTtRQUNoQixJQUFJLEVBQUUsTUFBTTtRQUNaLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLElBQUksRUFBRSxNQUFNO1FBQ1osS0FBSyxFQUFFLE9BQU87UUFDZCxJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRSxNQUFNO1FBQ1osUUFBUSxFQUFFLFVBQVU7UUFDcEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsUUFBUSxFQUFFLFVBQVU7UUFFcEIsaUJBQWlCO1FBQ2pCLEdBQUcsRUFBRSxLQUFLO1FBQ1YsTUFBTSxFQUFFLFFBQVE7UUFDaEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsSUFBSSxFQUFFLE1BQU07UUFDWixPQUFPLEVBQUUsU0FBUztRQUVsQiw2QkFBNkI7UUFDN0IsT0FBTyxFQUFFLFlBQVk7UUFDckIsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixLQUFLLEVBQUUsT0FBTztRQUNkLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLElBQUksRUFBRSxhQUFhO1FBRW5CLHVCQUF1QjtRQUN2QixVQUFVLEVBQUUsZUFBZTtRQUMzQixrQkFBa0IsRUFBRSw2Q0FBNkM7UUFDakUsY0FBYyxFQUFFLG9EQUFvRDtRQUVwRSxzQkFBc0I7UUFDdEIsaUJBQWlCLEVBQUUsV0FBVztLQUMvQjtJQUNELEVBQUUsRUFBRTtRQUNGLG9GQUFvRjtRQUNwRixFQUFFLEVBQUUsSUFBSTtRQUNSLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLElBQUksRUFBRSxhQUFhO1FBQ25CLE1BQU0sRUFBRSxXQUFXO1FBQ25CLElBQUksRUFBRSxVQUFVO1FBQ2hCLEtBQUssRUFBRSxRQUFRO1FBQ2YsSUFBSSxFQUFFLFFBQVE7UUFFZCxrRkFBa0Y7UUFDbEYsT0FBTyxFQUFFLGVBQWU7UUFDeEIsS0FBSyxFQUFFLFFBQVE7UUFDZixPQUFPLEVBQUUsUUFBUTtRQUVqQix1QkFBdUI7UUFDdkIsVUFBVSxFQUFFLGdCQUFnQjtLQUM3QjtJQUNELEVBQUUsRUFBRTtRQUNGLDBEQUEwRDtRQUMxRCxFQUFFLEVBQUUsSUFBSTtRQUNSLE1BQU0sRUFBRSxXQUFXO1FBQ25CLElBQUksRUFBRSxXQUFXO1FBQ2pCLE1BQU0sRUFBRSxTQUFTO1FBRWpCLDZCQUE2QjtRQUM3QixPQUFPLEVBQUUsVUFBVTtRQUNuQixLQUFLLEVBQUUsUUFBUTtRQUVmLHVCQUF1QjtRQUN2QixVQUFVLEVBQUUsa0JBQWtCO0tBQy9CO0NBQ0YsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHLElBQUksV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFekQsTUFBTSxPQUFPLEdBQWE7SUFDeEIsT0FBTyxFQUFFLGFBQWE7SUFDdEIsWUFBWTtDQUNiLENBQUM7QUFFRixlQUFlLE9BQU8sQ0FBQztBQUV2Qiw0Q0FBNEM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMYW5nU2V0dGluZ3MgZnJvbSAnLi9jb21wb25lbnRzL2xhbmctc2V0dGluZ3MnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VzQ29udGVudCwgVGV4dENvbnRlbnQgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlciB7XG4gIFt4OiBzdHJpbmddOiBUZXh0Q29udGVudDtcbn1cblxuLyoqXG4gKiBHbG9iYWwgY29udGVudCB0aGF0IGNhbiBiZSB1c2VkIGFjcm9zcyBhbGwgY29tcG9uZW50cy5cbiAqIFRoZXNlIGFyZSBjb21tb24gdGV4dHMgbGlrZSBidXR0b25zLCBhY3Rpb25zLCBzdGF0ZXMsIGV0Yy5cbiAqIFN0cnVjdHVyZToge2VzOiB7a2V5MTogJ3ZhbHVlMScsIGtleTI6ICd2YWx1ZTInfSwgZW46IHtrZXkxOiAndmFsdWUxJywga2V5MjogJ3ZhbHVlMid9LCBmcjogey4uLn19XG4gKlxuICogTm90ZTogWW91IGNhbiBhZGQgYW55IGxhbmd1YWdlIGNvZGUuIFRoZSBzeXN0ZW0gd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCBhdmFpbGFibGUgbGFuZ3VhZ2VzXG4gKiBhbmQgcHJvdmlkZSBpbnRlbGxpZ2VudCBmYWxsYmFja3Mgd2l0aCB3YXJuaW5ncyBmb3IgbWlzc2luZyB0cmFuc2xhdGlvbnMuXG4gKi9cbmNvbnN0IGdsb2JhbENvbnRlbnREYXRhOiBMYW5ndWFnZXNDb250ZW50ID0ge1xuICBlczoge1xuICAgIC8vIENvbW1vbiBidXR0b25zXG4gICAgb2s6ICdBY2VwdGFyJyxcbiAgICBjYW5jZWw6ICdDYW5jZWxhcicsXG4gICAgc2F2ZTogJ0d1YXJkYXInLFxuICAgIGRlbGV0ZTogJ0VsaW1pbmFyJyxcbiAgICBlZGl0OiAnRWRpdGFyJyxcbiAgICBjbG9zZTogJ0NlcnJhcicsXG4gICAgYmFjazogJ1ZvbHZlcicsXG4gICAgbmV4dDogJ1NpZ3VpZW50ZScsXG4gICAgcHJldmlvdXM6ICdBbnRlcmlvcicsXG4gICAgZmluaXNoOiAnRmluYWxpemFyJyxcbiAgICBjb250aW51ZTogJ0NvbnRpbnVhcicsXG5cbiAgICAvLyBDb21tb24gYWN0aW9uc1xuICAgIGFkZDogJ0FncmVnYXInLFxuICAgIHJlbW92ZTogJ1F1aXRhcicsXG4gICAgc2VhcmNoOiAnQnVzY2FyJyxcbiAgICBmaWx0ZXI6ICdGaWx0cmFyJyxcbiAgICBzb3J0OiAnT3JkZW5hcicsXG4gICAgcmVmcmVzaDogJ0FjdHVhbGl6YXInLFxuXG4gICAgLy8gQ29tbW9uIHN0YXRlcyBhbmQgbWVzc2FnZXNcbiAgICBsb2FkaW5nOiAnQ2FyZ2FuZG8uLi4nLFxuICAgIG5vRGF0YTogJ05vIGhheSBkYXRvcyBkaXNwb25pYmxlcycsXG4gICAgZXJyb3I6ICdFcnJvcicsXG4gICAgc3VjY2VzczogJ8OJeGl0bycsXG4gICAgd2FybmluZzogJ0FkdmVydGVuY2lhJyxcbiAgICBpbmZvOiAnSW5mb3JtYWNpw7NuJyxcbiAgICBsYW5ndWFnZTogJ0lkaW9tYScsXG5cbiAgICAvLyBDb21tb24gY29uZmlybWF0aW9uc1xuICAgIGFyZVlvdVN1cmU6ICfCv0VzdMOhcyBzZWd1cm8/JyxcbiAgICBkZWxldGVDb25maXJtYXRpb246ICfCv0VzdMOhcyBzZWd1cm8gZGUgcXVlIGRlc2VhcyBlbGltaW5hciB7aXRlbU5hbWV9PycsXG4gICAgdW5zYXZlZENoYW5nZXM6ICdUaWVuZXMgY2FtYmlvcyBzaW4gZ3VhcmRhci4gwr9EZXNlYXMgY29udGludWFyPycsXG5cbiAgICAvLyBDb21tb24gcGxhY2Vob2xkZXJzXG4gICAgc2VhcmNoUGxhY2Vob2xkZXI6ICdCdXNjYXIuLi4nLFxuICB9LFxuICBlbjoge1xuICAgIC8vIENvbW1vbiBidXR0b25zXG4gICAgb2s6ICdPSycsXG4gICAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgICBzYXZlOiAnU2F2ZScsXG4gICAgZGVsZXRlOiAnRGVsZXRlJyxcbiAgICBlZGl0OiAnRWRpdCcsXG4gICAgY2xvc2U6ICdDbG9zZScsXG4gICAgYmFjazogJ0JhY2snLFxuICAgIG5leHQ6ICdOZXh0JyxcbiAgICBwcmV2aW91czogJ1ByZXZpb3VzJyxcbiAgICBmaW5pc2g6ICdGaW5pc2gnLFxuICAgIGNvbnRpbnVlOiAnQ29udGludWUnLFxuXG4gICAgLy8gQ29tbW9uIGFjdGlvbnNcbiAgICBhZGQ6ICdBZGQnLFxuICAgIHJlbW92ZTogJ1JlbW92ZScsXG4gICAgc2VhcmNoOiAnU2VhcmNoJyxcbiAgICBmaWx0ZXI6ICdGaWx0ZXInLFxuICAgIHNvcnQ6ICdTb3J0JyxcbiAgICByZWZyZXNoOiAnUmVmcmVzaCcsXG5cbiAgICAvLyBDb21tb24gc3RhdGVzIGFuZCBtZXNzYWdlc1xuICAgIGxvYWRpbmc6ICdMb2FkaW5nLi4uJyxcbiAgICBub0RhdGE6ICdObyBkYXRhIGF2YWlsYWJsZScsXG4gICAgZXJyb3I6ICdFcnJvcicsXG4gICAgc3VjY2VzczogJ1N1Y2Nlc3MnLFxuICAgIHdhcm5pbmc6ICdXYXJuaW5nJyxcbiAgICBpbmZvOiAnSW5mb3JtYXRpb24nLFxuXG4gICAgLy8gQ29tbW9uIGNvbmZpcm1hdGlvbnNcbiAgICBhcmVZb3VTdXJlOiAnQXJlIHlvdSBzdXJlPycsXG4gICAgZGVsZXRlQ29uZmlybWF0aW9uOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB7aXRlbU5hbWV9PycsXG4gICAgdW5zYXZlZENoYW5nZXM6ICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPycsXG5cbiAgICAvLyBDb21tb24gcGxhY2Vob2xkZXJzXG4gICAgc2VhcmNoUGxhY2Vob2xkZXI6ICdTZWFyY2guLi4nLFxuICB9LFxuICBmcjoge1xuICAgIC8vIENvbW1vbiBidXR0b25zIC0gRXhhbXBsZSBvZiBwYXJ0aWFsIHRyYW5zbGF0aW9uIChtaXNzaW5nIHNvbWUga2V5cyBpbnRlbnRpb25hbGx5KVxuICAgIG9rOiAnT0snLFxuICAgIGNhbmNlbDogJ0FubnVsZXInLFxuICAgIHNhdmU6ICdTYXV2ZWdhcmRlcicsXG4gICAgZGVsZXRlOiAnU3VwcHJpbWVyJyxcbiAgICBlZGl0OiAnTW9kaWZpZXInLFxuICAgIGNsb3NlOiAnRmVybWVyJyxcbiAgICBiYWNrOiAnUmV0b3VyJyxcblxuICAgIC8vIENvbW1vbiBzdGF0ZXMgYW5kIG1lc3NhZ2VzIChpbnRlbnRpb25hbGx5IGluY29tcGxldGUgdG8gc2hvdyBmYWxsYmFjayBiZWhhdmlvcilcbiAgICBsb2FkaW5nOiAnQ2hhcmdlbWVudC4uLicsXG4gICAgZXJyb3I6ICdFcnJldXInLFxuICAgIHN1Y2Nlc3M6ICdTdWNjw6hzJyxcblxuICAgIC8vIENvbW1vbiBjb25maXJtYXRpb25zXG4gICAgYXJlWW91U3VyZTogJ8OKdGVzLXZvdXMgc8O7cj8nLFxuICB9LFxuICBkZToge1xuICAgIC8vIENvbW1vbiBidXR0b25zIC0gQW5vdGhlciBleGFtcGxlIG9mIHBhcnRpYWwgdHJhbnNsYXRpb25cbiAgICBvazogJ09LJyxcbiAgICBjYW5jZWw6ICdBYmJyZWNoZW4nLFxuICAgIHNhdmU6ICdTcGVpY2hlcm4nLFxuICAgIGRlbGV0ZTogJ0zDtnNjaGVuJyxcblxuICAgIC8vIENvbW1vbiBzdGF0ZXMgYW5kIG1lc3NhZ2VzXG4gICAgbG9hZGluZzogJ0xhZGVuLi4uJyxcbiAgICBlcnJvcjogJ0ZlaGxlcicsXG5cbiAgICAvLyBDb21tb24gY29uZmlybWF0aW9uc1xuICAgIGFyZVlvdVN1cmU6ICdTaW5kIFNpZSBzaWNoZXI/JyxcbiAgfSxcbn07XG5cbmNvbnN0IEdsb2JhbENvbnRlbnQgPSBuZXcgVGV4dENvbnRlbnQoZ2xvYmFsQ29udGVudERhdGEpO1xuXG5jb25zdCBjb250ZW50OiBQcm92aWRlciA9IHtcbiAgX2dsb2JhbDogR2xvYmFsQ29udGVudCxcbiAgTGFuZ1NldHRpbmdzLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29udGVudDtcblxuLy8gRXhwb3J0IG5hbWVkIGV4cG9ydHMgZm9yIHVzZXIgY29udmVuaWVuY2VcbmV4cG9ydCB7IGNvbnRlbnQsIEdsb2JhbENvbnRlbnQsIGdsb2JhbENvbnRlbnREYXRhIH07XG4iXX0=