valtech-components 2.0.419 → 2.0.420

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 (107) hide show
  1. package/esm2022/lib/components/atoms/button/button.component.mjs +30 -102
  2. package/esm2022/lib/components/atoms/countdown/countdown.component.mjs +2 -7
  3. package/esm2022/lib/components/atoms/display/display.component.mjs +18 -101
  4. package/esm2022/lib/components/atoms/image/image.component.mjs +2 -5
  5. package/esm2022/lib/components/atoms/price-tag/price-tag.component.mjs +2 -12
  6. package/esm2022/lib/components/atoms/qr-code/qr-code.component.mjs +4 -29
  7. package/esm2022/lib/components/atoms/text/text.component.mjs +49 -171
  8. package/esm2022/lib/components/atoms/title/title.component.mjs +23 -65
  9. package/esm2022/lib/components/atoms/title/types.mjs +7 -19
  10. package/esm2022/lib/components/molecules/accordion/accordion.component.mjs +7 -53
  11. package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +7 -26
  12. package/esm2022/lib/components/molecules/breadcrumb/breadcrumb.component.mjs +7 -42
  13. package/esm2022/lib/components/molecules/check-input/check-input.component.mjs +12 -41
  14. package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +3 -28
  15. package/esm2022/lib/components/molecules/code-display/code-display.component.mjs +2 -5
  16. package/esm2022/lib/components/molecules/command-display/command-display.component.mjs +3 -6
  17. package/esm2022/lib/components/molecules/comment/comment.component.mjs +5 -31
  18. package/esm2022/lib/components/molecules/currency-input/currency-input.component.mjs +2 -23
  19. package/esm2022/lib/components/molecules/date-range-input/date-range-input.component.mjs +2 -29
  20. package/esm2022/lib/components/molecules/expandable-text/expandable-text.component.mjs +4 -6
  21. package/esm2022/lib/components/molecules/glow-card/glow-card.component.mjs +16 -40
  22. package/esm2022/lib/components/molecules/language-selector/language-selector.component.mjs +25 -125
  23. package/esm2022/lib/components/molecules/multi-select-search/multi-select-search.component.mjs +4 -6
  24. package/esm2022/lib/components/molecules/number-stepper/number-stepper.component.mjs +2 -10
  25. package/esm2022/lib/components/molecules/participant-card/participant-card.component.mjs +2 -4
  26. package/esm2022/lib/components/molecules/phone-input/phone-input.component.mjs +2 -23
  27. package/esm2022/lib/components/molecules/plain-code-box/plain-code-box.component.mjs +3 -6
  28. package/esm2022/lib/components/molecules/popover-selector/popover-selector.component.mjs +9 -12
  29. package/esm2022/lib/components/molecules/raffle-status-card/raffle-status-card.component.mjs +3 -11
  30. package/esm2022/lib/components/molecules/range-input/range-input.component.mjs +4 -25
  31. package/esm2022/lib/components/molecules/segment-control/segment-control.component.mjs +3 -34
  32. package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +11 -20
  33. package/esm2022/lib/components/molecules/select-search/select-search.component.mjs +4 -6
  34. package/esm2022/lib/components/molecules/share-buttons/share-buttons.component.mjs +1 -6
  35. package/esm2022/lib/components/molecules/stepper/stepper.component.mjs +3 -28
  36. package/esm2022/lib/components/molecules/tabs/tabs.component.mjs +7 -41
  37. package/esm2022/lib/components/molecules/textarea-input/textarea-input.component.mjs +2 -27
  38. package/esm2022/lib/components/molecules/ticket-grid/ticket-grid.component.mjs +2 -10
  39. package/esm2022/lib/components/molecules/toggle-input/toggle-input.component.mjs +7 -37
  40. package/esm2022/lib/components/molecules/winner-display/winner-display.component.mjs +1 -12
  41. package/esm2022/lib/components/organisms/comment-section/comment-section.component.mjs +8 -54
  42. package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +1 -3
  43. package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +3 -5
  44. package/esm2022/lib/services/locale.service.mjs +75 -0
  45. package/esm2022/lib/services/types.mjs +5 -3
  46. package/esm2022/public-api.mjs +2 -7
  47. package/fesm2022/valtech-components.mjs +366 -2279
  48. package/fesm2022/valtech-components.mjs.map +1 -1
  49. package/lib/components/atoms/button/button.component.d.ts +12 -37
  50. package/lib/components/atoms/countdown/countdown.component.d.ts +0 -1
  51. package/lib/components/atoms/display/display.component.d.ts +8 -60
  52. package/lib/components/atoms/image/image.component.d.ts +0 -2
  53. package/lib/components/atoms/price-tag/price-tag.component.d.ts +0 -1
  54. package/lib/components/atoms/qr-code/qr-code.component.d.ts +2 -6
  55. package/lib/components/atoms/text/text.component.d.ts +20 -68
  56. package/lib/components/atoms/title/title.component.d.ts +7 -12
  57. package/lib/components/atoms/title/types.d.ts +11 -24
  58. package/lib/components/molecules/accordion/accordion.component.d.ts +2 -9
  59. package/lib/components/molecules/alert-box/alert-box.component.d.ts +3 -8
  60. package/lib/components/molecules/breadcrumb/breadcrumb.component.d.ts +2 -8
  61. package/lib/components/molecules/check-input/check-input.component.d.ts +2 -10
  62. package/lib/components/molecules/chip-group/chip-group.component.d.ts +2 -8
  63. package/lib/components/molecules/code-display/code-display.component.d.ts +0 -2
  64. package/lib/components/molecules/command-display/command-display.component.d.ts +0 -3
  65. package/lib/components/molecules/comment/comment.component.d.ts +2 -6
  66. package/lib/components/molecules/currency-input/currency-input.component.d.ts +0 -3
  67. package/lib/components/molecules/date-range-input/date-range-input.component.d.ts +0 -3
  68. package/lib/components/molecules/expandable-text/expandable-text.component.d.ts +0 -1
  69. package/lib/components/molecules/glow-card/glow-card.component.d.ts +5 -9
  70. package/lib/components/molecules/language-selector/language-selector.component.d.ts +7 -19
  71. package/lib/components/molecules/multi-select-search/multi-select-search.component.d.ts +0 -2
  72. package/lib/components/molecules/number-stepper/number-stepper.component.d.ts +0 -1
  73. package/lib/components/molecules/participant-card/participant-card.component.d.ts +0 -1
  74. package/lib/components/molecules/phone-input/phone-input.component.d.ts +0 -3
  75. package/lib/components/molecules/plain-code-box/plain-code-box.component.d.ts +0 -3
  76. package/lib/components/molecules/popover-selector/popover-selector.component.d.ts +3 -4
  77. package/lib/components/molecules/raffle-status-card/raffle-status-card.component.d.ts +0 -1
  78. package/lib/components/molecules/range-input/range-input.component.d.ts +3 -8
  79. package/lib/components/molecules/segment-control/segment-control.component.d.ts +2 -8
  80. package/lib/components/molecules/select-input/select-input.component.d.ts +2 -3
  81. package/lib/components/molecules/select-search/select-search.component.d.ts +0 -2
  82. package/lib/components/molecules/share-buttons/share-buttons.component.d.ts +0 -1
  83. package/lib/components/molecules/stepper/stepper.component.d.ts +2 -8
  84. package/lib/components/molecules/tabs/tabs.component.d.ts +2 -8
  85. package/lib/components/molecules/textarea-input/textarea-input.component.d.ts +2 -6
  86. package/lib/components/molecules/ticket-grid/ticket-grid.component.d.ts +0 -1
  87. package/lib/components/molecules/toggle-input/toggle-input.component.d.ts +2 -8
  88. package/lib/components/molecules/winner-display/winner-display.component.d.ts +0 -1
  89. package/lib/components/organisms/comment-section/comment-section.component.d.ts +2 -6
  90. package/lib/components/organisms/data-table/data-table.component.d.ts +0 -1
  91. package/lib/components/organisms/wizard/wizard.component.d.ts +0 -2
  92. package/lib/services/locale.service.d.ts +52 -0
  93. package/lib/services/types.d.ts +1 -6
  94. package/package.json +1 -1
  95. package/public-api.d.ts +1 -5
  96. package/esm2022/lib/services/lang-provider/components/lang-settings.mjs +0 -13
  97. package/esm2022/lib/services/lang-provider/content.mjs +0 -156
  98. package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +0 -530
  99. package/esm2022/lib/services/lang-provider/types.mjs +0 -23
  100. package/esm2022/lib/shared/utils/content.mjs +0 -186
  101. package/esm2022/lib/shared/utils/simple-content.mjs +0 -119
  102. package/lib/services/lang-provider/components/lang-settings.d.ts +0 -3
  103. package/lib/services/lang-provider/content.d.ts +0 -17
  104. package/lib/services/lang-provider/lang-provider.service.d.ts +0 -264
  105. package/lib/services/lang-provider/types.d.ts +0 -30
  106. package/lib/shared/utils/content.d.ts +0 -199
  107. package/lib/shared/utils/simple-content.d.ts +0 -120
@@ -1,186 +0,0 @@
1
- import { map } from 'rxjs';
2
- /**
3
- * Create a reactive content observable from a content key.
4
- * This is the primary utility for the `fromContent` pattern with unified support
5
- * for both simple content and content with interpolation.
6
- *
7
- * @param langService - The language service instance
8
- * @param config - Content configuration with optional interpolation
9
- * @returns Observable that emits the content string and updates on language change
10
- *
11
- * @example Simple content:
12
- * ```typescript
13
- * // Component-specific content
14
- * this.title$ = fromContent(this.langService, {
15
- * className: 'HeaderComponent',
16
- * key: 'title',
17
- * fallback: 'Default Title'
18
- * });
19
- *
20
- * // Global content (no className needed)
21
- * this.saveButton$ = fromContent(this.langService, {
22
- * key: 'save'
23
- * });
24
- * ```
25
- *
26
- * @example Content with interpolation:
27
- * ```typescript
28
- * // Content: "Hello {name}, you have {count} messages"
29
- * this.greeting$ = fromContent(this.langService, {
30
- * className: 'WelcomeComponent',
31
- * key: 'greeting',
32
- * interpolation: { name: 'John', count: 5 }
33
- * });
34
- * // Results in: "Hello John, you have 5 messages"
35
- * ```
36
- */
37
- export function fromContent(langService, config) {
38
- // Use _global as default className if not provided
39
- const finalClassName = config.className || '_global';
40
- const contentObservable = langService.getContent(finalClassName, config.key, config.fallback);
41
- // If interpolation is provided, apply it
42
- if (config.interpolation) {
43
- return contentObservable.pipe(map(content => interpolateContent(content, config.interpolation)));
44
- }
45
- return contentObservable;
46
- }
47
- /**
48
- * Create a reactive content observable with interpolation support.
49
- *
50
- * @deprecated Use fromContent() with interpolation property instead.
51
- * This method is kept for backward compatibility.
52
- *
53
- * @param langService - The language service instance
54
- * @param config - Interpolated content configuration
55
- * @returns Observable that emits the interpolated content string
56
- *
57
- * @example Migration:
58
- * ```typescript
59
- * // OLD (deprecated):
60
- * this.greeting$ = fromContentWithInterpolation(this.langService, {
61
- * className: 'WelcomeComponent',
62
- * key: 'greeting',
63
- * interpolation: { name: 'John', count: 5 }
64
- * });
65
- *
66
- * // NEW (recommended):
67
- * this.greeting$ = fromContent(this.langService, {
68
- * className: 'WelcomeComponent',
69
- * key: 'greeting',
70
- * interpolation: { name: 'John', count: 5 }
71
- * });
72
- * ```
73
- */
74
- export function fromContentWithInterpolation(langService, config) {
75
- // Delegate to the unified fromContent method
76
- return fromContent(langService, config);
77
- }
78
- /**
79
- * Create multiple reactive content observables at once.
80
- * Useful when a component needs several content strings.
81
- *
82
- * @param langService - The language service instance
83
- * @param className - The component class name
84
- * @param keys - Array of content keys to retrieve
85
- * @returns Observable that emits an object with all requested content
86
- *
87
- * @example
88
- * ```typescript
89
- * this.content$ = fromMultipleContent(this.langService, 'FormComponent', [
90
- * 'title', 'submitButton', 'cancelButton'
91
- * ]);
92
- *
93
- * // In template
94
- * <ng-container *ngIf="content$ | async as content">
95
- * <h2>{{ content.title }}</h2>
96
- * <button>{{ content.submitButton }}</button>
97
- * <button>{{ content.cancelButton }}</button>
98
- * </ng-container>
99
- * ```
100
- */
101
- export function fromMultipleContent(langService, className, keys) {
102
- return langService.getMultipleContent(className, keys);
103
- }
104
- /**
105
- * Helper function to interpolate values into a content string.
106
- * Replaces placeholders in the format {key} with corresponding values.
107
- *
108
- * @param content - The content string with placeholders
109
- * @param values - Object with values to interpolate
110
- * @returns The interpolated string
111
- *
112
- * @example
113
- * ```typescript
114
- * const result = interpolateContent("Hello {name}!", { name: "World" });
115
- * // Returns: "Hello World!"
116
- * ```
117
- */
118
- export function interpolateContent(content, values) {
119
- if (!values)
120
- return content;
121
- return Object.entries(values).reduce((result, [key, value]) => {
122
- return result.replace(new RegExp(`\\{${key}\\}`, 'g'), String(value));
123
- }, content);
124
- }
125
- /**
126
- * Factory function to create a content helper bound to a specific component class.
127
- * This creates a more convenient API for components that need multiple content strings.
128
- *
129
- * @param langService - The language service instance
130
- * @param className - The component class name
131
- * @returns Object with convenient methods for content retrieval
132
- *
133
- * @example
134
- * ```typescript
135
- * export class MyComponent {
136
- * private content = createContentHelper(this.langService, 'MyComponent');
137
- *
138
- * constructor(private langService: LangService) {}
139
- *
140
- * ngOnInit() {
141
- * this.title$ = this.content.get('title');
142
- * this.allContent$ = this.content.getMultiple(['title', 'description']);
143
- * }
144
- * }
145
- * ```
146
- */
147
- export function createContentHelper(langService, className) {
148
- return {
149
- /**
150
- * Get a single content string reactively.
151
- */
152
- get(key, fallback) {
153
- return fromContent(langService, { className, key, fallback });
154
- },
155
- /**
156
- * Get multiple content strings reactively.
157
- */
158
- getMultiple(keys) {
159
- return fromMultipleContent(langService, className, keys);
160
- },
161
- /**
162
- * Get content with interpolation.
163
- */
164
- getWithInterpolation(key, interpolation, fallback) {
165
- return fromContentWithInterpolation(langService, {
166
- className,
167
- key,
168
- interpolation,
169
- fallback,
170
- });
171
- },
172
- /**
173
- * Get a single content string synchronously (current language only).
174
- */
175
- getText(key, fallback) {
176
- return langService.getText(className, key, fallback);
177
- },
178
- /**
179
- * Check if a content key exists.
180
- */
181
- hasContent(key) {
182
- return langService.hasContent(className, key);
183
- },
184
- };
185
- }
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2hhcmVkL3V0aWxzL2NvbnRlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQXFDdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLFdBQXdCLEVBQUUsTUFBcUI7SUFDekUsbURBQW1EO0lBQ25ELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDO0lBRXJELE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFOUYseUNBQXlDO0lBQ3pDLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUMzQixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQ2xFLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxpQkFBaUIsQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUMxQyxXQUF3QixFQUN4QixNQUFpQztJQUVqQyw2Q0FBNkM7SUFDN0MsT0FBTyxXQUFXLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsV0FBd0IsRUFDeEIsU0FBaUIsRUFDakIsSUFBYztJQUVkLE9BQU8sV0FBVyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsT0FBZSxFQUNmLE1BQXdDO0lBRXhDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFFNUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQzVELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNkLENBQUM7QUFzQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxXQUF3QixFQUFFLFNBQWlCO0lBQzdFLE9BQU87UUFDTDs7V0FFRztRQUNILEdBQUcsQ0FBQyxHQUFXLEVBQUUsUUFBaUI7WUFDaEMsT0FBTyxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRDs7V0FFRztRQUNILFdBQVcsQ0FBQyxJQUFjO1lBQ3hCLE9BQU8sbUJBQW1CLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxvQkFBb0IsQ0FDbEIsR0FBVyxFQUNYLGFBQThDLEVBQzlDLFFBQWlCO1lBRWpCLE9BQU8sNEJBQTRCLENBQUMsV0FBVyxFQUFFO2dCQUMvQyxTQUFTO2dCQUNULEdBQUc7Z0JBQ0gsYUFBYTtnQkFDYixRQUFRO2FBQ1QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVEOztXQUVHO1FBQ0gsT0FBTyxDQUFDLEdBQVcsRUFBRSxRQUFpQjtZQUNwQyxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxVQUFVLENBQUMsR0FBVztZQUNwQixPQUFPLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIG1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTGFuZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL2xhbmctcHJvdmlkZXIuc2VydmljZSc7XG5cbi8qKlxuICogQ29udGVudCB1dGlsaXRpZXMgZm9yIHJlYWN0aXZlIHRleHQgYmluZGluZyBpbiBjb21wb25lbnRzLlxuICpcbiAqIFRoZXNlIHV0aWxpdGllcyBwcm92aWRlIGEgY29udmVuaWVudCB3YXkgdG8gYmluZCBjb21wb25lbnQgcHJvcGVydGllc1xuICogdG8gbGFuZ3VhZ2UgY29udGVudCB0aGF0IGF1dG9tYXRpY2FsbHkgdXBkYXRlcyB3aGVuIHRoZSBsYW5ndWFnZSBjaGFuZ2VzLlxuICovXG5cbi8qKlxuICogVW5pZmllZCBjb25maWd1cmF0aW9uIGZvciBjb250ZW50IGJpbmRpbmcgd2l0aCBvcHRpb25hbCBpbnRlcnBvbGF0aW9uLlxuICogU3VwcG9ydHMgYm90aCBzaW1wbGUgY29udGVudCByZXRyaWV2YWwgYW5kIGNvbnRlbnQgd2l0aCBkeW5hbWljIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250ZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZSAodXNlZCBmb3IgY29udGVudCBsb29rdXApLlxuICAgKiBJZiBvbWl0dGVkLCBzZWFyY2hlcyBpbiBnbG9iYWwgY29udGVudCAoX2dsb2JhbCBuYW1lc3BhY2UpLlxuICAgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICAvKiogVGhlIGNvbnRlbnQga2V5IHRvIHJldHJpZXZlICovXG4gIGtleTogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgZmFsbGJhY2sgdGV4dCBpZiBjb250ZW50IGlzIG5vdCBmb3VuZCAqL1xuICBmYWxsYmFjaz86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIG9iamVjdCB3aXRoIHZhbHVlcyB0byBpbnRlcnBvbGF0ZSBpbnRvIHRoZSBjb250ZW50IHN0cmluZyAqL1xuICBpbnRlcnBvbGF0aW9uPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPjtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ29udGVudENvbmZpZyB3aXRoIGludGVycG9sYXRpb24gcHJvcGVydHkgaW5zdGVhZC5cbiAqIFRoaXMgaW50ZXJmYWNlIGlzIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJwb2xhdGVkQ29udGVudENvbmZpZyBleHRlbmRzIENvbnRlbnRDb25maWcge1xuICAvKiogT2JqZWN0IHdpdGggdmFsdWVzIHRvIGludGVycG9sYXRlIGludG8gdGhlIGNvbnRlbnQgc3RyaW5nICovXG4gIGludGVycG9sYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHJlYWN0aXZlIGNvbnRlbnQgb2JzZXJ2YWJsZSBmcm9tIGEgY29udGVudCBrZXkuXG4gKiBUaGlzIGlzIHRoZSBwcmltYXJ5IHV0aWxpdHkgZm9yIHRoZSBgZnJvbUNvbnRlbnRgIHBhdHRlcm4gd2l0aCB1bmlmaWVkIHN1cHBvcnRcbiAqIGZvciBib3RoIHNpbXBsZSBjb250ZW50IGFuZCBjb250ZW50IHdpdGggaW50ZXJwb2xhdGlvbi5cbiAqXG4gKiBAcGFyYW0gbGFuZ1NlcnZpY2UgLSBUaGUgbGFuZ3VhZ2Ugc2VydmljZSBpbnN0YW5jZVxuICogQHBhcmFtIGNvbmZpZyAtIENvbnRlbnQgY29uZmlndXJhdGlvbiB3aXRoIG9wdGlvbmFsIGludGVycG9sYXRpb25cbiAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgY29udGVudCBzdHJpbmcgYW5kIHVwZGF0ZXMgb24gbGFuZ3VhZ2UgY2hhbmdlXG4gKlxuICogQGV4YW1wbGUgU2ltcGxlIGNvbnRlbnQ6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDb21wb25lbnQtc3BlY2lmaWMgY29udGVudFxuICogdGhpcy50aXRsZSQgPSBmcm9tQ29udGVudCh0aGlzLmxhbmdTZXJ2aWNlLCB7XG4gKiAgIGNsYXNzTmFtZTogJ0hlYWRlckNvbXBvbmVudCcsXG4gKiAgIGtleTogJ3RpdGxlJyxcbiAqICAgZmFsbGJhY2s6ICdEZWZhdWx0IFRpdGxlJ1xuICogfSk7XG4gKlxuICogLy8gR2xvYmFsIGNvbnRlbnQgKG5vIGNsYXNzTmFtZSBuZWVkZWQpXG4gKiB0aGlzLnNhdmVCdXR0b24kID0gZnJvbUNvbnRlbnQodGhpcy5sYW5nU2VydmljZSwge1xuICogICBrZXk6ICdzYXZlJ1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBDb250ZW50IHdpdGggaW50ZXJwb2xhdGlvbjpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENvbnRlbnQ6IFwiSGVsbG8ge25hbWV9LCB5b3UgaGF2ZSB7Y291bnR9IG1lc3NhZ2VzXCJcbiAqIHRoaXMuZ3JlZXRpbmckID0gZnJvbUNvbnRlbnQodGhpcy5sYW5nU2VydmljZSwge1xuICogICBjbGFzc05hbWU6ICdXZWxjb21lQ29tcG9uZW50JyxcbiAqICAga2V5OiAnZ3JlZXRpbmcnLFxuICogICBpbnRlcnBvbGF0aW9uOiB7IG5hbWU6ICdKb2huJywgY291bnQ6IDUgfVxuICogfSk7XG4gKiAvLyBSZXN1bHRzIGluOiBcIkhlbGxvIEpvaG4sIHlvdSBoYXZlIDUgbWVzc2FnZXNcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQ29udGVudChsYW5nU2VydmljZTogTGFuZ1NlcnZpY2UsIGNvbmZpZzogQ29udGVudENvbmZpZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gIC8vIFVzZSBfZ2xvYmFsIGFzIGRlZmF1bHQgY2xhc3NOYW1lIGlmIG5vdCBwcm92aWRlZFxuICBjb25zdCBmaW5hbENsYXNzTmFtZSA9IGNvbmZpZy5jbGFzc05hbWUgfHwgJ19nbG9iYWwnO1xuXG4gIGNvbnN0IGNvbnRlbnRPYnNlcnZhYmxlID0gbGFuZ1NlcnZpY2UuZ2V0Q29udGVudChmaW5hbENsYXNzTmFtZSwgY29uZmlnLmtleSwgY29uZmlnLmZhbGxiYWNrKTtcblxuICAvLyBJZiBpbnRlcnBvbGF0aW9uIGlzIHByb3ZpZGVkLCBhcHBseSBpdFxuICBpZiAoY29uZmlnLmludGVycG9sYXRpb24pIHtcbiAgICByZXR1cm4gY29udGVudE9ic2VydmFibGUucGlwZShcbiAgICAgIG1hcChjb250ZW50ID0+IGludGVycG9sYXRlQ29udGVudChjb250ZW50LCBjb25maWcuaW50ZXJwb2xhdGlvbikpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBjb250ZW50T2JzZXJ2YWJsZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSByZWFjdGl2ZSBjb250ZW50IG9ic2VydmFibGUgd2l0aCBpbnRlcnBvbGF0aW9uIHN1cHBvcnQuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGZyb21Db250ZW50KCkgd2l0aCBpbnRlcnBvbGF0aW9uIHByb3BlcnR5IGluc3RlYWQuXG4gKiBUaGlzIG1ldGhvZCBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICpcbiAqIEBwYXJhbSBsYW5nU2VydmljZSAtIFRoZSBsYW5ndWFnZSBzZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gY29uZmlnIC0gSW50ZXJwb2xhdGVkIGNvbnRlbnQgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBpbnRlcnBvbGF0ZWQgY29udGVudCBzdHJpbmdcbiAqXG4gKiBAZXhhbXBsZSBNaWdyYXRpb246XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBPTEQgKGRlcHJlY2F0ZWQpOlxuICogdGhpcy5ncmVldGluZyQgPSBmcm9tQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uKHRoaXMubGFuZ1NlcnZpY2UsIHtcbiAqICAgY2xhc3NOYW1lOiAnV2VsY29tZUNvbXBvbmVudCcsXG4gKiAgIGtleTogJ2dyZWV0aW5nJyxcbiAqICAgaW50ZXJwb2xhdGlvbjogeyBuYW1lOiAnSm9obicsIGNvdW50OiA1IH1cbiAqIH0pO1xuICpcbiAqIC8vIE5FVyAocmVjb21tZW5kZWQpOlxuICogdGhpcy5ncmVldGluZyQgPSBmcm9tQ29udGVudCh0aGlzLmxhbmdTZXJ2aWNlLCB7XG4gKiAgIGNsYXNzTmFtZTogJ1dlbGNvbWVDb21wb25lbnQnLFxuICogICBrZXk6ICdncmVldGluZycsXG4gKiAgIGludGVycG9sYXRpb246IHsgbmFtZTogJ0pvaG4nLCBjb3VudDogNSB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbUNvbnRlbnRXaXRoSW50ZXJwb2xhdGlvbihcbiAgbGFuZ1NlcnZpY2U6IExhbmdTZXJ2aWNlLFxuICBjb25maWc6IEludGVycG9sYXRlZENvbnRlbnRDb25maWdcbik6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gIC8vIERlbGVnYXRlIHRvIHRoZSB1bmlmaWVkIGZyb21Db250ZW50IG1ldGhvZFxuICByZXR1cm4gZnJvbUNvbnRlbnQobGFuZ1NlcnZpY2UsIGNvbmZpZyk7XG59XG5cbi8qKlxuICogQ3JlYXRlIG11bHRpcGxlIHJlYWN0aXZlIGNvbnRlbnQgb2JzZXJ2YWJsZXMgYXQgb25jZS5cbiAqIFVzZWZ1bCB3aGVuIGEgY29tcG9uZW50IG5lZWRzIHNldmVyYWwgY29udGVudCBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSBsYW5nU2VydmljZSAtIFRoZSBsYW5ndWFnZSBzZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gY2xhc3NOYW1lIC0gVGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lXG4gKiBAcGFyYW0ga2V5cyAtIEFycmF5IG9mIGNvbnRlbnQga2V5cyB0byByZXRyaWV2ZVxuICogQHJldHVybnMgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIG9iamVjdCB3aXRoIGFsbCByZXF1ZXN0ZWQgY29udGVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0aGlzLmNvbnRlbnQkID0gZnJvbU11bHRpcGxlQ29udGVudCh0aGlzLmxhbmdTZXJ2aWNlLCAnRm9ybUNvbXBvbmVudCcsIFtcbiAqICAgJ3RpdGxlJywgJ3N1Ym1pdEJ1dHRvbicsICdjYW5jZWxCdXR0b24nXG4gKiBdKTtcbiAqXG4gKiAvLyBJbiB0ZW1wbGF0ZVxuICogPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQkIHwgYXN5bmMgYXMgY29udGVudFwiPlxuICogICA8aDI+e3sgY29udGVudC50aXRsZSB9fTwvaDI+XG4gKiAgIDxidXR0b24+e3sgY29udGVudC5zdWJtaXRCdXR0b24gfX08L2J1dHRvbj5cbiAqICAgPGJ1dHRvbj57eyBjb250ZW50LmNhbmNlbEJ1dHRvbiB9fTwvYnV0dG9uPlxuICogPC9uZy1jb250YWluZXI+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21NdWx0aXBsZUNvbnRlbnQoXG4gIGxhbmdTZXJ2aWNlOiBMYW5nU2VydmljZSxcbiAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gIGtleXM6IHN0cmluZ1tdXG4pOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgcmV0dXJuIGxhbmdTZXJ2aWNlLmdldE11bHRpcGxlQ29udGVudChjbGFzc05hbWUsIGtleXMpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBpbnRlcnBvbGF0ZSB2YWx1ZXMgaW50byBhIGNvbnRlbnQgc3RyaW5nLlxuICogUmVwbGFjZXMgcGxhY2Vob2xkZXJzIGluIHRoZSBmb3JtYXQge2tleX0gd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IHN0cmluZyB3aXRoIHBsYWNlaG9sZGVyc1xuICogQHBhcmFtIHZhbHVlcyAtIE9iamVjdCB3aXRoIHZhbHVlcyB0byBpbnRlcnBvbGF0ZVxuICogQHJldHVybnMgVGhlIGludGVycG9sYXRlZCBzdHJpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gaW50ZXJwb2xhdGVDb250ZW50KFwiSGVsbG8ge25hbWV9IVwiLCB7IG5hbWU6IFwiV29ybGRcIiB9KTtcbiAqIC8vIFJldHVybnM6IFwiSGVsbG8gV29ybGQhXCJcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVDb250ZW50KFxuICBjb250ZW50OiBzdHJpbmcsXG4gIHZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cbik6IHN0cmluZyB7XG4gIGlmICghdmFsdWVzKSByZXR1cm4gY29udGVudDtcblxuICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWVzKS5yZWR1Y2UoKHJlc3VsdCwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgcmV0dXJuIHJlc3VsdC5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFx7JHtrZXl9XFxcXH1gLCAnZycpLCBTdHJpbmcodmFsdWUpKTtcbiAgfSwgY29udGVudCk7XG59XG5cbi8qKlxuICogVHlwZS1zYWZlIGNvbnRlbnQga2V5IGJ1aWxkZXIgZm9yIGJldHRlciBJREUgc3VwcG9ydC5cbiAqIFRoaXMgaXMgYSB1dGlsaXR5IHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBlbnN1cmUgY29udGVudCBrZXlzIGV4aXN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBEZWZpbmUgeW91ciBjb21wb25lbnQncyBjb250ZW50IGtleXNcbiAqIGludGVyZmFjZSBNeUNvbXBvbmVudENvbnRlbnQge1xuICogICB0aXRsZTogc3RyaW5nO1xuICogICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICogICBzdWJtaXRCdXR0b246IHN0cmluZztcbiAqIH1cbiAqXG4gKiAvLyBVc2Ugd2l0aCB0eXBlIHNhZmV0eVxuICogY29uc3QgdGl0bGVLZXk6IENvbnRlbnRLZXk8TXlDb21wb25lbnRDb250ZW50PiA9ICd0aXRsZSc7IC8vIOKckyBWYWxpZFxuICogY29uc3QgaW52YWxpZEtleTogQ29udGVudEtleTxNeUNvbXBvbmVudENvbnRlbnQ+ID0gJ2ludmFsaWQnOyAvLyDinJcgVHlwZSBlcnJvclxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRlbnRLZXk8VD4gPSBrZXlvZiBUICYgc3RyaW5nO1xuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgY29udGVudCBoZWxwZXIgYm91bmQgdG8gYSBzcGVjaWZpYyBjb21wb25lbnQgY2xhc3MuXG4gKiBUaGlzIGNyZWF0ZXMgYSBtb3JlIGNvbnZlbmllbnQgQVBJIGZvciBjb21wb25lbnRzIHRoYXQgbmVlZCBtdWx0aXBsZSBjb250ZW50IHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIGxhbmdTZXJ2aWNlIC0gVGhlIGxhbmd1YWdlIHNlcnZpY2UgaW5zdGFuY2VcbiAqIEBwYXJhbSBjbGFzc05hbWUgLSBUaGUgY29tcG9uZW50IGNsYXNzIG5hbWVcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGNvbnZlbmllbnQgbWV0aG9kcyBmb3IgY29udGVudCByZXRyaWV2YWxcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSBjb250ZW50ID0gY3JlYXRlQ29udGVudEhlbHBlcih0aGlzLmxhbmdTZXJ2aWNlLCAnTXlDb21wb25lbnQnKTtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbGFuZ1NlcnZpY2U6IExhbmdTZXJ2aWNlKSB7fVxuICpcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgdGhpcy50aXRsZSQgPSB0aGlzLmNvbnRlbnQuZ2V0KCd0aXRsZScpO1xuICogICAgIHRoaXMuYWxsQ29udGVudCQgPSB0aGlzLmNvbnRlbnQuZ2V0TXVsdGlwbGUoWyd0aXRsZScsICdkZXNjcmlwdGlvbiddKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZW50SGVscGVyKGxhbmdTZXJ2aWNlOiBMYW5nU2VydmljZSwgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBHZXQgYSBzaW5nbGUgY29udGVudCBzdHJpbmcgcmVhY3RpdmVseS5cbiAgICAgKi9cbiAgICBnZXQoa2V5OiBzdHJpbmcsIGZhbGxiYWNrPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgIHJldHVybiBmcm9tQ29udGVudChsYW5nU2VydmljZSwgeyBjbGFzc05hbWUsIGtleSwgZmFsbGJhY2sgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBtdWx0aXBsZSBjb250ZW50IHN0cmluZ3MgcmVhY3RpdmVseS5cbiAgICAgKi9cbiAgICBnZXRNdWx0aXBsZShrZXlzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgICAgcmV0dXJuIGZyb21NdWx0aXBsZUNvbnRlbnQobGFuZ1NlcnZpY2UsIGNsYXNzTmFtZSwga2V5cyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBjb250ZW50IHdpdGggaW50ZXJwb2xhdGlvbi5cbiAgICAgKi9cbiAgICBnZXRXaXRoSW50ZXJwb2xhdGlvbihcbiAgICAgIGtleTogc3RyaW5nLFxuICAgICAgaW50ZXJwb2xhdGlvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPixcbiAgICAgIGZhbGxiYWNrPzogc3RyaW5nXG4gICAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgIHJldHVybiBmcm9tQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uKGxhbmdTZXJ2aWNlLCB7XG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAga2V5LFxuICAgICAgICBpbnRlcnBvbGF0aW9uLFxuICAgICAgICBmYWxsYmFjayxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzaW5nbGUgY29udGVudCBzdHJpbmcgc3luY2hyb25vdXNseSAoY3VycmVudCBsYW5ndWFnZSBvbmx5KS5cbiAgICAgKi9cbiAgICBnZXRUZXh0KGtleTogc3RyaW5nLCBmYWxsYmFjaz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gbGFuZ1NlcnZpY2UuZ2V0VGV4dChjbGFzc05hbWUsIGtleSwgZmFsbGJhY2spO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGNvbnRlbnQga2V5IGV4aXN0cy5cbiAgICAgKi9cbiAgICBoYXNDb250ZW50KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gbGFuZ1NlcnZpY2UuaGFzQ29udGVudChjbGFzc05hbWUsIGtleSk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -1,119 +0,0 @@
1
- /**
2
- * Simplified content utilities for the new LangService-only system.
3
- * This replaces the old reactive-content.ts with a much simpler approach.
4
- */
5
- /**
6
- * Helper function to determine if component should use reactive content.
7
- * @param metadata Component metadata
8
- * @returns True if component should use reactive content
9
- */
10
- export function shouldUseReactiveContent(metadata) {
11
- return !metadata.content && !!(metadata.contentKey && metadata.contentClass);
12
- }
13
- /**
14
- * Extract content configuration from metadata.
15
- * @param metadata Component metadata
16
- * @returns Content configuration for LangService
17
- */
18
- export function extractContentConfig(metadata) {
19
- return {
20
- className: metadata.contentClass || '',
21
- key: metadata.contentKey || '',
22
- fallback: metadata.contentFallback,
23
- };
24
- }
25
- /**
26
- * Create reactive content metadata with defaults.
27
- * @param config Partial content configuration
28
- * @returns Complete reactive content metadata
29
- */
30
- export function createReactiveContentMetadata(config) {
31
- return {
32
- content: config.content,
33
- contentKey: config.contentKey,
34
- contentClass: config.contentClass,
35
- contentFallback: config.contentFallback,
36
- };
37
- }
38
- /**
39
- * Interpolate content string with values.
40
- * Replaces placeholders like {{key}} or {key} with actual values.
41
- *
42
- * @param content - Content string with placeholders
43
- * @param values - Values to interpolate
44
- * @returns Interpolated string
45
- *
46
- * @example
47
- * ```typescript
48
- * interpolateContent('Hello {{name}}!', { name: 'World' })
49
- * // Returns: 'Hello World!'
50
- * ```
51
- */
52
- export function interpolateContent(content, values) {
53
- if (!values || !content) {
54
- return content;
55
- }
56
- return content.replace(/\{\{?(\w+)\}?\}/g, (match, key) => {
57
- const value = values[key];
58
- return value !== undefined ? String(value) : match;
59
- });
60
- }
61
- /**
62
- * Check if component should use reactive content with interpolation.
63
- * @param metadata Component metadata with interpolation
64
- * @returns True if component should use reactive content with interpolation
65
- */
66
- export function shouldUseReactiveContentWithInterpolation(metadata) {
67
- return shouldUseReactiveContent(metadata) && !!metadata.contentInterpolation;
68
- }
69
- /**
70
- * Extract content configuration with interpolation from metadata.
71
- * @param metadata Component metadata with interpolation
72
- * @returns Content configuration for LangService with interpolation data
73
- */
74
- export function extractContentConfigWithInterpolation(metadata) {
75
- return {
76
- className: metadata.contentClass || '',
77
- key: metadata.contentKey || '',
78
- fallback: metadata.contentFallback,
79
- interpolation: metadata.contentInterpolation,
80
- };
81
- }
82
- /**
83
- * Helper function to get reactive content with interpolation using LangService.
84
- * This provides a unified way to get reactive, interpolated content.
85
- *
86
- * @param langService - The LangService instance
87
- * @param metadata - Component metadata with interpolation
88
- * @returns Observable that emits interpolated content
89
- *
90
- * @example
91
- * ```typescript
92
- * const content$ = fromContentWithInterpolation(this.langService, {
93
- * contentClass: 'MyComponent',
94
- * contentKey: 'greeting',
95
- * contentInterpolation: { name: 'World' }
96
- * });
97
- * ```
98
- */
99
- export function fromContentWithInterpolation(langService, // LangService type would cause circular dependency
100
- metadata) {
101
- // Observable<string> but avoiding import
102
- const config = extractContentConfigWithInterpolation(metadata);
103
- if (!config.className || !config.key) {
104
- throw new Error('fromContentWithInterpolation requires both contentClass and contentKey');
105
- }
106
- return langService.getContentWithInterpolation(config.className, config.key, config.interpolation, config.fallback);
107
- }
108
- /**
109
- * Helper function to get static content with interpolation.
110
- * This provides interpolation for static content strings.
111
- *
112
- * @param content - Static content string
113
- * @param interpolationData - Values to interpolate
114
- * @returns Interpolated string
115
- */
116
- export function interpolateStaticContent(content, interpolationData) {
117
- return interpolateContent(content, interpolationData);
118
- }
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWNvbnRlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NoYXJlZC91dGlscy9zaW1wbGUtY29udGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUF1Q0g7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxRQUFpQztJQUN4RSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxRQUFpQztJQUNwRSxPQUFPO1FBQ0wsU0FBUyxFQUFFLFFBQVEsQ0FBQyxZQUFZLElBQUksRUFBRTtRQUN0QyxHQUFHLEVBQUUsUUFBUSxDQUFDLFVBQVUsSUFBSSxFQUFFO1FBQzlCLFFBQVEsRUFBRSxRQUFRLENBQUMsZUFBZTtLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLE1BQXdDO0lBRXhDLE9BQU87UUFDTCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1FBQzdCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtRQUNqQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWU7S0FDeEMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxPQUFlLEVBQ2YsTUFBd0M7SUFFeEMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx5Q0FBeUMsQ0FDdkQsUUFBMEM7SUFFMUMsT0FBTyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDO0FBQy9FLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFDQUFxQyxDQUFDLFFBQTBDO0lBQzlGLE9BQU87UUFDTCxTQUFTLEVBQUUsUUFBUSxDQUFDLFlBQVksSUFBSSxFQUFFO1FBQ3RDLEdBQUcsRUFBRSxRQUFRLENBQUMsVUFBVSxJQUFJLEVBQUU7UUFDOUIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxlQUFlO1FBQ2xDLGFBQWEsRUFBRSxRQUFRLENBQUMsb0JBQW9CO0tBQzdDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLFdBQWdCLEVBQUUsbURBQW1EO0FBQ3JFLFFBQTBDO0lBRTFDLHlDQUF5QztJQUN6QyxNQUFNLE1BQU0sR0FBRyxxQ0FBcUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUvRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLHdFQUF3RSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDLDJCQUEyQixDQUM1QyxNQUFNLENBQUMsU0FBUyxFQUNoQixNQUFNLENBQUMsR0FBRyxFQUNWLE1BQU0sQ0FBQyxhQUFhLEVBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQ2hCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsT0FBZSxFQUNmLGlCQUFtRDtJQUVuRCxPQUFPLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNpbXBsaWZpZWQgY29udGVudCB1dGlsaXRpZXMgZm9yIHRoZSBuZXcgTGFuZ1NlcnZpY2Utb25seSBzeXN0ZW0uXG4gKiBUaGlzIHJlcGxhY2VzIHRoZSBvbGQgcmVhY3RpdmUtY29udGVudC50cyB3aXRoIGEgbXVjaCBzaW1wbGVyIGFwcHJvYWNoLlxuICovXG5cbi8qKlxuICogQmFzZSBtZXRhZGF0YSBmb3IgY29tcG9uZW50cyB0aGF0IHN1cHBvcnQgcmVhY3RpdmUgY29udGVudC5cbiAqIFNpbXBsaWZpZWQgdmVyc2lvbiB0aGF0IHdvcmtzIGRpcmVjdGx5IHdpdGggTGFuZ1NlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3RpdmVDb250ZW50TWV0YWRhdGEge1xuICAvKiogU3RhdGljIGNvbnRlbnQgdGV4dCAodGFrZXMgcHJlY2VkZW5jZSBvdmVyIHJlYWN0aXZlIGNvbnRlbnQpICovXG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG4gIC8qKiBDb250ZW50IGtleSBmb3IgcmVhY3RpdmUgY29udGVudCBmcm9tIExhbmdTZXJ2aWNlICovXG4gIGNvbnRlbnRLZXk/OiBzdHJpbmc7XG4gIC8qKiBDb21wb25lbnQgY2xhc3MgbmFtZSBmb3IgY29udGVudCBsb29rdXAgKi9cbiAgY29udGVudENsYXNzPzogc3RyaW5nO1xuICAvKiogRmFsbGJhY2sgdGV4dCBpZiBjb250ZW50IGlzIG5vdCBmb3VuZCAqL1xuICBjb250ZW50RmFsbGJhY2s/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgbWV0YWRhdGEgZm9yIHRleHQtYmFzZWQgY29tcG9uZW50cyB3aXRoIHJlYWN0aXZlIGNvbnRlbnQgc3VwcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZVRleHRNZXRhZGF0YSBleHRlbmRzIFJlYWN0aXZlQ29udGVudE1ldGFkYXRhIHtcbiAgLyoqIFN0YXRpYyBjb250ZW50IHRleHQgKi9cbiAgY29udGVudD86IHN0cmluZztcbiAgLyoqIENvbnRlbnQga2V5IGZvciByZWFjdGl2ZSBsb29rdXAgKi9cbiAgY29udGVudEtleT86IHN0cmluZztcbiAgLyoqIENvbXBvbmVudCBjbGFzcyBuYW1lICovXG4gIGNvbnRlbnRDbGFzcz86IHN0cmluZztcbiAgLyoqIEZhbGxiYWNrIHRleHQgKi9cbiAgY29udGVudEZhbGxiYWNrPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIG1ldGFkYXRhIGZvciBjb21wb25lbnRzIHRoYXQgc3VwcG9ydCBjb250ZW50IGludGVycG9sYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3RpdmVDb250ZW50V2l0aEludGVycG9sYXRpb24gZXh0ZW5kcyBSZWFjdGl2ZUNvbnRlbnRNZXRhZGF0YSB7XG4gIC8qKiBJbnRlcnBvbGF0aW9uIGRhdGEgZm9yIHBhcmFtZXRlcml6ZWQgY29udGVudCAqL1xuICBjb250ZW50SW50ZXJwb2xhdGlvbj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj47XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBjb21wb25lbnQgc2hvdWxkIHVzZSByZWFjdGl2ZSBjb250ZW50LlxuICogQHBhcmFtIG1ldGFkYXRhIENvbXBvbmVudCBtZXRhZGF0YVxuICogQHJldHVybnMgVHJ1ZSBpZiBjb21wb25lbnQgc2hvdWxkIHVzZSByZWFjdGl2ZSBjb250ZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRVc2VSZWFjdGl2ZUNvbnRlbnQobWV0YWRhdGE6IFJlYWN0aXZlQ29udGVudE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiAhbWV0YWRhdGEuY29udGVudCAmJiAhIShtZXRhZGF0YS5jb250ZW50S2V5ICYmIG1ldGFkYXRhLmNvbnRlbnRDbGFzcyk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBjb250ZW50IGNvbmZpZ3VyYXRpb24gZnJvbSBtZXRhZGF0YS5cbiAqIEBwYXJhbSBtZXRhZGF0YSBDb21wb25lbnQgbWV0YWRhdGFcbiAqIEByZXR1cm5zIENvbnRlbnQgY29uZmlndXJhdGlvbiBmb3IgTGFuZ1NlcnZpY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RDb250ZW50Q29uZmlnKG1ldGFkYXRhOiBSZWFjdGl2ZUNvbnRlbnRNZXRhZGF0YSkge1xuICByZXR1cm4ge1xuICAgIGNsYXNzTmFtZTogbWV0YWRhdGEuY29udGVudENsYXNzIHx8ICcnLFxuICAgIGtleTogbWV0YWRhdGEuY29udGVudEtleSB8fCAnJyxcbiAgICBmYWxsYmFjazogbWV0YWRhdGEuY29udGVudEZhbGxiYWNrLFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSByZWFjdGl2ZSBjb250ZW50IG1ldGFkYXRhIHdpdGggZGVmYXVsdHMuXG4gKiBAcGFyYW0gY29uZmlnIFBhcnRpYWwgY29udGVudCBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDb21wbGV0ZSByZWFjdGl2ZSBjb250ZW50IG1ldGFkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZUNvbnRlbnRNZXRhZGF0YShcbiAgY29uZmlnOiBQYXJ0aWFsPFJlYWN0aXZlQ29udGVudE1ldGFkYXRhPlxuKTogUmVhY3RpdmVDb250ZW50TWV0YWRhdGEge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbmZpZy5jb250ZW50LFxuICAgIGNvbnRlbnRLZXk6IGNvbmZpZy5jb250ZW50S2V5LFxuICAgIGNvbnRlbnRDbGFzczogY29uZmlnLmNvbnRlbnRDbGFzcyxcbiAgICBjb250ZW50RmFsbGJhY2s6IGNvbmZpZy5jb250ZW50RmFsbGJhY2ssXG4gIH07XG59XG5cbi8qKlxuICogSW50ZXJwb2xhdGUgY29udGVudCBzdHJpbmcgd2l0aCB2YWx1ZXMuXG4gKiBSZXBsYWNlcyBwbGFjZWhvbGRlcnMgbGlrZSB7e2tleX19IG9yIHtrZXl9IHdpdGggYWN0dWFsIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gY29udGVudCAtIENvbnRlbnQgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzXG4gKiBAcGFyYW0gdmFsdWVzIC0gVmFsdWVzIHRvIGludGVycG9sYXRlXG4gKiBAcmV0dXJucyBJbnRlcnBvbGF0ZWQgc3RyaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGludGVycG9sYXRlQ29udGVudCgnSGVsbG8ge3tuYW1lfX0hJywgeyBuYW1lOiAnV29ybGQnIH0pXG4gKiAvLyBSZXR1cm5zOiAnSGVsbG8gV29ybGQhJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZUNvbnRlbnQoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgdmFsdWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPlxuKTogc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZXMgfHwgIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UoL1xce1xcez8oXFx3KylcXH0/XFx9L2csIChtYXRjaCwga2V5KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IFN0cmluZyh2YWx1ZSkgOiBtYXRjaDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgY29tcG9uZW50IHNob3VsZCB1c2UgcmVhY3RpdmUgY29udGVudCB3aXRoIGludGVycG9sYXRpb24uXG4gKiBAcGFyYW0gbWV0YWRhdGEgQ29tcG9uZW50IG1ldGFkYXRhIHdpdGggaW50ZXJwb2xhdGlvblxuICogQHJldHVybnMgVHJ1ZSBpZiBjb21wb25lbnQgc2hvdWxkIHVzZSByZWFjdGl2ZSBjb250ZW50IHdpdGggaW50ZXJwb2xhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlUmVhY3RpdmVDb250ZW50V2l0aEludGVycG9sYXRpb24oXG4gIG1ldGFkYXRhOiBSZWFjdGl2ZUNvbnRlbnRXaXRoSW50ZXJwb2xhdGlvblxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaG91bGRVc2VSZWFjdGl2ZUNvbnRlbnQobWV0YWRhdGEpICYmICEhbWV0YWRhdGEuY29udGVudEludGVycG9sYXRpb247XG59XG5cbi8qKlxuICogRXh0cmFjdCBjb250ZW50IGNvbmZpZ3VyYXRpb24gd2l0aCBpbnRlcnBvbGF0aW9uIGZyb20gbWV0YWRhdGEuXG4gKiBAcGFyYW0gbWV0YWRhdGEgQ29tcG9uZW50IG1ldGFkYXRhIHdpdGggaW50ZXJwb2xhdGlvblxuICogQHJldHVybnMgQ29udGVudCBjb25maWd1cmF0aW9uIGZvciBMYW5nU2VydmljZSB3aXRoIGludGVycG9sYXRpb24gZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENvbnRlbnRDb25maWdXaXRoSW50ZXJwb2xhdGlvbihtZXRhZGF0YTogUmVhY3RpdmVDb250ZW50V2l0aEludGVycG9sYXRpb24pIHtcbiAgcmV0dXJuIHtcbiAgICBjbGFzc05hbWU6IG1ldGFkYXRhLmNvbnRlbnRDbGFzcyB8fCAnJyxcbiAgICBrZXk6IG1ldGFkYXRhLmNvbnRlbnRLZXkgfHwgJycsXG4gICAgZmFsbGJhY2s6IG1ldGFkYXRhLmNvbnRlbnRGYWxsYmFjayxcbiAgICBpbnRlcnBvbGF0aW9uOiBtZXRhZGF0YS5jb250ZW50SW50ZXJwb2xhdGlvbixcbiAgfTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHJlYWN0aXZlIGNvbnRlbnQgd2l0aCBpbnRlcnBvbGF0aW9uIHVzaW5nIExhbmdTZXJ2aWNlLlxuICogVGhpcyBwcm92aWRlcyBhIHVuaWZpZWQgd2F5IHRvIGdldCByZWFjdGl2ZSwgaW50ZXJwb2xhdGVkIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIGxhbmdTZXJ2aWNlIC0gVGhlIExhbmdTZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gbWV0YWRhdGEgLSBDb21wb25lbnQgbWV0YWRhdGEgd2l0aCBpbnRlcnBvbGF0aW9uXG4gKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgaW50ZXJwb2xhdGVkIGNvbnRlbnRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29udGVudCQgPSBmcm9tQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uKHRoaXMubGFuZ1NlcnZpY2UsIHtcbiAqICAgY29udGVudENsYXNzOiAnTXlDb21wb25lbnQnLFxuICogICBjb250ZW50S2V5OiAnZ3JlZXRpbmcnLFxuICogICBjb250ZW50SW50ZXJwb2xhdGlvbjogeyBuYW1lOiAnV29ybGQnIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uKFxuICBsYW5nU2VydmljZTogYW55LCAvLyBMYW5nU2VydmljZSB0eXBlIHdvdWxkIGNhdXNlIGNpcmN1bGFyIGRlcGVuZGVuY3lcbiAgbWV0YWRhdGE6IFJlYWN0aXZlQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uXG4pOiBhbnkge1xuICAvLyBPYnNlcnZhYmxlPHN0cmluZz4gYnV0IGF2b2lkaW5nIGltcG9ydFxuICBjb25zdCBjb25maWcgPSBleHRyYWN0Q29udGVudENvbmZpZ1dpdGhJbnRlcnBvbGF0aW9uKG1ldGFkYXRhKTtcblxuICBpZiAoIWNvbmZpZy5jbGFzc05hbWUgfHwgIWNvbmZpZy5rZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zyb21Db250ZW50V2l0aEludGVycG9sYXRpb24gcmVxdWlyZXMgYm90aCBjb250ZW50Q2xhc3MgYW5kIGNvbnRlbnRLZXknKTtcbiAgfVxuXG4gIHJldHVybiBsYW5nU2VydmljZS5nZXRDb250ZW50V2l0aEludGVycG9sYXRpb24oXG4gICAgY29uZmlnLmNsYXNzTmFtZSxcbiAgICBjb25maWcua2V5LFxuICAgIGNvbmZpZy5pbnRlcnBvbGF0aW9uLFxuICAgIGNvbmZpZy5mYWxsYmFja1xuICApO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgc3RhdGljIGNvbnRlbnQgd2l0aCBpbnRlcnBvbGF0aW9uLlxuICogVGhpcyBwcm92aWRlcyBpbnRlcnBvbGF0aW9uIGZvciBzdGF0aWMgY29udGVudCBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSBjb250ZW50IC0gU3RhdGljIGNvbnRlbnQgc3RyaW5nXG4gKiBAcGFyYW0gaW50ZXJwb2xhdGlvbkRhdGEgLSBWYWx1ZXMgdG8gaW50ZXJwb2xhdGVcbiAqIEByZXR1cm5zIEludGVycG9sYXRlZCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlU3RhdGljQ29udGVudChcbiAgY29udGVudDogc3RyaW5nLFxuICBpbnRlcnBvbGF0aW9uRGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cbik6IHN0cmluZyB7XG4gIHJldHVybiBpbnRlcnBvbGF0ZUNvbnRlbnQoY29udGVudCwgaW50ZXJwb2xhdGlvbkRhdGEpO1xufVxuIl19
@@ -1,3 +0,0 @@
1
- import { TextContent } from '../types';
2
- declare const _default: TextContent;
3
- export default _default;
@@ -1,17 +0,0 @@
1
- import { LanguagesContent, TextContent } from './types';
2
- export interface Provider {
3
- [x: string]: TextContent;
4
- }
5
- /**
6
- * Global content that can be used across all components.
7
- * These are common texts like buttons, actions, states, etc.
8
- * Structure: {es: {key1: 'value1', key2: 'value2'}, en: {key1: 'value1', key2: 'value2'}, fr: {...}}
9
- *
10
- * Note: You can add any language code. The system will automatically detect available languages
11
- * and provide intelligent fallbacks with warnings for missing translations.
12
- */
13
- declare const globalContentData: LanguagesContent;
14
- declare const GlobalContent: TextContent;
15
- declare const content: Provider;
16
- export default content;
17
- export { content, GlobalContent, globalContentData };
@@ -1,264 +0,0 @@
1
- import { Observable } from 'rxjs';
2
- import { ValtechConfig } from '../types';
3
- import { Provider } from './content';
4
- import { LangOption, LanguageText, LanguagesContent } from './types';
5
- import * as i0 from "@angular/core";
6
- /**
7
- * LangService - Reactive language and content management service.
8
- *
9
- * This service provides reactive content management with Observable-based language switching.
10
- * Components can subscribe to content changes and automatically update when the language changes.
11
- *
12
- * The service automatically detects available languages from the content configuration
13
- * and provides intelligent fallbacks with console warnings for missing translations.
14
- *
15
- * @example Basic usage:
16
- * ```typescript
17
- * constructor(private langService: LangService) {}
18
- *
19
- * // Get current language
20
- * const currentLang = this.langService.currentLang;
21
- *
22
- * // Subscribe to language changes
23
- * this.langService.currentLang$.subscribe(lang => console.log('Language changed:', lang));
24
- *
25
- * // Get static text
26
- * const text = this.langService.getText('ComponentName', 'textKey');
27
- *
28
- * // Get reactive text
29
- * const text$ = this.langService.getContent('ComponentName', 'textKey');
30
- * ```
31
- */
32
- export declare class LangService {
33
- private content;
34
- private defaultLang;
35
- private availableLanguages;
36
- private selectedLang;
37
- private config;
38
- private warnedMissingLanguages;
39
- constructor(config: ValtechConfig);
40
- /**
41
- * Detect available languages from the content configuration.
42
- * Scans all component content to find which languages are actually configured.
43
- */
44
- private detectAvailableLanguages;
45
- /**
46
- * Determine the best default language based on available content.
47
- */
48
- private determineDefaultLanguage;
49
- /**
50
- * Validate if a language is available in the content.
51
- */
52
- private validateLanguage;
53
- /**
54
- * Get the best available language for a component and key.
55
- * Provides intelligent fallback with warnings.
56
- */
57
- private getBestAvailableContent;
58
- /**
59
- * Observable that emits the current language whenever it changes.
60
- * Use this to subscribe to language changes in components.
61
- */
62
- get currentLang$(): Observable<LangOption>;
63
- /**
64
- * Get the current language synchronously.
65
- */
66
- get currentLang(): LangOption;
67
- /**
68
- * Get array of available languages detected from content.
69
- */
70
- get availableLangs(): LangOption[];
71
- /**
72
- * Get the default language.
73
- */
74
- get defaultLanguage(): LangOption;
75
- /**
76
- * Set the current language and persist it to localStorage.
77
- * This will trigger updates in all reactive content subscriptions.
78
- *
79
- * Validates that the language is available and warns if not.
80
- *
81
- * @param lang - The language to set
82
- */
83
- setLang(lang: LangOption): void;
84
- /**
85
- * Get content for a component class and key (legacy method).
86
- *
87
- * @deprecated Use getText() or getContent() for better type safety
88
- */
89
- Text(className: string): LanguageText;
90
- /**
91
- * Get a single content string synchronously for the current language.
92
- * Provides intelligent fallback with warnings for missing translations.
93
- *
94
- * @param className - The component class name
95
- * @param key - The text key
96
- * @param fallback - Optional fallback text if key is not found
97
- * @returns The text string or fallback
98
- */
99
- getText(className: string, key: string, fallback?: string): string;
100
- /**
101
- * Get a reactive Observable for a specific text key that updates when language changes.
102
- * This is the recommended method for components that need reactive content.
103
- * Provides intelligent fallback with warnings for missing translations.
104
- *
105
- * @param className - The component class name
106
- * @param key - The text key
107
- * @param fallback - Optional fallback text if key is not found
108
- * @returns Observable that emits the text string whenever language changes
109
- */
110
- getContent(className: string, key: string, fallback?: string): Observable<string>;
111
- /**
112
- * Get reactive content for multiple keys at once.
113
- * Provides intelligent fallback with warnings for missing translations.
114
- *
115
- * @param className - The component class name
116
- * @param keys - Array of text keys to retrieve
117
- * @returns Observable that emits an object with all requested keys
118
- */
119
- getMultipleContent(className: string, keys: string[]): Observable<Record<string, string>>;
120
- /**
121
- * Check if a content key exists for a component in any available language.
122
- *
123
- * @param className - The component class name
124
- * @param key - The text key
125
- * @returns True if the key exists in any language
126
- */
127
- hasContent(className: string, key: string): boolean;
128
- /**
129
- * Check if a content key exists for a component in a specific language.
130
- *
131
- * @param className - The component class name
132
- * @param key - The text key
133
- * @param lang - The language to check (defaults to current language)
134
- * @returns True if the key exists in the specified language
135
- */
136
- hasContentInLanguage(className: string, key: string, lang?: LangOption): boolean;
137
- /**
138
- * Get available languages for a specific component.
139
- *
140
- * @param className - The component class name
141
- * @returns Array of language codes available for the component
142
- */
143
- getAvailableLanguagesForComponent(className: string): LangOption[];
144
- /**
145
- * Get missing content keys for a component in a specific language.
146
- * Useful for identifying incomplete translations.
147
- *
148
- * @param className - The component class name
149
- * @param lang - The language to check
150
- * @param referenceLang - The reference language to compare against (defaults to default language)
151
- * @returns Array of missing keys
152
- */
153
- getMissingContentKeys(className: string, lang: LangOption, referenceLang?: LangOption): string[];
154
- /**
155
- * Register or update content for a component dynamically.
156
- * This allows registering content at runtime without APP_INITIALIZER.
157
- *
158
- * @param className - The component class name
159
- * @param content - The multilingual content object
160
- * @param merge - Whether to merge with existing content (default: true)
161
- *
162
- * @example
163
- * ```typescript
164
- * this.langService.registerContent('MyComponent', {
165
- * [LANGUAGES.ES]: { title: 'Título', description: 'Descripción' },
166
- * [LANGUAGES.EN]: { title: 'Title', description: 'Description' }
167
- * });
168
- * ```
169
- */
170
- registerContent(className: string, content: LanguagesContent, merge?: boolean): void;
171
- /**
172
- * Update multiple content registrations at once.
173
- *
174
- * @param contentMap - Map of className to content
175
- * @param merge - Whether to merge with existing content (default: true)
176
- *
177
- * @example
178
- * ```typescript
179
- * this.langService.registerMultipleContent({
180
- * 'Component1': { [LANGUAGES.ES]: { key1: 'valor1' } },
181
- * 'Component2': { [LANGUAGES.EN]: { key2: 'value2' } }
182
- * });
183
- * ```
184
- */
185
- registerMultipleContent(contentMap: Record<string, LanguagesContent>, merge?: boolean): void;
186
- /**
187
- * Remove content for a specific component.
188
- *
189
- * @param className - The component class name to remove
190
- */
191
- removeContent(className: string): void;
192
- /**
193
- * Get a list of all registered component classes.
194
- *
195
- * @returns Array of registered class names
196
- */
197
- getRegisteredClasses(): string[];
198
- /**
199
- * Get the complete content configuration (for debugging purposes).
200
- * Returns a deep copy to prevent accidental mutations.
201
- *
202
- * @returns Complete content configuration
203
- */
204
- getContentConfiguration(): Provider;
205
- /**
206
- * Clear all content and reset to initial state.
207
- * Useful for testing or complete reinitialization.
208
- */
209
- clearAllContent(): void;
210
- /**
211
- * Get content with interpolation support.
212
- * Retrieves content and replaces placeholders with provided values.
213
- *
214
- * @param className - The component class name
215
- * @param key - The text key
216
- * @param interpolationData - Object with values to interpolate
217
- * @param fallback - Optional fallback text if key is not found
218
- * @returns Text with interpolated values
219
- */
220
- getTextWithInterpolation(className: string, key: string, interpolationData?: Record<string, string | number>, fallback?: string): string;
221
- /**
222
- * Get reactive content with interpolation support.
223
- * Returns an Observable that emits interpolated content when language changes.
224
- *
225
- * @param className - The component class name
226
- * @param key - The text key
227
- * @param interpolationData - Object with values to interpolate
228
- * @param fallback - Optional fallback text if key is not found
229
- * @returns Observable that emits interpolated text
230
- */
231
- getContentWithInterpolation(className: string, key: string, interpolationData?: Record<string, string | number>, fallback?: string): Observable<string>;
232
- /**
233
- * Interpolate a string with provided values.
234
- * Replaces placeholders like {{key}} or {key} with actual values.
235
- *
236
- * @param content - Content string with placeholders
237
- * @param values - Values to interpolate
238
- * @returns Interpolated string
239
- *
240
- * @example
241
- * ```typescript
242
- * interpolateString('Hello {{name}}!', { name: 'World' })
243
- * // Returns: 'Hello World!'
244
- * ```
245
- */
246
- private interpolateString;
247
- /**
248
- * Legacy function equivalent to the old fromContentWithInterpolation.
249
- * Provides reactive content with interpolation support for backward compatibility.
250
- *
251
- * @param className - The component class name
252
- * @param key - The text key
253
- * @param interpolationData - Object with values to interpolate
254
- * @param fallback - Optional fallback text if key is not found
255
- * @returns Observable that emits interpolated text
256
- *
257
- * @deprecated Use getContentWithInterpolation instead
258
- */
259
- fromContentWithInterpolation(className: string, key: string, interpolationData?: Record<string, string | number>, fallback?: string): Observable<string>;
260
- get Lang(): LangOption;
261
- set Lang(lang: LangOption);
262
- static ɵfac: i0.ɵɵFactoryDeclaration<LangService, never>;
263
- static ɵprov: i0.ɵɵInjectableDeclaration<LangService>;
264
- }
@@ -1,30 +0,0 @@
1
- export type LanguageText = {
2
- [key: string]: string;
3
- };
4
- export type LanguagesContent = {
5
- [key: string]: LanguageText;
6
- };
7
- export declare class TextContent {
8
- text: LanguagesContent;
9
- constructor(text: LanguagesContent);
10
- get Content(): LanguagesContent;
11
- }
12
- /**
13
- * Language code type - supports any valid language code string.
14
- * Common examples: 'es', 'en', 'fr', 'de', 'pt', 'it', 'zh', 'ja', etc.
15
- */
16
- export type LangOption = string;
17
- /**
18
- * Common language constants for convenience.
19
- * Users can still use any language code string directly.
20
- */
21
- export declare const LANGUAGES: {
22
- readonly ES: "es";
23
- readonly EN: "en";
24
- readonly FR: "fr";
25
- readonly DE: "de";
26
- readonly PT: "pt";
27
- readonly IT: "it";
28
- readonly ZH: "zh";
29
- readonly JA: "ja";
30
- };