valtech-components 2.0.340 → 2.0.341

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.
package/README.md CHANGED
@@ -34,15 +34,18 @@ npm install valtech-components
34
34
  Import the desired standalone components in your Angular modules or components:
35
35
 
36
36
  ```typescript
37
- import { TextComponent } from 'valtech-components';
37
+ import { inject } from '@angular/core';
38
+ import { TextComponent, ButtonComponent, LangService } from 'valtech-components';
38
39
 
39
40
  @Component({
40
41
  selector: 'your-component',
41
42
  standalone: true,
42
43
  imports: [
43
44
  TextComponent,
45
+ ButtonComponent
44
46
  ],
45
47
  template: `
48
+ <!-- Static text -->
46
49
  <val-text
47
50
  [props]="{
48
51
  content: 'This is a body text.',
@@ -51,9 +54,38 @@ import { TextComponent } from 'valtech-components';
51
54
  size: 'small'
52
55
  }"
53
56
  />
54
- `})
57
+
58
+ <!-- Reactive text from global content -->
59
+ <val-text
60
+ [props]="{
61
+ contentKey: 'save',
62
+ contentClass: '_global',
63
+ contentFallback: 'Save',
64
+ color: 'primary',
65
+ bold: true,
66
+ size: 'medium'
67
+ }"
68
+ />
69
+
70
+ <!-- Button with reactive text -->
71
+ <val-button
72
+ [props]="{
73
+ contentKey: 'cancel',
74
+ contentClass: '_global',
75
+ contentFallback: 'Cancel',
76
+ color: 'secondary',
77
+ type: 'button'
78
+ }"
79
+ (onClick)="handleCancel()"
80
+ />
81
+ `
82
+ })
55
83
  export class YourComponent {
56
-
84
+ langService = inject(LangService);
85
+
86
+ handleCancel() {
87
+ console.log('Cancel clicked');
88
+ }
57
89
  }
58
90
  ```
59
91
 
@@ -66,9 +98,11 @@ The library includes a powerful reactive internationalization system with **Lang
66
98
  - **Global Content**: Reusable texts like buttons ("Save", "Cancel"), states ("Loading", "Error"), and confirmations
67
99
  - **Component-Specific Content**: Custom texts for individual components
68
100
  - **Reactive Updates**: Text automatically updates when language changes
69
- - **Interpolation Support**: Dynamic values in text strings
101
+ - **Interpolation Support**: Dynamic values in text strings with `{{variable}}` syntax
70
102
  - **Type-Safe**: Full TypeScript support with autocompletion
71
- - **Simple API**: Clean, injectable service without complex setup
103
+ - **Simple API**: Direct LangService injection, no complex setup
104
+ - **Automatic Fallbacks**: Intelligent language fallback with console warnings
105
+ - **Unified System**: Single service for all content needs
72
106
 
73
107
  ### Available Global Content
74
108
 
@@ -77,6 +111,7 @@ The library includes a powerful reactive internationalization system with **Lang
77
111
  - **States**: `loading`, `error`, `success`, `warning`, `info`, `noData`
78
112
  - **Forms**: `searchPlaceholder`
79
113
  - **Confirmations**: `deleteConfirmation`, `unsavedChanges`
114
+ - **General**: `language`, `areYouSure`, `copied`
80
115
 
81
116
  ### Basic Setup
82
117
 
@@ -107,78 +142,177 @@ bootstrapApplication(AppComponent, {
107
142
  });
108
143
  ```
109
144
 
110
- ### Using ContentService (Recommended)
145
+ ### Using LangService (Current API)
111
146
 
112
147
  ```typescript
113
148
  // component.ts
114
149
  import { inject } from '@angular/core';
115
- import { ContentService } from 'valtech-components';
150
+ import { LangService } from 'valtech-components';
116
151
 
117
152
  @Component({
118
153
  template: `
119
- <!-- Global content (no className needed) -->
120
- <button>{{ saveButton$ | async }}</button>
121
- <button>{{ cancelButton$ | async }}</button>
122
-
123
- <!-- Global content with val-text -->
154
+ <!-- Global content using val-text -->
124
155
  <val-text [props]="{
125
156
  contentKey: 'ok',
157
+ contentClass: '_global',
126
158
  color: 'primary',
127
159
  size: 'large',
128
160
  bold: true
129
161
  }"></val-text>
130
162
 
131
- <!-- Component-specific content with val-text -->
163
+ <!-- Component-specific content using val-text -->
132
164
  <val-text [props]="{
133
165
  contentKey: 'welcome',
134
166
  contentClass: 'AppComponent',
167
+ contentFallback: 'Welcome',
135
168
  color: 'secondary',
136
- size: 'medium',
137
- bold: false
169
+ size: 'medium'
138
170
  }"></val-text>
139
171
 
140
172
  <!-- Direct observable binding -->
141
173
  <h2>{{ title$ | async }}</h2>
174
+
175
+ <!-- With interpolation -->
176
+ <p>{{ greeting$ | async }}</p>
142
177
  `
143
178
  })
144
179
  export class MyComponent {
145
- content = inject(ContentService);
146
- componentContent = this.content.forComponent('AppComponent');
180
+ langService = inject(LangService);
147
181
 
148
- // Global content (automatically searches in global namespace)
149
- saveButton$ = this.content.fromContent({ key: 'save' });
150
- cancelButton$ = this.content.fromContent({ key: 'cancel' });
182
+ // Global content
183
+ saveButton$ = this.langService.getContent('_global', 'save', 'Save');
184
+ cancelButton$ = this.langService.getContent('_global', 'cancel', 'Cancel');
151
185
 
152
186
  // Component-specific content
153
- title$ = this.componentContent.get('welcome');
187
+ title$ = this.langService.getContent('AppComponent', 'welcome', 'Welcome');
188
+
189
+ // Content with interpolation
190
+ greeting$ = this.langService.getContentWithInterpolation(
191
+ 'AppComponent',
192
+ 'personalizedGreeting',
193
+ { name: 'John', count: 5 },
194
+ 'Hello!'
195
+ );
154
196
 
155
197
  // Switch language
156
198
  changeLanguage() {
157
- this.content.setLang(this.content.currentLang === 'es' ? 'en' : 'es');
199
+ const currentLang = this.langService.currentLang;
200
+ this.langService.setLang(currentLang === 'es' ? 'en' : 'es');
158
201
  }
159
202
 
160
203
  constructor() {}
161
204
  }
162
205
  ```
163
206
 
164
- ### Content with Variables
207
+ ### Content with Variables (Interpolation)
165
208
 
166
209
  ```typescript
167
- // Component with interpolation
210
+ // Component with interpolation using the new API
168
211
  export class UserComponent {
169
- content = inject(ContentService);
170
- componentContent = this.content.forComponent('UserComponent');
212
+ langService = inject(LangService);
171
213
 
172
- greeting$ = this.componentContent.get('personalizedGreeting', {
173
- interpolation: {
174
- name: 'John',
175
- count: 5,
176
- }
177
- });
214
+ // Method 1: Direct service usage
215
+ greeting$ = this.langService.getContentWithInterpolation(
216
+ 'UserComponent',
217
+ 'personalizedGreeting',
218
+ { name: 'John', count: 5 },
219
+ 'Hello!'
220
+ );
178
221
  // Results in: "Hello John, you have 5 messages"
222
+
223
+ // Method 2: Using val-text component
224
+ // In template:
225
+ // <val-text [props]="{
226
+ // contentKey: 'personalizedGreeting',
227
+ // contentClass: 'UserComponent',
228
+ // contentInterpolation: { name: 'John', count: 5 },
229
+ // contentFallback: 'Hello!'
230
+ // }"></val-text>
231
+ }
232
+ ```
233
+
234
+ ### Helper Functions
235
+
236
+ ```typescript
237
+ // Using utility helpers from simple-content
238
+ import {
239
+ fromContentWithInterpolation,
240
+ interpolateStaticContent,
241
+ shouldUseReactiveContent
242
+ } from 'valtech-components';
243
+
244
+ export class AdvancedComponent {
245
+ langService = inject(LangService);
246
+
247
+ // Using helper for reactive content with interpolation
248
+ message$ = fromContentWithInterpolation(this.langService, {
249
+ contentClass: 'MyComponent',
250
+ contentKey: 'message',
251
+ contentInterpolation: { count: 10 }
252
+ });
253
+
254
+ // Static content with interpolation
255
+ processStaticText() {
256
+ const text = interpolateStaticContent(
257
+ 'You have {{count}} items',
258
+ { count: 5 }
259
+ );
260
+ // Results in: "You have 5 items"
261
+ }
179
262
  }
180
263
  ```
181
264
 
265
+ ### Migration Guide
266
+
267
+ If you're migrating from the old `ContentService` API, here's a quick reference:
268
+
269
+ ```typescript
270
+ // OLD API (ContentService - removed)
271
+ content = inject(ContentService);
272
+ text$ = this.content.fromContent({ key: 'save' });
273
+
274
+ // NEW API (LangService - current)
275
+ langService = inject(LangService);
276
+ text$ = this.langService.getContent('_global', 'save', 'Save');
277
+
278
+ // OLD API (with interpolation)
279
+ text$ = this.content.fromContentWithInterpolation({
280
+ key: 'greeting',
281
+ interpolation: { name: 'John' }
282
+ });
283
+
284
+ // NEW API (with interpolation)
285
+ text$ = this.langService.getContentWithInterpolation(
286
+ '_global',
287
+ 'greeting',
288
+ { name: 'John' },
289
+ 'Hello!'
290
+ );
291
+ ```
292
+
293
+ ### Available Utility Functions
294
+
295
+ ```typescript
296
+ import {
297
+ shouldUseReactiveContent,
298
+ extractContentConfig,
299
+ interpolateStaticContent,
300
+ fromContentWithInterpolation
301
+ } from 'valtech-components';
302
+
303
+ // Check if metadata should use reactive content
304
+ const useReactive = shouldUseReactiveContent(metadata);
305
+
306
+ // Extract configuration from metadata
307
+ const config = extractContentConfig(metadata);
308
+
309
+ // Interpolate static strings
310
+ const result = interpolateStaticContent('Hello {{name}}!', { name: 'World' });
311
+
312
+ // Helper for reactive content with interpolation
313
+ const content$ = fromContentWithInterpolation(langService, metadata);
314
+ ```
315
+
182
316
  ## 🔗 Automatic Link Processing
183
317
 
184
318
  The library now includes automatic link detection and processing capabilities. Convert URLs and internal routes in text content into clickable links automatically:
@@ -246,11 +380,19 @@ processText(text: string) {
246
380
  - `src/lib/components/molecules/` – Compound components (e.g., input groups, cards)
247
381
  - `src/lib/components/organisms/` – Complex components (e.g., forms, toolbars)
248
382
  - `src/lib/components/templates/` – Page templates and layouts
249
- - `src/lib/components/_examples/` – Example components demonstrating features
250
383
  - `src/lib/components/styles/` – Shared SCSS variables, mixins, and utilities
251
- - `src/lib/services/` – Utility and helper services (e.g., theme, navigation, i18n)
252
- - `src/lib/shared/` – Shared constants and utility functions
253
-
384
+ - `src/lib/services/` – Core services:
385
+ - `lang-provider/` – **LangService** for reactive internationalization
386
+ - `theme.service.ts` – Theme management
387
+ - `navigation.service.ts` – Routing utilities
388
+ - `download.service.ts` – File download helpers
389
+ - `icons.service.ts` – Icon management
390
+ - `toast.service.ts` – Toast notifications
391
+ - `src/lib/shared/` – Shared utilities:
392
+ - `utils/simple-content.ts` – Content system helpers and interfaces
393
+ - `utils/content.ts` – Legacy content utilities (for backward compatibility)
394
+ - `pipes/process-links.pipe.ts` – Automatic link processing
395
+ - `constants/` – Shared constants
254
396
 
255
397
  ## License
256
398
 
@@ -12,7 +12,7 @@ export class InfoComponent {
12
12
  this.icon = inject(IconService);
13
13
  }
14
14
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InfoComponent, isStandalone: true, selector: "info", inputs: { props: "props" }, ngImport: i0, template: `
15
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InfoComponent, isStandalone: true, selector: "val-info", inputs: { props: "props" }, ngImport: i0, template: `
16
16
  @if (props.image) {
17
17
  <val-image style="display: contents;" [props]="props.image" />
18
18
  }
@@ -29,7 +29,7 @@ export class InfoComponent {
29
29
  }
30
30
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InfoComponent, decorators: [{
31
31
  type: Component,
32
- args: [{ selector: 'info', standalone: true, imports: [CommonModule, LinkComponent, TitleBlockComponent, ImageComponent, ButtonGroupComponent], template: `
32
+ args: [{ selector: 'val-info', standalone: true, imports: [CommonModule, LinkComponent, TitleBlockComponent, ImageComponent, ButtonGroupComponent], template: `
33
33
  @if (props.image) {
34
34
  <val-image style="display: contents;" [props]="props.image" />
35
35
  }
@@ -46,4 +46,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
46
46
  }], propDecorators: { props: [{
47
47
  type: Input
48
48
  }] } });
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9pbmZvL2luZm8uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztBQXVCOUQsTUFBTSxPQUFPLGFBQWE7SUFwQjFCO1FBcUJFLFNBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7S0FHNUI7K0dBSlksYUFBYTttR0FBYixhQUFhLDRGQWhCZDs7Ozs7Ozs7Ozs7OztHQWFULHlFQWRTLFlBQVksK0JBQUUsYUFBYSw4RkFBRSxtQkFBbUIsK0VBQUUsY0FBYyx5RUFBRSxvQkFBb0I7OzRGQWlCckYsYUFBYTtrQkFwQnpCLFNBQVM7K0JBQ0UsTUFBTSxjQUNKLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixDQUFDLFlBQ3ZGOzs7Ozs7Ozs7Ozs7O0dBYVQ7OEJBTVEsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL2FwcC9sYXlvdXQvbGF5b3V0LmNvbXBvbmVudC50cyAoc29sbyBsYSBwYXJ0ZSBkZSBzdHlsZXMpXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vbGluay9saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaXRsZUJsb2NrQ29tcG9uZW50IH0gZnJvbSAnLi4vdGl0bGUtYmxvY2svdGl0bGUtYmxvY2suY29tcG9uZW50JztcbmltcG9ydCB7IEltYWdlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvaW1hZ2UvaW1hZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uLWdyb3VwL2J1dHRvbi1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pY29ucy5zZXJ2aWNlJztcbmltcG9ydCB7IEluZm9NZXRhZGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpbmZvJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTGlua0NvbXBvbmVudCwgVGl0bGVCbG9ja0NvbXBvbmVudCwgSW1hZ2VDb21wb25lbnQsIEJ1dHRvbkdyb3VwQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKHByb3BzLmltYWdlKSB7XG4gICAgICA8dmFsLWltYWdlIHN0eWxlPVwiZGlzcGxheTogY29udGVudHM7XCIgW3Byb3BzXT1cInByb3BzLmltYWdlXCIgLz5cbiAgICB9XG4gICAgPHZhbC10aXRsZS1ibG9jayBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO21hcmdpbi10b3A6IDE2cHg7XCIgW3Byb3BzXT1cInByb3BzLnRpdGxlXCIgLz5cblxuICAgIEBpZiAocHJvcHMubGluaykge1xuICAgICAgPHZhbC1saW5rIFtwcm9wc109XCJwcm9wcy5saW5rXCIgLz5cbiAgICB9XG5cbiAgICBAaWYgKHByb3BzLmFjdGlvbnMpIHtcbiAgICAgIDx2YWwtYnV0dG9uLWdyb3VwIFtwcm9wc109XCJwcm9wcy5hY3Rpb25zXCIgLz5cbiAgICB9XG4gIGAsXG4gIHN0eWxlczogYGAsXG59KVxuZXhwb3J0IGNsYXNzIEluZm9Db21wb25lbnQge1xuICBpY29uID0gaW5qZWN0KEljb25TZXJ2aWNlKTtcblxuICBASW5wdXQoKSBwcm9wczogSW5mb01ldGFkYXRhO1xufVxuIl19
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9pbmZvL2luZm8uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztBQXVCOUQsTUFBTSxPQUFPLGFBQWE7SUFwQjFCO1FBcUJFLFNBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7S0FHNUI7K0dBSlksYUFBYTttR0FBYixhQUFhLGdHQWhCZDs7Ozs7Ozs7Ozs7OztHQWFULHlFQWRTLFlBQVksK0JBQUUsYUFBYSw4RkFBRSxtQkFBbUIsK0VBQUUsY0FBYyx5RUFBRSxvQkFBb0I7OzRGQWlCckYsYUFBYTtrQkFwQnpCLFNBQVM7K0JBQ0UsVUFBVSxjQUNSLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixDQUFDLFlBQ3ZGOzs7Ozs7Ozs7Ozs7O0dBYVQ7OEJBTVEsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL2FwcC9sYXlvdXQvbGF5b3V0LmNvbXBvbmVudC50cyAoc29sbyBsYSBwYXJ0ZSBkZSBzdHlsZXMpXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vbGluay9saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaXRsZUJsb2NrQ29tcG9uZW50IH0gZnJvbSAnLi4vdGl0bGUtYmxvY2svdGl0bGUtYmxvY2suY29tcG9uZW50JztcbmltcG9ydCB7IEltYWdlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvaW1hZ2UvaW1hZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uLWdyb3VwL2J1dHRvbi1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pY29ucy5zZXJ2aWNlJztcbmltcG9ydCB7IEluZm9NZXRhZGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtaW5mbycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIExpbmtDb21wb25lbnQsIFRpdGxlQmxvY2tDb21wb25lbnQsIEltYWdlQ29tcG9uZW50LCBCdXR0b25Hcm91cENvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgQGlmIChwcm9wcy5pbWFnZSkge1xuICAgICAgPHZhbC1pbWFnZSBzdHlsZT1cImRpc3BsYXk6IGNvbnRlbnRzO1wiIFtwcm9wc109XCJwcm9wcy5pbWFnZVwiIC8+XG4gICAgfVxuICAgIDx2YWwtdGl0bGUtYmxvY2sgc3R5bGU9XCJkaXNwbGF5OiBibG9jazttYXJnaW4tdG9wOiAxNnB4O1wiIFtwcm9wc109XCJwcm9wcy50aXRsZVwiIC8+XG5cbiAgICBAaWYgKHByb3BzLmxpbmspIHtcbiAgICAgIDx2YWwtbGluayBbcHJvcHNdPVwicHJvcHMubGlua1wiIC8+XG4gICAgfVxuXG4gICAgQGlmIChwcm9wcy5hY3Rpb25zKSB7XG4gICAgICA8dmFsLWJ1dHRvbi1ncm91cCBbcHJvcHNdPVwicHJvcHMuYWN0aW9uc1wiIC8+XG4gICAgfVxuICBgLFxuICBzdHlsZXM6IGBgLFxufSlcbmV4cG9ydCBjbGFzcyBJbmZvQ29tcG9uZW50IHtcbiAgaWNvbiA9IGluamVjdChJY29uU2VydmljZSk7XG5cbiAgQElucHV0KCkgcHJvcHM6IEluZm9NZXRhZGF0YTtcbn1cbiJdfQ==
@@ -5739,7 +5739,7 @@ class InfoComponent {
5739
5739
  this.icon = inject(IconService);
5740
5740
  }
5741
5741
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5742
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InfoComponent, isStandalone: true, selector: "info", inputs: { props: "props" }, ngImport: i0, template: `
5742
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InfoComponent, isStandalone: true, selector: "val-info", inputs: { props: "props" }, ngImport: i0, template: `
5743
5743
  @if (props.image) {
5744
5744
  <val-image style="display: contents;" [props]="props.image" />
5745
5745
  }
@@ -5756,7 +5756,7 @@ class InfoComponent {
5756
5756
  }
5757
5757
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InfoComponent, decorators: [{
5758
5758
  type: Component,
5759
- args: [{ selector: 'info', standalone: true, imports: [CommonModule, LinkComponent, TitleBlockComponent, ImageComponent, ButtonGroupComponent], template: `
5759
+ args: [{ selector: 'val-info', standalone: true, imports: [CommonModule, LinkComponent, TitleBlockComponent, ImageComponent, ButtonGroupComponent], template: `
5760
5760
  @if (props.image) {
5761
5761
  <val-image style="display: contents;" [props]="props.image" />
5762
5762
  }