valtech-components 2.0.192 → 2.0.193

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 (171) hide show
  1. package/README.md +67 -13
  2. package/esm2022/lib/components/atoms/avatar/avatar.component.mjs +15 -1
  3. package/esm2022/lib/components/atoms/avatar/types.mjs +1 -1
  4. package/esm2022/lib/components/atoms/box/box.component.mjs +17 -1
  5. package/esm2022/lib/components/atoms/box/types.mjs +1 -1
  6. package/esm2022/lib/components/atoms/button/button.component.mjs +15 -1
  7. package/esm2022/lib/components/atoms/display/display.component.mjs +11 -1
  8. package/esm2022/lib/components/atoms/display/types.mjs +1 -1
  9. package/esm2022/lib/components/atoms/divider/divider.component.mjs +11 -2
  10. package/esm2022/lib/components/atoms/divider/types.mjs +1 -1
  11. package/esm2022/lib/components/atoms/href/href.component.mjs +12 -1
  12. package/esm2022/lib/components/atoms/href/types.mjs +1 -1
  13. package/esm2022/lib/components/atoms/icon/icon.component.mjs +11 -1
  14. package/esm2022/lib/components/atoms/icon/types.mjs +1 -1
  15. package/esm2022/lib/components/atoms/image/image.component.mjs +13 -3
  16. package/esm2022/lib/components/atoms/image/types.mjs +1 -1
  17. package/esm2022/lib/components/atoms/progress-bar/progress-bar.component.mjs +11 -1
  18. package/esm2022/lib/components/atoms/progress-bar/types.mjs +1 -1
  19. package/esm2022/lib/components/atoms/text/text.component.mjs +11 -1
  20. package/esm2022/lib/components/atoms/text/types.mjs +1 -1
  21. package/esm2022/lib/components/atoms/title/title.component.mjs +11 -1
  22. package/esm2022/lib/components/atoms/title/types.mjs +1 -1
  23. package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +11 -1
  24. package/esm2022/lib/components/molecules/button-group/button-group.component.mjs +15 -1
  25. package/esm2022/lib/components/molecules/button-group/types.mjs +1 -1
  26. package/esm2022/lib/components/molecules/card/card.component.mjs +15 -1
  27. package/esm2022/lib/components/molecules/check-input/check-input.component.mjs +9 -1
  28. package/esm2022/lib/components/molecules/comment-input/comment-input.component.mjs +11 -1
  29. package/esm2022/lib/components/molecules/content-loader/content-loader.component.mjs +11 -1
  30. package/esm2022/lib/components/molecules/content-loader/types.mjs +1 -1
  31. package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +11 -1
  32. package/esm2022/lib/components/molecules/email-input/email-input.component.mjs +11 -1
  33. package/esm2022/lib/components/molecules/expandable-text/expandable-text.component.mjs +11 -1
  34. package/esm2022/lib/components/molecules/expandable-text/types.mjs +1 -1
  35. package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +16 -6
  36. package/esm2022/lib/components/molecules/hint/hint.component.mjs +11 -1
  37. package/esm2022/lib/components/molecules/hour-input/hour-input.component.mjs +11 -1
  38. package/esm2022/lib/components/molecules/link/link.component.mjs +12 -1
  39. package/esm2022/lib/components/molecules/link/types.mjs +1 -1
  40. package/esm2022/lib/components/molecules/links-cake/links-cake.component.mjs +11 -1
  41. package/esm2022/lib/components/molecules/links-cake/types.mjs +1 -1
  42. package/esm2022/lib/components/molecules/notes-box/notes-box.component.mjs +31 -3
  43. package/esm2022/lib/components/molecules/notes-box/types.mjs +1 -1
  44. package/esm2022/lib/components/molecules/number-input/number-input.component.mjs +11 -1
  45. package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +11 -1
  46. package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +11 -1
  47. package/esm2022/lib/components/molecules/progress-status/progress-status.component.mjs +11 -1
  48. package/esm2022/lib/components/molecules/progress-status/types.mjs +1 -1
  49. package/esm2022/lib/components/molecules/prompter/prompter.component.mjs +12 -1
  50. package/esm2022/lib/components/molecules/prompter/types.mjs +1 -1
  51. package/esm2022/lib/components/molecules/radio-input/radio-input.component.mjs +11 -1
  52. package/esm2022/lib/components/molecules/searchbar/searchbar.component.mjs +27 -5
  53. package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +11 -1
  54. package/esm2022/lib/components/molecules/select-search/select-search.component.mjs +13 -3
  55. package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +14 -17
  56. package/esm2022/lib/components/molecules/title-block/title-block.component.mjs +11 -1
  57. package/esm2022/lib/components/molecules/title-block/types.mjs +1 -1
  58. package/esm2022/lib/components/organisms/banner/banner.component.mjs +25 -3
  59. package/esm2022/lib/components/organisms/banner/types.mjs +1 -1
  60. package/esm2022/lib/components/organisms/footer/footer.component.mjs +23 -2
  61. package/esm2022/lib/components/organisms/footer/types.mjs +1 -1
  62. package/esm2022/lib/components/organisms/header/header.component.mjs +20 -1
  63. package/esm2022/lib/components/organisms/header/types.mjs +1 -1
  64. package/esm2022/lib/components/organisms/item-list/item-list.component.mjs +31 -1
  65. package/esm2022/lib/components/organisms/item-list/types.mjs +1 -1
  66. package/esm2022/lib/components/organisms/no-content/no-content.component.mjs +20 -1
  67. package/esm2022/lib/components/organisms/no-content/types.mjs +1 -1
  68. package/esm2022/lib/components/organisms/toolbar/toolbar.component.mjs +46 -12
  69. package/esm2022/lib/components/organisms/toolbar/types.mjs +1 -1
  70. package/esm2022/lib/components/organisms/wizard/types.mjs +4 -1
  71. package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +44 -1
  72. package/esm2022/lib/services/download.service.mjs +18 -1
  73. package/esm2022/lib/services/icons.service.mjs +8 -1
  74. package/esm2022/lib/services/in-app-browser.service.mjs +12 -1
  75. package/esm2022/lib/services/local-storage.service.mjs +22 -1
  76. package/esm2022/lib/services/navigation.service.mjs +22 -1
  77. package/esm2022/lib/services/theme.service.mjs +46 -2
  78. package/esm2022/lib/services/toast.service.mjs +14 -2
  79. package/esm2022/lib/shared/utils/dom.mjs +11 -1
  80. package/esm2022/lib/shared/utils/styles.mjs +13 -1
  81. package/esm2022/lib/shared/utils/text.mjs +11 -1
  82. package/fesm2022/valtech-components.mjs +812 -47
  83. package/fesm2022/valtech-components.mjs.map +1 -1
  84. package/lib/components/atoms/avatar/avatar.component.d.ts +11 -0
  85. package/lib/components/atoms/avatar/types.d.ts +8 -0
  86. package/lib/components/atoms/box/box.component.d.ts +13 -0
  87. package/lib/components/atoms/box/types.d.ts +10 -0
  88. package/lib/components/atoms/button/button.component.d.ts +12 -0
  89. package/lib/components/atoms/display/display.component.d.ts +7 -0
  90. package/lib/components/atoms/display/types.d.ts +7 -0
  91. package/lib/components/atoms/divider/divider.component.d.ts +17 -0
  92. package/lib/components/atoms/divider/types.d.ts +7 -0
  93. package/lib/components/atoms/href/href.component.d.ts +10 -0
  94. package/lib/components/atoms/href/types.d.ts +10 -0
  95. package/lib/components/atoms/icon/icon.component.d.ts +7 -0
  96. package/lib/components/atoms/icon/types.d.ts +7 -0
  97. package/lib/components/atoms/image/image.component.d.ts +14 -0
  98. package/lib/components/atoms/image/types.d.ts +14 -0
  99. package/lib/components/atoms/progress-bar/progress-bar.component.d.ts +10 -0
  100. package/lib/components/atoms/progress-bar/types.d.ts +10 -0
  101. package/lib/components/atoms/text/text.component.d.ts +8 -0
  102. package/lib/components/atoms/text/types.d.ts +8 -0
  103. package/lib/components/atoms/title/title.component.d.ts +9 -0
  104. package/lib/components/atoms/title/types.d.ts +9 -0
  105. package/lib/components/molecules/alert-box/alert-box.component.d.ts +7 -0
  106. package/lib/components/molecules/button-group/button-group.component.d.ts +10 -0
  107. package/lib/components/molecules/button-group/types.d.ts +7 -0
  108. package/lib/components/molecules/card/card.component.d.ts +14 -0
  109. package/lib/components/molecules/comment-input/comment-input.component.d.ts +6 -0
  110. package/lib/components/molecules/content-loader/content-loader.component.d.ts +8 -0
  111. package/lib/components/molecules/content-loader/types.d.ts +8 -0
  112. package/lib/components/molecules/date-input/date-input.component.d.ts +6 -0
  113. package/lib/components/molecules/email-input/email-input.component.d.ts +6 -0
  114. package/lib/components/molecules/expandable-text/expandable-text.component.d.ts +8 -0
  115. package/lib/components/molecules/expandable-text/types.d.ts +8 -0
  116. package/lib/components/molecules/file-input/file-input.component.d.ts +6 -1
  117. package/lib/components/molecules/hint/hint.component.d.ts +6 -0
  118. package/lib/components/molecules/hour-input/hour-input.component.d.ts +5 -0
  119. package/lib/components/molecules/link/link.component.d.ts +10 -0
  120. package/lib/components/molecules/link/types.d.ts +10 -0
  121. package/lib/components/molecules/links-cake/links-cake.component.d.ts +7 -0
  122. package/lib/components/molecules/links-cake/types.d.ts +7 -0
  123. package/lib/components/molecules/notes-box/notes-box.component.d.ts +11 -0
  124. package/lib/components/molecules/notes-box/types.d.ts +11 -0
  125. package/lib/components/molecules/number-input/number-input.component.d.ts +6 -0
  126. package/lib/components/molecules/password-input/password-input.component.d.ts +7 -1
  127. package/lib/components/molecules/pin-input/pin-input.component.d.ts +5 -0
  128. package/lib/components/molecules/progress-status/progress-status.component.d.ts +9 -0
  129. package/lib/components/molecules/progress-status/types.d.ts +10 -0
  130. package/lib/components/molecules/prompter/prompter.component.d.ts +12 -0
  131. package/lib/components/molecules/prompter/types.d.ts +12 -0
  132. package/lib/components/molecules/radio-input/radio-input.component.d.ts +6 -0
  133. package/lib/components/molecules/searchbar/searchbar.component.d.ts +14 -2
  134. package/lib/components/molecules/select-input/select-input.component.d.ts +8 -0
  135. package/lib/components/molecules/select-search/select-search.component.d.ts +9 -2
  136. package/lib/components/molecules/text-input/text-input.component.d.ts +7 -0
  137. package/lib/components/molecules/title-block/title-block.component.d.ts +8 -0
  138. package/lib/components/molecules/title-block/types.d.ts +8 -0
  139. package/lib/components/organisms/banner/types.d.ts +14 -0
  140. package/lib/components/organisms/footer/footer.component.d.ts +24 -0
  141. package/lib/components/organisms/footer/types.d.ts +10 -0
  142. package/lib/components/organisms/header/header.component.d.ts +10 -0
  143. package/lib/components/organisms/header/types.d.ts +10 -0
  144. package/lib/components/organisms/item-list/item-list.component.d.ts +20 -0
  145. package/lib/components/organisms/item-list/types.d.ts +43 -0
  146. package/lib/components/organisms/no-content/no-content.component.d.ts +10 -0
  147. package/lib/components/organisms/no-content/types.d.ts +10 -0
  148. package/lib/components/organisms/toolbar/toolbar.component.d.ts +40 -3
  149. package/lib/components/organisms/toolbar/types.d.ts +15 -0
  150. package/lib/components/organisms/wizard/types.d.ts +22 -0
  151. package/lib/components/organisms/wizard/wizard.component.d.ts +32 -0
  152. package/lib/services/download.service.d.ts +13 -0
  153. package/lib/services/icons.service.d.ts +3 -0
  154. package/lib/services/in-app-browser.service.d.ts +7 -0
  155. package/lib/services/local-storage.service.d.ts +21 -0
  156. package/lib/services/navigation.service.d.ts +24 -0
  157. package/lib/services/theme.service.d.ts +42 -0
  158. package/lib/services/toast.service.d.ts +12 -0
  159. package/lib/shared/utils/dom.d.ts +10 -0
  160. package/lib/shared/utils/styles.d.ts +12 -0
  161. package/lib/shared/utils/text.d.ts +10 -0
  162. package/package.json +1 -1
  163. package/src/lib/components/styles/overrides.scss +11 -3
  164. package/src/lib/components/styles/variables.scss +1 -0
  165. package/styles/fonts.scss +0 -35
  166. package/src/lib/assets/fonts/Khula-Bold.ttf +0 -0
  167. package/src/lib/assets/fonts/Khula-ExtraBold.ttf +0 -0
  168. package/src/lib/assets/fonts/Khula-Light.ttf +0 -0
  169. package/src/lib/assets/fonts/Khula-Regular.ttf +0 -0
  170. package/src/lib/assets/fonts/Khula-SemiBold.ttf +0 -0
  171. package/src/lib/assets/fonts/OFL.txt +0 -93
@@ -15,8 +15,22 @@ import * as i2 from '@ionic/angular';
15
15
  import { IonicModule } from '@ionic/angular';
16
16
  import { BehaviorSubject } from 'rxjs';
17
17
 
18
+ /**
19
+ * val-avatar
20
+ *
21
+ * Displays a user or profile image, optionally with a box style and different sizes.
22
+ *
23
+ * @example
24
+ * <val-avatar [props]="{ image: 'url', size: 'medium', box: true }" (onClick)="handler()"></val-avatar>
25
+ *
26
+ * @input props: AvatarMetadata - Configuration for the avatar (image, size, box, default image)
27
+ * @output onClick - Emits when the avatar is clicked
28
+ */
18
29
  class AvatarComponent {
19
30
  constructor() {
31
+ /**
32
+ * Event emitted when the avatar is clicked.
33
+ */
20
34
  this.onClick = new EventEmitter();
21
35
  }
22
36
  ngOnInit() { }
@@ -44,7 +58,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
44
58
  }] } });
45
59
 
46
60
  /* eslint-disable no-underscore-dangle */
61
+ /**
62
+ * Service for registering and managing custom Ionicons icons in the application.
63
+ * Automatically registers a set of commonly used icons on initialization.
64
+ */
47
65
  class IconService {
66
+ /**
67
+ * Registers a set of Ionicons icons for use throughout the app.
68
+ */
48
69
  constructor() {
49
70
  addIcons({
50
71
  addOutline,
@@ -81,8 +102,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
81
102
  }]
82
103
  }], ctorParameters: () => [] });
83
104
 
105
+ /**
106
+ * val-box
107
+ *
108
+ * A stylized card container for grouping content, with optional icon, color, border, and click event.
109
+ *
110
+ * @example
111
+ * <val-box [props]="{ color: 'primary', rounded: true, icon: 'star' }" (onClick)="handler()">
112
+ * <div body>Content here</div>
113
+ * </val-box>
114
+ *
115
+ * @input props: BoxMetadata - Configuration for the box (color, icon, border, etc.)
116
+ * @output onClick - Emits when the box or its icon is clicked
117
+ */
84
118
  class BoxComponent {
85
119
  constructor(icon) {
120
+ /**
121
+ * Event emitted when the box or its icon is clicked.
122
+ */
86
123
  this.onClick = new EventEmitter();
87
124
  }
88
125
  ngOnInit() { }
@@ -196,7 +233,16 @@ var ToolbarActionType;
196
233
  ToolbarActionType["BUTTON"] = "BUTTON";
197
234
  })(ToolbarActionType || (ToolbarActionType = {}));
198
235
 
236
+ /**
237
+ * Service for downloading files and opening links in new tabs.
238
+ * Provides utility methods for browser-based file downloads and extracting file names from URLs.
239
+ */
199
240
  class DownloadService {
241
+ /**
242
+ * Extracts the file name from a given URL.
243
+ * @param url The file URL
244
+ * @returns The file name
245
+ */
200
246
  getFileNameFromUrl(url) {
201
247
  try {
202
248
  const pathSegments = url.split('/');
@@ -209,6 +255,10 @@ class DownloadService {
209
255
  return 'filename';
210
256
  }
211
257
  }
258
+ /**
259
+ * Opens a given URL in a new browser tab and triggers download if possible.
260
+ * @param url The file URL
261
+ */
212
262
  openNewTab(url) {
213
263
  if (url) {
214
264
  const fileName = this.getFileNameFromUrl(url);
@@ -224,6 +274,10 @@ class DownloadService {
224
274
  console.error('La URL no está definida');
225
275
  }
226
276
  }
277
+ /**
278
+ * Downloads a file from the browser using fetch and triggers a download dialog.
279
+ * @param url The file URL
280
+ */
227
281
  downloadLinkFromBrowser(url) {
228
282
  console.log('trying to download file from url');
229
283
  if (url) {
@@ -258,13 +312,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
258
312
  }] });
259
313
 
260
314
  /* eslint-disable no-underscore-dangle */
315
+ /**
316
+ * Service for opening URLs using Capacitor's InAppBrowser plugin.
317
+ * Provides a method to open links in a popover-style browser within the app.
318
+ */
261
319
  class InAppBrowserService {
262
320
  constructor() {
321
+ /**
322
+ * Default options for the in-app browser.
323
+ */
263
324
  this.options = {
264
325
  presentationStyle: 'popover',
265
326
  url: '',
266
327
  };
267
328
  }
329
+ /**
330
+ * Opens a URL using Capacitor's InAppBrowser with the configured options.
331
+ * @param url The URL to open
332
+ */
268
333
  async openWithInAppBrowser(url) {
269
334
  await Browser.open({ ...this.options, url });
270
335
  }
@@ -278,14 +343,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
278
343
  }]
279
344
  }], ctorParameters: () => [] });
280
345
 
346
+ /**
347
+ * Service for navigation and routing within the application.
348
+ * Supports navigation with data transfer, in-app browser, and opening links in new tabs.
349
+ */
281
350
  class NavigationService {
282
351
  constructor() {
283
352
  this.router = inject(Router);
284
353
  this.inAppBrowser = inject(InAppBrowserService);
285
354
  }
355
+ /**
356
+ * Opens a URL using the in-app browser service.
357
+ * @param url The URL to open
358
+ */
286
359
  navigateInApp(url) {
287
360
  this.inAppBrowser.openWithInAppBrowser(url);
288
361
  }
362
+ /**
363
+ * Navigates to a route and transfers data using Angular Router state.
364
+ * @param route The route to navigate to
365
+ * @param dataTransfer The data to transfer
366
+ */
289
367
  navigateWithData(route, dataTransfer) {
290
368
  const navigationExtras = {
291
369
  state: {
@@ -294,12 +372,20 @@ class NavigationService {
294
372
  };
295
373
  this.router.navigate([route], navigationExtras);
296
374
  }
375
+ /**
376
+ * Navigates to a URL using Angular Router.
377
+ * @param url The URL to navigate to
378
+ */
297
379
  navigateByUrl(url) {
298
380
  this.router
299
381
  .navigateByUrl(url)
300
382
  .then(response => { })
301
383
  .catch(error => { });
302
384
  }
385
+ /**
386
+ * Opens a URL in a new browser tab.
387
+ * @param url The URL to open
388
+ */
303
389
  openInNewTab(url) {
304
390
  window.open(url, '_blank', 'noopener,noreferrer');
305
391
  }
@@ -313,11 +399,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
313
399
  }]
314
400
  }], ctorParameters: () => [] });
315
401
 
402
+ /**
403
+ * val-button
404
+ *
405
+ * A customizable button supporting icons, loading state, navigation, and custom handlers.
406
+ *
407
+ * @example
408
+ * <val-button [props]="{ text: 'Save', color: 'primary', icon: { name: 'save', slot: 'start' } }" (onClick)="handler()"></val-button>
409
+ *
410
+ * @input props: ButtonMetadata - Configuration for the button (text, color, icon, state, etc.)
411
+ * @output onClick - Emits when the button is clicked
412
+ */
316
413
  class ButtonComponent {
317
414
  constructor(download, icon, navigation) {
318
415
  this.download = download;
319
416
  this.navigation = navigation;
320
417
  this.states = ComponentStates;
418
+ /**
419
+ * Event emitted when the button is clicked.
420
+ */
321
421
  this.onClick = new EventEmitter();
322
422
  }
323
423
  ngOnInit() { }
@@ -601,6 +701,16 @@ const SecondarySolidBlockIconHrefButton = (text, icon, href, target) => {
601
701
  return { ...SecondarySolidBlockIconButton(text, icon), href, target };
602
702
  };
603
703
 
704
+ /**
705
+ * val-display
706
+ *
707
+ * Displays prominent text or titles with custom color and size.
708
+ *
709
+ * @example
710
+ * <val-display [props]="{ content: 'Title', color: 'dark', size: 'large' }"></val-display>
711
+ *
712
+ * @input props: DisplayMetadata - Configuration for the display (content, color, size)
713
+ */
604
714
  class DisplayComponent {
605
715
  constructor() { }
606
716
  ngOnInit() { }
@@ -626,7 +736,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
626
736
  type: Input
627
737
  }] } });
628
738
 
629
- //TODO: fix the class name colission between medium size and medium color
739
+ /**
740
+ * val-divider
741
+ *
742
+ * A horizontal divider for separating content sections.
743
+ *
744
+ * @example
745
+ * <val-divider [props]="{ size: 'medium', color: 'light', fill: 'solid' }"></val-divider>
746
+ *
747
+ * @input props: DividerMetadata - Configuration for the divider (size, color, fill)
748
+ */
630
749
  class DividerComponent {
631
750
  constructor() { }
632
751
  ngOnInit() { }
@@ -640,6 +759,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
640
759
  type: Input
641
760
  }] } });
642
761
 
762
+ /**
763
+ * val-href
764
+ *
765
+ * A styled anchor/link element, supporting download and click events.
766
+ *
767
+ * @example
768
+ * <val-href [props]="{ url: 'https://...', text: 'Open', color: 'primary', download: true }" (onClick)="handler()"></val-href>
769
+ *
770
+ * @input props: HrefMetadata - Configuration for the link (url, text, color, download, etc.)
771
+ * @output onClick - Emits when the link is clicked
772
+ */
643
773
  class HrefComponent {
644
774
  constructor(downloadService) {
645
775
  this.downloadService = downloadService;
@@ -686,6 +816,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
686
816
  type: Output
687
817
  }] } });
688
818
 
819
+ /**
820
+ * val-icon
821
+ *
822
+ * Displays an icon from the Ionicons set, with configurable size and color.
823
+ *
824
+ * @example
825
+ * <val-icon [props]="{ name: 'star', size: 'large', color: 'warning' }"></val-icon>
826
+ *
827
+ * @input props: IconMetadata - Configuration for the icon (name, color, size)
828
+ */
689
829
  class IconComponent {
690
830
  constructor(service) { }
691
831
  ngOnInit() { }
@@ -699,6 +839,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
699
839
  type: Input
700
840
  }] } });
701
841
 
842
+ /**
843
+ * val-image
844
+ *
845
+ * Displays an image with various display options (bordered, shaded, dark, etc).
846
+ *
847
+ * @example
848
+ * <val-image [props]="{ src: 'url', alt: 'desc', width: 100, height: 100, bordered: true }"></val-image>
849
+ *
850
+ * @input props: ImageMetadata - Configuration for the image (src, alt, size, mode, etc.)
851
+ */
702
852
  class ImageComponent {
703
853
  constructor() {
704
854
  this.available = true;
@@ -715,7 +865,7 @@ class ImageComponent {
715
865
  <img
716
866
  [ngClass]="['image', props.mode, props.size]"
717
867
  [ngStyle]="{
718
- content: 'var(' + props.src + ')'
868
+ content: 'var(' + props.src + ')',
719
869
  }"
720
870
  [class.bordered]="props.bordered"
721
871
  [class.shaded]="props.shaded"
@@ -749,7 +899,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
749
899
  <img
750
900
  [ngClass]="['image', props.mode, props.size]"
751
901
  [ngStyle]="{
752
- content: 'var(' + props.src + ')'
902
+ content: 'var(' + props.src + ')',
753
903
  }"
754
904
  [class.bordered]="props.bordered"
755
905
  [class.shaded]="props.shaded"
@@ -779,6 +929,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
779
929
  type: Input
780
930
  }] } });
781
931
 
932
+ /**
933
+ * val-progress-bar
934
+ *
935
+ * A progress bar for indicating completion or loading state.
936
+ *
937
+ * @example
938
+ * <val-progress-bar [props]="{ progress: 0.5, color: 'success', size: 'small' }"></val-progress-bar>
939
+ *
940
+ * @input props: ProgressBarMetadata - Configuration for the progress bar (progress, color, size, etc.)
941
+ */
782
942
  class ProgressBarComponent {
783
943
  constructor() { }
784
944
  ngOnInit() { }
@@ -810,6 +970,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
810
970
  type: Input
811
971
  }] } });
812
972
 
973
+ /**
974
+ * val-text
975
+ *
976
+ * For displaying styled text with color, size, and bold options.
977
+ *
978
+ * @example
979
+ * <val-text [props]="{ content: 'Some text', color: 'medium', size: 'small', bold: true }"></val-text>
980
+ *
981
+ * @input props: TextMetadata - Configuration for the text (content, color, size, bold)
982
+ */
813
983
  class TextComponent {
814
984
  constructor() { }
815
985
  ngOnInit() { }
@@ -831,6 +1001,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
831
1001
  type: Input
832
1002
  }] } });
833
1003
 
1004
+ /**
1005
+ * val-title
1006
+ *
1007
+ * A styled title or heading, with options for size, color, and boldness.
1008
+ *
1009
+ * @example
1010
+ * <val-title [props]="{ content: 'Section', size: 'large', color: 'primary', bold: true }"></val-title>
1011
+ *
1012
+ * @input props: TitleMetadata - Configuration for the title (content, color, size, bold, thin)
1013
+ */
834
1014
  class TitleComponent {
835
1015
  constructor() { }
836
1016
  ngOnInit() { }
@@ -862,6 +1042,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
862
1042
  type: Input
863
1043
  }] } });
864
1044
 
1045
+ /**
1046
+ * val-alert-box
1047
+ *
1048
+ * Displays an alert box with an icon and text, using a styled box container.
1049
+ *
1050
+ * @example
1051
+ * <val-alert-box [props]="{ box: {...}, icon: {...}, text: {...} }"></val-alert-box>
1052
+ *
1053
+ * @input props: AlertBoxMetadata - Configuration for the alert box (box, icon, text)
1054
+ */
865
1055
  class AlertBoxComponent {
866
1056
  constructor() { }
867
1057
  ngOnInit() { }
@@ -889,8 +1079,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
889
1079
  type: Input
890
1080
  }] } });
891
1081
 
1082
+ /**
1083
+ * val-button-group
1084
+ *
1085
+ * Displays a group of buttons with configurable layout and position.
1086
+ *
1087
+ * @example
1088
+ * <val-button-group [props]="{ buttons: [...], position: 'center', columned: false }" (onClick)="handler($event)"></val-button-group>
1089
+ *
1090
+ * @input props: ButtonGroupMetadata - Configuration for the button group (buttons, position, columned)
1091
+ * @output onClick - Emits the token of the clicked button
1092
+ */
892
1093
  class ButtonGroupComponent {
893
1094
  constructor() {
1095
+ /**
1096
+ * Event emitted with the token of the clicked button.
1097
+ */
894
1098
  this.onClick = new EventEmitter();
895
1099
  }
896
1100
  ngOnInit() { }
@@ -949,8 +1153,22 @@ var CardSection;
949
1153
  CardSection[CardSection["footerExtra"] = 4] = "footerExtra";
950
1154
  })(CardSection || (CardSection = {}));
951
1155
 
1156
+ /**
1157
+ * val-card
1158
+ *
1159
+ * A flexible card component supporting images, titles, content, actions, and custom sections.
1160
+ *
1161
+ * @example
1162
+ * <val-card [props]="{ type: 'native', title: 'Card', image: 'url', content: '...', actions: [...] }" (onClick)="handler($event)"></val-card>
1163
+ *
1164
+ * @input props: CardMetadata - Configuration for the card (type, title, image, content, actions, etc.)
1165
+ * @output onClick - Emits a CardClickEvent when the card or an action is clicked
1166
+ */
952
1167
  class CardComponent {
953
1168
  constructor() {
1169
+ /**
1170
+ * Event emitted when the card or an action is clicked.
1171
+ */
954
1172
  this.onClick = new EventEmitter();
955
1173
  this.types = CardType;
956
1174
  this.actionTypes = ToolbarActionType;
@@ -1303,6 +1521,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1303
1521
  type: Output
1304
1522
  }] } });
1305
1523
 
1524
+ /**
1525
+ * val-check-input
1526
+ *
1527
+ * A simple checkbox input for boolean values or agreements.
1528
+ *
1529
+ * @example
1530
+ * <val-check-input></val-check-input>
1531
+ */
1306
1532
  class CheckInputComponent {
1307
1533
  constructor() { }
1308
1534
  ngOnInit() { }
@@ -1314,6 +1540,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1314
1540
  args: [{ selector: 'val-check-input', standalone: true, imports: [CommonModule, IonCheckbox], template: ` <ion-checkbox>I agree to the terms and conditions</ion-checkbox> ` }]
1315
1541
  }], ctorParameters: () => [] });
1316
1542
 
1543
+ /**
1544
+ * val-comment-input
1545
+ *
1546
+ * A textarea input for multi-line comments, integrated with Angular forms.
1547
+ *
1548
+ * @example
1549
+ * <val-comment-input [props]="{ control: myControl, range: { max: 200 } }"></val-comment-input>
1550
+ *
1551
+ * @input props: InputMetadata - Configuration for the textarea (form control, range, etc.)
1552
+ */
1317
1553
  class CommentInputComponent {
1318
1554
  constructor() { }
1319
1555
  ngOnInit() { }
@@ -1331,6 +1567,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1331
1567
  type: Input
1332
1568
  }] } });
1333
1569
 
1570
+ /**
1571
+ * val-content-loader
1572
+ *
1573
+ * A loading spinner with optional text, for indicating loading states.
1574
+ *
1575
+ * @example
1576
+ * <val-content-loader [props]="{ size: 'large', color: 'primary', text: 'Loading...' }"></val-content-loader>
1577
+ *
1578
+ * @input props: ContentLoaderMetadata - Configuration for the loader (size, color, text, etc.)
1579
+ */
1334
1580
  class ContentLoaderComponent {
1335
1581
  constructor() { }
1336
1582
  ngOnInit() { }
@@ -1358,6 +1604,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1358
1604
  type: Input
1359
1605
  }] } });
1360
1606
 
1607
+ /**
1608
+ * val-date-input
1609
+ *
1610
+ * A date picker input integrated with Angular forms, using Ionic's datetime component.
1611
+ *
1612
+ * @example
1613
+ * <val-date-input [props]="{ control: myControl, hint: 'Select a date' }"></val-date-input>
1614
+ *
1615
+ * @input props: InputMetadata - Configuration for the date input (form control, hint, etc.)
1616
+ */
1361
1617
  class DateInputComponent {
1362
1618
  constructor() { }
1363
1619
  ngOnInit() { }
@@ -1425,6 +1681,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1425
1681
  type: Input
1426
1682
  }] } });
1427
1683
 
1684
+ /**
1685
+ * val-email-input
1686
+ *
1687
+ * An email input field integrated with Angular forms.
1688
+ *
1689
+ * @example
1690
+ * <val-email-input [props]="{ control: myControl, placeholder: 'Enter your email' }"></val-email-input>
1691
+ *
1692
+ * @input props: InputMetadata - Configuration for the input (form control, placeholder, etc.)
1693
+ */
1428
1694
  class EmailInputComponent {
1429
1695
  constructor() { }
1430
1696
  ngOnInit() { }
@@ -1438,6 +1704,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1438
1704
  type: Input
1439
1705
  }] } });
1440
1706
 
1707
+ /**
1708
+ * Resolves a color string to a valid CSS value for use in styles.
1709
+ * Supports Ionic color names, CSS variables, and custom colors.
1710
+ *
1711
+ * @param color The color name, CSS variable, or custom color string
1712
+ * @returns A valid CSS color value
1713
+ *
1714
+ * @example
1715
+ * resolveColor('primary'); // returns 'var(--ion-color-primary)'
1716
+ * resolveColor('--my-custom-color'); // returns 'var(--my-custom-color)'
1717
+ * resolveColor('#ff0000'); // returns '#ff0000'
1718
+ */
1441
1719
  function resolveColor(color) {
1442
1720
  // Si el color empieza con "--", se asume que es una variable CSS válida
1443
1721
  if (color.startsWith('--')) {
@@ -1463,6 +1741,16 @@ function resolveColor(color) {
1463
1741
  return color;
1464
1742
  }
1465
1743
 
1744
+ /**
1745
+ * val-expandable-text
1746
+ *
1747
+ * A text component that can be expanded/collapsed to show more or less content.
1748
+ *
1749
+ * @example
1750
+ * <val-expandable-text [props]="{ content: '...', limit: 180, color: 'primary', expandText: 'más' }"></val-expandable-text>
1751
+ *
1752
+ * @input props: ExpandableTextInput - Configuration for the expandable text (content, limit, color, expandText)
1753
+ */
1466
1754
  class ExpandableTextComponent {
1467
1755
  constructor() {
1468
1756
  this.expanded = false;
@@ -1517,6 +1805,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1517
1805
  type: Input
1518
1806
  }] } });
1519
1807
 
1808
+ /**
1809
+ * val-file-input
1810
+ *
1811
+ * A file input component for uploading files, integrated with Angular forms.
1812
+ *
1813
+ * @example
1814
+ * <val-file-input [props]="{ control: myControl }"></val-file-input>
1815
+ *
1816
+ * @input props: InputMetadata - Configuration for the file input (form control, etc.)
1817
+ */
1520
1818
  class FileInputComponent {
1521
1819
  constructor() {
1522
1820
  this.contrastButton = {
@@ -1551,7 +1849,7 @@ class FileInputComponent {
1551
1849
  </div>
1552
1850
  <val-button [props]="contrastButton" (onClick)="fileInput.click()"></val-button>
1553
1851
  </div>
1554
- `, isInline: true, styles: [".section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.file-container{margin-top:.25rem}.name-container{display:flex;flex-direction:row;align-items:flex-start}\n"], dependencies: [{ kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["props"], outputs: ["onClick"] }] }); }
1852
+ `, isInline: true, styles: [".section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.file-container{margin-top:.25rem}.name-container{display:flex;flex-direction:row;align-items:center}\n"], dependencies: [{ kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["props"], outputs: ["onClick"] }] }); }
1555
1853
  }
1556
1854
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FileInputComponent, decorators: [{
1557
1855
  type: Component,
@@ -1572,14 +1870,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1572
1870
  </div>
1573
1871
  <val-button [props]="contrastButton" (onClick)="fileInput.click()"></val-button>
1574
1872
  </div>
1575
- `, styles: [".section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.file-container{margin-top:.25rem}.name-container{display:flex;flex-direction:row;align-items:flex-start}\n"] }]
1576
- }], ctorParameters: () => [], propDecorators: { fileInput: [{
1873
+ `, styles: [".section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.file-container{margin-top:.25rem}.name-container{display:flex;flex-direction:row;align-items:center}\n"] }]
1874
+ }], ctorParameters: () => [], propDecorators: { props: [{
1875
+ type: Input
1876
+ }], fileInput: [{
1577
1877
  type: ViewChild,
1578
1878
  args: ['fileInput']
1579
- }], props: [{
1580
- type: Input
1581
1879
  }] } });
1582
1880
 
1881
+ /**
1882
+ * val-hint
1883
+ *
1884
+ * Displays validation error messages for a form input, using Angular forms.
1885
+ *
1886
+ * @example
1887
+ * <val-hint [props]="{ control: myControl, errors: { required: 'Required field' } }"></val-hint>
1888
+ *
1889
+ * @input props: InputMetadata - Configuration for the input (form control, errors, etc.)
1890
+ */
1583
1891
  class HintComponent {
1584
1892
  constructor() { }
1585
1893
  ngOnInit() { }
@@ -1627,6 +1935,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1627
1935
  type: Input
1628
1936
  }] } });
1629
1937
 
1938
+ /**
1939
+ * val-hour-input
1940
+ *
1941
+ * A time picker input integrated with Angular forms, using Ionic's datetime component.
1942
+ *
1943
+ * @example
1944
+ * <val-hour-input [props]="{ control: myControl }"></val-hour-input>
1945
+ *
1946
+ * @input props: InputMetadata - Configuration for the time input (form control, etc.)
1947
+ */
1630
1948
  class HourInputComponent {
1631
1949
  constructor() { }
1632
1950
  ngOnInit() { }
@@ -1640,6 +1958,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1640
1958
  type: Input
1641
1959
  }] } });
1642
1960
 
1961
+ /**
1962
+ * val-link
1963
+ *
1964
+ * A stylized link button with navigation support for internal, in-app, or new tab links.
1965
+ *
1966
+ * @example
1967
+ * <val-link [props]="{ text: 'Go', color: 'primary', link: '/home', type: 'internal' }" (onClick)="handler($event)"></val-link>
1968
+ *
1969
+ * @input props: LinkMetadata - Configuration for the link (text, color, link, type, etc.)
1970
+ * @output onClick - Emits the token of the clicked link
1971
+ */
1643
1972
  class LinkComponent {
1644
1973
  constructor() {
1645
1974
  this.onClick = new EventEmitter();
@@ -1687,6 +2016,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1687
2016
  type: Output
1688
2017
  }] } });
1689
2018
 
2019
+ /**
2020
+ * val-links-cake
2021
+ *
2022
+ * Displays a list of links with an optional title, styled as a "cake" of links.
2023
+ *
2024
+ * @example
2025
+ * <val-links-cake [props]="{ title: 'Links', links: [...], size: 'medium' }"></val-links-cake>
2026
+ *
2027
+ * @input props: LinkCakeMetadata - Configuration for the links cake (title, links, size)
2028
+ */
1690
2029
  class LinksCakeComponent {
1691
2030
  constructor() { }
1692
2031
  ngOnInit() { }
@@ -1722,12 +2061,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1722
2061
  type: Input
1723
2062
  }] } });
1724
2063
 
2064
+ /**
2065
+ * val-notes-box
2066
+ *
2067
+ * Displays a styled notes/info box with optional prefix and configurable color, size, and padding.
2068
+ *
2069
+ * @example
2070
+ * <val-notes-box [props]="{ text: 'Note', prefix: 'Info', color: 'primary', textColor: 'dark', size: 'medium', rounded: true, padding: '8px' }"></val-notes-box>
2071
+ *
2072
+ * @input props: NotesBoxMetadata - Configuration for the notes box (text, prefix, color, textColor, size, rounded, padding)
2073
+ */
1725
2074
  class NotesBoxComponent {
1726
2075
  constructor() { }
1727
2076
  ngOnInit() { }
1728
2077
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotesBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1729
2078
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NotesBoxComponent, isStandalone: true, selector: "val-notes-box", inputs: { props: "props" }, ngImport: i0, template: `
1730
- <val-box [props]="{ icon: '', bordered: false, color: props.color, leftBorder: true, rounded: props.rounded, padding: props.padding }">
2079
+ <val-box
2080
+ [props]="{
2081
+ icon: '',
2082
+ bordered: false,
2083
+ color: props.color,
2084
+ leftBorder: true,
2085
+ rounded: props.rounded,
2086
+ padding: props.padding,
2087
+ }"
2088
+ >
1731
2089
  <div [ngClass]="['content-container', props.size]" body>
1732
2090
  @if (props.prefix) {
1733
2091
  <val-text
@@ -1742,7 +2100,16 @@ class NotesBoxComponent {
1742
2100
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotesBoxComponent, decorators: [{
1743
2101
  type: Component,
1744
2102
  args: [{ selector: 'val-notes-box', standalone: true, imports: [CommonModule, BoxComponent, TextComponent], template: `
1745
- <val-box [props]="{ icon: '', bordered: false, color: props.color, leftBorder: true, rounded: props.rounded, padding: props.padding }">
2103
+ <val-box
2104
+ [props]="{
2105
+ icon: '',
2106
+ bordered: false,
2107
+ color: props.color,
2108
+ leftBorder: true,
2109
+ rounded: props.rounded,
2110
+ padding: props.padding,
2111
+ }"
2112
+ >
1746
2113
  <div [ngClass]="['content-container', props.size]" body>
1747
2114
  @if (props.prefix) {
1748
2115
  <val-text
@@ -1757,6 +2124,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1757
2124
  type: Input
1758
2125
  }] } });
1759
2126
 
2127
+ /**
2128
+ * val-number-input
2129
+ *
2130
+ * A number input field integrated with Angular forms.
2131
+ *
2132
+ * @example
2133
+ * <val-number-input [props]="{ control: myControl, placeholder: 'Enter a number' }"></val-number-input>
2134
+ *
2135
+ * @input props: InputMetadata - Configuration for the input (form control, placeholder, etc.)
2136
+ */
1760
2137
  class NumberInputComponent {
1761
2138
  constructor() { }
1762
2139
  ngOnInit() { }
@@ -1770,6 +2147,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1770
2147
  type: Input
1771
2148
  }] } });
1772
2149
 
2150
+ /**
2151
+ * val-password-input
2152
+ *
2153
+ * A password input field with show/hide toggle, integrated with Angular forms.
2154
+ *
2155
+ * @example
2156
+ * <val-password-input [props]="{ control: myControl, placeholder: 'Enter password' }"></val-password-input>
2157
+ *
2158
+ * @input props: InputMetadata - Configuration for the input (form control, placeholder, etc.)
2159
+ */
1773
2160
  class PasswordInputComponent {
1774
2161
  constructor(icon) {
1775
2162
  this.hidePassword = true;
@@ -1809,6 +2196,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1809
2196
  type: Input
1810
2197
  }] } });
1811
2198
 
2199
+ /**
2200
+ * val-pin-input
2201
+ *
2202
+ * A PIN code input using ng-otp-input, integrated with Angular forms.
2203
+ *
2204
+ * @example
2205
+ * <val-pin-input [props]="{ control: myControl }"></val-pin-input>
2206
+ *
2207
+ * @input props: InputMetadata - Configuration for the PIN input (form control, etc.)
2208
+ */
1812
2209
  class PinInputComponent {
1813
2210
  constructor() {
1814
2211
  this.codeLength = 5;
@@ -1850,6 +2247,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1850
2247
  type: Input
1851
2248
  }] } });
1852
2249
 
2250
+ /**
2251
+ * val-title-block
2252
+ *
2253
+ * Displays a block of titles (above, main, below) with configurable styles and positions.
2254
+ *
2255
+ * @example
2256
+ * <val-title-block [props]="{ title: {...}, aboveTitle: {...}, bellowTitle: {...}, position: 'center' }"></val-title-block>
2257
+ *
2258
+ * @input props: TitleBlockMetada - Configuration for the title block (title, aboveTitle, bellowTitle, position)
2259
+ */
1853
2260
  class TitleBlockComponent {
1854
2261
  constructor() { }
1855
2262
  ngOnInit() { }
@@ -1924,6 +2331,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1924
2331
  }] } });
1925
2332
 
1926
2333
  //TODO: support automatic or manual interval for messages. Include the interval number as a parameter.
2334
+ /**
2335
+ * val-progress-status
2336
+ *
2337
+ * Displays a progress bar with status messages and titles, useful for multi-step or loading processes.
2338
+ *
2339
+ * @example
2340
+ * <val-progress-status [props]="{ progress: 0.5, color: 'primary', size: 'medium', titles: {...}, messages: [...] }"></val-progress-status>
2341
+ *
2342
+ * @input props: ProgressStatusMetadata - Configuration for the progress status (progress, color, size, titles, messages)
2343
+ */
1927
2344
  class ProgressStatusComponent {
1928
2345
  constructor() {
1929
2346
  this.currentIndex = 0;
@@ -2013,6 +2430,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2013
2430
  type: Input
2014
2431
  }] } });
2015
2432
 
2433
+ /**
2434
+ * val-prompter
2435
+ *
2436
+ * Displays a prompt/info box with text, actions (buttons/links), and custom styles.
2437
+ *
2438
+ * @example
2439
+ * <val-prompter [props]="{ content: 'Message', buttons: [...], hrefs: [...], color: 'primary', size: 'medium' }"></val-prompter>
2440
+ *
2441
+ * @input props: PrompterMetadata - Configuration for the prompter (content, buttons, hrefs, color, size, etc.)
2442
+ * @output onClick - Emits when an action is clicked
2443
+ */
2016
2444
  class PrompterComponent {
2017
2445
  constructor() {
2018
2446
  this.onClick = new EventEmitter();
@@ -2101,6 +2529,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2101
2529
  type: Output
2102
2530
  }] } });
2103
2531
 
2532
+ /**
2533
+ * val-radio-input
2534
+ *
2535
+ * A radio group input for selecting one option, integrated with Angular forms.
2536
+ *
2537
+ * @example
2538
+ * <val-radio-input [props]="{ control: myControl, options: [{ id: '1', name: 'Option 1' }] }"></val-radio-input>
2539
+ *
2540
+ * @input props: InputMetadata - Configuration for the radio input (form control, options, etc.)
2541
+ */
2104
2542
  class RadioInputComponent {
2105
2543
  constructor() { }
2106
2544
  ngOnInit() { }
@@ -2128,13 +2566,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2128
2566
  type: Input
2129
2567
  }] } });
2130
2568
 
2569
+ /**
2570
+ * Removes diacritical marks (accents) from a string using Unicode normalization.
2571
+ * Useful for text search and comparison.
2572
+ *
2573
+ * @param text The input string
2574
+ * @returns The normalized string without diacritical marks
2575
+ *
2576
+ * @example
2577
+ * replaceSpecialChars('canción') // returns 'cancion'
2578
+ */
2131
2579
  const replaceSpecialChars = (text) => text.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
2132
2580
 
2581
+ /**
2582
+ * val-searchbar
2583
+ *
2584
+ * A search bar component with debounce and event emitters for filtering, focus, and blur.
2585
+ *
2586
+ * @example
2587
+ * <val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()"></val-searchbar>
2588
+ *
2589
+ * @input disabled - Whether the searchbar is disabled.
2590
+ * @output filterEvent - Emits the search term on input.
2591
+ * @output focusEvent - Emits when the searchbar gains focus.
2592
+ * @output blurEvent - Emits when the searchbar loses focus.
2593
+ */
2133
2594
  class SearchbarComponent {
2134
2595
  constructor() {
2596
+ /**
2597
+ * Emits the search term on input.
2598
+ */
2599
+ this.filterEvent = new EventEmitter();
2600
+ /**
2601
+ * Emits when the searchbar gains focus.
2602
+ */
2135
2603
  this.focusEvent = new EventEmitter();
2604
+ /**
2605
+ * Emits when the searchbar loses focus.
2606
+ */
2136
2607
  this.blurEvent = new EventEmitter();
2137
- this.filterEvent = new EventEmitter();
2138
2608
  }
2139
2609
  onSearch($event) {
2140
2610
  const searchTerm = $event.detail.value;
@@ -2147,7 +2617,7 @@ class SearchbarComponent {
2147
2617
  this.blurEvent.emit();
2148
2618
  }
2149
2619
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2150
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchbarComponent, isStandalone: true, selector: "val-searchbar", inputs: { disabled: "disabled" }, outputs: { focusEvent: "focusEvent", blurEvent: "blurEvent", filterEvent: "filterEvent" }, ngImport: i0, template: `
2620
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchbarComponent, isStandalone: true, selector: "val-searchbar", inputs: { disabled: "disabled" }, outputs: { filterEvent: "filterEvent", focusEvent: "focusEvent", blurEvent: "blurEvent" }, ngImport: i0, template: `
2151
2621
  <ion-searchbar
2152
2622
  mode="ios"
2153
2623
  debounce="500"
@@ -2180,14 +2650,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2180
2650
  `, styles: ["ion-searchbar{--cancel-button-color: var(--ion-color-dark);--background: var(--ion-color-light);font-family:var(--ion-default-font),Arial,sans-serif}\n"] }]
2181
2651
  }], ctorParameters: () => [], propDecorators: { disabled: [{
2182
2652
  type: Input
2653
+ }], filterEvent: [{
2654
+ type: Output
2183
2655
  }], focusEvent: [{
2184
2656
  type: Output
2185
2657
  }], blurEvent: [{
2186
2658
  type: Output
2187
- }], filterEvent: [{
2188
- type: Output
2189
2659
  }] } });
2190
2660
 
2661
+ /**
2662
+ * val-select-search
2663
+ *
2664
+ * A searchable select/dropdown input with modal and filtering, integrated with Angular forms.
2665
+ *
2666
+ * @example
2667
+ * <val-select-search [props]="{ control: myControl, label: 'Choose', options: [{ id: '1', name: 'Option 1' }] }"></val-select-search>
2668
+ *
2669
+ * @input props: InputMetadata - Configuration for the select input (form control, label, options, etc.)
2670
+ */
2191
2671
  class SelectSearchComponent {
2192
2672
  constructor() {
2193
2673
  this.label = 'Seleccionar';
@@ -2472,7 +2952,7 @@ class SelectSearchComponent {
2472
2952
  </ion-content>
2473
2953
  </ng-template>
2474
2954
  </ion-modal>
2475
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["disabled"], outputs: ["focusEvent", "blurEvent", "filterEvent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
2955
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["disabled"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
2476
2956
  }
2477
2957
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectSearchComponent, decorators: [{
2478
2958
  type: Component,
@@ -2531,6 +3011,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2531
3011
  type: Input
2532
3012
  }] } });
2533
3013
 
3014
+ /**
3015
+ * val-select-input
3016
+ *
3017
+ * A select/dropdown input integrated with Angular forms, using Ionic's select component.
3018
+ *
3019
+ * @example
3020
+ * <val-select-input [props]="{ control: myControl, label: 'Choose', options: [{ id: '1', name: 'Option 1' }] }"></val-select-input>
3021
+ *
3022
+ * @input props: InputMetadata - Configuration for the select input (form control, label, options, etc.)
3023
+ */
2534
3024
  class SearchSelectorComponent {
2535
3025
  constructor() {
2536
3026
  this.customModalOptions = {
@@ -2580,34 +3070,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2580
3070
  type: Input
2581
3071
  }] } });
2582
3072
 
3073
+ /**
3074
+ * val-text-input
3075
+ *
3076
+ * A text input field integrated with Angular forms.
3077
+ *
3078
+ * @example
3079
+ * <val-text-input [props]="{ control: myControl, placeholder: 'Enter text', ... }"></val-text-input>
3080
+ *
3081
+ * @input props: InputMetadata - Configuration for the input (form control, placeholder, label, etc.)
3082
+ */
2583
3083
  class TextInputComponent {
2584
3084
  constructor() {
2585
3085
  this.states = ComponentStates;
2586
3086
  }
2587
- ngOnInit() {
2588
- }
3087
+ ngOnInit() { }
2589
3088
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2590
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TextInputComponent, isStandalone: true, selector: "val-text-input", inputs: { props: "props" }, ngImport: i0, template: `
2591
- <ion-input
2592
- [formControl]="props.control"
2593
- type="text"
2594
- [placeholder]="props.placeholder"
2595
- />
2596
- `, isInline: true, styles: [".section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
3089
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TextInputComponent, isStandalone: true, selector: "val-text-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="text" [placeholder]="props.placeholder" /> `, isInline: true, styles: [".section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
2597
3090
  }
2598
3091
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, decorators: [{
2599
3092
  type: Component,
2600
- args: [{ selector: 'val-text-input', standalone: true, imports: [ReactiveFormsModule, IonInput], template: `
2601
- <ion-input
2602
- [formControl]="props.control"
2603
- type="text"
2604
- [placeholder]="props.placeholder"
2605
- />
2606
- `, styles: [".section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"] }]
3093
+ args: [{ selector: 'val-text-input', standalone: true, imports: [ReactiveFormsModule, IonInput], template: ` <ion-input [formControl]="props.control" type="text" [placeholder]="props.placeholder" /> `, styles: [".section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"] }]
2607
3094
  }], ctorParameters: () => [], propDecorators: { props: [{
2608
3095
  type: Input
2609
3096
  }] } });
2610
3097
 
3098
+ /**
3099
+ * val-banner
3100
+ *
3101
+ * Displays a banner with title block, actions, and optional close button.
3102
+ *
3103
+ * @example
3104
+ * <val-banner [props]="{ content: {...}, actions: {...}, closable: true, bordered: true, mode: 'center', alignment: 'center', padding: '8px' }" (onClick)="handler($event)" (onClose)="closeHandler()"></val-banner>
3105
+ *
3106
+ * @input props: BannerMetadata - Configuration for the banner (content, actions, closable, bordered, mode, alignment, padding)
3107
+ * @output onClick - Emits when an action is clicked
3108
+ * @output onClose - Emits when the banner is closed
3109
+ */
2611
3110
  class BannerComponent {
2612
3111
  constructor() {
2613
3112
  this.onClick = new EventEmitter();
@@ -2623,7 +3122,12 @@ class BannerComponent {
2623
3122
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2624
3123
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: BannerComponent, isStandalone: true, selector: "val-banner", inputs: { props: "props" }, outputs: { onClick: "onClick", onClose: "onClose" }, ngImport: i0, template: `
2625
3124
  <val-box
2626
- [props]="{ icon: props.closable ? 'close-outline' : '', bordered: props.bordered, color: '', padding: props.padding }"
3125
+ [props]="{
3126
+ icon: props.closable ? 'close-outline' : '',
3127
+ bordered: props.bordered,
3128
+ color: '',
3129
+ padding: props.padding,
3130
+ }"
2627
3131
  (onClick)="closeHandler()"
2628
3132
  >
2629
3133
  <div [ngClass]="['content-container', props.mode, props.alignment]" body>
@@ -2650,7 +3154,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2650
3154
  type: Component,
2651
3155
  args: [{ selector: 'val-banner', standalone: true, imports: [CommonModule, BoxComponent, TitleBlockComponent, ButtonGroupComponent], template: `
2652
3156
  <val-box
2653
- [props]="{ icon: props.closable ? 'close-outline' : '', bordered: props.bordered, color: '', padding: props.padding }"
3157
+ [props]="{
3158
+ icon: props.closable ? 'close-outline' : '',
3159
+ bordered: props.bordered,
3160
+ color: '',
3161
+ padding: props.padding,
3162
+ }"
2654
3163
  (onClick)="closeHandler()"
2655
3164
  >
2656
3165
  <div [ngClass]="['content-container', props.mode, props.alignment]" body>
@@ -2680,38 +3189,72 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2680
3189
  type: Output
2681
3190
  }] } });
2682
3191
 
3192
+ /**
3193
+ * ToolbarComponent
3194
+ *
3195
+ * Componente de barra de herramientas reutilizable para encabezados y pies de página.
3196
+ * Permite acciones, botón de retroceso, menú y personalización de colores y título.
3197
+ *
3198
+ * @example
3199
+ * <val-toolbar [props]="{ title: 'Mi App', withBack: true, actions: [...] }" (onClick)="handleToolbarAction($event)"></val-toolbar>
3200
+ *
3201
+ * @input props {ToolbarMetadata} - Metadatos de la barra de herramientas.
3202
+ * @output onClick - Emite el token de la acción clicada.
3203
+ */
2683
3204
  class ToolbarComponent {
2684
3205
  constructor(navCtrl, icon) {
2685
3206
  this.navCtrl = navCtrl;
3207
+ /**
3208
+ * Evento emitido al hacer click en una acción o botón de la barra.
3209
+ */
2686
3210
  this.onClick = new EventEmitter();
2687
3211
  this.actionTypes = ToolbarActionType;
2688
3212
  addIcons({ chevronBackOutline });
2689
3213
  }
2690
3214
  ngOnInit() { }
3215
+ /**
3216
+ * Emite el token de la acción clicada.
3217
+ * @param token Token de la acción
3218
+ */
3219
+ clickHandler(token) {
3220
+ this.onClick.emit(token);
3221
+ }
3222
+ /**
3223
+ * Navega hacia atrás usando NavController.
3224
+ */
2691
3225
  goBack() {
2692
3226
  this.navCtrl.back();
2693
3227
  }
2694
- rightActions() {
2695
- return this.props.actions.filter(x => x.position === 'right');
2696
- }
2697
- leftActions() {
2698
- return this.props.actions.filter(x => x.position === 'left');
2699
- }
3228
+ /**
3229
+ * Determina si hay acciones a la derecha.
3230
+ */
2700
3231
  someInRight() {
2701
3232
  return !!this.props.actions.find(x => x.position === 'right');
2702
3233
  }
3234
+ /**
3235
+ * Determina si hay acciones a la izquierda.
3236
+ */
2703
3237
  someInLeft() {
2704
3238
  return !!this.props.actions.find(x => x.position === 'left');
2705
3239
  }
2706
- clickHandler(token) {
2707
- this.onClick.emit(token);
3240
+ /**
3241
+ * Devuelve las acciones de la derecha.
3242
+ */
3243
+ rightActions() {
3244
+ return this.props.actions.filter(x => x.position === 'right');
3245
+ }
3246
+ /**
3247
+ * Devuelve las acciones de la izquierda.
3248
+ */
3249
+ leftActions() {
3250
+ return this.props.actions.filter(x => x.position === 'left');
2708
3251
  }
2709
3252
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToolbarComponent, deps: [{ token: i2.NavController }, { token: IconService }], target: i0.ɵɵFactoryTarget.Component }); }
2710
3253
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ToolbarComponent, isStandalone: true, selector: "val-toolbar", inputs: { props: "props" }, outputs: { onClick: "onClick" }, ngImport: i0, template: `
2711
3254
  <ion-toolbar [color]="props.color" [class.background]="props.color === 'background'">
2712
3255
  <ng-container *ngIf="props.withBack">
2713
3256
  <ion-buttons class="left-buttons" slot="start" *ngIf="props.withBack">
2714
- <ion-button fill="clear" (click)="goBack()" [color]="props.textColor">
3257
+ <ion-button fill="clear" (click)="goBack()" [color]="props.textColor" style="margin-left: 8px;">
2715
3258
  <ion-icon name="chevron-back-outline" [slot]="props.backText ? 'start' : 'icon-only'"></ion-icon>
2716
3259
  <ion-text *ngIf="props.backText">{{ props.backText }}</ion-text>
2717
3260
  </ion-button>
@@ -2783,7 +3326,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2783
3326
  <ion-toolbar [color]="props.color" [class.background]="props.color === 'background'">
2784
3327
  <ng-container *ngIf="props.withBack">
2785
3328
  <ion-buttons class="left-buttons" slot="start" *ngIf="props.withBack">
2786
- <ion-button fill="clear" (click)="goBack()" [color]="props.textColor">
3329
+ <ion-button fill="clear" (click)="goBack()" [color]="props.textColor" style="margin-left: 8px;">
2787
3330
  <ion-icon name="chevron-back-outline" [slot]="props.backText ? 'start' : 'icon-only'"></ion-icon>
2788
3331
  <ion-text *ngIf="props.backText">{{ props.backText }}</ion-text>
2789
3332
  </ion-button>
@@ -2843,11 +3386,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2843
3386
  type: Output
2844
3387
  }] } });
2845
3388
 
3389
+ /**
3390
+ * FooterComponent
3391
+ *
3392
+ * Componente de pie de página reutilizable para aplicaciones Ionic/Angular.
3393
+ * Permite mostrar una barra de herramientas (toolbar) y contenido adicional.
3394
+ *
3395
+ * @example
3396
+ * <val-footer [props]="footerProps" (onClick)="handleFooterAction($event)">
3397
+ * <div extra>Contenido extra</div>
3398
+ * </val-footer>
3399
+ *
3400
+ * @input props {FooterMetadata} - Metadatos del pie de página y su toolbar.
3401
+ * @output onClick - Emite el token de la acción clicada en la toolbar.
3402
+ */
2846
3403
  class FooterComponent {
2847
3404
  constructor() {
3405
+ /**
3406
+ * Evento emitido al hacer click en una acción de la toolbar.
3407
+ */
2848
3408
  this.onClick = new EventEmitter();
2849
3409
  }
2850
3410
  ngOnInit() { }
3411
+ /**
3412
+ * Emite el token de la acción clicada en la toolbar.
3413
+ * @param token Token de la acción
3414
+ */
2851
3415
  clickHandler(token) {
2852
3416
  this.onClick.emit(token);
2853
3417
  }
@@ -2974,6 +3538,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2974
3538
  type: Output
2975
3539
  }] } });
2976
3540
 
3541
+ /**
3542
+ * Scrolls smoothly to the top of the element with the given id.
3543
+ * @param id The id of the element to scroll to
3544
+ */
2977
3545
  const goToTop = (id) => {
2978
3546
  const element = document.getElementById(id);
2979
3547
  if (element) {
@@ -2984,6 +3552,12 @@ const goToTop = (id) => {
2984
3552
  });
2985
3553
  }
2986
3554
  };
3555
+ /**
3556
+ * Checks if the bottom of the given ElementRef is within the viewport.
3557
+ * Useful for determining if a form or element is fully visible.
3558
+ * @param elementRef The Angular ElementRef to check
3559
+ * @returns True if the element's bottom is at or above the window's bottom
3560
+ */
2987
3561
  const isAtEnd = (elementRef) => {
2988
3562
  const formElement = elementRef.nativeElement;
2989
3563
  const rect = formElement.getBoundingClientRect();
@@ -3248,11 +3822,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3248
3822
  type: Output
3249
3823
  }] } });
3250
3824
 
3825
+ /**
3826
+ * HeaderComponent
3827
+ *
3828
+ * Componente de encabezado reutilizable para aplicaciones Ionic/Angular.
3829
+ * Permite mostrar una barra de herramientas (toolbar) configurable.
3830
+ *
3831
+ * @example
3832
+ * <val-header [props]="headerProps" (onClick)="handleHeaderAction($event)"></val-header>
3833
+ *
3834
+ * @input props {HeaderMetadata} - Metadatos del encabezado y su toolbar.
3835
+ * @output onClick - Emite el token de la acción clicada en la toolbar.
3836
+ */
3251
3837
  class HeaderComponent {
3252
3838
  constructor() {
3839
+ /**
3840
+ * Evento emitido al hacer click en una acción de la toolbar.
3841
+ */
3253
3842
  this.onClick = new EventEmitter();
3254
3843
  }
3255
3844
  ngOnInit() { }
3845
+ /**
3846
+ * Emite el token de la acción clicada en la toolbar.
3847
+ * @param token Token de la acción
3848
+ */
3256
3849
  clickHandler(token) {
3257
3850
  this.onClick.emit(token);
3258
3851
  }
@@ -3276,20 +3869,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3276
3869
  type: Output
3277
3870
  }] } });
3278
3871
 
3872
+ /**
3873
+ * ItemListComponent
3874
+ *
3875
+ * Componente de lista reutilizable para mostrar una colección de elementos con diferentes modos de visualización (texto, subtítulo, avatar, icono, ruta, acciones).
3876
+ * Permite acciones por elemento, indicadores de no leído, y personalización de estilos.
3877
+ *
3878
+ * @example
3879
+ * <val-item-list [props]="{ title: 'Usuarios', items: [{ text: 'Juan', mode: 'avatar', image: 'avatar.jpg' }] }" (onClick)="handleClick($event)"></val-item-list>
3880
+ *
3881
+ * @input props {ListMetadata} - Metadatos de la lista y sus elementos.
3882
+ * @output onClick - Emite el token del elemento clicado.
3883
+ * @output onActionClick - Emite el token de la acción clicada en un elemento.
3884
+ */
3279
3885
  class ItemListComponent {
3280
3886
  constructor(icon) {
3281
3887
  this.states = ComponentStates;
3282
3888
  this.defaultColor = 'primary';
3889
+ /**
3890
+ * Evento emitido al hacer click en un elemento de la lista.
3891
+ */
3283
3892
  this.onClick = new EventEmitter();
3893
+ /**
3894
+ * Evento emitido al hacer click en una acción de un elemento.
3895
+ */
3284
3896
  this.onActionClick = new EventEmitter();
3285
3897
  }
3286
3898
  ngOnInit() { }
3899
+ /**
3900
+ * Emite el token del elemento clicado.
3901
+ * @param token Token del elemento
3902
+ */
3287
3903
  clickHandler(token) {
3288
3904
  this.onClick.emit(token);
3289
3905
  }
3906
+ /**
3907
+ * Emite el token de la acción clicada.
3908
+ * @param token Token de la acción
3909
+ */
3290
3910
  onActionClickHandler(token) {
3291
3911
  this.onActionClick.emit(token);
3292
3912
  }
3913
+ /**
3914
+ * Devuelve el color de borde de la lista.
3915
+ */
3293
3916
  color() {
3294
3917
  return resolveColor(this.props.color || this.defaultColor);
3295
3918
  }
@@ -3650,11 +4273,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3650
4273
  type: Output
3651
4274
  }] } });
3652
4275
 
4276
+ /**
4277
+ * NoContentComponent
4278
+ *
4279
+ * Componente para mostrar una pantalla de "sin contenido" con imagen y banners opcionales arriba y abajo.
4280
+ * Útil para estados vacíos, errores o mensajes informativos.
4281
+ *
4282
+ * @example
4283
+ * <val-no-content [props]="{ image: { src: 'empty.svg' }, bottomContent: { ... } }"></val-no-content>
4284
+ *
4285
+ * @input props {NoContentMetadata} - Metadatos de la imagen y banners a mostrar.
4286
+ * @output onClick - Emite el token de acción de los banners si corresponde.
4287
+ */
3653
4288
  class NoContentComponent {
3654
4289
  constructor() {
4290
+ /**
4291
+ * Evento emitido al hacer click en un banner.
4292
+ */
3655
4293
  this.onClick = new EventEmitter();
3656
4294
  }
3657
4295
  ngOnInit() { }
4296
+ /**
4297
+ * Emite el token de acción del banner clicado.
4298
+ * @param token Token de la acción
4299
+ */
3658
4300
  onClickHandler(token) {
3659
4301
  this.onClick.emit(token);
3660
4302
  }
@@ -3690,6 +4332,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3690
4332
  type: Output
3691
4333
  }] } });
3692
4334
 
4335
+ /**
4336
+ * Enumera los posibles movimientos de navegación en el wizard.
4337
+ */
3693
4338
  var MOTION;
3694
4339
  (function (MOTION) {
3695
4340
  MOTION[MOTION["BACKWARD"] = 0] = "BACKWARD";
@@ -3797,18 +4442,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3797
4442
  type: Output
3798
4443
  }] } });
3799
4444
 
4445
+ /**
4446
+ * WizardComponent
4447
+ *
4448
+ * Componente para flujos de pasos (wizard) reutilizable, con soporte para estados, errores y navegación entre pasos.
4449
+ * Permite mostrar contenido personalizado por paso y manejar acciones de navegación.
4450
+ *
4451
+ * @example
4452
+ * <val-wizard [props]="wizardProps" (onClick)="handleWizardNav($event)">
4453
+ * <div step>Contenido del paso</div>
4454
+ * </val-wizard>
4455
+ *
4456
+ * @input props {WizardMetadata} - Metadatos del wizard, pasos y estado.
4457
+ * @output onClick - Emite el paso actual y la acción de navegación (MOTION).
4458
+ */
3800
4459
  class WizardComponent {
3801
4460
  constructor() {
4461
+ /**
4462
+ * Evento emitido al hacer click en una acción de navegación.
4463
+ */
3802
4464
  this.onClick = new EventEmitter();
3803
4465
  this.wrapperId = 'wizard-wrapper';
3804
4466
  }
3805
4467
  ngOnInit() { }
4468
+ /**
4469
+ * Cambia el estado del wizard a 'WORKING' y deshabilita los botones del paso actual.
4470
+ */
3806
4471
  working() {
3807
4472
  this.props.state = ComponentStates.WORKING;
3808
4473
  this.Current.buttons.map(x => {
3809
4474
  x.state = ComponentStates.DISABLED;
3810
4475
  });
3811
4476
  }
4477
+ /**
4478
+ * Cambia el estado del wizard a 'ENABLED' y habilita los botones del paso actual.
4479
+ * No realiza cambios si ya está en estado 'ENABLED'.
4480
+ */
3812
4481
  done() {
3813
4482
  if (this.props.state === ComponentStates.ENABLED) {
3814
4483
  return;
@@ -3818,9 +4487,16 @@ class WizardComponent {
3818
4487
  x.state = ComponentStates.ENABLED;
3819
4488
  });
3820
4489
  }
4490
+ /**
4491
+ * Devuelve el paso actual del wizard.
4492
+ */
3821
4493
  get Current() {
3822
4494
  return this.props.steps[this.props.current];
3823
4495
  }
4496
+ /**
4497
+ * Cambia el paso actual del wizard y hace scroll al inicio.
4498
+ * @param newStep Nuevo índice de paso
4499
+ */
3824
4500
  setCurrent(newStep) {
3825
4501
  if (newStep === this.props.current) {
3826
4502
  return;
@@ -3828,6 +4504,10 @@ class WizardComponent {
3828
4504
  this.props.current = newStep;
3829
4505
  goToTop(this.wrapperId);
3830
4506
  }
4507
+ /**
4508
+ * Establece el estado de error y muestra el mensaje de error en el banner inferior.
4509
+ * @param error Mensaje de error a mostrar
4510
+ */
3831
4511
  setError(error) {
3832
4512
  if (this.props.state === ComponentStates.ERROR) {
3833
4513
  return;
@@ -3836,10 +4516,18 @@ class WizardComponent {
3836
4516
  this.props.state = ComponentStates.ERROR;
3837
4517
  goToTop(this.wrapperId);
3838
4518
  }
4519
+ /**
4520
+ * Reinicia el estado de error y vuelve a estado 'ENABLED'.
4521
+ */
3839
4522
  reset() {
3840
4523
  this.props.error.titles.bottomContent.content.bellowTitle.content = '';
3841
4524
  this.done();
3842
4525
  }
4526
+ /**
4527
+ * Maneja el click en el banner de error y emite el evento de navegación.
4528
+ * Si el token contiene 'retry', reinicia el wizard.
4529
+ * @param token Token de la acción clicada
4530
+ */
3843
4531
  clickHandler(token) {
3844
4532
  if (!token) {
3845
4533
  return;
@@ -3922,25 +4610,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3922
4610
  `, styles: [".layout-container{margin:0 auto;padding:0;width:100%;box-sizing:border-box;margin-bottom:1rem;padding-top:.5rem}@media (max-width: 768px){.layout-container{max-width:100%}}@media (min-width: 768px){.layout-container{margin:0 auto;max-width:33.75rem;margin-bottom:1.5rem}}@media (min-width: 1200px){.layout-container{margin:0 auto;max-width:45rem}}\n"] }]
3923
4611
  }] });
3924
4612
 
4613
+ const LANG = 'LANG';
4614
+ const THEME = 'THEME';
4615
+
4616
+ /**
4617
+ * Utility service for interacting with browser localStorage in a type-safe way.
4618
+ * Provides static methods for setting, getting, removing, and clearing items.
4619
+ */
3925
4620
  class LocalStorageService {
4621
+ /**
4622
+ * Stores a value in localStorage under the given reference key.
4623
+ * @param reference The key to store the value under
4624
+ * @param value The value to store
4625
+ */
3926
4626
  static set(reference, value) {
3927
4627
  localStorage.setItem(reference, JSON.stringify(value));
3928
4628
  }
4629
+ /**
4630
+ * Retrieves a value from localStorage by key.
4631
+ * @param reference The key to retrieve
4632
+ * @returns The parsed value
4633
+ */
3929
4634
  static get(reference) {
3930
4635
  const value = localStorage.getItem(reference);
3931
4636
  return JSON.parse(value);
3932
4637
  }
4638
+ /**
4639
+ * Removes an item from localStorage by key.
4640
+ * @param reference The key to remove
4641
+ */
3933
4642
  static remove(reference) {
3934
4643
  localStorage.removeItem(reference);
3935
4644
  }
4645
+ /**
4646
+ * Clears all items from localStorage.
4647
+ */
3936
4648
  static clear() {
3937
4649
  localStorage.clear();
3938
4650
  }
3939
4651
  }
3940
4652
 
3941
- const LANG = 'LANG';
3942
- const THEME = 'THEME';
3943
-
4653
+ /**
4654
+ * Service for managing application themes (light, dark, auto).
4655
+ * Handles user preferences, system theme detection, and theme toggling.
4656
+ * Uses localStorage to persist the selected theme.
4657
+ */
3944
4658
  var ThemeOption;
3945
4659
  (function (ThemeOption) {
3946
4660
  ThemeOption["LIGHT"] = "light";
@@ -3949,12 +4663,33 @@ var ThemeOption;
3949
4663
  })(ThemeOption || (ThemeOption = {}));
3950
4664
  class ThemeService {
3951
4665
  constructor() {
4666
+ /**
4667
+ * Indicates if the light theme is active.
4668
+ */
3952
4669
  this.lightToggle = false;
4670
+ /**
4671
+ * Indicates if the dark theme is active.
4672
+ */
3953
4673
  this.darkToggle = false;
4674
+ /**
4675
+ * Indicates if the auto theme is active.
4676
+ */
3954
4677
  this.autoToggle = false;
4678
+ /**
4679
+ * The current selected theme option.
4680
+ */
3955
4681
  this.currentOption = ThemeOption.AUTO;
4682
+ /**
4683
+ * Enum with all available theme options.
4684
+ */
3956
4685
  this.themeOptions = ThemeOption;
4686
+ /**
4687
+ * Whether the system prefers dark mode.
4688
+ */
3957
4689
  this.prefersDark = false;
4690
+ /**
4691
+ * The default theme option.
4692
+ */
3958
4693
  this.default = ThemeOption.AUTO;
3959
4694
  const current = LocalStorageService.get(THEME);
3960
4695
  console.log('💡 ThemeConfig current::: ', current);
@@ -3989,20 +4724,38 @@ class ThemeService {
3989
4724
  this.toggleTheme(ThemeOption.LIGHT, true);
3990
4725
  this.toggleTheme(ThemeOption.DARK, false);
3991
4726
  }
4727
+ /**
4728
+ * Returns true if the system prefers dark mode.
4729
+ */
3992
4730
  get IsDark() {
3993
4731
  return this.prefersDark;
3994
4732
  }
4733
+ /**
4734
+ * Gets the current theme option.
4735
+ */
3995
4736
  get Theme() {
3996
4737
  return this.theme.value;
3997
4738
  }
4739
+ /**
4740
+ * Sets the current theme option and persists it.
4741
+ */
3998
4742
  set Theme(theme) {
3999
4743
  this.theme.next(theme);
4000
4744
  LocalStorageService.set(THEME, theme);
4001
4745
  }
4746
+ /**
4747
+ * Toggles a theme class on the document body.
4748
+ * @param name The theme name
4749
+ * @param shouldAdd Whether to add or remove the class
4750
+ */
4002
4751
  toggleTheme(name, shouldAdd) {
4003
4752
  console.log('toggleTheme::: ', name, shouldAdd);
4004
4753
  document.body.classList.toggle(name, shouldAdd);
4005
4754
  }
4755
+ /**
4756
+ * Sets the user theme preference and updates toggles and theme classes.
4757
+ * @param option The selected theme option
4758
+ */
4006
4759
  toggleUserPreference(option) {
4007
4760
  this.currentOption = option;
4008
4761
  this.Theme = option;
@@ -4199,10 +4952,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
4199
4952
  args: [ValtechConfigService]
4200
4953
  }] }] });
4201
4954
 
4955
+ /**
4956
+ * Service for displaying toast notifications using Ionic's ToastController.
4957
+ * Provides methods to show and present toasts with custom options.
4958
+ */
4202
4959
  class ToastService {
4203
4960
  constructor(toastController) {
4204
4961
  this.toastController = toastController;
4205
4962
  }
4963
+ /**
4964
+ * Presents a toast notification with the given options.
4965
+ * @param request Toast options (message, duration, position, color, etc.)
4966
+ */
4206
4967
  async presentToast(request) {
4207
4968
  const toast = await this.toastController.create({
4208
4969
  message: request.message,
@@ -4212,12 +4973,16 @@ class ToastService {
4212
4973
  });
4213
4974
  await toast.present();
4214
4975
  }
4976
+ /**
4977
+ * Shows a toast notification and logs the result.
4978
+ * @param request Toast options (message, duration, position, color, etc.)
4979
+ */
4215
4980
  show(request) {
4216
4981
  this.presentToast(request)
4217
4982
  .then(() => {
4218
4983
  console.info('Toast created');
4219
4984
  })
4220
- .catch((error) => {
4985
+ .catch(error => {
4221
4986
  console.error(JSON.stringify(error));
4222
4987
  });
4223
4988
  }