@caribeng/ui 22.1.1 → 22.4.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.
- package/README.md +134 -12
- package/fesm2022/caribeng-ui-accordion.mjs +4 -4
- package/fesm2022/caribeng-ui-anchor.mjs +169 -0
- package/fesm2022/caribeng-ui-autocomplete.mjs +10 -8
- package/fesm2022/caribeng-ui-avatar.mjs +2 -2
- package/fesm2022/caribeng-ui-avatargroup.mjs +9 -3
- package/fesm2022/caribeng-ui-badge.mjs +8 -2
- package/fesm2022/caribeng-ui-blockui.mjs +12 -4
- package/fesm2022/caribeng-ui-breadcrumb.mjs +17 -7
- package/fesm2022/caribeng-ui-button.mjs +22 -2
- package/fesm2022/caribeng-ui-caribe-alert.mjs +5 -2
- package/fesm2022/caribeng-ui-caribe-animation-lottie.mjs +6 -3
- package/fesm2022/caribeng-ui-caribe-button-group.mjs +6 -3
- package/fesm2022/caribeng-ui-caribe-calendar.mjs +11 -6
- package/fesm2022/caribeng-ui-caribe-card-content.mjs +6 -3
- package/fesm2022/caribeng-ui-caribe-card-move.mjs +29 -7
- package/fesm2022/caribeng-ui-caribe-card-select.mjs +56 -14
- package/fesm2022/caribeng-ui-caribe-circle-loading.mjs +10 -7
- package/fesm2022/caribeng-ui-caribe-coachmark.mjs +42 -19
- package/fesm2022/caribeng-ui-caribe-data-table.mjs +15 -9
- package/fesm2022/caribeng-ui-caribe-dots-indicator.mjs +38 -5
- package/fesm2022/caribeng-ui-caribe-expansion-panel.mjs +16 -5
- package/fesm2022/caribeng-ui-caribe-fab-menu.mjs +56 -7
- package/fesm2022/caribeng-ui-caribe-file-download.mjs +68 -27
- package/fesm2022/caribeng-ui-caribe-file-select.mjs +22 -17
- package/fesm2022/caribeng-ui-caribe-float-menu.mjs +6 -3
- package/fesm2022/caribeng-ui-caribe-footer.mjs +8 -4
- package/fesm2022/caribeng-ui-caribe-header.mjs +6 -3
- package/fesm2022/caribeng-ui-caribe-icon-button.mjs +6 -3
- package/fesm2022/caribeng-ui-caribe-illustration.mjs +6 -3
- package/fesm2022/caribeng-ui-caribe-inline-alert.mjs +5 -2
- package/fesm2022/caribeng-ui-caribe-input-search.mjs +14 -10
- package/fesm2022/caribeng-ui-caribe-input-select.mjs +12 -10
- package/fesm2022/caribeng-ui-caribe-input-token.mjs +61 -11
- package/fesm2022/caribeng-ui-caribe-link.mjs +7 -2
- package/fesm2022/caribeng-ui-caribe-loader.mjs +8 -5
- package/fesm2022/caribeng-ui-caribe-modal.mjs +32 -16
- package/fesm2022/caribeng-ui-caribe-off-canvas.mjs +26 -12
- package/fesm2022/caribeng-ui-caribe-onboarding.mjs +44 -19
- package/fesm2022/caribeng-ui-caribe-pictogram.mjs +6 -3
- package/fesm2022/caribeng-ui-caribe-pop-over.mjs +34 -10
- package/fesm2022/caribeng-ui-caribe-preloader.mjs +9 -6
- package/fesm2022/caribeng-ui-caribe-progress-bar.mjs +5 -2
- package/fesm2022/caribeng-ui-caribe-shortcut.mjs +8 -3
- package/fesm2022/caribeng-ui-caribe-step-indicator.mjs +12 -5
- package/fesm2022/caribeng-ui-caribe-stroke.mjs +6 -3
- package/fesm2022/caribeng-ui-caribe-switch.mjs +5 -3
- package/fesm2022/caribeng-ui-caribe-tag-button.mjs +1 -1
- package/fesm2022/caribeng-ui-caribe-tracker.mjs +5 -2
- package/fesm2022/caribeng-ui-caribe-transaction-status.mjs +1 -1
- package/fesm2022/caribeng-ui-caribe-voucher.mjs +11 -8
- package/fesm2022/caribeng-ui-carousel.mjs +49 -14
- package/fesm2022/caribeng-ui-cascadeselect.mjs +22 -8
- package/fesm2022/caribeng-ui-chart.mjs +2601 -303
- package/fesm2022/caribeng-ui-chat.mjs +1303 -0
- package/fesm2022/caribeng-ui-chip.mjs +9 -4
- package/fesm2022/caribeng-ui-chips.mjs +9 -5
- package/fesm2022/caribeng-ui-code-block.mjs +332 -0
- package/fesm2022/caribeng-ui-colorpicker.mjs +107 -11
- package/fesm2022/caribeng-ui-command-palette.mjs +476 -0
- package/fesm2022/caribeng-ui-confirmdialog.mjs +140 -10
- package/fesm2022/caribeng-ui-confirmpopup.mjs +209 -9
- package/fesm2022/caribeng-ui-contextmenu.mjs +13 -6
- package/fesm2022/caribeng-ui-copy-button.mjs +230 -0
- package/fesm2022/caribeng-ui-dataview.mjs +214 -6
- package/fesm2022/caribeng-ui-datepicker.mjs +1630 -393
- package/fesm2022/caribeng-ui-descriptions.mjs +124 -0
- package/fesm2022/caribeng-ui-dialog.mjs +10 -7
- package/fesm2022/caribeng-ui-dock.mjs +58 -15
- package/fesm2022/caribeng-ui-drawer.mjs +17 -9
- package/fesm2022/caribeng-ui-dynamicdialog.mjs +210 -6
- package/fesm2022/caribeng-ui-editor.mjs +4413 -243
- package/fesm2022/caribeng-ui-empty.mjs +80 -0
- package/fesm2022/caribeng-ui-fieldset.mjs +2 -2
- package/fesm2022/caribeng-ui-file-card.mjs +136 -19
- package/fesm2022/caribeng-ui-fileupload.mjs +96 -19
- package/fesm2022/caribeng-ui-floatlabel.mjs +4 -2
- package/fesm2022/caribeng-ui-folder-card.mjs +132 -15
- package/fesm2022/caribeng-ui-galleria.mjs +76 -45
- package/fesm2022/caribeng-ui-image.mjs +52 -29
- package/fesm2022/caribeng-ui-inlinemessage.mjs +2 -2
- package/fesm2022/caribeng-ui-inplace.mjs +22 -6
- package/fesm2022/caribeng-ui-input-number.mjs +9 -7
- package/fesm2022/caribeng-ui-inputgroup.mjs +2 -2
- package/fesm2022/caribeng-ui-inputmask.mjs +22 -13
- package/fesm2022/caribeng-ui-inputotp.mjs +12 -6
- package/fesm2022/caribeng-ui-kanban.mjs +4612 -0
- package/fesm2022/caribeng-ui-kbd.mjs +122 -0
- package/fesm2022/caribeng-ui-keyfilter.mjs +72 -0
- package/fesm2022/caribeng-ui-listbox.mjs +13 -11
- package/fesm2022/caribeng-ui-megamenu.mjs +228 -32
- package/fesm2022/caribeng-ui-mentions.mjs +495 -0
- package/fesm2022/caribeng-ui-menu.mjs +18 -8
- package/fesm2022/caribeng-ui-menubar.mjs +17 -8
- package/fesm2022/caribeng-ui-message.mjs +13 -7
- package/fesm2022/caribeng-ui-metergroup.mjs +29 -11
- package/fesm2022/caribeng-ui-multiselect.mjs +399 -97
- package/fesm2022/caribeng-ui-orderlist.mjs +230 -11
- package/fesm2022/caribeng-ui-organizationchart.mjs +16 -15
- package/fesm2022/caribeng-ui-paginator.mjs +18 -15
- package/fesm2022/caribeng-ui-panel.mjs +11 -8
- package/fesm2022/caribeng-ui-panelmenu.mjs +14 -8
- package/fesm2022/caribeng-ui-password.mjs +8 -6
- package/fesm2022/caribeng-ui-pdfviewer.mjs +1553 -0
- package/fesm2022/caribeng-ui-phone-input.mjs +688 -0
- package/fesm2022/caribeng-ui-picklist.mjs +251 -14
- package/fesm2022/caribeng-ui-pricing.mjs +272 -75
- package/fesm2022/caribeng-ui-qrcode.mjs +564 -0
- package/fesm2022/caribeng-ui-rating.mjs +7 -3
- package/fesm2022/caribeng-ui-repeater.mjs +223 -0
- package/fesm2022/caribeng-ui-result.mjs +91 -0
- package/fesm2022/caribeng-ui-ripple.mjs +2 -0
- package/fesm2022/caribeng-ui-scrollpanel.mjs +6 -3
- package/fesm2022/caribeng-ui-scrolltop.mjs +9 -4
- package/fesm2022/caribeng-ui-select.mjs +379 -87
- package/fesm2022/caribeng-ui-selectbutton.mjs +2 -2
- package/fesm2022/caribeng-ui-sidebar.mjs +573 -0
- package/fesm2022/caribeng-ui-slider.mjs +171 -75
- package/fesm2022/caribeng-ui-speeddial.mjs +7 -4
- package/fesm2022/caribeng-ui-spinner.mjs +5 -2
- package/fesm2022/caribeng-ui-splitbutton.mjs +163 -0
- package/fesm2022/caribeng-ui-splitter.mjs +5 -2
- package/fesm2022/caribeng-ui-statistic.mjs +183 -0
- package/fesm2022/caribeng-ui-stepper.mjs +17 -7
- package/fesm2022/caribeng-ui-steps.mjs +6 -3
- package/fesm2022/caribeng-ui-table.mjs +716 -84
- package/fesm2022/caribeng-ui-tabmenu.mjs +13 -6
- package/fesm2022/caribeng-ui-tag.mjs +2 -2
- package/fesm2022/caribeng-ui-terminal.mjs +45 -9
- package/fesm2022/caribeng-ui-themetoggle.mjs +82 -0
- package/fesm2022/caribeng-ui-tieredmenu.mjs +113 -20
- package/fesm2022/caribeng-ui-timeline.mjs +175 -6
- package/fesm2022/caribeng-ui-toast.mjs +7 -4
- package/fesm2022/caribeng-ui-togglebutton.mjs +8 -6
- package/fesm2022/caribeng-ui-toolbar.mjs +6 -3
- package/fesm2022/caribeng-ui-tree.mjs +302 -6
- package/fesm2022/caribeng-ui-treeselect.mjs +26 -10
- package/fesm2022/caribeng-ui-treetable.mjs +269 -6
- package/fesm2022/caribeng-ui-virtualscroller.mjs +123 -10
- package/fesm2022/caribeng-ui.mjs +1216 -6
- package/package.json +93 -3
- package/schematics/collection.json +15 -0
- package/schematics/migrate-from-primeng/core-icons.json +1 -0
- package/schematics/migrate-from-primeng/icons.js +269 -0
- package/schematics/migrate-from-primeng/index.js +290 -0
- package/schematics/migrate-from-primeng/mappings/button.js +93 -0
- package/schematics/migrate-from-primeng/mappings/card.js +33 -0
- package/schematics/migrate-from-primeng/mappings/checkbox.js +44 -0
- package/schematics/migrate-from-primeng/mappings/confirm.js +221 -0
- package/schematics/migrate-from-primeng/mappings/datepicker.js +121 -0
- package/schematics/migrate-from-primeng/mappings/dialog.js +84 -0
- package/schematics/migrate-from-primeng/mappings/index.js +88 -0
- package/schematics/migrate-from-primeng/mappings/inputnumber.js +62 -0
- package/schematics/migrate-from-primeng/mappings/inputtext.js +60 -0
- package/schematics/migrate-from-primeng/mappings/menu.js +468 -0
- package/schematics/migrate-from-primeng/mappings/multiselect.js +49 -0
- package/schematics/migrate-from-primeng/mappings/radiobutton.js +22 -0
- package/schematics/migrate-from-primeng/mappings/rules.js +206 -0
- package/schematics/migrate-from-primeng/mappings/select.js +97 -0
- package/schematics/migrate-from-primeng/mappings/service-calls.js +100 -0
- package/schematics/migrate-from-primeng/mappings/table.js +613 -0
- package/schematics/migrate-from-primeng/mappings/tabs.js +225 -0
- package/schematics/migrate-from-primeng/mappings/tag.js +29 -0
- package/schematics/migrate-from-primeng/mappings/textarea.js +44 -0
- package/schematics/migrate-from-primeng/mappings/toast.js +173 -0
- package/schematics/migrate-from-primeng/mappings/toggleswitch.js +37 -0
- package/schematics/migrate-from-primeng/mappings/tooltip.js +44 -0
- package/schematics/migrate-from-primeng/mappings/types.js +10 -0
- package/schematics/migrate-from-primeng/report.js +79 -0
- package/schematics/migrate-from-primeng/schema.js +2 -0
- package/schematics/migrate-from-primeng/schema.json +34 -0
- package/schematics/migrate-from-primeng/template.js +387 -0
- package/schematics/migrate-from-primeng/todo.js +5 -0
- package/schematics/migrate-from-primeng/typescript.js +442 -0
- package/schematics/migrate-from-primeng/workspace.js +117 -0
- package/schematics/ng-add/index.js +140 -0
- package/schematics/ng-add/schema.js +2 -0
- package/schematics/ng-add/schema.json +66 -0
- package/types/caribeng-ui-anchor.d.ts +50 -0
- package/types/caribeng-ui-autocomplete.d.ts +4 -2
- package/types/caribeng-ui-avatargroup.d.ts +3 -1
- package/types/caribeng-ui-badge.d.ts +3 -1
- package/types/caribeng-ui-blockui.d.ts +9 -4
- package/types/caribeng-ui-breadcrumb.d.ts +11 -0
- package/types/caribeng-ui-button.d.ts +9 -1
- package/types/caribeng-ui-caribe-alert.d.ts +3 -0
- package/types/caribeng-ui-caribe-animation-lottie.d.ts +4 -1
- package/types/caribeng-ui-caribe-button-group.d.ts +4 -1
- package/types/caribeng-ui-caribe-calendar.d.ts +5 -1
- package/types/caribeng-ui-caribe-card-content.d.ts +4 -1
- package/types/caribeng-ui-caribe-card-move.d.ts +13 -13
- package/types/caribeng-ui-caribe-card-select.d.ts +10 -1
- package/types/caribeng-ui-caribe-circle-loading.d.ts +4 -1
- package/types/caribeng-ui-caribe-coachmark.d.ts +6 -0
- package/types/caribeng-ui-caribe-data-table.d.ts +7 -2
- package/types/caribeng-ui-caribe-dots-indicator.d.ts +9 -0
- package/types/caribeng-ui-caribe-expansion-panel.d.ts +7 -10
- package/types/caribeng-ui-caribe-fab-menu.d.ts +10 -1
- package/types/caribeng-ui-caribe-file-download.d.ts +8 -10
- package/types/caribeng-ui-caribe-file-select.d.ts +7 -1
- package/types/caribeng-ui-caribe-float-menu.d.ts +4 -1
- package/types/caribeng-ui-caribe-header.d.ts +3 -0
- package/types/caribeng-ui-caribe-icon-button.d.ts +4 -1
- package/types/caribeng-ui-caribe-illustration.d.ts +4 -1
- package/types/caribeng-ui-caribe-inline-alert.d.ts +3 -0
- package/types/caribeng-ui-caribe-input-search.d.ts +4 -2
- package/types/caribeng-ui-caribe-input-select.d.ts +4 -2
- package/types/caribeng-ui-caribe-input-token.d.ts +16 -1
- package/types/caribeng-ui-caribe-link.d.ts +3 -0
- package/types/caribeng-ui-caribe-loader.d.ts +4 -1
- package/types/caribeng-ui-caribe-modal.d.ts +7 -10
- package/types/caribeng-ui-caribe-off-canvas.d.ts +6 -1
- package/types/caribeng-ui-caribe-onboarding.d.ts +6 -0
- package/types/caribeng-ui-caribe-pictogram.d.ts +4 -1
- package/types/caribeng-ui-caribe-pop-over.d.ts +7 -10
- package/types/caribeng-ui-caribe-preloader.d.ts +4 -1
- package/types/caribeng-ui-caribe-progress-bar.d.ts +3 -0
- package/types/caribeng-ui-caribe-shortcut.d.ts +3 -1
- package/types/caribeng-ui-caribe-step-indicator.d.ts +6 -0
- package/types/caribeng-ui-caribe-stroke.d.ts +4 -1
- package/types/caribeng-ui-caribe-switch.d.ts +3 -1
- package/types/caribeng-ui-caribe-tracker.d.ts +3 -0
- package/types/caribeng-ui-caribe-voucher.d.ts +5 -2
- package/types/caribeng-ui-carousel.d.ts +10 -1
- package/types/caribeng-ui-cascadeselect.d.ts +7 -2
- package/types/caribeng-ui-chart.d.ts +471 -44
- package/types/caribeng-ui-chat.d.ts +299 -0
- package/types/caribeng-ui-chip.d.ts +6 -0
- package/types/caribeng-ui-chips.d.ts +6 -2
- package/types/caribeng-ui-code-block.d.ts +65 -0
- package/types/caribeng-ui-colorpicker.d.ts +8 -2
- package/types/caribeng-ui-command-palette.d.ts +133 -0
- package/types/caribeng-ui-confirmdialog.d.ts +57 -6
- package/types/caribeng-ui-confirmpopup.d.ts +74 -5
- package/types/caribeng-ui-contextmenu.d.ts +11 -1
- package/types/caribeng-ui-copy-button.d.ts +90 -0
- package/types/caribeng-ui-dataview.d.ts +65 -5
- package/types/caribeng-ui-datepicker.d.ts +186 -21
- package/types/caribeng-ui-descriptions.d.ts +63 -0
- package/types/caribeng-ui-dialog.d.ts +4 -1
- package/types/caribeng-ui-dock.d.ts +17 -2
- package/types/caribeng-ui-drawer.d.ts +7 -2
- package/types/caribeng-ui-dynamicdialog.d.ts +93 -3
- package/types/caribeng-ui-editor.d.ts +486 -13
- package/types/caribeng-ui-empty.d.ts +34 -0
- package/types/caribeng-ui-file-card.d.ts +28 -3
- package/types/caribeng-ui-fileupload.d.ts +27 -4
- package/types/caribeng-ui-folder-card.d.ts +31 -6
- package/types/caribeng-ui-galleria.d.ts +9 -0
- package/types/caribeng-ui-image.d.ts +10 -0
- package/types/caribeng-ui-inplace.d.ts +8 -0
- package/types/caribeng-ui-input-number.d.ts +3 -1
- package/types/caribeng-ui-inputmask.d.ts +8 -1
- package/types/caribeng-ui-inputotp.d.ts +7 -2
- package/types/caribeng-ui-kanban.d.ts +783 -0
- package/types/caribeng-ui-kbd.d.ts +36 -0
- package/types/caribeng-ui-keyfilter.d.ts +30 -0
- package/types/caribeng-ui-listbox.d.ts +5 -3
- package/types/caribeng-ui-megamenu.d.ts +37 -2
- package/types/caribeng-ui-mentions.d.ts +127 -0
- package/types/caribeng-ui-menu.d.ts +14 -2
- package/types/caribeng-ui-menubar.d.ts +12 -1
- package/types/caribeng-ui-message.d.ts +5 -0
- package/types/caribeng-ui-metergroup.d.ts +9 -1
- package/types/caribeng-ui-multiselect.d.ts +71 -10
- package/types/caribeng-ui-orderlist.d.ts +58 -6
- package/types/caribeng-ui-organizationchart.d.ts +7 -1
- package/types/caribeng-ui-paginator.d.ts +3 -0
- package/types/caribeng-ui-panel.d.ts +3 -0
- package/types/caribeng-ui-panelmenu.d.ts +11 -1
- package/types/caribeng-ui-password.d.ts +4 -2
- package/types/caribeng-ui-pdfviewer.d.ts +258 -0
- package/types/caribeng-ui-phone-input.d.ts +168 -0
- package/types/caribeng-ui-picklist.d.ts +67 -7
- package/types/caribeng-ui-pricing.d.ts +49 -9
- package/types/caribeng-ui-qrcode.d.ts +88 -0
- package/types/caribeng-ui-rating.d.ts +6 -2
- package/types/caribeng-ui-repeater.d.ts +79 -0
- package/types/caribeng-ui-result.d.ts +35 -0
- package/types/caribeng-ui-scrollpanel.d.ts +4 -1
- package/types/caribeng-ui-scrolltop.d.ts +4 -1
- package/types/caribeng-ui-select.d.ts +73 -9
- package/types/caribeng-ui-sidebar.d.ts +167 -0
- package/types/caribeng-ui-slider.d.ts +63 -10
- package/types/caribeng-ui-speeddial.d.ts +5 -2
- package/types/caribeng-ui-spinner.d.ts +3 -0
- package/types/caribeng-ui-splitbutton.d.ts +49 -0
- package/types/caribeng-ui-splitter.d.ts +3 -0
- package/types/caribeng-ui-statistic.d.ts +65 -0
- package/types/caribeng-ui-stepper.d.ts +5 -0
- package/types/caribeng-ui-steps.d.ts +4 -1
- package/types/caribeng-ui-table.d.ts +185 -17
- package/types/caribeng-ui-tabmenu.d.ts +11 -1
- package/types/caribeng-ui-terminal.d.ts +10 -0
- package/types/caribeng-ui-themetoggle.d.ts +32 -0
- package/types/caribeng-ui-tieredmenu.d.ts +22 -3
- package/types/caribeng-ui-timeline.d.ts +63 -4
- package/types/caribeng-ui-toast.d.ts +3 -0
- package/types/caribeng-ui-togglebutton.d.ts +5 -3
- package/types/caribeng-ui-toolbar.d.ts +7 -4
- package/types/caribeng-ui-tree.d.ts +76 -4
- package/types/caribeng-ui-treeselect.d.ts +10 -2
- package/types/caribeng-ui-treetable.d.ts +68 -4
- package/types/caribeng-ui-virtualscroller.d.ts +45 -5
- package/types/caribeng-ui.d.ts +775 -12
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
<p align="center">
|
|
9
9
|
<img alt="Angular 22" src="https://img.shields.io/badge/Angular-22-dd0031.svg?style=flat-square" />
|
|
10
|
-
<img alt="Entry points" src="https://img.shields.io/badge/entry%20points-
|
|
10
|
+
<img alt="Entry points" src="https://img.shields.io/badge/entry%20points-162-10b981.svg?style=flat-square" />
|
|
11
11
|
<img alt="Licencia MIT" src="https://img.shields.io/badge/licencia-MIT-blue.svg?style=flat-square" />
|
|
12
12
|
</p>
|
|
13
13
|
|
|
@@ -15,13 +15,14 @@
|
|
|
15
15
|
|
|
16
16
|
## ✨ Características
|
|
17
17
|
|
|
18
|
-
- **
|
|
18
|
+
- **162 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).
|
|
22
22
|
- **Tematizables:** tokens CSS `--cb-*`, modo claro/oscuro y presets de color que se cambian en caliente.
|
|
23
23
|
- **Caribe Design:** 45 componentes adicionales del sistema Caribe (`@caribeng/ui/caribe/*`).
|
|
24
|
-
- **Iconos incluidos:**
|
|
24
|
+
- **Iconos incluidos:** 363 iconos núcleo listos para usar y un catálogo opcional de 1891 iconos.
|
|
25
|
+
- **Migración desde PrimeNG:** un schematic traduce imports, plantillas e iconos y deja un informe con lo pendiente ([ver más](#migrar-desde-primeng)).
|
|
25
26
|
|
|
26
27
|
## 🖥 Compatibilidad
|
|
27
28
|
|
|
@@ -42,7 +43,23 @@ Navegadores: los mismos que [soporta Angular](https://angular.dev/reference/vers
|
|
|
42
43
|
- `@angular/cdk` se instala automáticamente como dependencia (overlays y accesibilidad).
|
|
43
44
|
- npm, yarn o pnpm.
|
|
44
45
|
|
|
45
|
-
###
|
|
46
|
+
### Instalación rápida (recomendada)
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
ng add @caribeng/ui
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Pregunta el idioma, el tema y el color primario, y deja el proyecto listo:
|
|
53
|
+
|
|
54
|
+
- instala `@caribeng/ui` (y `@angular/cdk`),
|
|
55
|
+
- registra `provideCaribeNG({ locale, theme, preset })` en `app.config.ts` (o en `AppModule`),
|
|
56
|
+
- añade `@caribeng/ui/styles.css` a los estilos de `angular.json`.
|
|
57
|
+
|
|
58
|
+
Se puede ejecutar sin preguntas: `ng add @caribeng/ui --locale=en --theme=system --preset=ocean --skip-confirmation`. Volver a ejecutarlo no duplica nada.
|
|
59
|
+
|
|
60
|
+
Después, salta al paso [3. Verifica la instalación](#3-verifica-la-instalación).
|
|
61
|
+
|
|
62
|
+
### Instalación manual
|
|
46
63
|
|
|
47
64
|
```bash
|
|
48
65
|
# npm
|
|
@@ -55,8 +72,91 @@ yarn add @caribeng/ui
|
|
|
55
72
|
pnpm add @caribeng/ui
|
|
56
73
|
```
|
|
57
74
|
|
|
75
|
+
### Migrar desde PrimeNG
|
|
76
|
+
|
|
77
|
+
En un proyecto con PrimeNG 18 o superior, instala CaribeNG y ejecuta el migrador:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npm install @caribeng/ui@22
|
|
81
|
+
ng generate @caribeng/ui:migrate-from-primeng
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
> Haz commit (o una copia) antes de ejecutarlo para poder revisar los cambios con `git diff`. Con `--dry-run` ves qué archivos cambiaría sin escribir nada. Si ejecutas `ng add @caribeng/ui` en un proyecto con PrimeNG, te recordará este comando.
|
|
85
|
+
|
|
86
|
+
```html
|
|
87
|
+
<!-- Antes -->
|
|
88
|
+
<p-button label="Guardar" icon="pi pi-check" [outlined]="true" (onClick)="guardar()" />
|
|
89
|
+
<input pInputText id="email" [(ngModel)]="email" />
|
|
90
|
+
<p-dialog header="Editar" [(visible)]="abierto" [modal]="true" [style]="{ width: '25rem' }">…</p-dialog>
|
|
91
|
+
|
|
92
|
+
<!-- Después -->
|
|
93
|
+
<cb-button variant="outlined" (click)="guardar()"><cb-icon name="check" />Guardar</cb-button>
|
|
94
|
+
<cb-input inputId="email" [(ngModel)]="email" />
|
|
95
|
+
<cb-dialog header="Editar" [(visible)]="abierto" width="25rem">…</cb-dialog>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Qué hace:
|
|
99
|
+
|
|
100
|
+
- cambia los imports de PrimeNG por los de CaribeNG (`ButtonModule` → `CbButton`, `providePrimeNG()` → `provideCaribeNG()`) y añade a cada componente los que usa su plantilla,
|
|
101
|
+
- traduce las plantillas con sus inputs y eventos (`[outlined]` → `variant`, `size="small"` → `size="sm"`, `(onClick)` → `(click)`, `subheader` → `subtitle`…), incluido el pie de Dialog y Card (`#footer` → `<div cb-dialog-footer>` / `<div cb-card-footer>`),
|
|
102
|
+
- cambia `MessageService` por `CbToastService`: traduce los mensajes (`severity: 'error'` → `'danger'`, `'warn'` → `'warning'`, `sticky: true` → `life: 0`) y lo quita de los `providers`, porque `CbToastService` es único para toda la app,
|
|
103
|
+
- convierte los iconos `pi pi-*` en `<cb-icon>` y registra con `provideCbIcons` los que no están en el set núcleo,
|
|
104
|
+
- quita PrimeIcons de `angular.json` y de las hojas de estilo, y añade `@caribeng/ui/styles.css`,
|
|
105
|
+
- quita `primeng`, `primeicons` y `@primeuix/*` de `package.json` **solo cuando ya no queda ninguna referencia**; mientras tanto las dos librerías conviven.
|
|
106
|
+
|
|
107
|
+
Lo que no puede traducir con seguridad (un input sin equivalente, una plantilla `#header` personalizada, un `pButton` sobre un enlace…) lo marca con un comentario junto al código, conservando el atributo original:
|
|
108
|
+
|
|
109
|
+
```html
|
|
110
|
+
<!-- TODO(caribeng): [rounded]="true" — cb-button no tiene variante redondeada; usa una clase propia o <cb-icon-button>. -->
|
|
111
|
+
<cb-button severity="danger">Borrar</cb-button>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Todos los avisos, las referencias a PrimeNG que aún quedan (por ejemplo componentes que el migrador no traduce todavía) y los imports que haya que añadir a mano se resumen en `caribeng-migration-report.md`, con archivo y línea.
|
|
115
|
+
|
|
116
|
+
**Componentes que traduce hoy:**
|
|
117
|
+
|
|
118
|
+
| PrimeNG | CaribeNG |
|
|
119
|
+
|---|---|
|
|
120
|
+
| `<p-button>`, `<button pButton>` | `<cb-button>` |
|
|
121
|
+
| `<input pInputText>` | `<cb-input>` |
|
|
122
|
+
| `<textarea pTextarea>`, `<textarea pInputTextarea>` | `<cb-textarea>` |
|
|
123
|
+
| `<p-inputnumber>` | `<cb-input-number>` |
|
|
124
|
+
| `<p-select>`, `<p-dropdown>` | `<cb-select>` |
|
|
125
|
+
| `<p-multiselect>` | `<cb-multiselect>` |
|
|
126
|
+
| `<p-toggleswitch>`, `<p-inputSwitch>` | `<cb-toggle>` |
|
|
127
|
+
| `<p-datepicker>`, `<p-calendar>` | `<cb-datepicker>` |
|
|
128
|
+
| `<p-dialog>` | `<cb-dialog>` |
|
|
129
|
+
| `<p-confirmdialog>` + `ConfirmationService` | `<cb-confirm-dialog service>` + `CbConfirmationService` |
|
|
130
|
+
| `<p-confirmpopup>` | `<cb-confirm-popup service>` |
|
|
131
|
+
| `<p-menu>`, `<p-menubar>`, `<p-tieredmenu>`, `<p-panelmenu>`, `<p-breadcrumb>`, `<p-tabmenu>` | `<cb-menu>`, `<cb-menubar>`, `<cb-tieredmenu>`, `<cb-panelmenu>`, `<cb-breadcrumb>`, `<cb-tabmenu>` |
|
|
132
|
+
| `MenuItem[]` (`icon`, `command`, `routerLink`…) | el tipo de item del menú que lo recibe (`CbMenubarItem[]`…) |
|
|
133
|
+
| `<p-splitbutton>` | `<cb-split-button>` |
|
|
134
|
+
| `<p-table>` (columnas escritas en `#header`/`#body` o dinámicas con `@for`) | `<cb-table [columns]>` + un `cbTableCell` por celda personalizada |
|
|
135
|
+
| `<p-tabs>` (y `<p-tabView>`) | `<cb-tabs>` + `<cb-tab label="…">` |
|
|
136
|
+
| `<p-accordion>` (y `<p-accordionTab>`) | `<cb-accordion>` + `<cb-accordion-panel header="…">` |
|
|
137
|
+
| `<p-tag>` | `<cb-tag>` |
|
|
138
|
+
| `<p-toast>` + `MessageService` | `<cb-toast>` + `CbToastService` |
|
|
139
|
+
| `<p-card>` | `<cb-card>` |
|
|
140
|
+
| `pTooltip` (en cualquier elemento) | `cbTooltip` |
|
|
141
|
+
| `<p-checkbox>` | `<cb-checkbox>` |
|
|
142
|
+
| `<i class="pi pi-*">` | `<cb-icon>` |
|
|
143
|
+
|
|
144
|
+
En los menús, los arrays de `MenuItem` cambian de tipo según el menú que los recibe en la plantilla; `icon: 'pi pi-plus'` pasa a `'plus'`, `command` y `visible` se conservan, y `routerLink: '/x'` pasa a `url` (los `routerLink` con parámetros quedan con aviso). En las tablas, cada `<th>`/`<td>` pasa a una columna de `[columns]` (`pSortableColumn` → `sortable`, `<p-columnFilter>` → `filter`, `pFrozenColumn` → `frozen`); las celdas que no son solo `{{ fila.campo }}` pasan a un `<ng-template cbTableCell>` con su contenido migrado, y las columnas de checkbox y de expandir desaparecen porque `cb-table` las pone sola. Con columnas dinámicas (`[columns]="cols"` + `@for`), `cols` pasa directamente a `[columns]`: el migrador le añade `sortable: true` / `filter: true` si la cabecera los aplicaba a todas, y las ramas `@if (col.field === '…')` o `@switch (col.field)` del cuerpo pasan a un `cbTableCell` por campo. Las tablas con celdas de lógica genérica, varias filas por registro o plantillas sin equivalente se dejan con aviso y conservan `TableModule`, para que sigan compilando. Las pestañas y los acordeones de PrimeNG 18+ se reestructuran (la cabecera pasa a `label`/`header`); si se generan con `@for` o la cabecera lleva iconos, quedan con aviso.
|
|
145
|
+
|
|
146
|
+
Los radios (`<p-radiobutton>`) y los menús contextuales (`<p-contextmenu>`) se marcan con un aviso pero no se convierten, porque cambia la estructura de la página: en CaribeNG el modelo de los radios va en un `<cb-radio-group>` que envuelve las opciones, y `<cb-contextmenu>` envuelve el área sobre la que se abre en vez de apuntar a ella con `[target]`. El resto de componentes aparece en el informe para migrarlo a mano; se irán añadiendo en próximas versiones.
|
|
147
|
+
|
|
148
|
+
| Opción | Uso |
|
|
149
|
+
|---|---|
|
|
150
|
+
| `--path=src/app/ventas` | Migrar solo una carpeta (migración por partes). |
|
|
151
|
+
| `--remove-primeng=false` | No tocar las dependencias de `package.json`. |
|
|
152
|
+
| `--report=false` | No escribir el informe. |
|
|
153
|
+
| `--skip-install` | No instalar dependencias al terminar. |
|
|
154
|
+
| `--force` | Migrar aunque falte `@caribeng/ui` o la versión de PrimeNG sea anterior a la 18. |
|
|
155
|
+
|
|
58
156
|
## 🔨 Uso
|
|
59
157
|
|
|
158
|
+
> Con `ng add @caribeng/ui` los pasos 1 y 2 ya están hechos.
|
|
159
|
+
|
|
60
160
|
### 1. Proveedor
|
|
61
161
|
|
|
62
162
|
Añade `provideCaribeNG()` a los providers de tu `app.config.ts`. Todas las opciones son opcionales:
|
|
@@ -131,6 +231,28 @@ Todos los controles funcionan con Reactive Forms y con formularios por plantilla
|
|
|
131
231
|
<cb-input label="Correo" formControlName="email" error="Ingresa un correo válido" />
|
|
132
232
|
```
|
|
133
233
|
|
|
234
|
+
## 🌐 Idioma (i18n)
|
|
235
|
+
|
|
236
|
+
Los textos de interfaz de los componentes (etiquetas accesibles, botones, placeholders y mensajes) vienen en **español** (por defecto) e **inglés**:
|
|
237
|
+
|
|
238
|
+
```ts
|
|
239
|
+
provideCaribeNG({
|
|
240
|
+
locale: 'en', // 'es' | 'en' | objeto CbTranslation propio
|
|
241
|
+
translation: { noResults: 'Nothing here yet' }, // sobrescribe textos sueltos
|
|
242
|
+
});
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Cambio en caliente, sin recargar:
|
|
246
|
+
|
|
247
|
+
```ts
|
|
248
|
+
import { inject } from '@angular/core';
|
|
249
|
+
import { CbLocaleService } from '@caribeng/ui';
|
|
250
|
+
|
|
251
|
+
inject(CbLocaleService).use('en');
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Un texto pasado por input (por ejemplo `placeholder` o `emptyMessage`) siempre tiene prioridad sobre el idioma.
|
|
255
|
+
|
|
134
256
|
## 🎨 Tema claro/oscuro y presets
|
|
135
257
|
|
|
136
258
|
```ts
|
|
@@ -152,7 +274,7 @@ export class Header {
|
|
|
152
274
|
|
|
153
275
|
## 🔣 Iconos
|
|
154
276
|
|
|
155
|
-
Los
|
|
277
|
+
Los 363 iconos núcleo se registran solos:
|
|
156
278
|
|
|
157
279
|
```html
|
|
158
280
|
<cb-icon name="house" [size]="20" />
|
|
@@ -169,15 +291,15 @@ providers: [provideCbIcons({ 'heart-pulse': heartPulse, rocket })];
|
|
|
169
291
|
|
|
170
292
|
## 📚 Catálogo
|
|
171
293
|
|
|
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`.
|
|
174
|
-
- **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`.
|
|
294
|
+
- **Form:** `autocomplete`, `button`, `cascadeselect`, `checkbox`, `chips`, `colorpicker`, `datepicker`, `editor`, `fileupload`, `floatlabel`, `iconfield`, `input`, `input-number`, `inputgroup`, `inputmask`, `inputotp`, `keyfilter`, `knob`, `listbox`, `mentions`, `multiselect`, `password`, `phone-input`, `radio`, `rating`, `repeater`, `select`, `selectbutton`, `slider`, `textarea`, `toggle`, `togglebutton`, `treeselect`.
|
|
295
|
+
- **Data:** `dataview`, `descriptions`, `kanban`, `orderlist`, `organizationchart`, `paginator`, `picklist`, `statistic`, `table`, `timeline`, `tree`, `treetable`, `virtualscroller`.
|
|
296
|
+
- **Overlay:** `command-palette`, `confirmdialog`, `confirmpopup`, `dialog`, `drawer`, `dynamicdialog`, `popover`, `tooltip`.
|
|
297
|
+
- **Messages:** `badge`, `chat`, `chip`, `empty`, `inlinemessage`, `message`, `result`, `tag`, `toast`.
|
|
298
|
+
- **Menu:** `anchor`, `breadcrumb`, `contextmenu`, `dock`, `megamenu`, `menu`, `menubar`, `panelmenu`, `sidebar`, `speeddial`, `splitbutton`, `steps`, `tabmenu`, `tieredmenu`.
|
|
177
299
|
- **Panel:** `accordion`, `card`, `divider`, `fieldset`, `panel`, `scrollpanel`, `scrolltop`, `splitter`, `stepper`, `tabs`, `toolbar`.
|
|
178
|
-
- **Media:** `avatar`, `avatargroup`, `carousel`, `galleria`, `image`.
|
|
300
|
+
- **Media:** `avatar`, `avatargroup`, `carousel`, `galleria`, `image`, `pdfviewer`, `qrcode`.
|
|
179
301
|
- **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`.
|
|
302
|
+
- **Misc y directivas:** `animateonscroll`, `autofocus`, `blockui`, `chart`, `code-block`, `copy-button`, `focustrap`, `icon`, `icons`, `inplace`, `kbd`, `metergroup`, `progressbar`, `ripple`, `skeleton`, `spinner`, `styleclass`, `terminal`, `themetoggle`.
|
|
181
303
|
- **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
304
|
|
|
183
305
|
## 🧭 Próximos pasos
|
|
@@ -66,7 +66,7 @@ class CbAccordionPanel {
|
|
|
66
66
|
class="cb-accordion__header"
|
|
67
67
|
[id]="headerId"
|
|
68
68
|
[attr.aria-expanded]="open()"
|
|
69
|
-
[attr.aria-controls]="regionId"
|
|
69
|
+
[attr.aria-controls]="open() ? regionId : null"
|
|
70
70
|
[disabled]="disabled()"
|
|
71
71
|
(click)="toggle()"
|
|
72
72
|
>
|
|
@@ -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-
|
|
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,
|
|
@@ -99,7 +99,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
99
99
|
class="cb-accordion__header"
|
|
100
100
|
[id]="headerId"
|
|
101
101
|
[attr.aria-expanded]="open()"
|
|
102
|
-
[attr.aria-controls]="regionId"
|
|
102
|
+
[attr.aria-controls]="open() ? regionId : null"
|
|
103
103
|
[disabled]="disabled()"
|
|
104
104
|
(click)="toggle()"
|
|
105
105
|
>
|
|
@@ -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-
|
|
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(
|
|
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="
|
|
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-
|
|
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="
|
|
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-
|
|
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';
|
|
@@ -44,7 +44,7 @@ class CbAvatar {
|
|
|
44
44
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CbAvatar, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
45
45
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: CbAvatar, isStandalone: true, selector: "cb-avatar", inputs: { image: { classPropertyName: "image", publicName: "image", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, severity: { classPropertyName: "severity", publicName: "severity", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "'cb-avatar cb-avatar--' + shape() + ' cb-avatar--' + severity()", "style.width.px": "px()", "style.height.px": "px()", "style.font-size.px": "px() * 0.4", "attr.aria-label": "ariaLabel() || null", "attr.role": "ariaLabel() ? \"img\" : null" }, classAttribute: "cb-avatar" }, ngImport: i0, template: `
|
|
46
46
|
@if (image()) {
|
|
47
|
-
<img class="cb-avatar__img" [src]="image()"
|
|
47
|
+
<img class="cb-avatar__img" [src]="image()" alt="" />
|
|
48
48
|
} @else if (icon()) {
|
|
49
49
|
<cb-icon [name]="icon()" [size]="px() * 0.5" aria-hidden="true" />
|
|
50
50
|
} @else {
|
|
@@ -64,7 +64,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
64
64
|
'[attr.role]': 'ariaLabel() ? "img" : null',
|
|
65
65
|
}, template: `
|
|
66
66
|
@if (image()) {
|
|
67
|
-
<img class="cb-avatar__img" [src]="image()"
|
|
67
|
+
<img class="cb-avatar__img" [src]="image()" alt="" />
|
|
68
68
|
} @else if (icon()) {
|
|
69
69
|
<cb-icon [name]="icon()" [size]="px() * 0.5" aria-hidden="true" />
|
|
70
70
|
} @else {
|
|
@@ -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
|
+
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.
|