@caribeng/ui 22.1.0 → 22.2.0

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 (253) hide show
  1. package/README.md +52 -12
  2. package/fesm2022/caribeng-ui-accordion.mjs +2 -2
  3. package/fesm2022/caribeng-ui-anchor.mjs +169 -0
  4. package/fesm2022/caribeng-ui-autocomplete.mjs +10 -8
  5. package/fesm2022/caribeng-ui-avatargroup.mjs +9 -3
  6. package/fesm2022/caribeng-ui-blockui.mjs +12 -4
  7. package/fesm2022/caribeng-ui-breadcrumb.mjs +5 -2
  8. package/fesm2022/caribeng-ui-button.mjs +22 -2
  9. package/fesm2022/caribeng-ui-caribe-alert.mjs +5 -2
  10. package/fesm2022/caribeng-ui-caribe-animation-lottie.mjs +6 -3
  11. package/fesm2022/caribeng-ui-caribe-button-group.mjs +6 -3
  12. package/fesm2022/caribeng-ui-caribe-calendar.mjs +11 -6
  13. package/fesm2022/caribeng-ui-caribe-card-content.mjs +6 -3
  14. package/fesm2022/caribeng-ui-caribe-card-move.mjs +29 -7
  15. package/fesm2022/caribeng-ui-caribe-card-select.mjs +56 -14
  16. package/fesm2022/caribeng-ui-caribe-circle-loading.mjs +10 -7
  17. package/fesm2022/caribeng-ui-caribe-coachmark.mjs +42 -19
  18. package/fesm2022/caribeng-ui-caribe-data-table.mjs +15 -9
  19. package/fesm2022/caribeng-ui-caribe-dots-indicator.mjs +38 -5
  20. package/fesm2022/caribeng-ui-caribe-expansion-panel.mjs +16 -5
  21. package/fesm2022/caribeng-ui-caribe-fab-menu.mjs +56 -7
  22. package/fesm2022/caribeng-ui-caribe-file-download.mjs +68 -27
  23. package/fesm2022/caribeng-ui-caribe-file-select.mjs +22 -17
  24. package/fesm2022/caribeng-ui-caribe-float-menu.mjs +6 -3
  25. package/fesm2022/caribeng-ui-caribe-footer.mjs +8 -4
  26. package/fesm2022/caribeng-ui-caribe-header.mjs +6 -3
  27. package/fesm2022/caribeng-ui-caribe-icon-button.mjs +6 -3
  28. package/fesm2022/caribeng-ui-caribe-illustration.mjs +6 -3
  29. package/fesm2022/caribeng-ui-caribe-inline-alert.mjs +5 -2
  30. package/fesm2022/caribeng-ui-caribe-input-search.mjs +14 -10
  31. package/fesm2022/caribeng-ui-caribe-input-select.mjs +12 -10
  32. package/fesm2022/caribeng-ui-caribe-input-token.mjs +61 -11
  33. package/fesm2022/caribeng-ui-caribe-link.mjs +7 -2
  34. package/fesm2022/caribeng-ui-caribe-loader.mjs +8 -5
  35. package/fesm2022/caribeng-ui-caribe-modal.mjs +32 -16
  36. package/fesm2022/caribeng-ui-caribe-off-canvas.mjs +26 -12
  37. package/fesm2022/caribeng-ui-caribe-onboarding.mjs +44 -19
  38. package/fesm2022/caribeng-ui-caribe-pictogram.mjs +6 -3
  39. package/fesm2022/caribeng-ui-caribe-pop-over.mjs +34 -10
  40. package/fesm2022/caribeng-ui-caribe-preloader.mjs +9 -6
  41. package/fesm2022/caribeng-ui-caribe-progress-bar.mjs +5 -2
  42. package/fesm2022/caribeng-ui-caribe-shortcut.mjs +8 -3
  43. package/fesm2022/caribeng-ui-caribe-step-indicator.mjs +12 -5
  44. package/fesm2022/caribeng-ui-caribe-stroke.mjs +6 -3
  45. package/fesm2022/caribeng-ui-caribe-switch.mjs +5 -3
  46. package/fesm2022/caribeng-ui-caribe-tag-button.mjs +1 -1
  47. package/fesm2022/caribeng-ui-caribe-tracker.mjs +5 -2
  48. package/fesm2022/caribeng-ui-caribe-transaction-status.mjs +1 -1
  49. package/fesm2022/caribeng-ui-caribe-voucher.mjs +11 -8
  50. package/fesm2022/caribeng-ui-carousel.mjs +49 -14
  51. package/fesm2022/caribeng-ui-cascadeselect.mjs +22 -8
  52. package/fesm2022/caribeng-ui-chart.mjs +2598 -303
  53. package/fesm2022/caribeng-ui-chip.mjs +9 -4
  54. package/fesm2022/caribeng-ui-chips.mjs +9 -5
  55. package/fesm2022/caribeng-ui-colorpicker.mjs +9 -7
  56. package/fesm2022/caribeng-ui-confirmdialog.mjs +74 -9
  57. package/fesm2022/caribeng-ui-confirmpopup.mjs +134 -9
  58. package/fesm2022/caribeng-ui-contextmenu.mjs +6 -3
  59. package/fesm2022/caribeng-ui-dataview.mjs +211 -6
  60. package/fesm2022/caribeng-ui-datepicker.mjs +1630 -393
  61. package/fesm2022/caribeng-ui-descriptions.mjs +124 -0
  62. package/fesm2022/caribeng-ui-dialog.mjs +10 -7
  63. package/fesm2022/caribeng-ui-dock.mjs +6 -3
  64. package/fesm2022/caribeng-ui-drawer.mjs +10 -7
  65. package/fesm2022/caribeng-ui-dynamicdialog.mjs +210 -6
  66. package/fesm2022/caribeng-ui-editor.mjs +4392 -243
  67. package/fesm2022/caribeng-ui-empty.mjs +80 -0
  68. package/fesm2022/caribeng-ui-file-card.mjs +2 -2
  69. package/fesm2022/caribeng-ui-fileupload.mjs +96 -19
  70. package/fesm2022/caribeng-ui-floatlabel.mjs +4 -2
  71. package/fesm2022/caribeng-ui-folder-card.mjs +10 -3
  72. package/fesm2022/caribeng-ui-galleria.mjs +76 -45
  73. package/fesm2022/caribeng-ui-image.mjs +52 -29
  74. package/fesm2022/caribeng-ui-inplace.mjs +22 -6
  75. package/fesm2022/caribeng-ui-input-number.mjs +9 -7
  76. package/fesm2022/caribeng-ui-inputgroup.mjs +2 -2
  77. package/fesm2022/caribeng-ui-inputmask.mjs +14 -11
  78. package/fesm2022/caribeng-ui-inputotp.mjs +12 -6
  79. package/fesm2022/caribeng-ui-keyfilter.mjs +72 -0
  80. package/fesm2022/caribeng-ui-listbox.mjs +13 -11
  81. package/fesm2022/caribeng-ui-megamenu.mjs +222 -30
  82. package/fesm2022/caribeng-ui-menu.mjs +11 -5
  83. package/fesm2022/caribeng-ui-menubar.mjs +10 -5
  84. package/fesm2022/caribeng-ui-message.mjs +7 -4
  85. package/fesm2022/caribeng-ui-metergroup.mjs +29 -11
  86. package/fesm2022/caribeng-ui-multiselect.mjs +399 -97
  87. package/fesm2022/caribeng-ui-orderlist.mjs +230 -11
  88. package/fesm2022/caribeng-ui-organizationchart.mjs +12 -7
  89. package/fesm2022/caribeng-ui-paginator.mjs +18 -15
  90. package/fesm2022/caribeng-ui-panel.mjs +5 -2
  91. package/fesm2022/caribeng-ui-panelmenu.mjs +6 -3
  92. package/fesm2022/caribeng-ui-password.mjs +8 -6
  93. package/fesm2022/caribeng-ui-pdfviewer.mjs +1553 -0
  94. package/fesm2022/caribeng-ui-picklist.mjs +251 -14
  95. package/fesm2022/caribeng-ui-pricing.mjs +17 -14
  96. package/fesm2022/caribeng-ui-rating.mjs +7 -3
  97. package/fesm2022/caribeng-ui-repeater.mjs +223 -0
  98. package/fesm2022/caribeng-ui-result.mjs +91 -0
  99. package/fesm2022/caribeng-ui-scrollpanel.mjs +6 -3
  100. package/fesm2022/caribeng-ui-scrolltop.mjs +6 -3
  101. package/fesm2022/caribeng-ui-select.mjs +379 -87
  102. package/fesm2022/caribeng-ui-selectbutton.mjs +2 -2
  103. package/fesm2022/caribeng-ui-slider.mjs +171 -75
  104. package/fesm2022/caribeng-ui-speeddial.mjs +7 -4
  105. package/fesm2022/caribeng-ui-spinner.mjs +5 -2
  106. package/fesm2022/caribeng-ui-splitbutton.mjs +163 -0
  107. package/fesm2022/caribeng-ui-splitter.mjs +5 -2
  108. package/fesm2022/caribeng-ui-statistic.mjs +183 -0
  109. package/fesm2022/caribeng-ui-stepper.mjs +8 -5
  110. package/fesm2022/caribeng-ui-steps.mjs +6 -3
  111. package/fesm2022/caribeng-ui-table.mjs +708 -82
  112. package/fesm2022/caribeng-ui-tabmenu.mjs +6 -3
  113. package/fesm2022/caribeng-ui-tag.mjs +2 -2
  114. package/fesm2022/caribeng-ui-terminal.mjs +45 -9
  115. package/fesm2022/caribeng-ui-themetoggle.mjs +82 -0
  116. package/fesm2022/caribeng-ui-tieredmenu.mjs +9 -6
  117. package/fesm2022/caribeng-ui-timeline.mjs +175 -6
  118. package/fesm2022/caribeng-ui-toast.mjs +7 -4
  119. package/fesm2022/caribeng-ui-togglebutton.mjs +8 -6
  120. package/fesm2022/caribeng-ui-toolbar.mjs +6 -3
  121. package/fesm2022/caribeng-ui-tree.mjs +302 -6
  122. package/fesm2022/caribeng-ui-treeselect.mjs +26 -10
  123. package/fesm2022/caribeng-ui-treetable.mjs +269 -6
  124. package/fesm2022/caribeng-ui-virtualscroller.mjs +123 -10
  125. package/fesm2022/caribeng-ui.mjs +829 -6
  126. package/package.json +70 -11
  127. package/schematics/collection.json +10 -0
  128. package/schematics/ng-add/index.js +125 -0
  129. package/schematics/ng-add/schema.js +2 -0
  130. package/schematics/ng-add/schema.json +66 -0
  131. package/styles/caribeng.css +380 -0
  132. package/styles/scss/_mixins.scss +46 -0
  133. package/styles/scss/_overlay.scss +15 -0
  134. package/styles/scss/_tokens.scss +267 -0
  135. package/styles/scss/_utilities.scss +73 -0
  136. package/styles/scss/_variables.scss +33 -0
  137. package/styles/scss/index.scss +16 -0
  138. package/types/caribeng-ui-anchor.d.ts +50 -0
  139. package/types/caribeng-ui-autocomplete.d.ts +4 -2
  140. package/types/caribeng-ui-avatargroup.d.ts +3 -1
  141. package/types/caribeng-ui-blockui.d.ts +9 -4
  142. package/types/caribeng-ui-breadcrumb.d.ts +3 -0
  143. package/types/caribeng-ui-button.d.ts +9 -1
  144. package/types/caribeng-ui-caribe-alert.d.ts +3 -0
  145. package/types/caribeng-ui-caribe-animation-lottie.d.ts +4 -1
  146. package/types/caribeng-ui-caribe-button-group.d.ts +4 -1
  147. package/types/caribeng-ui-caribe-calendar.d.ts +5 -1
  148. package/types/caribeng-ui-caribe-card-content.d.ts +4 -1
  149. package/types/caribeng-ui-caribe-card-move.d.ts +13 -13
  150. package/types/caribeng-ui-caribe-card-select.d.ts +10 -1
  151. package/types/caribeng-ui-caribe-circle-loading.d.ts +4 -1
  152. package/types/caribeng-ui-caribe-coachmark.d.ts +6 -0
  153. package/types/caribeng-ui-caribe-data-table.d.ts +7 -2
  154. package/types/caribeng-ui-caribe-dots-indicator.d.ts +9 -0
  155. package/types/caribeng-ui-caribe-expansion-panel.d.ts +7 -10
  156. package/types/caribeng-ui-caribe-fab-menu.d.ts +10 -1
  157. package/types/caribeng-ui-caribe-file-download.d.ts +8 -10
  158. package/types/caribeng-ui-caribe-file-select.d.ts +7 -1
  159. package/types/caribeng-ui-caribe-float-menu.d.ts +4 -1
  160. package/types/caribeng-ui-caribe-header.d.ts +3 -0
  161. package/types/caribeng-ui-caribe-icon-button.d.ts +4 -1
  162. package/types/caribeng-ui-caribe-illustration.d.ts +4 -1
  163. package/types/caribeng-ui-caribe-inline-alert.d.ts +3 -0
  164. package/types/caribeng-ui-caribe-input-search.d.ts +4 -2
  165. package/types/caribeng-ui-caribe-input-select.d.ts +4 -2
  166. package/types/caribeng-ui-caribe-input-token.d.ts +16 -1
  167. package/types/caribeng-ui-caribe-link.d.ts +3 -0
  168. package/types/caribeng-ui-caribe-loader.d.ts +4 -1
  169. package/types/caribeng-ui-caribe-modal.d.ts +7 -10
  170. package/types/caribeng-ui-caribe-off-canvas.d.ts +6 -1
  171. package/types/caribeng-ui-caribe-onboarding.d.ts +6 -0
  172. package/types/caribeng-ui-caribe-pictogram.d.ts +4 -1
  173. package/types/caribeng-ui-caribe-pop-over.d.ts +7 -10
  174. package/types/caribeng-ui-caribe-preloader.d.ts +4 -1
  175. package/types/caribeng-ui-caribe-progress-bar.d.ts +3 -0
  176. package/types/caribeng-ui-caribe-shortcut.d.ts +3 -1
  177. package/types/caribeng-ui-caribe-step-indicator.d.ts +6 -0
  178. package/types/caribeng-ui-caribe-stroke.d.ts +4 -1
  179. package/types/caribeng-ui-caribe-switch.d.ts +3 -1
  180. package/types/caribeng-ui-caribe-tracker.d.ts +3 -0
  181. package/types/caribeng-ui-caribe-voucher.d.ts +5 -2
  182. package/types/caribeng-ui-carousel.d.ts +10 -1
  183. package/types/caribeng-ui-cascadeselect.d.ts +7 -2
  184. package/types/caribeng-ui-chart.d.ts +469 -44
  185. package/types/caribeng-ui-chip.d.ts +6 -0
  186. package/types/caribeng-ui-chips.d.ts +6 -2
  187. package/types/caribeng-ui-colorpicker.d.ts +3 -1
  188. package/types/caribeng-ui-confirmdialog.d.ts +25 -6
  189. package/types/caribeng-ui-confirmpopup.d.ts +37 -5
  190. package/types/caribeng-ui-contextmenu.d.ts +4 -1
  191. package/types/caribeng-ui-dataview.d.ts +63 -5
  192. package/types/caribeng-ui-datepicker.d.ts +186 -21
  193. package/types/caribeng-ui-descriptions.d.ts +63 -0
  194. package/types/caribeng-ui-dialog.d.ts +4 -1
  195. package/types/caribeng-ui-dock.d.ts +4 -1
  196. package/types/caribeng-ui-drawer.d.ts +4 -1
  197. package/types/caribeng-ui-dynamicdialog.d.ts +93 -3
  198. package/types/caribeng-ui-editor.d.ts +486 -13
  199. package/types/caribeng-ui-empty.d.ts +34 -0
  200. package/types/caribeng-ui-file-card.d.ts +1 -1
  201. package/types/caribeng-ui-fileupload.d.ts +27 -4
  202. package/types/caribeng-ui-folder-card.d.ts +4 -1
  203. package/types/caribeng-ui-galleria.d.ts +9 -0
  204. package/types/caribeng-ui-image.d.ts +10 -0
  205. package/types/caribeng-ui-inplace.d.ts +8 -0
  206. package/types/caribeng-ui-input-number.d.ts +3 -1
  207. package/types/caribeng-ui-inputmask.d.ts +5 -0
  208. package/types/caribeng-ui-inputotp.d.ts +7 -2
  209. package/types/caribeng-ui-keyfilter.d.ts +30 -0
  210. package/types/caribeng-ui-listbox.d.ts +5 -3
  211. package/types/caribeng-ui-megamenu.d.ts +26 -2
  212. package/types/caribeng-ui-menu.d.ts +7 -2
  213. package/types/caribeng-ui-menubar.d.ts +5 -1
  214. package/types/caribeng-ui-message.d.ts +3 -0
  215. package/types/caribeng-ui-metergroup.d.ts +9 -1
  216. package/types/caribeng-ui-multiselect.d.ts +71 -10
  217. package/types/caribeng-ui-orderlist.d.ts +58 -6
  218. package/types/caribeng-ui-organizationchart.d.ts +7 -1
  219. package/types/caribeng-ui-paginator.d.ts +3 -0
  220. package/types/caribeng-ui-panel.d.ts +3 -0
  221. package/types/caribeng-ui-panelmenu.d.ts +4 -1
  222. package/types/caribeng-ui-password.d.ts +4 -2
  223. package/types/caribeng-ui-pdfviewer.d.ts +258 -0
  224. package/types/caribeng-ui-picklist.d.ts +67 -7
  225. package/types/caribeng-ui-pricing.d.ts +8 -5
  226. package/types/caribeng-ui-rating.d.ts +6 -2
  227. package/types/caribeng-ui-repeater.d.ts +79 -0
  228. package/types/caribeng-ui-result.d.ts +35 -0
  229. package/types/caribeng-ui-scrollpanel.d.ts +4 -1
  230. package/types/caribeng-ui-scrolltop.d.ts +4 -1
  231. package/types/caribeng-ui-select.d.ts +73 -9
  232. package/types/caribeng-ui-slider.d.ts +63 -10
  233. package/types/caribeng-ui-speeddial.d.ts +5 -2
  234. package/types/caribeng-ui-spinner.d.ts +3 -0
  235. package/types/caribeng-ui-splitbutton.d.ts +49 -0
  236. package/types/caribeng-ui-splitter.d.ts +3 -0
  237. package/types/caribeng-ui-statistic.d.ts +65 -0
  238. package/types/caribeng-ui-stepper.d.ts +3 -0
  239. package/types/caribeng-ui-steps.d.ts +4 -1
  240. package/types/caribeng-ui-table.d.ts +184 -16
  241. package/types/caribeng-ui-tabmenu.d.ts +4 -1
  242. package/types/caribeng-ui-terminal.d.ts +10 -0
  243. package/types/caribeng-ui-themetoggle.d.ts +32 -0
  244. package/types/caribeng-ui-tieredmenu.d.ts +5 -2
  245. package/types/caribeng-ui-timeline.d.ts +63 -4
  246. package/types/caribeng-ui-toast.d.ts +3 -0
  247. package/types/caribeng-ui-togglebutton.d.ts +5 -3
  248. package/types/caribeng-ui-toolbar.d.ts +7 -4
  249. package/types/caribeng-ui-tree.d.ts +76 -4
  250. package/types/caribeng-ui-treeselect.d.ts +10 -2
  251. package/types/caribeng-ui-treetable.d.ts +68 -4
  252. package/types/caribeng-ui-virtualscroller.d.ts +45 -5
  253. package/types/caribeng-ui.d.ts +501 -12
package/README.md CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## ✨ Características
17
17
 
18
- - **142 componentes y directivas** standalone, cada uno en su propio entry point (`@caribeng/ui/button`, `@caribeng/ui/table`…): solo empaquetas lo que importas.
18
+ - **152 componentes y directivas** standalone, cada uno en su propio entry point (`@caribeng/ui/button`, `@caribeng/ui/table`…): solo empaquetas lo que importas.
19
19
  - **Angular moderno:** `input()` / `model()` / `output()` con Signals, `ChangeDetectionStrategy.OnPush` y compatible con apps zoneless.
20
20
  - **Formularios sin fricción:** `ControlValueAccessor` en todos los controles; el error y el indicador de obligatorio se sincronizan solos con Angular Forms.
21
21
  - **Accesibles:** roles y atributos ARIA, soporte de teclado y gestión de foco (WCAG 2.2 AA).
@@ -39,24 +39,42 @@ Navegadores: los mismos que [soporta Angular](https://angular.dev/reference/vers
39
39
  ### Requisitos
40
40
 
41
41
  - Un proyecto **Angular 22** con `@angular/forms` (lo incluye cualquier proyecto creado con `ng new`).
42
- - **`@angular/cdk` 22**, que CaribeNG usa para overlays y accesibilidad.
42
+ - `@angular/cdk` se instala automáticamente como dependencia (overlays y accesibilidad).
43
43
  - npm, yarn o pnpm.
44
44
 
45
- ### Descarga
45
+ ### Instalación rápida (recomendada)
46
+
47
+ ```bash
48
+ ng add @caribeng/ui
49
+ ```
50
+
51
+ Pregunta el idioma, el tema y el color primario, y deja el proyecto listo:
52
+
53
+ - instala `@caribeng/ui` (y `@angular/cdk`),
54
+ - registra `provideCaribeNG({ locale, theme, preset })` en `app.config.ts` (o en `AppModule`),
55
+ - añade `@caribeng/ui/styles.css` a los estilos de `angular.json`.
56
+
57
+ Se puede ejecutar sin preguntas: `ng add @caribeng/ui --locale=en --theme=system --preset=ocean --skip-confirmation`. Volver a ejecutarlo no duplica nada.
58
+
59
+ Después, salta al paso [3. Verifica la instalación](#3-verifica-la-instalación).
60
+
61
+ ### Instalación manual
46
62
 
47
63
  ```bash
48
64
  # npm
49
- npm install @caribeng/ui @angular/cdk
65
+ npm install @caribeng/ui
50
66
 
51
67
  # yarn
52
- yarn add @caribeng/ui @angular/cdk
68
+ yarn add @caribeng/ui
53
69
 
54
70
  # pnpm
55
- pnpm add @caribeng/ui @angular/cdk
71
+ pnpm add @caribeng/ui
56
72
  ```
57
73
 
58
74
  ## 🔨 Uso
59
75
 
76
+ > Con `ng add @caribeng/ui` los pasos 1 y 2 ya están hechos.
77
+
60
78
  ### 1. Proveedor
61
79
 
62
80
  Añade `provideCaribeNG()` a los providers de tu `app.config.ts`. Todas las opciones son opcionales:
@@ -131,6 +149,28 @@ Todos los controles funcionan con Reactive Forms y con formularios por plantilla
131
149
  <cb-input label="Correo" formControlName="email" error="Ingresa un correo válido" />
132
150
  ```
133
151
 
152
+ ## 🌐 Idioma (i18n)
153
+
154
+ Los textos de interfaz de los componentes (etiquetas accesibles, botones, placeholders y mensajes) vienen en **español** (por defecto) e **inglés**:
155
+
156
+ ```ts
157
+ provideCaribeNG({
158
+ locale: 'en', // 'es' | 'en' | objeto CbTranslation propio
159
+ translation: { noResults: 'Nothing here yet' }, // sobrescribe textos sueltos
160
+ });
161
+ ```
162
+
163
+ Cambio en caliente, sin recargar:
164
+
165
+ ```ts
166
+ import { inject } from '@angular/core';
167
+ import { CbLocaleService } from '@caribeng/ui';
168
+
169
+ inject(CbLocaleService).use('en');
170
+ ```
171
+
172
+ Un texto pasado por input (por ejemplo `placeholder` o `emptyMessage`) siempre tiene prioridad sobre el idioma.
173
+
134
174
  ## 🎨 Tema claro/oscuro y presets
135
175
 
136
176
  ```ts
@@ -169,15 +209,15 @@ providers: [provideCbIcons({ 'heart-pulse': heartPulse, rocket })];
169
209
 
170
210
  ## 📚 Catálogo
171
211
 
172
- - **Form:** `autocomplete`, `button`, `cascadeselect`, `checkbox`, `chips`, `colorpicker`, `datepicker`, `editor`, `fileupload`, `floatlabel`, `iconfield`, `input`, `input-number`, `inputgroup`, `inputmask`, `inputotp`, `knob`, `listbox`, `multiselect`, `password`, `radio`, `rating`, `select`, `selectbutton`, `slider`, `textarea`, `toggle`, `togglebutton`, `treeselect`.
173
- - **Data:** `dataview`, `orderlist`, `organizationchart`, `paginator`, `picklist`, `table`, `timeline`, `tree`, `treetable`, `virtualscroller`.
212
+ - **Form:** `autocomplete`, `button`, `cascadeselect`, `checkbox`, `chips`, `colorpicker`, `datepicker`, `editor`, `fileupload`, `floatlabel`, `iconfield`, `input`, `input-number`, `inputgroup`, `inputmask`, `inputotp`, `keyfilter`, `knob`, `listbox`, `multiselect`, `password`, `radio`, `rating`, `repeater`, `select`, `selectbutton`, `slider`, `textarea`, `toggle`, `togglebutton`, `treeselect`.
213
+ - **Data:** `dataview`, `descriptions`, `orderlist`, `organizationchart`, `paginator`, `picklist`, `statistic`, `table`, `timeline`, `tree`, `treetable`, `virtualscroller`.
174
214
  - **Overlay:** `confirmdialog`, `confirmpopup`, `dialog`, `drawer`, `dynamicdialog`, `popover`, `tooltip`.
175
- - **Messages:** `badge`, `chip`, `inlinemessage`, `message`, `tag`, `toast`.
176
- - **Menu:** `breadcrumb`, `contextmenu`, `dock`, `megamenu`, `menu`, `menubar`, `panelmenu`, `speeddial`, `steps`, `tabmenu`, `tieredmenu`.
215
+ - **Messages:** `badge`, `chip`, `empty`, `inlinemessage`, `message`, `result`, `tag`, `toast`.
216
+ - **Menu:** `anchor`, `breadcrumb`, `contextmenu`, `dock`, `megamenu`, `menu`, `menubar`, `panelmenu`, `speeddial`, `splitbutton`, `steps`, `tabmenu`, `tieredmenu`.
177
217
  - **Panel:** `accordion`, `card`, `divider`, `fieldset`, `panel`, `scrollpanel`, `scrolltop`, `splitter`, `stepper`, `tabs`, `toolbar`.
178
- - **Media:** `avatar`, `avatargroup`, `carousel`, `galleria`, `image`.
218
+ - **Media:** `avatar`, `avatargroup`, `carousel`, `galleria`, `image`, `pdfviewer`.
179
219
  - **Archivos y precios:** `file-card`, `folder-card`, `pricing`.
180
- - **Misc y directivas:** `animateonscroll`, `autofocus`, `blockui`, `chart`, `focustrap`, `icon`, `icons`, `inplace`, `metergroup`, `progressbar`, `ripple`, `skeleton`, `spinner`, `styleclass`, `terminal`.
220
+ - **Misc y directivas:** `animateonscroll`, `autofocus`, `blockui`, `chart`, `focustrap`, `icon`, `icons`, `inplace`, `metergroup`, `progressbar`, `ripple`, `skeleton`, `spinner`, `styleclass`, `terminal`, `themetoggle`.
181
221
  - **Caribe Design (`@caribeng/ui/caribe/*`):** `alert`, `animation-lottie`, `button-group`, `calendar`, `card-content`, `card-move`, `card-primary`, `card-select`, `circle-loading`, `coachmark`, `data-table`, `dots-indicator`, `expansion-panel`, `fab-menu`, `file-download`, `file-select`, `float-menu`, `footer`, `header`, `icon-button`, `illustration`, `inline-alert`, `input-date`, `input-search`, `input-select`, `input-token`, `link`, `loader`, `logo`, `modal`, `off-canvas`, `onboarding`, `pictogram`, `pop-over`, `preloader`, `progress-bar`, `shortcut`, `status`, `step-indicator`, `stroke`, `switch`, `tag-button`, `tracker`, `transaction-status`, `voucher`.
182
222
 
183
223
  ## 🧭 Próximos pasos
@@ -85,7 +85,7 @@ class CbAccordionPanel {
85
85
  <div class="cb-accordion__inner"><ng-content /></div>
86
86
  </div>
87
87
  }
88
- `, isInline: true, styles: [":host{display:block;color:var(--cb-color-text);font-family:var(--cb-font-sans)}:host+:host{border-top:var(--cb-border-width) solid var(--cb-color-border)}.cb-accordion__heading{margin:0}.cb-accordion__header{display:flex;align-items:center;justify-content:space-between;gap:var(--cb-space-3);width:100%;padding:var(--cb-space-3) var(--cb-space-4);border:none;background:transparent;color:inherit;font:inherit;font-weight:var(--cb-font-weight-medium);text-align:left;cursor:pointer;transition:background var(--cb-duration-fast) var(--cb-ease)}.cb-accordion__header:hover{background-color:var(--cb-color-surface-50)}.cb-accordion__header:focus-visible{outline:2px solid var(--cb-color-focus-ring);outline-offset:-2px}.cb-accordion__header:disabled{opacity:var(--cb-opacity-disabled, .55);cursor:default}:host(.cb-is-open) .cb-accordion__header{background-color:var(--cb-color-surface-50)}.cb-accordion__chevron{flex:none;color:var(--cb-color-text-muted);transition:transform var(--cb-duration-fast) var(--cb-ease)}.cb-accordion__chevron.cb-is-open{transform:rotate(180deg)}.cb-accordion__content{overflow:hidden}.cb-accordion__inner{padding:0 var(--cb-space-4) var(--cb-space-4);color:var(--cb-color-text-muted);font-size:var(--cb-text-sm);line-height:var(--cb-line-height-normal)}:host-context([data-theme=\"dark\"]) .cb-accordion__header:hover,:host-context([data-theme=\"dark\"]):host(.cb-is-open) .cb-accordion__header{background-color:var(--cb-color-surface-100)}\n"], dependencies: [{ kind: "component", type: CbIcon, selector: "cb-icon", inputs: ["name", "size", "spin", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
88
+ `, isInline: true, styles: [":host{display:block;color:var(--cb-color-text);font-family:var(--cb-font-sans)}:host+:host{border-top:var(--cb-border-width) solid var(--cb-color-border)}.cb-accordion__heading{margin:0}.cb-accordion__header{display:flex;align-items:center;justify-content:space-between;gap:var(--cb-space-3);width:100%;padding:var(--cb-space-3) var(--cb-space-4);border:none;background:transparent;color:inherit;font:inherit;font-weight:var(--cb-font-weight-medium);text-align:left;cursor:pointer;transition:background var(--cb-duration-fast) var(--cb-ease)}.cb-accordion__header:hover{background-color:var(--cb-color-surface-subtle)}.cb-accordion__header:focus-visible{outline:2px solid var(--cb-color-focus-ring);outline-offset:-2px}.cb-accordion__header:disabled{opacity:var(--cb-opacity-disabled, .55);cursor:default}:host(.cb-is-open) .cb-accordion__header{background-color:var(--cb-color-surface-subtle)}.cb-accordion__chevron{flex:none;color:var(--cb-color-text-muted);transition:transform var(--cb-duration-fast) var(--cb-ease)}.cb-accordion__chevron.cb-is-open{transform:rotate(180deg)}.cb-accordion__content{overflow:hidden}.cb-accordion__inner{padding:0 var(--cb-space-4) var(--cb-space-4);color:var(--cb-color-text-muted);font-size:var(--cb-text-sm);line-height:var(--cb-line-height-normal)}\n"], dependencies: [{ kind: "component", type: CbIcon, selector: "cb-icon", inputs: ["name", "size", "spin", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
89
89
  }
90
90
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CbAccordionPanel, decorators: [{
91
91
  type: Component,
@@ -118,7 +118,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
118
118
  <div class="cb-accordion__inner"><ng-content /></div>
119
119
  </div>
120
120
  }
121
- `, styles: [":host{display:block;color:var(--cb-color-text);font-family:var(--cb-font-sans)}:host+:host{border-top:var(--cb-border-width) solid var(--cb-color-border)}.cb-accordion__heading{margin:0}.cb-accordion__header{display:flex;align-items:center;justify-content:space-between;gap:var(--cb-space-3);width:100%;padding:var(--cb-space-3) var(--cb-space-4);border:none;background:transparent;color:inherit;font:inherit;font-weight:var(--cb-font-weight-medium);text-align:left;cursor:pointer;transition:background var(--cb-duration-fast) var(--cb-ease)}.cb-accordion__header:hover{background-color:var(--cb-color-surface-50)}.cb-accordion__header:focus-visible{outline:2px solid var(--cb-color-focus-ring);outline-offset:-2px}.cb-accordion__header:disabled{opacity:var(--cb-opacity-disabled, .55);cursor:default}:host(.cb-is-open) .cb-accordion__header{background-color:var(--cb-color-surface-50)}.cb-accordion__chevron{flex:none;color:var(--cb-color-text-muted);transition:transform var(--cb-duration-fast) var(--cb-ease)}.cb-accordion__chevron.cb-is-open{transform:rotate(180deg)}.cb-accordion__content{overflow:hidden}.cb-accordion__inner{padding:0 var(--cb-space-4) var(--cb-space-4);color:var(--cb-color-text-muted);font-size:var(--cb-text-sm);line-height:var(--cb-line-height-normal)}:host-context([data-theme=\"dark\"]) .cb-accordion__header:hover,:host-context([data-theme=\"dark\"]):host(.cb-is-open) .cb-accordion__header{background-color:var(--cb-color-surface-100)}\n"] }]
121
+ `, styles: [":host{display:block;color:var(--cb-color-text);font-family:var(--cb-font-sans)}:host+:host{border-top:var(--cb-border-width) solid var(--cb-color-border)}.cb-accordion__heading{margin:0}.cb-accordion__header{display:flex;align-items:center;justify-content:space-between;gap:var(--cb-space-3);width:100%;padding:var(--cb-space-3) var(--cb-space-4);border:none;background:transparent;color:inherit;font:inherit;font-weight:var(--cb-font-weight-medium);text-align:left;cursor:pointer;transition:background var(--cb-duration-fast) var(--cb-ease)}.cb-accordion__header:hover{background-color:var(--cb-color-surface-subtle)}.cb-accordion__header:focus-visible{outline:2px solid var(--cb-color-focus-ring);outline-offset:-2px}.cb-accordion__header:disabled{opacity:var(--cb-opacity-disabled, .55);cursor:default}:host(.cb-is-open) .cb-accordion__header{background-color:var(--cb-color-surface-subtle)}.cb-accordion__chevron{flex:none;color:var(--cb-color-text-muted);transition:transform var(--cb-duration-fast) var(--cb-ease)}.cb-accordion__chevron.cb-is-open{transform:rotate(180deg)}.cb-accordion__content{overflow:hidden}.cb-accordion__inner{padding:0 var(--cb-space-4) var(--cb-space-4);color:var(--cb-color-text-muted);font-size:var(--cb-text-sm);line-height:var(--cb-line-height-normal)}\n"] }]
122
122
  }], propDecorators: { header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
123
123
  function toBoolean(value) {
124
124
  return value !== false && value != null && `${value}` !== 'false';
@@ -0,0 +1,169 @@
1
+ import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, input, output, signal, afterNextRender, DestroyRef, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
4
+ import { injectCbTranslation } from '@caribeng/ui';
5
+
6
+ /**
7
+ * Anchor de CaribeNG: índice de la página ("En esta página") que resalta la
8
+ * sección visible (`aria-current="location"`) y, al hacer clic, desplaza hasta
9
+ * ella teniendo en cuenta una cabecera fija (`offset`) y le pasa el foco.
10
+ *
11
+ * @example
12
+ * ```html
13
+ * <cb-anchor [offset]="64" [links]="[
14
+ * { label: 'Resumen', href: '#resumen' },
15
+ * { label: 'Movimientos', href: '#movimientos', children: [{ label: 'Pendientes', href: '#pendientes' }] },
16
+ * ]" />
17
+ * ```
18
+ */
19
+ class CbAnchor {
20
+ constructor() {
21
+ /** Textos de interfaz en el idioma activo (`provideCaribeNG({ locale })`). */
22
+ this.t = injectCbTranslation();
23
+ this.document = inject(DOCUMENT);
24
+ this.links = input([], /* @ts-ignore */
25
+ ...(ngDevMode ? [{ debugName: "links" }] : /* istanbul ignore next */ []));
26
+ /** Alto (px) de la cabecera fija que tapa la parte superior de la página. */
27
+ this.offset = input(0, /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "offset" }] : /* istanbul ignore next */ []));
29
+ /** Nombre de la navegación. Por defecto, "En esta página" del idioma activo. */
30
+ this.ariaLabel = input(undefined, /* @ts-ignore */
31
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
32
+ /** Se emite al cambiar la sección visible (su `href`). */
33
+ this.activeChange = output();
34
+ this.active = signal(null, /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
36
+ this.frame = 0;
37
+ this.onScroll = () => {
38
+ const win = this.document.defaultView;
39
+ if (!win || this.frame)
40
+ return;
41
+ this.frame = win.requestAnimationFrame(() => {
42
+ this.frame = 0;
43
+ this.update();
44
+ });
45
+ };
46
+ const win = this.document.defaultView;
47
+ afterNextRender(() => {
48
+ this.update();
49
+ win?.addEventListener('scroll', this.onScroll, { passive: true });
50
+ win?.addEventListener('resize', this.onScroll, { passive: true });
51
+ });
52
+ inject(DestroyRef).onDestroy(() => {
53
+ win?.removeEventListener('scroll', this.onScroll);
54
+ win?.removeEventListener('resize', this.onScroll);
55
+ if (this.frame)
56
+ win?.cancelAnimationFrame(this.frame);
57
+ });
58
+ }
59
+ /** Sección activa: la última cuyo inicio ya pasó la línea de la cabecera fija. */
60
+ update() {
61
+ const line = this.offset() + 8;
62
+ let current = null;
63
+ for (const href of this.flatHrefs()) {
64
+ const target = this.target(href);
65
+ if (target && target.getBoundingClientRect().top <= line)
66
+ current = href;
67
+ }
68
+ current ??= this.flatHrefs()[0] ?? null;
69
+ if (current !== this.active()) {
70
+ this.active.set(current);
71
+ this.activeChange.emit(current);
72
+ }
73
+ }
74
+ /** Desplaza hasta la sección, deja el foco en ella y actualiza la URL. */
75
+ go(event, link) {
76
+ const target = this.target(link.href);
77
+ const win = this.document.defaultView;
78
+ if (!target || !win)
79
+ return;
80
+ event.preventDefault();
81
+ const reduce = win.matchMedia?.('(prefers-reduced-motion: reduce)').matches;
82
+ const top = target.getBoundingClientRect().top + win.scrollY - this.offset();
83
+ win.scrollTo({ top, behavior: reduce ? 'auto' : 'smooth' });
84
+ if (!target.hasAttribute('tabindex'))
85
+ target.setAttribute('tabindex', '-1');
86
+ target.focus({ preventScroll: true });
87
+ win.history?.replaceState?.(null, '', link.href);
88
+ this.active.set(link.href);
89
+ this.activeChange.emit(link.href);
90
+ }
91
+ flatHrefs() {
92
+ const out = [];
93
+ const walk = (links) => links.forEach((l) => {
94
+ out.push(l.href);
95
+ if (l.children)
96
+ walk(l.children);
97
+ });
98
+ walk(this.links());
99
+ return out;
100
+ }
101
+ target(href) {
102
+ const id = href.startsWith('#') ? decodeURIComponent(href.slice(1)) : '';
103
+ return id ? this.document.getElementById(id) : null;
104
+ }
105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CbAnchor, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
106
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: CbAnchor, isStandalone: true, selector: "cb-anchor", inputs: { links: { classPropertyName: "links", publicName: "links", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeChange: "activeChange" }, host: { classAttribute: "cb-anchor" }, ngImport: i0, template: `
107
+ <nav class="cb-anchor__nav" [attr.aria-label]="ariaLabel() ?? t().onThisPage">
108
+ <ng-template #list let-links let-level="level">
109
+ <ul class="cb-anchor__list" [class.cb-anchor__list--nested]="level > 0">
110
+ @for (link of links; track link.href) {
111
+ <li>
112
+ <a
113
+ class="cb-anchor__link"
114
+ [class.cb-is-active]="active() === link.href"
115
+ [href]="link.href"
116
+ [attr.aria-current]="active() === link.href ? 'location' : null"
117
+ (click)="go($event, link)"
118
+ >
119
+ {{ link.label }}
120
+ </a>
121
+ @if (link.children?.length) {
122
+ <ng-container *ngTemplateOutlet="list; context: { $implicit: link.children, level: level + 1 }" />
123
+ }
124
+ </li>
125
+ }
126
+ </ul>
127
+ </ng-template>
128
+ <ng-container *ngTemplateOutlet="list; context: { $implicit: links(), level: 0 }" />
129
+ </nav>
130
+ `, isInline: true, styles: [":host{display:block;font-family:var(--cb-font-sans, inherit)}.cb-anchor__list{margin:0;padding:0;list-style:none;border-left:2px solid var(--cb-color-border)}.cb-anchor__list--nested{border-left:0}.cb-anchor__link{display:block;margin-left:-2px;padding:.3rem .75rem;font-size:var(--cb-text-sm, .875rem);color:var(--cb-color-text-muted);text-decoration:none;border-left:2px solid transparent;transition:color var(--cb-duration-fast, .12s) ease,border-color var(--cb-duration-fast, .12s) ease}.cb-anchor__list--nested .cb-anchor__link{padding-left:1.5rem}.cb-anchor__link:hover{color:var(--cb-color-text)}.cb-anchor__link.cb-is-active{font-weight:var(--cb-font-weight-medium, 500);color:var(--cb-color-primary-600, #059669);border-left-color:var(--cb-color-primary-500)}.cb-anchor__link:focus-visible{outline:2px solid var(--cb-color-focus-ring);outline-offset:-2px;border-radius:var(--cb-radius-sm, .25rem)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
131
+ }
132
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CbAnchor, decorators: [{
133
+ type: Component,
134
+ args: [{ selector: 'cb-anchor', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, imports: [NgTemplateOutlet], host: { class: 'cb-anchor' }, template: `
135
+ <nav class="cb-anchor__nav" [attr.aria-label]="ariaLabel() ?? t().onThisPage">
136
+ <ng-template #list let-links let-level="level">
137
+ <ul class="cb-anchor__list" [class.cb-anchor__list--nested]="level > 0">
138
+ @for (link of links; track link.href) {
139
+ <li>
140
+ <a
141
+ class="cb-anchor__link"
142
+ [class.cb-is-active]="active() === link.href"
143
+ [href]="link.href"
144
+ [attr.aria-current]="active() === link.href ? 'location' : null"
145
+ (click)="go($event, link)"
146
+ >
147
+ {{ link.label }}
148
+ </a>
149
+ @if (link.children?.length) {
150
+ <ng-container *ngTemplateOutlet="list; context: { $implicit: link.children, level: level + 1 }" />
151
+ }
152
+ </li>
153
+ }
154
+ </ul>
155
+ </ng-template>
156
+ <ng-container *ngTemplateOutlet="list; context: { $implicit: links(), level: 0 }" />
157
+ </nav>
158
+ `, styles: [":host{display:block;font-family:var(--cb-font-sans, inherit)}.cb-anchor__list{margin:0;padding:0;list-style:none;border-left:2px solid var(--cb-color-border)}.cb-anchor__list--nested{border-left:0}.cb-anchor__link{display:block;margin-left:-2px;padding:.3rem .75rem;font-size:var(--cb-text-sm, .875rem);color:var(--cb-color-text-muted);text-decoration:none;border-left:2px solid transparent;transition:color var(--cb-duration-fast, .12s) ease,border-color var(--cb-duration-fast, .12s) ease}.cb-anchor__list--nested .cb-anchor__link{padding-left:1.5rem}.cb-anchor__link:hover{color:var(--cb-color-text)}.cb-anchor__link.cb-is-active{font-weight:var(--cb-font-weight-medium, 500);color:var(--cb-color-primary-600, #059669);border-left-color:var(--cb-color-primary-500)}.cb-anchor__link:focus-visible{outline:2px solid var(--cb-color-focus-ring);outline-offset:-2px;border-radius:var(--cb-radius-sm, .25rem)}\n"] }]
159
+ }], ctorParameters: () => [], propDecorators: { links: [{ type: i0.Input, args: [{ isSignal: true, alias: "links", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], activeChange: [{ type: i0.Output, args: ["activeChange"] }] } });
160
+
161
+ /*
162
+ * Public API Surface de @caribeng/ui/anchor
163
+ */
164
+
165
+ /**
166
+ * Generated bundle index. Do not edit.
167
+ */
168
+
169
+ export { CbAnchor };
@@ -3,7 +3,7 @@ import { model, input, output, signal, viewChild, computed, forwardRef, ViewEnca
3
3
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
4
  import * as i1 from '@angular/cdk/overlay';
5
5
  import { OverlayModule } from '@angular/cdk/overlay';
6
- import { cbFieldState } from '@caribeng/ui';
6
+ import { injectCbTranslation, cbFieldState } from '@caribeng/ui';
7
7
  import { CbIcon } from '@caribeng/ui/icon';
8
8
 
9
9
  let nextUid = 0;
@@ -24,6 +24,8 @@ let nextUid = 0;
24
24
  */
25
25
  class CbAutocomplete {
26
26
  constructor() {
27
+ /** Textos de interfaz en el idioma activo (`provideCaribeNG({ locale })`). */
28
+ this.t = injectCbTranslation();
27
29
  /** Valor seleccionado (two-way opcional fuera de Angular Forms). */
28
30
  this.value = model(null, /* @ts-ignore */
29
31
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
@@ -48,7 +50,7 @@ class CbAutocomplete {
48
50
  this.forceSelection = input(true, { ...(ngDevMode ? { debugName: "forceSelection" } : /* istanbul ignore next */ {}), transform: toBoolean });
49
51
  /** Muestra un botón para desplegar todas las sugerencias. */
50
52
  this.dropdown = input(false, { ...(ngDevMode ? { debugName: "dropdown" } : /* istanbul ignore next */ {}), transform: toBoolean });
51
- this.emptyMessage = input('Sin resultados', /* @ts-ignore */
53
+ this.emptyMessage = input(undefined, /* @ts-ignore */
52
54
  ...(ngDevMode ? [{ debugName: "emptyMessage" }] : /* istanbul ignore next */ []));
53
55
  this.label = input('', /* @ts-ignore */
54
56
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
@@ -330,7 +332,7 @@ class CbAutocomplete {
330
332
  type="button"
331
333
  class="cb-autocomplete__dropdown-btn"
332
334
  tabindex="-1"
333
- aria-label="Mostrar sugerencias"
335
+ [attr.aria-label]="t().showSuggestions"
334
336
  [disabled]="isDisabled()"
335
337
  (click)="onDropdownClick()"
336
338
  >
@@ -366,7 +368,7 @@ class CbAutocomplete {
366
368
  </li>
367
369
  } @empty {
368
370
  <li class="cb-autocomplete__empty" role="option" aria-disabled="true">
369
- {{ emptyMessage() }}
371
+ {{ (emptyMessage() ?? t().noResults) }}
370
372
  </li>
371
373
  }
372
374
  </ul>
@@ -382,7 +384,7 @@ class CbAutocomplete {
382
384
  {{ hint() }}
383
385
  </p>
384
386
  }
385
- `, isInline: true, styles: [":host{display:block}.cb-autocomplete__label{display:block;margin-bottom:var(--cb-space-1);font-family:var(--cb-font-sans);font-size:var(--cb-text-sm);font-weight:var(--cb-font-weight-medium);color:var(--cb-color-text)}.cb-autocomplete__required{color:var(--cb-color-danger);margin-left:2px}.cb-autocomplete{position:relative;display:flex;align-items:stretch;box-sizing:border-box;width:100%;background-color:var(--cb-color-bg);border:var(--cb-border-width) solid var(--cb-color-border-strong);border-radius:var(--cb-radius-md);transition:border-color var(--cb-duration-fast) var(--cb-ease),box-shadow var(--cb-duration-fast) var(--cb-ease)}.cb-autocomplete:hover:not(.cb-is-disabled):not(:focus-within){border-color:var(--cb-color-text-muted)}.cb-autocomplete:focus-within,.cb-autocomplete.cb-is-open{border-color:var(--cb-color-primary-500);box-shadow:0 0 0 3px color-mix(in srgb,var(--cb-color-primary-500) 25%,transparent)}.cb-autocomplete.cb-is-invalid{border-color:var(--cb-color-danger)}.cb-autocomplete.cb-is-invalid:focus-within,.cb-autocomplete.cb-is-invalid.cb-is-open{box-shadow:0 0 0 3px color-mix(in srgb,var(--cb-color-danger) 25%,transparent)}.cb-autocomplete.cb-is-disabled{background-color:var(--cb-color-surface);opacity:.8}.cb-autocomplete__field{flex:1 1 auto;min-width:0;box-sizing:border-box;font-family:var(--cb-font-sans);color:var(--cb-color-text);background:transparent;border:none;border-radius:inherit}.cb-autocomplete__field::placeholder{color:var(--cb-color-text-muted)}.cb-autocomplete__field:focus{outline:none}.cb-autocomplete__field:disabled{color:var(--cb-color-text-muted);cursor:not-allowed}.cb-autocomplete--sm .cb-autocomplete__field{min-height:2rem;padding:var(--cb-space-1) var(--cb-space-2);font-size:var(--cb-text-sm)}.cb-autocomplete--md .cb-autocomplete__field{min-height:2.5rem;padding:var(--cb-space-2) var(--cb-space-3);font-size:var(--cb-text-base)}.cb-autocomplete--lg .cb-autocomplete__field{min-height:3rem;padding:var(--cb-space-3) var(--cb-space-4);font-size:var(--cb-text-lg)}.cb-autocomplete__dropdown-btn{display:flex;flex:none;align-items:center;justify-content:center;width:2.5rem;padding:0;color:var(--cb-color-text-muted);background:transparent;border:none;border-left:var(--cb-border-width) solid var(--cb-color-border);cursor:pointer}.cb-autocomplete__dropdown-btn:hover:not(:disabled){color:var(--cb-color-text)}.cb-autocomplete__dropdown-btn:disabled{cursor:not-allowed;opacity:.5}.cb-autocomplete__dropdown-btn cb-icon{color:currentColor}.cb-autocomplete__panel{box-sizing:border-box;width:100%;background-color:var(--cb-color-surface-raised);border:1px solid var(--cb-color-border);border-radius:var(--cb-radius-md);box-shadow:var(--cb-shadow-md);overflow:hidden;font-family:var(--cb-font-sans)}.cb-autocomplete__list{list-style:none;margin:0;padding:var(--cb-space-1);max-height:16rem;overflow-y:auto}.cb-autocomplete__option{display:flex;align-items:center;padding:var(--cb-space-2) var(--cb-space-3);border-radius:var(--cb-radius-sm);font-size:var(--cb-text-base);color:var(--cb-color-text);cursor:pointer}.cb-autocomplete__option.cb-is-active{background-color:var(--cb-color-surface-100)}.cb-autocomplete__empty{padding:var(--cb-space-3);color:var(--cb-color-text-muted);font-size:var(--cb-text-sm);text-align:center}.cb-autocomplete__message{margin:var(--cb-space-1) 0 0;font-size:var(--cb-text-sm);line-height:var(--cb-line-height-normal)}.cb-autocomplete__message--hint{color:var(--cb-color-text-muted)}.cb-autocomplete__message--error{color:var(--cb-color-danger)}.cb-autocomplete__required--required,.cb-autocomplete__required--optional{margin-left:.25rem;color:var(--cb-color-text-muted);font-size:.85em;font-weight:var(--cb-font-weight-normal, 400)}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: CbIcon, selector: "cb-icon", inputs: ["name", "size", "spin", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
387
+ `, isInline: true, styles: [":host{display:block}.cb-autocomplete__label{display:block;margin-bottom:var(--cb-space-1);font-family:var(--cb-font-sans);font-size:var(--cb-text-sm);font-weight:var(--cb-font-weight-medium);color:var(--cb-color-text)}.cb-autocomplete__required{color:var(--cb-color-danger);margin-left:2px}.cb-autocomplete{position:relative;display:flex;align-items:stretch;box-sizing:border-box;width:100%;background-color:var(--cb-color-bg);border:var(--cb-border-width) solid var(--cb-color-border-strong);border-radius:var(--cb-radius-md);transition:border-color var(--cb-duration-fast) var(--cb-ease),box-shadow var(--cb-duration-fast) var(--cb-ease)}.cb-autocomplete:hover:not(.cb-is-disabled):not(:focus-within){border-color:var(--cb-color-text-muted)}.cb-autocomplete:focus-within,.cb-autocomplete.cb-is-open{border-color:var(--cb-color-primary-500);box-shadow:0 0 0 3px color-mix(in srgb,var(--cb-color-primary-500) 25%,transparent)}.cb-autocomplete.cb-is-invalid{border-color:var(--cb-color-danger)}.cb-autocomplete.cb-is-invalid:focus-within,.cb-autocomplete.cb-is-invalid.cb-is-open{box-shadow:0 0 0 3px color-mix(in srgb,var(--cb-color-danger) 25%,transparent)}.cb-autocomplete.cb-is-disabled{background-color:var(--cb-color-surface);opacity:.8}.cb-autocomplete__field{flex:1 1 auto;min-width:0;box-sizing:border-box;font-family:var(--cb-font-sans);color:var(--cb-color-text);background:transparent;border:none;border-radius:inherit}.cb-autocomplete__field::placeholder{color:var(--cb-color-text-muted)}.cb-autocomplete__field:focus{outline:none}.cb-autocomplete__field:disabled{color:var(--cb-color-text-muted);cursor:not-allowed}.cb-autocomplete--sm .cb-autocomplete__field{min-height:2rem;padding:var(--cb-space-1) var(--cb-space-2);font-size:var(--cb-text-sm)}.cb-autocomplete--md .cb-autocomplete__field{min-height:2.5rem;padding:var(--cb-space-2) var(--cb-space-3);font-size:var(--cb-text-base)}.cb-autocomplete--lg .cb-autocomplete__field{min-height:3rem;padding:var(--cb-space-3) var(--cb-space-4);font-size:var(--cb-text-lg)}.cb-autocomplete__dropdown-btn{display:flex;flex:none;align-items:center;justify-content:center;width:2.5rem;padding:0;color:var(--cb-color-text-muted);background:transparent;border:none;border-left:var(--cb-border-width) solid var(--cb-color-border);cursor:pointer}.cb-autocomplete__dropdown-btn:hover:not(:disabled){color:var(--cb-color-text)}.cb-autocomplete__dropdown-btn:disabled{cursor:not-allowed;opacity:.5}.cb-autocomplete__dropdown-btn cb-icon{color:currentColor}.cb-autocomplete__panel{box-sizing:border-box;width:100%;background-color:var(--cb-color-surface-raised);border:1px solid var(--cb-color-border);border-radius:var(--cb-radius-md);box-shadow:var(--cb-shadow-md);overflow:hidden;font-family:var(--cb-font-sans)}.cb-autocomplete__list{list-style:none;margin:0;padding:var(--cb-space-1);max-height:16rem;overflow-y:auto}.cb-autocomplete__option{display:flex;align-items:center;padding:var(--cb-space-2) var(--cb-space-3);border-radius:var(--cb-radius-sm);font-size:var(--cb-text-base);color:var(--cb-color-text);cursor:pointer}.cb-autocomplete__option.cb-is-active{background-color:var(--cb-color-surface-hover)}.cb-autocomplete__empty{padding:var(--cb-space-3);color:var(--cb-color-text-muted);font-size:var(--cb-text-sm);text-align:center}.cb-autocomplete__message{margin:var(--cb-space-1) 0 0;font-size:var(--cb-text-sm);line-height:var(--cb-line-height-normal)}.cb-autocomplete__message--hint{color:var(--cb-color-text-muted)}.cb-autocomplete__message--error{color:var(--cb-color-danger)}.cb-autocomplete__required--required,.cb-autocomplete__required--optional{margin-left:.25rem;color:var(--cb-color-text-muted);font-size:.85em;font-weight:var(--cb-font-weight-normal, 400)}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: CbIcon, selector: "cb-icon", inputs: ["name", "size", "spin", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
386
388
  }
387
389
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CbAutocomplete, decorators: [{
388
390
  type: Component,
@@ -441,7 +443,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
441
443
  type="button"
442
444
  class="cb-autocomplete__dropdown-btn"
443
445
  tabindex="-1"
444
- aria-label="Mostrar sugerencias"
446
+ [attr.aria-label]="t().showSuggestions"
445
447
  [disabled]="isDisabled()"
446
448
  (click)="onDropdownClick()"
447
449
  >
@@ -477,7 +479,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
477
479
  </li>
478
480
  } @empty {
479
481
  <li class="cb-autocomplete__empty" role="option" aria-disabled="true">
480
- {{ emptyMessage() }}
482
+ {{ (emptyMessage() ?? t().noResults) }}
481
483
  </li>
482
484
  }
483
485
  </ul>
@@ -493,7 +495,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
493
495
  {{ hint() }}
494
496
  </p>
495
497
  }
496
- `, styles: [":host{display:block}.cb-autocomplete__label{display:block;margin-bottom:var(--cb-space-1);font-family:var(--cb-font-sans);font-size:var(--cb-text-sm);font-weight:var(--cb-font-weight-medium);color:var(--cb-color-text)}.cb-autocomplete__required{color:var(--cb-color-danger);margin-left:2px}.cb-autocomplete{position:relative;display:flex;align-items:stretch;box-sizing:border-box;width:100%;background-color:var(--cb-color-bg);border:var(--cb-border-width) solid var(--cb-color-border-strong);border-radius:var(--cb-radius-md);transition:border-color var(--cb-duration-fast) var(--cb-ease),box-shadow var(--cb-duration-fast) var(--cb-ease)}.cb-autocomplete:hover:not(.cb-is-disabled):not(:focus-within){border-color:var(--cb-color-text-muted)}.cb-autocomplete:focus-within,.cb-autocomplete.cb-is-open{border-color:var(--cb-color-primary-500);box-shadow:0 0 0 3px color-mix(in srgb,var(--cb-color-primary-500) 25%,transparent)}.cb-autocomplete.cb-is-invalid{border-color:var(--cb-color-danger)}.cb-autocomplete.cb-is-invalid:focus-within,.cb-autocomplete.cb-is-invalid.cb-is-open{box-shadow:0 0 0 3px color-mix(in srgb,var(--cb-color-danger) 25%,transparent)}.cb-autocomplete.cb-is-disabled{background-color:var(--cb-color-surface);opacity:.8}.cb-autocomplete__field{flex:1 1 auto;min-width:0;box-sizing:border-box;font-family:var(--cb-font-sans);color:var(--cb-color-text);background:transparent;border:none;border-radius:inherit}.cb-autocomplete__field::placeholder{color:var(--cb-color-text-muted)}.cb-autocomplete__field:focus{outline:none}.cb-autocomplete__field:disabled{color:var(--cb-color-text-muted);cursor:not-allowed}.cb-autocomplete--sm .cb-autocomplete__field{min-height:2rem;padding:var(--cb-space-1) var(--cb-space-2);font-size:var(--cb-text-sm)}.cb-autocomplete--md .cb-autocomplete__field{min-height:2.5rem;padding:var(--cb-space-2) var(--cb-space-3);font-size:var(--cb-text-base)}.cb-autocomplete--lg .cb-autocomplete__field{min-height:3rem;padding:var(--cb-space-3) var(--cb-space-4);font-size:var(--cb-text-lg)}.cb-autocomplete__dropdown-btn{display:flex;flex:none;align-items:center;justify-content:center;width:2.5rem;padding:0;color:var(--cb-color-text-muted);background:transparent;border:none;border-left:var(--cb-border-width) solid var(--cb-color-border);cursor:pointer}.cb-autocomplete__dropdown-btn:hover:not(:disabled){color:var(--cb-color-text)}.cb-autocomplete__dropdown-btn:disabled{cursor:not-allowed;opacity:.5}.cb-autocomplete__dropdown-btn cb-icon{color:currentColor}.cb-autocomplete__panel{box-sizing:border-box;width:100%;background-color:var(--cb-color-surface-raised);border:1px solid var(--cb-color-border);border-radius:var(--cb-radius-md);box-shadow:var(--cb-shadow-md);overflow:hidden;font-family:var(--cb-font-sans)}.cb-autocomplete__list{list-style:none;margin:0;padding:var(--cb-space-1);max-height:16rem;overflow-y:auto}.cb-autocomplete__option{display:flex;align-items:center;padding:var(--cb-space-2) var(--cb-space-3);border-radius:var(--cb-radius-sm);font-size:var(--cb-text-base);color:var(--cb-color-text);cursor:pointer}.cb-autocomplete__option.cb-is-active{background-color:var(--cb-color-surface-100)}.cb-autocomplete__empty{padding:var(--cb-space-3);color:var(--cb-color-text-muted);font-size:var(--cb-text-sm);text-align:center}.cb-autocomplete__message{margin:var(--cb-space-1) 0 0;font-size:var(--cb-text-sm);line-height:var(--cb-line-height-normal)}.cb-autocomplete__message--hint{color:var(--cb-color-text-muted)}.cb-autocomplete__message--error{color:var(--cb-color-danger)}.cb-autocomplete__required--required,.cb-autocomplete__required--optional{margin-left:.25rem;color:var(--cb-color-text-muted);font-size:.85em;font-weight:var(--cb-font-weight-normal, 400)}\n"] }]
498
+ `, styles: [":host{display:block}.cb-autocomplete__label{display:block;margin-bottom:var(--cb-space-1);font-family:var(--cb-font-sans);font-size:var(--cb-text-sm);font-weight:var(--cb-font-weight-medium);color:var(--cb-color-text)}.cb-autocomplete__required{color:var(--cb-color-danger);margin-left:2px}.cb-autocomplete{position:relative;display:flex;align-items:stretch;box-sizing:border-box;width:100%;background-color:var(--cb-color-bg);border:var(--cb-border-width) solid var(--cb-color-border-strong);border-radius:var(--cb-radius-md);transition:border-color var(--cb-duration-fast) var(--cb-ease),box-shadow var(--cb-duration-fast) var(--cb-ease)}.cb-autocomplete:hover:not(.cb-is-disabled):not(:focus-within){border-color:var(--cb-color-text-muted)}.cb-autocomplete:focus-within,.cb-autocomplete.cb-is-open{border-color:var(--cb-color-primary-500);box-shadow:0 0 0 3px color-mix(in srgb,var(--cb-color-primary-500) 25%,transparent)}.cb-autocomplete.cb-is-invalid{border-color:var(--cb-color-danger)}.cb-autocomplete.cb-is-invalid:focus-within,.cb-autocomplete.cb-is-invalid.cb-is-open{box-shadow:0 0 0 3px color-mix(in srgb,var(--cb-color-danger) 25%,transparent)}.cb-autocomplete.cb-is-disabled{background-color:var(--cb-color-surface);opacity:.8}.cb-autocomplete__field{flex:1 1 auto;min-width:0;box-sizing:border-box;font-family:var(--cb-font-sans);color:var(--cb-color-text);background:transparent;border:none;border-radius:inherit}.cb-autocomplete__field::placeholder{color:var(--cb-color-text-muted)}.cb-autocomplete__field:focus{outline:none}.cb-autocomplete__field:disabled{color:var(--cb-color-text-muted);cursor:not-allowed}.cb-autocomplete--sm .cb-autocomplete__field{min-height:2rem;padding:var(--cb-space-1) var(--cb-space-2);font-size:var(--cb-text-sm)}.cb-autocomplete--md .cb-autocomplete__field{min-height:2.5rem;padding:var(--cb-space-2) var(--cb-space-3);font-size:var(--cb-text-base)}.cb-autocomplete--lg .cb-autocomplete__field{min-height:3rem;padding:var(--cb-space-3) var(--cb-space-4);font-size:var(--cb-text-lg)}.cb-autocomplete__dropdown-btn{display:flex;flex:none;align-items:center;justify-content:center;width:2.5rem;padding:0;color:var(--cb-color-text-muted);background:transparent;border:none;border-left:var(--cb-border-width) solid var(--cb-color-border);cursor:pointer}.cb-autocomplete__dropdown-btn:hover:not(:disabled){color:var(--cb-color-text)}.cb-autocomplete__dropdown-btn:disabled{cursor:not-allowed;opacity:.5}.cb-autocomplete__dropdown-btn cb-icon{color:currentColor}.cb-autocomplete__panel{box-sizing:border-box;width:100%;background-color:var(--cb-color-surface-raised);border:1px solid var(--cb-color-border);border-radius:var(--cb-radius-md);box-shadow:var(--cb-shadow-md);overflow:hidden;font-family:var(--cb-font-sans)}.cb-autocomplete__list{list-style:none;margin:0;padding:var(--cb-space-1);max-height:16rem;overflow-y:auto}.cb-autocomplete__option{display:flex;align-items:center;padding:var(--cb-space-2) var(--cb-space-3);border-radius:var(--cb-radius-sm);font-size:var(--cb-text-base);color:var(--cb-color-text);cursor:pointer}.cb-autocomplete__option.cb-is-active{background-color:var(--cb-color-surface-hover)}.cb-autocomplete__empty{padding:var(--cb-space-3);color:var(--cb-color-text-muted);font-size:var(--cb-text-sm);text-align:center}.cb-autocomplete__message{margin:var(--cb-space-1) 0 0;font-size:var(--cb-text-sm);line-height:var(--cb-line-height-normal)}.cb-autocomplete__message--hint{color:var(--cb-color-text-muted)}.cb-autocomplete__message--error{color:var(--cb-color-danger)}.cb-autocomplete__required--required,.cb-autocomplete__required--optional{margin-left:.25rem;color:var(--cb-color-text-muted);font-size:.85em;font-weight:var(--cb-font-weight-normal, 400)}\n"] }]
497
499
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], suggestions: [{ type: i0.Input, args: [{ isSignal: true, alias: "suggestions", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], minLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minLength", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }], forceSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "forceSelection", required: false }] }], dropdown: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdown", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], requiredIndicator: [{ type: i0.Input, args: [{ isSignal: true, alias: "requiredIndicator", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], inputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputId", required: false }] }], complete: [{ type: i0.Output, args: ["complete"] }], optionSelected: [{ type: i0.Output, args: ["optionSelected"] }], triggerRef: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], fieldRef: [{ type: i0.ViewChild, args: ['field', { isSignal: true }] }] } });
498
500
  function toBoolean(value) {
499
501
  return value !== false && value != null && `${value}` !== 'false';
@@ -1,20 +1,26 @@
1
1
  import * as i0 from '@angular/core';
2
- import { ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { input, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
 
4
4
  /**
5
5
  * AvatarGroup de CaribeNG: agrupa varios `<cb-avatar>` con superposición visual.
6
6
  */
7
7
  class CbAvatarGroup {
8
+ constructor() {
9
+ /** Nombre accesible del grupo (p. ej. "Participantes"). */
10
+ this.ariaLabel = input(undefined, /* @ts-ignore */
11
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
12
+ }
8
13
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CbAvatarGroup, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: CbAvatarGroup, isStandalone: true, selector: "cb-avatar-group", host: { attributes: { "role": "group" }, classAttribute: "cb-avatar-group" }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: [".cb-avatar-group{display:inline-flex;align-items:center}.cb-avatar-group>cb-avatar{border:2px solid var(--cb-color-surface);border-radius:999px}.cb-avatar-group>cb-avatar+cb-avatar{margin-left:-.65rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
14
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.5", type: CbAvatarGroup, isStandalone: true, selector: "cb-avatar-group", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" }, properties: { "attr.aria-label": "ariaLabel() || null" }, classAttribute: "cb-avatar-group" }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: [".cb-avatar-group{display:inline-flex;align-items:center}.cb-avatar-group>cb-avatar{border:2px solid var(--cb-color-surface);border-radius:999px}.cb-avatar-group>cb-avatar+cb-avatar{margin-left:-.65rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
10
15
  }
11
16
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CbAvatarGroup, decorators: [{
12
17
  type: Component,
13
18
  args: [{ selector: 'cb-avatar-group', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
14
19
  class: 'cb-avatar-group',
15
20
  role: 'group',
21
+ '[attr.aria-label]': 'ariaLabel() || null',
16
22
  }, template: `<ng-content />`, styles: [".cb-avatar-group{display:inline-flex;align-items:center}.cb-avatar-group>cb-avatar{border:2px solid var(--cb-color-surface);border-radius:999px}.cb-avatar-group>cb-avatar+cb-avatar{margin-left:-.65rem}\n"] }]
17
- }] });
23
+ }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
18
24
 
19
25
  /**
20
26
  * Generated bundle index. Do not edit.
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { input, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { CbIcon } from '@caribeng/ui/icon';
4
+ import { injectCbTranslation } from '@caribeng/ui';
4
5
 
5
6
  /**
6
7
  * BlockUI de CaribeNG: bloquea la interacción sobre el contenido proyectado
@@ -8,20 +9,26 @@ import { CbIcon } from '@caribeng/ui/icon';
8
9
  */
9
10
  class CbBlockUi {
10
11
  constructor() {
12
+ /** Textos de interfaz en el idioma activo (`provideCaribeNG({ locale })`). */
13
+ this.t = injectCbTranslation();
11
14
  this.blocked = input(false, /* @ts-ignore */
12
15
  ...(ngDevMode ? [{ debugName: "blocked" }] : /* istanbul ignore next */ []));
16
+ /** Texto que anuncia el lector de pantalla al bloquear. Por defecto, "Cargando" del idioma activo. */
17
+ this.message = input(undefined, /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
13
19
  }
14
20
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CbBlockUi, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: CbBlockUi, isStandalone: true, selector: "cb-block-ui", inputs: { blocked: { classPropertyName: "blocked", publicName: "blocked", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.cb-is-blocked": "blocked()", "attr.aria-busy": "blocked()" }, classAttribute: "cb-block-ui" }, ngImport: i0, template: `
21
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: CbBlockUi, isStandalone: true, selector: "cb-block-ui", inputs: { blocked: { classPropertyName: "blocked", publicName: "blocked", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.cb-is-blocked": "blocked()", "attr.aria-busy": "blocked()" }, classAttribute: "cb-block-ui" }, ngImport: i0, template: `
16
22
  <div class="cb-block-ui__content" [attr.inert]="blocked() ? '' : null">
17
23
  <ng-content />
18
24
  </div>
19
25
  @if (blocked()) {
20
26
  <div class="cb-block-ui__mask" role="status" aria-live="polite">
21
27
  <cb-icon name="loader" [size]="22" [spin]="true" aria-hidden="true" />
28
+ <span class="cb-block-ui__sr">{{ message() ?? t().loading }}</span>
22
29
  </div>
23
30
  }
24
- `, isInline: true, styles: [":host{position:relative;display:block;width:100%;font-family:var(--cb-font-sans)}.cb-block-ui__mask{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;border-radius:var(--cb-radius-lg);background:#0f172a59;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);color:#fff}\n"], dependencies: [{ kind: "component", type: CbIcon, selector: "cb-icon", inputs: ["name", "size", "spin", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31
+ `, isInline: true, styles: [":host{position:relative;display:block;width:100%;font-family:var(--cb-font-sans)}.cb-block-ui__mask{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;border-radius:var(--cb-radius-lg);background:#0f172a59;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);color:#fff}.cb-block-ui__sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "component", type: CbIcon, selector: "cb-icon", inputs: ["name", "size", "spin", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25
32
  }
26
33
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CbBlockUi, decorators: [{
27
34
  type: Component,
@@ -36,10 +43,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
36
43
  @if (blocked()) {
37
44
  <div class="cb-block-ui__mask" role="status" aria-live="polite">
38
45
  <cb-icon name="loader" [size]="22" [spin]="true" aria-hidden="true" />
46
+ <span class="cb-block-ui__sr">{{ message() ?? t().loading }}</span>
39
47
  </div>
40
48
  }
41
- `, styles: [":host{position:relative;display:block;width:100%;font-family:var(--cb-font-sans)}.cb-block-ui__mask{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;border-radius:var(--cb-radius-lg);background:#0f172a59;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);color:#fff}\n"] }]
42
- }], propDecorators: { blocked: [{ type: i0.Input, args: [{ isSignal: true, alias: "blocked", required: false }] }] } });
49
+ `, styles: [":host{position:relative;display:block;width:100%;font-family:var(--cb-font-sans)}.cb-block-ui__mask{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;border-radius:var(--cb-radius-lg);background:#0f172a59;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);color:#fff}.cb-block-ui__sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"] }]
50
+ }], propDecorators: { blocked: [{ type: i0.Input, args: [{ isSignal: true, alias: "blocked", required: false }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }] } });
43
51
 
44
52
  /**
45
53
  * Generated bundle index. Do not edit.
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { input, output, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { CbIcon } from '@caribeng/ui/icon';
4
+ import { injectCbTranslation } from '@caribeng/ui';
4
5
 
5
6
  /**
6
7
  * Breadcrumb de CaribeNG: rastro de navegación jerárquica.
@@ -16,6 +17,8 @@ import { CbIcon } from '@caribeng/ui/icon';
16
17
  */
17
18
  class CbBreadcrumb {
18
19
  constructor() {
20
+ /** Textos de interfaz en el idioma activo (`provideCaribeNG({ locale })`). */
21
+ this.t = injectCbTranslation();
19
22
  this.items = input([], /* @ts-ignore */
20
23
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
21
24
  /** Icono separador entre elementos. */
@@ -26,7 +29,7 @@ class CbBreadcrumb {
26
29
  }
27
30
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CbBreadcrumb, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28
31
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: CbBreadcrumb, isStandalone: true, selector: "cb-breadcrumb", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { classAttribute: "cb-breadcrumb" }, ngImport: i0, template: `
29
- <nav aria-label="Breadcrumb">
32
+ <nav [attr.aria-label]="t().breadcrumb">
30
33
  <ol class="cb-breadcrumb__list">
31
34
  @for (item of items(); track $index; let last = $last) {
32
35
  <li class="cb-breadcrumb__item">
@@ -53,7 +56,7 @@ class CbBreadcrumb {
53
56
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CbBreadcrumb, decorators: [{
54
57
  type: Component,
55
58
  args: [{ selector: 'cb-breadcrumb', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, imports: [CbIcon], host: { class: 'cb-breadcrumb' }, template: `
56
- <nav aria-label="Breadcrumb">
59
+ <nav [attr.aria-label]="t().breadcrumb">
57
60
  <ol class="cb-breadcrumb__list">
58
61
  @for (item of items(); track $index; let last = $last) {
59
62
  <li class="cb-breadcrumb__item">