cax-design-system 2.8.4 → 3.0.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 +46 -46
- package/api/confirmation.d.ts +4 -10
- package/api/message.d.ts +0 -1
- package/autocomplete/autocomplete.d.ts +23 -6
- package/autocomplete/autocomplete.module.d.ts +8 -7
- package/avatar/avatar.d.ts +23 -1
- package/badge/badge.d.ts +4 -0
- package/button/button.d.ts +8 -1
- package/button/button.directive.d.ts +3 -1
- package/calendar/calendar.d.ts +33 -11
- package/card/card.d.ts +2 -6
- package/cascadeselect/cascadeselect.d.ts +32 -2
- package/categorycard/categorycard.d.ts +11 -0
- package/categorycard/categorycard.module.d.ts +7 -0
- package/categorycard/index.d.ts +5 -0
- package/categorycard/public_api.d.ts +2 -0
- package/checkbox/checkbox.d.ts +2 -2
- package/chip/chip.d.ts +3 -4
- package/commentbox/commentbox.d.ts +1 -1
- package/comments/comments.d.ts +83 -0
- package/comments/comments.module.d.ts +7 -0
- package/{chips → comments}/index.d.ts +1 -1
- package/comments/public_api.d.ts +2 -0
- package/comparecard/comaparecard.module.d.ts +11 -0
- package/comparecard/comparecard.component.d.ts +44 -0
- package/comparecard/index.d.ts +5 -0
- package/comparecard/public_api.d.ts +2 -0
- package/confirmdialog/confirmdialog.d.ts +13 -22
- package/divider/divider.d.ts +9 -1
- package/dom/domhandler.d.ts +2 -2
- package/dropdown/dropdown-item.d.ts +2 -1
- package/dropdown/dropdown.d.ts +24 -2
- package/editor/editor.d.ts +6 -1
- package/fesm2022/cax-design-system-accordion.mjs +22 -17
- package/fesm2022/cax-design-system-accordion.mjs.map +1 -1
- package/fesm2022/cax-design-system-animate.mjs +7 -7
- package/fesm2022/cax-design-system-animate.mjs.map +1 -1
- package/fesm2022/cax-design-system-animateonscroll.mjs +7 -7
- package/fesm2022/cax-design-system-animateonscroll.mjs.map +1 -1
- package/fesm2022/cax-design-system-api.mjs +37 -37
- package/fesm2022/cax-design-system-api.mjs.map +1 -1
- package/fesm2022/cax-design-system-autocomplete.mjs +101 -47
- package/fesm2022/cax-design-system-autocomplete.mjs.map +1 -1
- package/fesm2022/cax-design-system-autofocus.mjs +7 -7
- package/fesm2022/cax-design-system-autofocus.mjs.map +1 -1
- package/fesm2022/cax-design-system-avatar.mjs +39 -8
- package/fesm2022/cax-design-system-avatar.mjs.map +1 -1
- package/fesm2022/cax-design-system-avatargroup.mjs +8 -8
- package/fesm2022/cax-design-system-avatargroup.mjs.map +1 -1
- package/fesm2022/cax-design-system-badge.mjs +16 -12
- package/fesm2022/cax-design-system-badge.mjs.map +1 -1
- package/fesm2022/cax-design-system-baseicon.mjs +3 -3
- package/fesm2022/cax-design-system-baseicon.mjs.map +1 -1
- package/fesm2022/cax-design-system-blockui.mjs +7 -7
- package/fesm2022/cax-design-system-blockui.mjs.map +1 -1
- package/fesm2022/cax-design-system-breadcrumb.mjs +10 -11
- package/fesm2022/cax-design-system-breadcrumb.mjs.map +1 -1
- package/fesm2022/cax-design-system-button.mjs +93 -39
- package/fesm2022/cax-design-system-button.mjs.map +1 -1
- package/fesm2022/cax-design-system-buttongroup.mjs +7 -7
- package/fesm2022/cax-design-system-buttongroup.mjs.map +1 -1
- package/fesm2022/cax-design-system-calendar.mjs +388 -100
- package/fesm2022/cax-design-system-calendar.mjs.map +1 -1
- package/fesm2022/cax-design-system-card.mjs +12 -25
- package/fesm2022/cax-design-system-card.mjs.map +1 -1
- package/fesm2022/cax-design-system-carousel.mjs +7 -7
- package/fesm2022/cax-design-system-carousel.mjs.map +1 -1
- package/fesm2022/cax-design-system-cascadeselect.mjs +90 -30
- package/fesm2022/cax-design-system-cascadeselect.mjs.map +1 -1
- package/fesm2022/cax-design-system-categorycard.mjs +57 -0
- package/fesm2022/cax-design-system-categorycard.mjs.map +1 -0
- package/fesm2022/cax-design-system-chart.mjs +7 -7
- package/fesm2022/cax-design-system-chart.mjs.map +1 -1
- package/fesm2022/cax-design-system-checkbox.mjs +15 -14
- package/fesm2022/cax-design-system-checkbox.mjs.map +1 -1
- package/fesm2022/cax-design-system-chip.mjs +14 -12
- package/fesm2022/cax-design-system-chip.mjs.map +1 -1
- package/fesm2022/cax-design-system-colorpicker.mjs +8 -8
- package/fesm2022/cax-design-system-colorpicker.mjs.map +1 -1
- package/fesm2022/cax-design-system-commentbox.mjs +8 -8
- package/fesm2022/cax-design-system-commentbox.mjs.map +1 -1
- package/fesm2022/cax-design-system-comments.mjs +385 -0
- package/fesm2022/cax-design-system-comments.mjs.map +1 -0
- package/fesm2022/cax-design-system-comparecard.mjs +143 -0
- package/fesm2022/cax-design-system-comparecard.mjs.map +1 -0
- package/fesm2022/cax-design-system-confirmdialog.mjs +54 -50
- package/fesm2022/cax-design-system-confirmdialog.mjs.map +1 -1
- package/fesm2022/cax-design-system-confirmpopup.mjs +8 -8
- package/fesm2022/cax-design-system-confirmpopup.mjs.map +1 -1
- package/fesm2022/cax-design-system-contextmenu.mjs +10 -10
- package/fesm2022/cax-design-system-contextmenu.mjs.map +1 -1
- package/fesm2022/cax-design-system-dataview.mjs +10 -10
- package/fesm2022/cax-design-system-dataview.mjs.map +1 -1
- package/fesm2022/cax-design-system-defer.mjs +7 -7
- package/fesm2022/cax-design-system-defer.mjs.map +1 -1
- package/fesm2022/cax-design-system-dialog.mjs +12 -13
- package/fesm2022/cax-design-system-dialog.mjs.map +1 -1
- package/fesm2022/cax-design-system-divider.mjs +21 -11
- package/fesm2022/cax-design-system-divider.mjs.map +1 -1
- package/fesm2022/cax-design-system-dock.mjs +7 -7
- package/fesm2022/cax-design-system-dock.mjs.map +1 -1
- package/fesm2022/cax-design-system-dom.mjs +16 -6
- package/fesm2022/cax-design-system-dom.mjs.map +1 -1
- package/fesm2022/cax-design-system-dragdrop.mjs +10 -10
- package/fesm2022/cax-design-system-dragdrop.mjs.map +1 -1
- package/fesm2022/cax-design-system-dropdown.mjs +57 -22
- package/fesm2022/cax-design-system-dropdown.mjs.map +1 -1
- package/fesm2022/cax-design-system-dynamicdialog.mjs +15 -15
- package/fesm2022/cax-design-system-dynamicdialog.mjs.map +1 -1
- package/fesm2022/cax-design-system-editor.mjs +55 -15
- package/fesm2022/cax-design-system-editor.mjs.map +1 -1
- package/fesm2022/cax-design-system-fieldset.mjs +8 -8
- package/fesm2022/cax-design-system-fieldset.mjs.map +1 -1
- package/fesm2022/cax-design-system-fileupload.mjs +7 -7
- package/fesm2022/cax-design-system-fileupload.mjs.map +1 -1
- package/fesm2022/cax-design-system-floatlabel.mjs +7 -7
- package/fesm2022/cax-design-system-floatlabel.mjs.map +1 -1
- package/fesm2022/cax-design-system-focustrap.mjs +7 -7
- package/fesm2022/cax-design-system-focustrap.mjs.map +1 -1
- package/fesm2022/cax-design-system-galleria.mjs +19 -19
- package/fesm2022/cax-design-system-galleria.mjs.map +1 -1
- package/fesm2022/cax-design-system-iconfield.mjs +7 -7
- package/fesm2022/cax-design-system-iconfield.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-angledoubledown.mjs +3 -3
- package/fesm2022/cax-design-system-icons-angledoubledown.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-angledoubleleft.mjs +3 -3
- package/fesm2022/cax-design-system-icons-angledoubleleft.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-angledoubleright.mjs +3 -3
- package/fesm2022/cax-design-system-icons-angledoubleright.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-angledoubleup.mjs +3 -3
- package/fesm2022/cax-design-system-icons-angledoubleup.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-angledown.mjs +4 -4
- package/fesm2022/cax-design-system-icons-angledown.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-angleleft.mjs +3 -3
- package/fesm2022/cax-design-system-icons-angleleft.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-angleright.mjs +3 -3
- package/fesm2022/cax-design-system-icons-angleright.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-angleup.mjs +4 -4
- package/fesm2022/cax-design-system-icons-angleup.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-arrowdown.mjs +4 -4
- package/fesm2022/cax-design-system-icons-arrowdown.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-arrowdownleft.mjs +3 -3
- package/fesm2022/cax-design-system-icons-arrowdownleft.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-arrowdownright.mjs +3 -3
- package/fesm2022/cax-design-system-icons-arrowdownright.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-arrowleft.mjs +3 -3
- package/fesm2022/cax-design-system-icons-arrowleft.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-arrowright.mjs +3 -3
- package/fesm2022/cax-design-system-icons-arrowright.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-arrowup.mjs +4 -4
- package/fesm2022/cax-design-system-icons-arrowup.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-ban.mjs +3 -3
- package/fesm2022/cax-design-system-icons-ban.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-bars.mjs +3 -3
- package/fesm2022/cax-design-system-icons-bars.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-blank.mjs +4 -4
- package/fesm2022/cax-design-system-icons-blank.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-calendar.mjs +4 -4
- package/fesm2022/cax-design-system-icons-calendar.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-caretleft.mjs +3 -3
- package/fesm2022/cax-design-system-icons-caretleft.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-caretright.mjs +3 -3
- package/fesm2022/cax-design-system-icons-caretright.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-check.mjs +4 -4
- package/fesm2022/cax-design-system-icons-check.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-chevrondown.mjs +4 -4
- package/fesm2022/cax-design-system-icons-chevrondown.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-chevronleft.mjs +3 -3
- package/fesm2022/cax-design-system-icons-chevronleft.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-chevronright.mjs +4 -4
- package/fesm2022/cax-design-system-icons-chevronright.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-chevronup.mjs +4 -4
- package/fesm2022/cax-design-system-icons-chevronup.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-exclamationtriangle.mjs +3 -3
- package/fesm2022/cax-design-system-icons-exclamationtriangle.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-eye.mjs +4 -4
- package/fesm2022/cax-design-system-icons-eye.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-eyeslash.mjs +3 -3
- package/fesm2022/cax-design-system-icons-eyeslash.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-filter.mjs +3 -3
- package/fesm2022/cax-design-system-icons-filter.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-filterslash.mjs +4 -4
- package/fesm2022/cax-design-system-icons-filterslash.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-home.mjs +3 -3
- package/fesm2022/cax-design-system-icons-home.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-infocircle.mjs +3 -3
- package/fesm2022/cax-design-system-icons-infocircle.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-minus.mjs +3 -3
- package/fesm2022/cax-design-system-icons-minus.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-pencil.mjs +3 -3
- package/fesm2022/cax-design-system-icons-pencil.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-plus.mjs +4 -4
- package/fesm2022/cax-design-system-icons-plus.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-refresh.mjs +4 -4
- package/fesm2022/cax-design-system-icons-refresh.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-search.mjs +4 -4
- package/fesm2022/cax-design-system-icons-search.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-searchminus.mjs +4 -4
- package/fesm2022/cax-design-system-icons-searchminus.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-searchplus.mjs +4 -4
- package/fesm2022/cax-design-system-icons-searchplus.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-sortalt.mjs +3 -3
- package/fesm2022/cax-design-system-icons-sortalt.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-sortamountdown.mjs +3 -3
- package/fesm2022/cax-design-system-icons-sortamountdown.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-sortamountupalt.mjs +3 -3
- package/fesm2022/cax-design-system-icons-sortamountupalt.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-spinner.mjs +4 -4
- package/fesm2022/cax-design-system-icons-spinner.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-star.mjs +3 -3
- package/fesm2022/cax-design-system-icons-star.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-starfill.mjs +3 -3
- package/fesm2022/cax-design-system-icons-starfill.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-thlarge.mjs +3 -3
- package/fesm2022/cax-design-system-icons-thlarge.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-times.mjs +4 -4
- package/fesm2022/cax-design-system-icons-times.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-timescircle.mjs +4 -4
- package/fesm2022/cax-design-system-icons-timescircle.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-trash.mjs +4 -4
- package/fesm2022/cax-design-system-icons-trash.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-undo.mjs +4 -4
- package/fesm2022/cax-design-system-icons-undo.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-upload.mjs +3 -3
- package/fesm2022/cax-design-system-icons-upload.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-windowmaximize.mjs +3 -3
- package/fesm2022/cax-design-system-icons-windowmaximize.mjs.map +1 -1
- package/fesm2022/cax-design-system-icons-windowminimize.mjs +3 -3
- package/fesm2022/cax-design-system-icons-windowminimize.mjs.map +1 -1
- package/fesm2022/cax-design-system-image.mjs +8 -8
- package/fesm2022/cax-design-system-image.mjs.map +1 -1
- package/fesm2022/cax-design-system-inplace.mjs +13 -13
- package/fesm2022/cax-design-system-inplace.mjs.map +1 -1
- package/fesm2022/{cax-design-system-chips.mjs → cax-design-system-inputchips.mjs} +66 -27
- package/fesm2022/cax-design-system-inputchips.mjs.map +1 -0
- package/fesm2022/cax-design-system-inputgroup.mjs +54 -10
- package/fesm2022/cax-design-system-inputgroup.mjs.map +1 -1
- package/fesm2022/cax-design-system-inputgroupaddon.mjs +8 -8
- package/fesm2022/cax-design-system-inputgroupaddon.mjs.map +1 -1
- package/fesm2022/cax-design-system-inputicon.mjs +7 -7
- package/fesm2022/cax-design-system-inputicon.mjs.map +1 -1
- package/fesm2022/cax-design-system-inputmask.mjs +33 -20
- package/fesm2022/cax-design-system-inputmask.mjs.map +1 -1
- package/fesm2022/cax-design-system-inputnumber.mjs +64 -30
- package/fesm2022/cax-design-system-inputnumber.mjs.map +1 -1
- package/fesm2022/cax-design-system-inputotp.mjs +7 -7
- package/fesm2022/cax-design-system-inputotp.mjs.map +1 -1
- package/fesm2022/cax-design-system-inputswitch.mjs +7 -7
- package/fesm2022/cax-design-system-inputswitch.mjs.map +1 -1
- package/fesm2022/cax-design-system-inputtext.mjs +30 -14
- package/fesm2022/cax-design-system-inputtext.mjs.map +1 -1
- package/fesm2022/cax-design-system-inputtextarea.mjs +49 -18
- package/fesm2022/cax-design-system-inputtextarea.mjs.map +1 -1
- package/fesm2022/cax-design-system-keyfilter.mjs +7 -7
- package/fesm2022/cax-design-system-keyfilter.mjs.map +1 -1
- package/fesm2022/cax-design-system-knob.mjs +7 -7
- package/fesm2022/cax-design-system-knob.mjs.map +1 -1
- package/fesm2022/cax-design-system-listbox.mjs +39 -369
- package/fesm2022/cax-design-system-listbox.mjs.map +1 -1
- package/fesm2022/cax-design-system-logo.mjs +8 -8
- package/fesm2022/cax-design-system-logo.mjs.map +1 -1
- package/fesm2022/cax-design-system-logocard.mjs +37 -0
- package/fesm2022/cax-design-system-logocard.mjs.map +1 -0
- package/fesm2022/cax-design-system-megamenu.mjs +10 -10
- package/fesm2022/cax-design-system-megamenu.mjs.map +1 -1
- package/fesm2022/cax-design-system-menu.mjs +15 -15
- package/fesm2022/cax-design-system-menu.mjs.map +1 -1
- package/fesm2022/cax-design-system-menubar.mjs +13 -13
- package/fesm2022/cax-design-system-menubar.mjs.map +1 -1
- package/fesm2022/cax-design-system-message.mjs +7 -7
- package/fesm2022/cax-design-system-message.mjs.map +1 -1
- package/fesm2022/cax-design-system-messages.mjs +17 -44
- package/fesm2022/cax-design-system-messages.mjs.map +1 -1
- package/fesm2022/cax-design-system-metergroup.mjs +10 -10
- package/fesm2022/cax-design-system-metergroup.mjs.map +1 -1
- package/fesm2022/cax-design-system-multiselect.mjs +58 -24
- package/fesm2022/cax-design-system-multiselect.mjs.map +1 -1
- package/fesm2022/cax-design-system-navigation.mjs +193 -105
- package/fesm2022/cax-design-system-navigation.mjs.map +1 -1
- package/fesm2022/cax-design-system-orderlist.mjs +7 -7
- package/fesm2022/cax-design-system-orderlist.mjs.map +1 -1
- package/fesm2022/cax-design-system-organizationchart.mjs +11 -11
- package/fesm2022/cax-design-system-organizationchart.mjs.map +1 -1
- package/fesm2022/cax-design-system-overlay.mjs +8 -8
- package/fesm2022/cax-design-system-overlay.mjs.map +1 -1
- package/fesm2022/cax-design-system-overlaypanel.mjs +17 -11
- package/fesm2022/cax-design-system-overlaypanel.mjs.map +1 -1
- package/fesm2022/cax-design-system-paginator.mjs +8 -8
- package/fesm2022/cax-design-system-paginator.mjs.map +1 -1
- package/fesm2022/cax-design-system-panel.mjs +8 -8
- package/fesm2022/cax-design-system-panel.mjs.map +1 -1
- package/fesm2022/cax-design-system-panelmenu.mjs +14 -14
- package/fesm2022/cax-design-system-panelmenu.mjs.map +1 -1
- package/fesm2022/cax-design-system-password.mjs +14 -14
- package/fesm2022/cax-design-system-password.mjs.map +1 -1
- package/fesm2022/cax-design-system-picklist.mjs +7 -7
- package/fesm2022/cax-design-system-picklist.mjs.map +1 -1
- package/fesm2022/cax-design-system-productcard.mjs +90 -0
- package/fesm2022/cax-design-system-productcard.mjs.map +1 -0
- package/fesm2022/cax-design-system-progressbar.mjs +31 -9
- package/fesm2022/cax-design-system-progressbar.mjs.map +1 -1
- package/fesm2022/cax-design-system-progressspinner.mjs +17 -15
- package/fesm2022/cax-design-system-progressspinner.mjs.map +1 -1
- package/fesm2022/cax-design-system-radiobutton.mjs +27 -15
- package/fesm2022/cax-design-system-radiobutton.mjs.map +1 -1
- package/fesm2022/cax-design-system-rating.mjs +7 -7
- package/fesm2022/cax-design-system-rating.mjs.map +1 -1
- package/fesm2022/cax-design-system-ripple.mjs +7 -7
- package/fesm2022/cax-design-system-ripple.mjs.map +1 -1
- package/fesm2022/cax-design-system-scroller.mjs +8 -8
- package/fesm2022/cax-design-system-scroller.mjs.map +1 -1
- package/fesm2022/cax-design-system-scrollpanel.mjs +7 -7
- package/fesm2022/cax-design-system-scrollpanel.mjs.map +1 -1
- package/fesm2022/cax-design-system-scrolltop.mjs +8 -8
- package/fesm2022/cax-design-system-scrolltop.mjs.map +1 -1
- package/fesm2022/cax-design-system-selectbutton.mjs +79 -9
- package/fesm2022/cax-design-system-selectbutton.mjs.map +1 -1
- package/fesm2022/cax-design-system-sidebar.mjs +10 -10
- package/fesm2022/cax-design-system-sidebar.mjs.map +1 -1
- package/fesm2022/cax-design-system-skeleton.mjs +11 -10
- package/fesm2022/cax-design-system-skeleton.mjs.map +1 -1
- package/fesm2022/cax-design-system-slidemenu.mjs +10 -10
- package/fesm2022/cax-design-system-slidemenu.mjs.map +1 -1
- package/fesm2022/cax-design-system-slider.mjs +14 -199
- package/fesm2022/cax-design-system-slider.mjs.map +1 -1
- package/fesm2022/cax-design-system-speeddial.mjs +16 -9
- package/fesm2022/cax-design-system-speeddial.mjs.map +1 -1
- package/fesm2022/cax-design-system-spinner.mjs +7 -7
- package/fesm2022/cax-design-system-spinner.mjs.map +1 -1
- package/fesm2022/cax-design-system-splitbutton.mjs +10 -13
- package/fesm2022/cax-design-system-splitbutton.mjs.map +1 -1
- package/fesm2022/cax-design-system-splitter.mjs +8 -8
- package/fesm2022/cax-design-system-splitter.mjs.map +1 -1
- package/fesm2022/cax-design-system-stepper.mjs +20 -20
- package/fesm2022/cax-design-system-stepper.mjs.map +1 -1
- package/fesm2022/cax-design-system-steps.mjs +30 -11
- package/fesm2022/cax-design-system-steps.mjs.map +1 -1
- package/fesm2022/cax-design-system-styleclass.mjs +7 -7
- package/fesm2022/cax-design-system-styleclass.mjs.map +1 -1
- package/fesm2022/cax-design-system-subscriptioncard.mjs +97 -0
- package/fesm2022/cax-design-system-subscriptioncard.mjs.map +1 -0
- package/fesm2022/cax-design-system-table-paginator.mjs +129 -0
- package/fesm2022/cax-design-system-table-paginator.mjs.map +1 -0
- package/fesm2022/cax-design-system-table.mjs +284 -400
- package/fesm2022/cax-design-system-table.mjs.map +1 -1
- package/fesm2022/cax-design-system-tableconfiguration.mjs +19 -10
- package/fesm2022/cax-design-system-tableconfiguration.mjs.map +1 -1
- package/fesm2022/cax-design-system-tabmenu.mjs +7 -7
- package/fesm2022/cax-design-system-tabmenu.mjs.map +1 -1
- package/fesm2022/cax-design-system-tabview.mjs +168 -95
- package/fesm2022/cax-design-system-tabview.mjs.map +1 -1
- package/fesm2022/cax-design-system-tag.mjs +71 -15
- package/fesm2022/cax-design-system-tag.mjs.map +1 -1
- package/fesm2022/cax-design-system-terminal.mjs +14 -14
- package/fesm2022/cax-design-system-terminal.mjs.map +1 -1
- package/fesm2022/cax-design-system-tieredmenu.mjs +21 -14
- package/fesm2022/cax-design-system-tieredmenu.mjs.map +1 -1
- package/fesm2022/cax-design-system-timeline.mjs +8 -8
- package/fesm2022/cax-design-system-timeline.mjs.map +1 -1
- package/fesm2022/cax-design-system-toast.mjs +13 -25
- package/fesm2022/cax-design-system-toast.mjs.map +1 -1
- package/fesm2022/cax-design-system-togglebutton.mjs +9 -9
- package/fesm2022/cax-design-system-togglebutton.mjs.map +1 -1
- package/fesm2022/cax-design-system-toggleswitch.mjs +26 -8
- package/fesm2022/cax-design-system-toggleswitch.mjs.map +1 -1
- package/fesm2022/cax-design-system-toolbar.mjs +7 -7
- package/fesm2022/cax-design-system-toolbar.mjs.map +1 -1
- package/fesm2022/cax-design-system-tooltip.mjs +40 -20
- package/fesm2022/cax-design-system-tooltip.mjs.map +1 -1
- package/fesm2022/cax-design-system-tree.mjs +12 -12
- package/fesm2022/cax-design-system-tree.mjs.map +1 -1
- package/fesm2022/cax-design-system-treeselect.mjs +8 -8
- package/fesm2022/cax-design-system-treeselect.mjs.map +1 -1
- package/fesm2022/cax-design-system-treetable.mjs +55 -55
- package/fesm2022/cax-design-system-treetable.mjs.map +1 -1
- package/fesm2022/cax-design-system-tristatecheckbox.mjs +8 -8
- package/fesm2022/cax-design-system-tristatecheckbox.mjs.map +1 -1
- package/fesm2022/cax-design-system-upload.mjs +209 -96
- package/fesm2022/cax-design-system-upload.mjs.map +1 -1
- package/fesm2022/cax-design-system-utils.mjs.map +1 -1
- package/fesm2022/cax-design-system-virtualscroller.mjs +7 -7
- package/fesm2022/cax-design-system-virtualscroller.mjs.map +1 -1
- package/fonts/Inter/Inter-Italic-VariableFont_opsz,wght.ttf +0 -0
- package/fonts/Inter/Inter-VariableFont_opsz,wght.ttf +0 -0
- package/fonts/Inter/OFL.txt +93 -0
- package/fonts/Inter/README.txt +118 -0
- package/fonts/Inter/static/Inter_18pt-Black.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-BlackItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-Bold.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-BoldItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-ExtraBold.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-ExtraBoldItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-ExtraLight.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-ExtraLightItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-Italic.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-Light.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-LightItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-Medium.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-MediumItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-Regular.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-SemiBold.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-SemiBoldItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-Thin.ttf +0 -0
- package/fonts/Inter/static/Inter_18pt-ThinItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-Black.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-BlackItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-Bold.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-BoldItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-ExtraBold.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-ExtraBoldItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-ExtraLight.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-ExtraLightItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-Italic.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-Light.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-LightItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-Medium.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-MediumItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-Regular.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-SemiBold.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-SemiBoldItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-Thin.ttf +0 -0
- package/fonts/Inter/static/Inter_24pt-ThinItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-Black.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-BlackItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-Bold.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-BoldItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-ExtraBold.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-ExtraBoldItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-ExtraLight.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-ExtraLightItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-Italic.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-Light.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-LightItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-Medium.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-MediumItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-Regular.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-SemiBold.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-SemiBoldItalic.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-Thin.ttf +0 -0
- package/fonts/Inter/static/Inter_28pt-ThinItalic.ttf +0 -0
- package/inputchips/index.d.ts +5 -0
- package/{chips/chips.d.ts → inputchips/inputchips.d.ts} +24 -6
- package/{chips/chips.interface.d.ts → inputchips/inputchips.interface.d.ts} +1 -1
- package/inputchips/inputchips.module.d.ts +14 -0
- package/inputchips/public_api.d.ts +3 -0
- package/inputgroup/inputgroup.d.ts +32 -1
- package/inputmask/inputmask.d.ts +9 -3
- package/inputnumber/inputnumber.d.ts +30 -4
- package/inputtext/inputtext.component.d.ts +2 -1
- package/inputtext/inputtext.directive.d.ts +3 -1
- package/inputtextarea/inputtextarea.component.d.ts +8 -1
- package/inputtextarea/inputtextarea.directive.d.ts +12 -1
- package/listbox/listbox.d.ts +14 -16
- package/listbox/listbox.module.d.ts +14 -0
- package/listbox/public_api.d.ts +1 -0
- package/logocard/index.d.ts +5 -0
- package/logocard/logocard.d.ts +6 -0
- package/logocard/logocard.module.d.ts +7 -0
- package/logocard/public_api.d.ts +2 -0
- package/messages/messages.d.ts +2 -11
- package/messages/messages.interface.d.ts +0 -2
- package/multiselect/multiselect.d.ts +28 -2
- package/navigation/navigation.d.ts +17 -12
- package/overlaypanel/overlaypanel.d.ts +6 -1
- package/package.json +240 -220
- package/productcard/index.d.ts +5 -0
- package/productcard/productcard.d.ts +19 -0
- package/productcard/productcard.module.d.ts +7 -0
- package/productcard/public_api.d.ts +2 -0
- package/progressbar/progressbar.d.ts +17 -2
- package/radiobutton/radiobutton.d.ts +1 -0
- package/resources/cax.min.scss +6351 -1
- package/resources/cax.scss +11281 -12539
- package/resources/components/accordion/accordion.scss +0 -46
- package/resources/components/autocomplete/autocomplete.scss +249 -184
- package/resources/components/avatar/avatar.scss +30 -34
- package/resources/components/avatargroup/avatargroup.scss +10 -10
- package/resources/components/badge/badge.scss +68 -67
- package/resources/components/blockui/blockui.css +26 -26
- package/resources/components/breadcrumb/breadcrumb.scss +36 -33
- package/resources/components/button/button.scss +160 -163
- package/resources/components/calendar/calendar.scss +368 -231
- package/resources/components/card/card.scss +9 -50
- package/resources/components/carousel/carousel.css +71 -71
- package/resources/components/cascadeselect/cascadeselect.scss +104 -105
- package/resources/components/categorycard/categorycard.scss +46 -0
- package/resources/components/checkbox/checkbox.scss +30 -30
- package/resources/components/chip/chip.scss +6 -6
- package/resources/components/colorpicker/colorpicker-images.scss +7 -7
- package/resources/components/colorpicker/colorpicker.scss +82 -82
- package/resources/components/commentbox/commentbox.scss +621 -611
- package/resources/components/comments/comments.scss +0 -0
- package/resources/components/common/common.scss +183 -183
- package/resources/components/comparecard/comparecard.component.scss +50 -0
- package/resources/components/confirmpopup/confirmpopup.css +53 -53
- package/resources/components/contextmenu/contextmenu.css +42 -42
- package/resources/components/dataview/dataview.css +13 -13
- package/resources/components/dialog/dialog.scss +193 -171
- package/resources/components/divider/divider.scss +0 -86
- package/resources/components/dock/dock.css +107 -107
- package/resources/components/dropdown/dropdown.scss +93 -94
- package/resources/components/editor/editor.scss +97 -4
- package/resources/components/fieldset/fieldset.css +30 -30
- package/resources/components/fileupload/fileupload.css +47 -47
- package/resources/components/galleria/galleria.css +281 -281
- package/resources/components/iconfield/iconfield.css +5 -5
- package/resources/components/image/image.scss +97 -92
- package/resources/components/inplace/inplace.css +19 -19
- package/resources/components/{chips/chips.scss → inputchips/inputchips.scss} +181 -205
- package/resources/components/inputicon/inputicon.css +6 -6
- package/resources/components/inputmask/inputmask.scss +48 -12
- package/resources/components/inputnumber/inputnumber.scss +109 -109
- package/resources/components/inputotp/inputotp.css +2 -2
- package/resources/components/inputswitch/inputswitch.css +23 -23
- package/resources/components/inputtext/inputtext.scss +138 -145
- package/resources/components/inputtextarea/inputtextarea.scss +15 -10
- package/resources/components/knob/knob.css +20 -20
- package/resources/components/listbox/listbox.scss +49 -0
- package/resources/components/logocard/logocard.scss +6 -0
- package/resources/components/megamenu/megamenu.css +108 -108
- package/resources/components/menu/menu.scss +31 -31
- package/resources/components/menubar/menubar.css +81 -81
- package/resources/components/message/message.css +17 -17
- package/resources/components/messages/messages.scss +53 -55
- package/resources/components/multiselect/multiselect.scss +132 -132
- package/resources/components/navigation/navigation.scss +236 -197
- package/resources/components/orderlist/orderlist.css +78 -78
- package/resources/components/organizationchart/organizationchart.css +62 -62
- package/resources/components/overlay/overlay.scss +80 -80
- package/resources/components/overlaypanel/overlaypanel.scss +84 -66
- package/resources/components/paginator/paginator.scss +41 -41
- package/resources/components/panel/panel.css +29 -29
- package/resources/components/panelmenu/panelmenu.css +45 -45
- package/resources/components/password/password.css +54 -54
- package/resources/components/picklist/picklist.css +60 -60
- package/resources/components/productcard/productcard.scss +95 -0
- package/resources/components/progressbar/progressbar.scss +107 -107
- package/resources/components/progressspinner/progressspinner.scss +0 -94
- package/resources/components/radiobutton/radiobutton.scss +34 -34
- package/resources/components/rating/rating.css +15 -15
- package/resources/components/ripple/ripple.scss +29 -29
- package/resources/components/scroller/scroller.scss +58 -58
- package/resources/components/scrollpanel/scrollpanel.css +50 -50
- package/resources/components/scrolltop/scrolltop.css +18 -18
- package/resources/components/sidebar/sidebar.scss +117 -117
- package/resources/components/skeleton/skeleton.scss +24 -25
- package/resources/components/slidemenu/slidemenu.css +100 -100
- package/resources/components/slider/{slider.css → slider.scss} +41 -41
- package/resources/components/speeddial/speeddial.scss +131 -122
- package/resources/components/spinner/spinner.css +63 -63
- package/resources/components/splitbutton/splitbutton.scss +57 -53
- package/resources/components/splitter/splitter.scss +73 -73
- package/resources/components/stepper/stepper.css +9 -9
- package/resources/components/steps/steps.scss +49 -50
- package/resources/components/subscriptioncard/subscriptioncard.component.scss +65 -0
- package/resources/components/table/table.scss +511 -458
- package/resources/components/table-paginator/table-paginator.component.scss +72 -0
- package/resources/components/tableconfiguration/tableconfiguration.scss +3 -125
- package/resources/components/tabmenu/tabmenu.css +80 -80
- package/resources/components/tabview/tabview.scss +206 -198
- package/resources/components/tag/tag.scss +7 -23
- package/resources/components/terminal/terminal.css +24 -24
- package/resources/components/tieredmenu/tieredmenu.scss +55 -55
- package/resources/components/timeline/timeline.scss +128 -128
- package/resources/components/toast/toast.scss +78 -87
- package/resources/components/toggleswitch/toggleswitch.scss +45 -36
- package/resources/components/toolbar/toolbar.css +19 -19
- package/resources/components/tooltip/tooltip.scss +124 -124
- package/resources/components/tree/tree.scss +154 -154
- package/resources/components/treeselect/treeselect.scss +114 -114
- package/resources/components/treetable/treetable.css +205 -205
- package/resources/components/upload/upload.component.scss +84 -145
- package/resources/fonts/Inter/Inter-Italic-VariableFont_opsz,wght.ttf +0 -0
- package/resources/fonts/Inter/Inter-VariableFont_opsz,wght.ttf +0 -0
- package/resources/fonts/Inter/OFL.txt +93 -0
- package/resources/fonts/Inter/README.txt +118 -0
- package/resources/fonts/Inter/static/Inter_18pt-Black.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-BlackItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-Bold.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-BoldItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-ExtraBold.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-ExtraBoldItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-ExtraLight.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-ExtraLightItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-Italic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-Light.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-LightItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-Medium.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-MediumItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-Regular.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-SemiBold.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-SemiBoldItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-Thin.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_18pt-ThinItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-Black.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-BlackItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-Bold.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-BoldItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-ExtraBold.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-ExtraBoldItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-ExtraLight.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-ExtraLightItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-Italic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-Light.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-LightItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-Medium.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-MediumItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-Regular.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-SemiBold.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-SemiBoldItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-Thin.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_24pt-ThinItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-Black.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-BlackItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-Bold.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-BoldItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-ExtraBold.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-ExtraBoldItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-ExtraLight.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-ExtraLightItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-Italic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-Light.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-LightItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-Medium.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-MediumItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-Regular.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-SemiBold.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-SemiBoldItalic.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-Thin.ttf +0 -0
- package/resources/fonts/Inter/static/Inter_28pt-ThinItalic.ttf +0 -0
- package/resources/logo/cax-intro-logo.svg +75 -0
- package/resources/logo/cax-sidebar-logo.svg +6 -0
- package/resources/logo/dataX-dark.svg +12 -12
- package/resources/logo/dataX-icon-dark.svg +5 -5
- package/resources/logo/dataX-icon.svg +5 -5
- package/resources/logo/dataX.svg +12 -12
- package/resources/styles/colors.scss +568 -397
- package/resources/styles/fonts.scss +15 -0
- package/resources/styles/transitions.scss +23 -0
- package/resources/styles/typography.scss +555 -116
- package/resources/styles/variables.scss +85 -0
- package/selectbutton/selectbutton.d.ts +50 -1
- package/slider/public_api.d.ts +1 -0
- package/slider/slider.d.ts +1 -8
- package/slider/slider.module.d.ts +9 -0
- package/speeddial/speeddial.d.ts +6 -1
- package/splitbutton/splitbutton.d.ts +2 -2
- package/steps/steps.d.ts +11 -4
- package/steps/steps.module.d.ts +2 -1
- package/subscriptioncard/index.d.ts +5 -0
- package/subscriptioncard/public_api.d.ts +2 -0
- package/subscriptioncard/subscriptioncard.component.d.ts +33 -0
- package/subscriptioncard/subscriptioncard.module.d.ts +11 -0
- package/table/components/column-filter/column-filter.d.ts +0 -34
- package/table/components/table-header-checkbox/table-header-checkbox.d.ts +3 -1
- package/table/directives/cell-extend.directive.d.ts +14 -0
- package/table/directives/cell-highlight.directive.d.ts +4 -6
- package/table/public_api.d.ts +1 -0
- package/table/table.d.ts +34 -60
- package/table/table.interface.d.ts +21 -0
- package/table/table.module.d.ts +4 -3
- package/table-paginator/index.d.ts +5 -0
- package/table-paginator/public_api.d.ts +3 -0
- package/table-paginator/table-paginator.component.d.ts +28 -0
- package/table-paginator/table-paginator.interface.d.ts +21 -0
- package/table-paginator/table-paginator.module.d.ts +9 -0
- package/tableconfiguration/tableconfiguration.d.ts +3 -1
- package/tabview/tabview.d.ts +14 -12
- package/tabview/tabview.module.d.ts +2 -1
- package/tag/tag.d.ts +43 -5
- package/terminal/terminal.d.ts +1 -1
- package/tieredmenu/tieredmenu.d.ts +6 -1
- package/toast/toast.d.ts +1 -9
- package/toggleswitch/toggleswitch.d.ts +5 -0
- package/upload/upload.component.d.ts +51 -19
- package/chips/chips.module.d.ts +0 -14
- package/chips/public_api.d.ts +0 -3
- package/fesm2022/cax-design-system-chips.mjs.map +0 -1
- package/resources/components/listbox/listbox.css +0 -40
- package/resources/styles/shadow-blur.scss +0 -22
- package/resources/styles/space-radius-border.scss +0 -49
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { EventEmitter, ViewChild, Output, Input, Component, NgModule } from '@angular/core';
|
|
3
|
+
import * as i1 from '@angular/common';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import * as i5 from '@angular/forms';
|
|
6
|
+
import { FormsModule } from '@angular/forms';
|
|
7
|
+
import { Avatar } from 'cax-design-system/avatar';
|
|
8
|
+
import * as i2 from 'cax-design-system/button';
|
|
9
|
+
import { ButtonModule } from 'cax-design-system/button';
|
|
10
|
+
import * as i4 from 'cax-design-system/editor';
|
|
11
|
+
import { EditorModule } from 'cax-design-system/editor';
|
|
12
|
+
import * as i6 from 'cax-design-system/overlaypanel';
|
|
13
|
+
import { OverlayPanelModule } from 'cax-design-system/overlaypanel';
|
|
14
|
+
import { ListboxModule } from 'cax-design-system/listbox';
|
|
15
|
+
import * as i3 from 'cax-design-system/api';
|
|
16
|
+
import { SharedModule } from 'cax-design-system/api';
|
|
17
|
+
import { ChipModule } from 'cax-design-system/chip';
|
|
18
|
+
|
|
19
|
+
class CommentsComponent {
|
|
20
|
+
cdr;
|
|
21
|
+
scrollContainer;
|
|
22
|
+
suggestionOverlay;
|
|
23
|
+
visibilityObserver;
|
|
24
|
+
_comments = [];
|
|
25
|
+
groupedComments = [];
|
|
26
|
+
isRichText = false;
|
|
27
|
+
commentValue = '';
|
|
28
|
+
// Suggestion state
|
|
29
|
+
isSuggestionVisible = false;
|
|
30
|
+
suggestionType = null;
|
|
31
|
+
filteredSuggestions = [];
|
|
32
|
+
triggerIndex = -1;
|
|
33
|
+
attachedFiles = [];
|
|
34
|
+
lastBounds = null;
|
|
35
|
+
constructor(cdr) {
|
|
36
|
+
this.cdr = cdr;
|
|
37
|
+
}
|
|
38
|
+
ngAfterViewInit() {
|
|
39
|
+
this.scrollToBottom();
|
|
40
|
+
this.setupVisibilityObserver();
|
|
41
|
+
}
|
|
42
|
+
ngOnDestroy() {
|
|
43
|
+
if (this.visibilityObserver) {
|
|
44
|
+
this.visibilityObserver.disconnect();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
set comments(value) {
|
|
48
|
+
this._comments = value || [];
|
|
49
|
+
this.recomputeGroups();
|
|
50
|
+
this.scrollToBottom();
|
|
51
|
+
}
|
|
52
|
+
get comments() {
|
|
53
|
+
return this._comments;
|
|
54
|
+
}
|
|
55
|
+
commentPlaceholder = 'Add your comments here...';
|
|
56
|
+
_mentionSuggestions = [];
|
|
57
|
+
_hashTagSuggestions = [];
|
|
58
|
+
set mentionSuggestions(value) {
|
|
59
|
+
this._mentionSuggestions = value || [];
|
|
60
|
+
this.recomputeGroups();
|
|
61
|
+
}
|
|
62
|
+
get mentionSuggestions() {
|
|
63
|
+
return this._mentionSuggestions;
|
|
64
|
+
}
|
|
65
|
+
set hashTagSuggestions(value) {
|
|
66
|
+
this._hashTagSuggestions = value || [];
|
|
67
|
+
this.recomputeGroups();
|
|
68
|
+
}
|
|
69
|
+
get hashTagSuggestions() {
|
|
70
|
+
return this._hashTagSuggestions;
|
|
71
|
+
}
|
|
72
|
+
acceptedFiles = [];
|
|
73
|
+
get acceptFileTypes() {
|
|
74
|
+
if (!this.acceptedFiles || this.acceptedFiles.length === 0)
|
|
75
|
+
return '';
|
|
76
|
+
return this.acceptedFiles.map((type) => (type.startsWith('.') ? type : `.${type}`)).join(',');
|
|
77
|
+
}
|
|
78
|
+
onSendComment = new EventEmitter();
|
|
79
|
+
onFileSelect = new EventEmitter();
|
|
80
|
+
onDownloadFile = new EventEmitter();
|
|
81
|
+
editor;
|
|
82
|
+
recomputeGroups() {
|
|
83
|
+
const groups = this._comments.reduce((acc, comment) => {
|
|
84
|
+
const date = new Date(comment.timestamp);
|
|
85
|
+
const dateOnly = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
|
86
|
+
let group = acc.find((g) => g.date.getTime() === dateOnly.getTime());
|
|
87
|
+
if (!group) {
|
|
88
|
+
group = { date: dateOnly, comments: [] };
|
|
89
|
+
acc.push(group);
|
|
90
|
+
}
|
|
91
|
+
group.comments.push(comment);
|
|
92
|
+
return acc;
|
|
93
|
+
}, []);
|
|
94
|
+
groups.sort((a, b) => a.date.getTime() - b.date.getTime());
|
|
95
|
+
groups.forEach((group) => {
|
|
96
|
+
group.comments.forEach((comment) => {
|
|
97
|
+
comment.message = this.enrichMessage(comment.message);
|
|
98
|
+
});
|
|
99
|
+
group.comments.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
100
|
+
});
|
|
101
|
+
this.groupedComments = groups;
|
|
102
|
+
}
|
|
103
|
+
enrichMessage(message) {
|
|
104
|
+
if (!message)
|
|
105
|
+
return '';
|
|
106
|
+
let processedMessage = message;
|
|
107
|
+
// Replace empty paragraphs with line breaks for cleaner spacing
|
|
108
|
+
processedMessage = processedMessage.replace(/<p><br><\/p>/g, '<br/>');
|
|
109
|
+
processedMessage = processedMessage.replace(/<p><\/p>/g, '<br/>');
|
|
110
|
+
processedMessage = processedMessage.replace(/<p> <\/p>/g, '<br/>');
|
|
111
|
+
// Extract and validate mentions
|
|
112
|
+
this._mentionSuggestions.forEach((suggestion) => {
|
|
113
|
+
const username = suggestion.userName;
|
|
114
|
+
// Only wrap if not already wrapped in the mention span
|
|
115
|
+
// This regex checks for @username NOT preceded by the mention span start tag
|
|
116
|
+
const regex = new RegExp(`(?<!class="cax-comment-mention">)@${username}\\b`, 'g');
|
|
117
|
+
processedMessage = processedMessage.replace(regex, `<span class="cax-comment-mention">@${username}</span>`);
|
|
118
|
+
});
|
|
119
|
+
// Extract and validate hashtags
|
|
120
|
+
this._hashTagSuggestions.forEach((tag) => {
|
|
121
|
+
// Only wrap if not already wrapped in the hashtag span
|
|
122
|
+
const regex = new RegExp(`(?<!class="cax-comment-hashtag">)#${tag}\\b`, 'g');
|
|
123
|
+
processedMessage = processedMessage.replace(regex, `<span class="cax-comment-hashtag">#${tag}</span>`);
|
|
124
|
+
});
|
|
125
|
+
// Trim trailing empty paragraphs or line breaks
|
|
126
|
+
processedMessage = processedMessage.replace(/(<p><br><\/p>|<p><\/p>|<br\s*\/?>)+$/, '');
|
|
127
|
+
return processedMessage;
|
|
128
|
+
}
|
|
129
|
+
getInitials(author) {
|
|
130
|
+
if (!author)
|
|
131
|
+
return '?';
|
|
132
|
+
return ((author.firstName?.[0] || '') + (author.lastName?.[0] || '')).toUpperCase();
|
|
133
|
+
}
|
|
134
|
+
isLastInGroup(groupComments, index) {
|
|
135
|
+
const current = groupComments[index];
|
|
136
|
+
const next = groupComments[index + 1];
|
|
137
|
+
if (current.currentUser)
|
|
138
|
+
return false;
|
|
139
|
+
if (!next)
|
|
140
|
+
return true;
|
|
141
|
+
const currentAuthor = `${current.author?.firstName} ${current.author?.lastName}`;
|
|
142
|
+
const nextAuthor = `${next.author?.firstName} ${next.author?.lastName}`;
|
|
143
|
+
return next.currentUser || currentAuthor !== nextAuthor;
|
|
144
|
+
}
|
|
145
|
+
isConsecutive(groupComments, index) {
|
|
146
|
+
if (index === 0)
|
|
147
|
+
return false;
|
|
148
|
+
const current = groupComments[index];
|
|
149
|
+
const prev = groupComments[index - 1];
|
|
150
|
+
const currentAuthor = `${current.author?.firstName} ${current.author?.lastName}`;
|
|
151
|
+
const prevAuthor = `${prev.author?.firstName} ${prev.author?.lastName}`;
|
|
152
|
+
return current.currentUser === prev.currentUser && currentAuthor === prevAuthor;
|
|
153
|
+
}
|
|
154
|
+
toggleRichText() {
|
|
155
|
+
this.isRichText = !this.isRichText;
|
|
156
|
+
}
|
|
157
|
+
onFileSelected(event) {
|
|
158
|
+
const input = event.target;
|
|
159
|
+
if (input.files && input.files.length > 0) {
|
|
160
|
+
this.attachedFiles.push(...Array.from(input.files));
|
|
161
|
+
this.onFileSelect.emit(this.attachedFiles);
|
|
162
|
+
}
|
|
163
|
+
if (input) {
|
|
164
|
+
input.value = '';
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
removeAttachedFile(index) {
|
|
168
|
+
this.attachedFiles.splice(index, 1);
|
|
169
|
+
this.onFileSelect.emit(this.attachedFiles);
|
|
170
|
+
}
|
|
171
|
+
onSendMessage() {
|
|
172
|
+
if (this.commentValue || this.attachedFiles.length > 0) {
|
|
173
|
+
const processedMessage = this.enrichMessage(this.commentValue);
|
|
174
|
+
this.onSendComment.emit({
|
|
175
|
+
message: processedMessage,
|
|
176
|
+
attachments: [...this.attachedFiles]
|
|
177
|
+
});
|
|
178
|
+
this.commentValue = '';
|
|
179
|
+
this.attachedFiles = [];
|
|
180
|
+
this.hideSuggestions();
|
|
181
|
+
this.scrollToBottom();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
onDownload(file) {
|
|
185
|
+
this.onDownloadFile.emit(file);
|
|
186
|
+
}
|
|
187
|
+
// Suggestion implementation
|
|
188
|
+
showSuggestions(type, index, bounds) {
|
|
189
|
+
this.suggestionType = type;
|
|
190
|
+
this.triggerIndex = index;
|
|
191
|
+
this.lastBounds = bounds;
|
|
192
|
+
this.filterSuggestions('');
|
|
193
|
+
const target = this.editor?.el.nativeElement.querySelector('.cax-editor-content');
|
|
194
|
+
if (!target)
|
|
195
|
+
return;
|
|
196
|
+
this.suggestionOverlay.show(null, target);
|
|
197
|
+
this.updateOverlayPosition();
|
|
198
|
+
}
|
|
199
|
+
updateOverlayPosition() {
|
|
200
|
+
setTimeout(() => {
|
|
201
|
+
const panel = this.suggestionOverlay.container;
|
|
202
|
+
const target = this.editor?.el.nativeElement.querySelector('.cax-editor-content');
|
|
203
|
+
if (panel && this.lastBounds && target) {
|
|
204
|
+
const panelHeight = panel.offsetHeight;
|
|
205
|
+
const rect = target.getBoundingClientRect();
|
|
206
|
+
panel.style.position = 'fixed';
|
|
207
|
+
panel.style.zIndex = '9999';
|
|
208
|
+
panel.style.left = `${rect.left + this.lastBounds.left}px`;
|
|
209
|
+
panel.style.top = `${rect.top + this.lastBounds.top - panelHeight - 10}px`;
|
|
210
|
+
this.cdr.detectChanges();
|
|
211
|
+
}
|
|
212
|
+
}, 0);
|
|
213
|
+
}
|
|
214
|
+
hideSuggestions() {
|
|
215
|
+
if (this.suggestionType === null)
|
|
216
|
+
return;
|
|
217
|
+
this.suggestionOverlay?.hide();
|
|
218
|
+
this.suggestionType = null;
|
|
219
|
+
this.filteredSuggestions = [];
|
|
220
|
+
this.triggerIndex = -1;
|
|
221
|
+
this.cdr.detectChanges();
|
|
222
|
+
}
|
|
223
|
+
onEditorTextChange(event) {
|
|
224
|
+
const quill = this.editor.getQuill();
|
|
225
|
+
if (!quill)
|
|
226
|
+
return;
|
|
227
|
+
// 20ms delay to ensure Quill and DOM are synchronized
|
|
228
|
+
setTimeout(() => {
|
|
229
|
+
const range = quill.getSelection();
|
|
230
|
+
if (!range)
|
|
231
|
+
return;
|
|
232
|
+
const text = quill.getText(0, range.index);
|
|
233
|
+
const token = this.getTokenAtCursor(text, range.index);
|
|
234
|
+
if (token) {
|
|
235
|
+
const type = token.charAt(0);
|
|
236
|
+
const hasSuggestions = type === '@' ? this.mentionSuggestions?.length > 0 : this.hashTagSuggestions?.length > 0;
|
|
237
|
+
if (hasSuggestions) {
|
|
238
|
+
// If trigger type changed while open, reset first
|
|
239
|
+
if (this.suggestionType && this.suggestionType !== type) {
|
|
240
|
+
this.hideSuggestions();
|
|
241
|
+
}
|
|
242
|
+
if (!this.suggestionType) {
|
|
243
|
+
const bounds = quill.getBounds(range.index);
|
|
244
|
+
this.showSuggestions(type, range.index, bounds);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
this.filterSuggestions(token.slice(1));
|
|
248
|
+
this.updateOverlayPosition();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
else if (this.suggestionType) {
|
|
252
|
+
this.hideSuggestions();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else if (this.suggestionType) {
|
|
256
|
+
this.hideSuggestions();
|
|
257
|
+
}
|
|
258
|
+
}, 20);
|
|
259
|
+
}
|
|
260
|
+
filterSuggestions(searchTerm) {
|
|
261
|
+
const term = searchTerm.toLowerCase();
|
|
262
|
+
// Fast-path: if search term is empty, just return the full list
|
|
263
|
+
if (term === '') {
|
|
264
|
+
this.filteredSuggestions = this.suggestionType === '@' ? [...this._mentionSuggestions] : [...this._hashTagSuggestions];
|
|
265
|
+
}
|
|
266
|
+
else if (this.suggestionType === '@') {
|
|
267
|
+
this.filteredSuggestions = this._mentionSuggestions.filter((s) => s.firstName.toLowerCase().includes(term) || s.lastName.toLowerCase().includes(term) || s.userName.toLowerCase().includes(term));
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
this.filteredSuggestions = this._hashTagSuggestions.filter((s) => s.toLowerCase().includes(term));
|
|
271
|
+
}
|
|
272
|
+
if (this.filteredSuggestions.length === 0 && searchTerm !== '') {
|
|
273
|
+
this.hideSuggestions();
|
|
274
|
+
}
|
|
275
|
+
this.cdr.detectChanges();
|
|
276
|
+
}
|
|
277
|
+
onSuggestionSelect(item) {
|
|
278
|
+
const selectedValue = this.suggestionType === '@' ? `@${item.userName}` : `#${item}`;
|
|
279
|
+
const quill = this.editor.getQuill();
|
|
280
|
+
const range = quill.getSelection();
|
|
281
|
+
if (range) {
|
|
282
|
+
const textBefore = quill.getText(0, range.index);
|
|
283
|
+
const token = this.getTokenAtCursor(textBefore, range.index);
|
|
284
|
+
const start = range.index - (token ? token.length : 0);
|
|
285
|
+
quill.deleteText(start, token ? token.length : 0);
|
|
286
|
+
quill.insertText(start, selectedValue + ' ');
|
|
287
|
+
quill.setSelection(start + selectedValue.length + 1);
|
|
288
|
+
quill.focus();
|
|
289
|
+
}
|
|
290
|
+
this.hideSuggestions();
|
|
291
|
+
}
|
|
292
|
+
getTokenAtCursor(text, cursorPos) {
|
|
293
|
+
const beforeCursor = text.slice(0, cursorPos);
|
|
294
|
+
const match = beforeCursor.match(/[@#][^\s]*$/);
|
|
295
|
+
return match ? match[0] : null;
|
|
296
|
+
}
|
|
297
|
+
onEditorKeyDown(event) {
|
|
298
|
+
if (!this.isRichText && event.key === 'Enter' && !event.shiftKey) {
|
|
299
|
+
event.preventDefault();
|
|
300
|
+
event.stopPropagation();
|
|
301
|
+
this.onSendMessage();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
formatBytes(bytes, decimals = 2) {
|
|
305
|
+
if (!+bytes)
|
|
306
|
+
return '0 Bytes';
|
|
307
|
+
const k = 1024;
|
|
308
|
+
const dm = decimals < 0 ? 0 : decimals;
|
|
309
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
310
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
311
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
|
|
312
|
+
}
|
|
313
|
+
scrollToBottom() {
|
|
314
|
+
setTimeout(() => {
|
|
315
|
+
if (this.scrollContainer) {
|
|
316
|
+
const element = this.scrollContainer.nativeElement;
|
|
317
|
+
element.scrollTop = element.scrollHeight;
|
|
318
|
+
this.cdr.detectChanges();
|
|
319
|
+
}
|
|
320
|
+
}, 100);
|
|
321
|
+
}
|
|
322
|
+
setupVisibilityObserver() {
|
|
323
|
+
if (typeof IntersectionObserver !== 'undefined' && this.scrollContainer) {
|
|
324
|
+
this.visibilityObserver = new IntersectionObserver((entries) => {
|
|
325
|
+
entries.forEach((entry) => {
|
|
326
|
+
if (entry.isIntersecting) {
|
|
327
|
+
this.scrollToBottom();
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
this.visibilityObserver.observe(this.scrollContainer.nativeElement);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: CommentsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
335
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.21", type: CommentsComponent, isStandalone: true, selector: "cax-comments", inputs: { comments: "comments", commentPlaceholder: "commentPlaceholder", mentionSuggestions: "mentionSuggestions", hashTagSuggestions: "hashTagSuggestions", acceptedFiles: "acceptedFiles" }, outputs: { onSendComment: "onSendComment", onFileSelect: "onFileSelect", onDownloadFile: "onDownloadFile" }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "suggestionOverlay", first: true, predicate: ["suggestionOverlay"], descendants: true }, { propertyName: "editor", first: true, predicate: ["editor"], descendants: true }], ngImport: i0, template: "<div class=\"cax-comments\">\n <div class=\"cax-comments-container\" #scrollContainer>\n <div class=\"cax-comments-empty\" *ngIf=\"groupedComments.length === 0\">\n <i class=\"cax cax-chat-line-bold\"></i>\n <div>\n <span class=\"cax-text-action-md-medium\">No comments yet</span>\n <span class=\"cax-text-action-sm-regular\">You can post a comment here to start the conversation. All feedback and discussions will appear here.</span>\n </div>\n </div>\n <div class=\"cax-comments-group\" *ngFor=\"let group of groupedComments\">\n <div class=\"cax-comments-date\">\n <span class=\"cax-text-action-xsm-semibold\">{{ group.date | date: 'MMM d, y' }}</span>\n </div>\n <div class=\"cax-comment-row\" *ngFor=\"let comment of group.comments; let i = index\" [class.current-user]=\"comment.currentUser\" [class.consecutive]=\"isConsecutive(group.comments, i)\">\n <div class=\"cax-avatar-container\" *ngIf=\"!comment.currentUser\">\n <cax-avatar *ngIf=\"isLastInGroup(group.comments, i); else avatarSpacer\" [label]=\"getInitials(comment.author)\" shape=\"square\" avatarSize=\"sm\"></cax-avatar>\n <ng-template #avatarSpacer>\n <div class=\"avatar-spacer\"></div>\n </ng-template>\n </div>\n <div class=\"cax-comment-bubble\">\n <div class=\"cax-comment-message-container\">\n <span class=\"cax-comment-username cax-text-body-sm-semibold\" *ngIf=\"!comment.currentUser\">{{ comment.author?.firstName }} {{ comment.author?.lastName }}</span>\n <div class=\"cax-comment-attachments\" *ngIf=\"comment.attachments?.length\">\n <div *ngFor=\"let file of comment.attachments\" class=\"cax-comment-file-preview\">\n <span class=\"cax-comment-file-name cax-text-action-md-medium\">{{ file.name }}</span>\n <span class=\"cax-comment-file-size cax-text-action-sm-medium\">{{ formatBytes(file.size) }}</span>\n <span class=\"cax cax-download cax-comment-file-download\" (click)=\"onDownload(file)\"></span>\n </div>\n </div>\n <span class=\"cax-comment-message cax-text-body-md-regular\" [innerHTML]=\"comment.message\"></span>\n <span class=\"cax-comment-time cax-text-action-sm-medium\">{{ comment.timestamp | date: 'shortTime' }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"cax-comment-bar\">\n <div class=\"cax-comment-input-wrapper\" [class.toolbar-hidden]=\"!isRichText\" (keydown)=\"onEditorKeyDown($event)\">\n <cax-editor #editor [placeholder]=\"commentPlaceholder\" [style]=\"{ maxHeight: '300px' }\" [(ngModel)]=\"commentValue\" (onTextChange)=\"onEditorTextChange($event)\">\n <ng-template caxTemplate=\"header\">\n <span class=\"ql-formats\">\n <button type=\"button\" class=\"ql-bold\" aria-label=\"Bold\"></button>\n <button type=\"button\" class=\"ql-italic\" aria-label=\"Italic\"></button>\n <button type=\"button\" class=\"ql-underline\" aria-label=\"Underline\"></button>\n <button type=\"button\" class=\"ql-list\" value=\"bullet\" aria-label=\"Bullet List\"></button>\n <button type=\"button\" class=\"ql-link\" aria-label=\"Insert Link\"></button>\n <button type=\"button\" class=\"ql-image\" aria-label=\"Insert Image\"></button>\n <button type=\"button\" class=\"ql-code-block\" aria-label=\"Code Block\"></button>\n </span>\n </ng-template>\n </cax-editor>\n <div class=\"cax-comment-input-footer\">\n <div class=\"cax-comment-attached-files\">\n <div class=\"cax-comment-attached-file\" *ngFor=\"let file of attachedFiles; let i = index\">\n <span class=\"file-name cax-text-action-md-medium\">{{ file.name }}</span>\n <i class=\"cax cax-close\" (click)=\"removeAttachedFile(i)\"></i>\n </div>\n </div>\n <div class=\"cax-comment-bar-actions\">\n <div (click)=\"toggleRichText()\" [class.active]=\"isRichText\">\n <i class=\"cax cax-text-icon\"></i>\n </div>\n <div (click)=\"fileInput.click()\">\n <i class=\"cax cax-paperclip\"></i>\n <input type=\"file\" #fileInput [accept]=\"acceptFileTypes\" style=\"display: none\" (change)=\"onFileSelected($event)\" multiple />\n </div>\n </div>\n </div>\n </div>\n <div class=\"cax-comment-bar-actions\">\n <cax-button [icon]=\"'cax cax-plain'\" [rounded]=\"true\" [size]=\"'lg'\" [disabled]=\"!commentValue && attachedFiles.length === 0\" (click)=\"onSendMessage()\"></cax-button>\n </div>\n </div>\n\n <cax-overlayPanel styleClass=\"cax-comments-suggestion-overlay\" #suggestionOverlay [style]=\"{ width: '250px', 'max-height': '300px' }\" (onHide)=\"hideSuggestions()\">\n <div class=\"cax-comments-suggestion-list\">\n <div class=\"cax-comments-suggestion-item\" *ngFor=\"let item of filteredSuggestions\" (mousedown)=\"$event.preventDefault(); onSuggestionSelect(item)\">\n <ng-container *ngIf=\"suggestionType === '@'\">\n <cax-avatar [label]=\"getInitials(item)\" shape=\"circle\" avatarSize=\"sm\"></cax-avatar>\n <div class=\"cax-comments-suggestion-info\">\n <span class=\"cax-comments-suggestion-label\">{{ item.firstName }} {{ item.lastName }}</span>\n <span class=\"cax-comments-suggestion-subtext\">@{{ item.userName }}</span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"suggestionType === '#'\">\n <div class=\"cax-comments-suggestion-info\">\n <span class=\"cax-comments-suggestion-label\">{{ item }}</span>\n </div>\n </ng-container>\n </div>\n </div>\n </cax-overlayPanel>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "component", type: Avatar, selector: "cax-avatar", inputs: ["label", "icon", "image", "avatarSize", "shape", "style", "styleClass", "textColor", "backgroundColor", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.Button, selector: "cax-button", inputs: ["type", "iconPos", "icon", "badge", "rightIcon", "leftIcon", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i3.CaxTemplate, selector: "[caxTemplate]", inputs: ["type", "caxTemplate"] }, { kind: "ngmodule", type: EditorModule }, { kind: "component", type: i4.Editor, selector: "cax-editor", inputs: ["style", "styleClass", "placeholder", "disabled", "formats", "modules", "bounds", "scrollingContainer", "debug", "readonly"], outputs: ["onInit", "onTextChange", "onSelectionChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: OverlayPanelModule }, { kind: "component", type: i6.OverlayPanel, selector: "cax-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "variant", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ListboxModule }, { kind: "ngmodule", type: SharedModule }, { kind: "ngmodule", type: ChipModule }] });
|
|
336
|
+
}
|
|
337
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: CommentsComponent, decorators: [{
|
|
338
|
+
type: Component,
|
|
339
|
+
args: [{ selector: 'cax-comments', standalone: true, imports: [CommonModule, Avatar, ButtonModule, EditorModule, FormsModule, OverlayPanelModule, ListboxModule, SharedModule, ChipModule], template: "<div class=\"cax-comments\">\n <div class=\"cax-comments-container\" #scrollContainer>\n <div class=\"cax-comments-empty\" *ngIf=\"groupedComments.length === 0\">\n <i class=\"cax cax-chat-line-bold\"></i>\n <div>\n <span class=\"cax-text-action-md-medium\">No comments yet</span>\n <span class=\"cax-text-action-sm-regular\">You can post a comment here to start the conversation. All feedback and discussions will appear here.</span>\n </div>\n </div>\n <div class=\"cax-comments-group\" *ngFor=\"let group of groupedComments\">\n <div class=\"cax-comments-date\">\n <span class=\"cax-text-action-xsm-semibold\">{{ group.date | date: 'MMM d, y' }}</span>\n </div>\n <div class=\"cax-comment-row\" *ngFor=\"let comment of group.comments; let i = index\" [class.current-user]=\"comment.currentUser\" [class.consecutive]=\"isConsecutive(group.comments, i)\">\n <div class=\"cax-avatar-container\" *ngIf=\"!comment.currentUser\">\n <cax-avatar *ngIf=\"isLastInGroup(group.comments, i); else avatarSpacer\" [label]=\"getInitials(comment.author)\" shape=\"square\" avatarSize=\"sm\"></cax-avatar>\n <ng-template #avatarSpacer>\n <div class=\"avatar-spacer\"></div>\n </ng-template>\n </div>\n <div class=\"cax-comment-bubble\">\n <div class=\"cax-comment-message-container\">\n <span class=\"cax-comment-username cax-text-body-sm-semibold\" *ngIf=\"!comment.currentUser\">{{ comment.author?.firstName }} {{ comment.author?.lastName }}</span>\n <div class=\"cax-comment-attachments\" *ngIf=\"comment.attachments?.length\">\n <div *ngFor=\"let file of comment.attachments\" class=\"cax-comment-file-preview\">\n <span class=\"cax-comment-file-name cax-text-action-md-medium\">{{ file.name }}</span>\n <span class=\"cax-comment-file-size cax-text-action-sm-medium\">{{ formatBytes(file.size) }}</span>\n <span class=\"cax cax-download cax-comment-file-download\" (click)=\"onDownload(file)\"></span>\n </div>\n </div>\n <span class=\"cax-comment-message cax-text-body-md-regular\" [innerHTML]=\"comment.message\"></span>\n <span class=\"cax-comment-time cax-text-action-sm-medium\">{{ comment.timestamp | date: 'shortTime' }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"cax-comment-bar\">\n <div class=\"cax-comment-input-wrapper\" [class.toolbar-hidden]=\"!isRichText\" (keydown)=\"onEditorKeyDown($event)\">\n <cax-editor #editor [placeholder]=\"commentPlaceholder\" [style]=\"{ maxHeight: '300px' }\" [(ngModel)]=\"commentValue\" (onTextChange)=\"onEditorTextChange($event)\">\n <ng-template caxTemplate=\"header\">\n <span class=\"ql-formats\">\n <button type=\"button\" class=\"ql-bold\" aria-label=\"Bold\"></button>\n <button type=\"button\" class=\"ql-italic\" aria-label=\"Italic\"></button>\n <button type=\"button\" class=\"ql-underline\" aria-label=\"Underline\"></button>\n <button type=\"button\" class=\"ql-list\" value=\"bullet\" aria-label=\"Bullet List\"></button>\n <button type=\"button\" class=\"ql-link\" aria-label=\"Insert Link\"></button>\n <button type=\"button\" class=\"ql-image\" aria-label=\"Insert Image\"></button>\n <button type=\"button\" class=\"ql-code-block\" aria-label=\"Code Block\"></button>\n </span>\n </ng-template>\n </cax-editor>\n <div class=\"cax-comment-input-footer\">\n <div class=\"cax-comment-attached-files\">\n <div class=\"cax-comment-attached-file\" *ngFor=\"let file of attachedFiles; let i = index\">\n <span class=\"file-name cax-text-action-md-medium\">{{ file.name }}</span>\n <i class=\"cax cax-close\" (click)=\"removeAttachedFile(i)\"></i>\n </div>\n </div>\n <div class=\"cax-comment-bar-actions\">\n <div (click)=\"toggleRichText()\" [class.active]=\"isRichText\">\n <i class=\"cax cax-text-icon\"></i>\n </div>\n <div (click)=\"fileInput.click()\">\n <i class=\"cax cax-paperclip\"></i>\n <input type=\"file\" #fileInput [accept]=\"acceptFileTypes\" style=\"display: none\" (change)=\"onFileSelected($event)\" multiple />\n </div>\n </div>\n </div>\n </div>\n <div class=\"cax-comment-bar-actions\">\n <cax-button [icon]=\"'cax cax-plain'\" [rounded]=\"true\" [size]=\"'lg'\" [disabled]=\"!commentValue && attachedFiles.length === 0\" (click)=\"onSendMessage()\"></cax-button>\n </div>\n </div>\n\n <cax-overlayPanel styleClass=\"cax-comments-suggestion-overlay\" #suggestionOverlay [style]=\"{ width: '250px', 'max-height': '300px' }\" (onHide)=\"hideSuggestions()\">\n <div class=\"cax-comments-suggestion-list\">\n <div class=\"cax-comments-suggestion-item\" *ngFor=\"let item of filteredSuggestions\" (mousedown)=\"$event.preventDefault(); onSuggestionSelect(item)\">\n <ng-container *ngIf=\"suggestionType === '@'\">\n <cax-avatar [label]=\"getInitials(item)\" shape=\"circle\" avatarSize=\"sm\"></cax-avatar>\n <div class=\"cax-comments-suggestion-info\">\n <span class=\"cax-comments-suggestion-label\">{{ item.firstName }} {{ item.lastName }}</span>\n <span class=\"cax-comments-suggestion-subtext\">@{{ item.userName }}</span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"suggestionType === '#'\">\n <div class=\"cax-comments-suggestion-info\">\n <span class=\"cax-comments-suggestion-label\">{{ item }}</span>\n </div>\n </ng-container>\n </div>\n </div>\n </cax-overlayPanel>\n</div>\n" }]
|
|
340
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { scrollContainer: [{
|
|
341
|
+
type: ViewChild,
|
|
342
|
+
args: ['scrollContainer']
|
|
343
|
+
}], suggestionOverlay: [{
|
|
344
|
+
type: ViewChild,
|
|
345
|
+
args: ['suggestionOverlay']
|
|
346
|
+
}], comments: [{
|
|
347
|
+
type: Input
|
|
348
|
+
}], commentPlaceholder: [{
|
|
349
|
+
type: Input
|
|
350
|
+
}], mentionSuggestions: [{
|
|
351
|
+
type: Input
|
|
352
|
+
}], hashTagSuggestions: [{
|
|
353
|
+
type: Input
|
|
354
|
+
}], acceptedFiles: [{
|
|
355
|
+
type: Input
|
|
356
|
+
}], onSendComment: [{
|
|
357
|
+
type: Output
|
|
358
|
+
}], onFileSelect: [{
|
|
359
|
+
type: Output
|
|
360
|
+
}], onDownloadFile: [{
|
|
361
|
+
type: Output
|
|
362
|
+
}], editor: [{
|
|
363
|
+
type: ViewChild,
|
|
364
|
+
args: ['editor']
|
|
365
|
+
}] } });
|
|
366
|
+
|
|
367
|
+
class CommentsModule {
|
|
368
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: CommentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
369
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.21", ngImport: i0, type: CommentsModule, imports: [CommentsComponent], exports: [CommentsComponent] });
|
|
370
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: CommentsModule, imports: [CommentsComponent] });
|
|
371
|
+
}
|
|
372
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: CommentsModule, decorators: [{
|
|
373
|
+
type: NgModule,
|
|
374
|
+
args: [{
|
|
375
|
+
imports: [CommentsComponent],
|
|
376
|
+
exports: [CommentsComponent]
|
|
377
|
+
}]
|
|
378
|
+
}] });
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Generated bundle index. Do not edit.
|
|
382
|
+
*/
|
|
383
|
+
|
|
384
|
+
export { CommentsComponent, CommentsModule };
|
|
385
|
+
//# sourceMappingURL=cax-design-system-comments.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cax-design-system-comments.mjs","sources":["../../src/app/components/comments/comments.ts","../../src/app/components/comments/comments.html","../../src/app/components/comments/comments.module.ts","../../src/app/components/comments/cax-design-system-comments.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output, ViewChild, ElementRef, ChangeDetectorRef, AfterViewInit, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Avatar } from 'cax-design-system/avatar';\nimport { ButtonModule } from 'cax-design-system/button';\nimport { EditorModule } from 'cax-design-system/editor';\nimport { OverlayPanelModule, OverlayPanel } from 'cax-design-system/overlaypanel';\nimport { ListboxModule } from 'cax-design-system/listbox';\nimport { SharedModule } from 'cax-design-system/api';\nimport { ChipModule } from 'cax-design-system/chip';\n\ninterface MentionUser {\n firstName: string;\n lastName: string;\n userName: string;\n}\n\ninterface Comment {\n message: string;\n timestamp: string;\n currentUser?: boolean;\n author?: MentionUser;\n attachments?: File[];\n}\n\ninterface GroupedComments {\n date: Date;\n comments: Comment[];\n}\n\n@Component({\n selector: 'cax-comments',\n templateUrl: './comments.html',\n styleUrls: ['./comments.scss'],\n standalone: true,\n imports: [CommonModule, Avatar, ButtonModule, EditorModule, FormsModule, OverlayPanelModule, ListboxModule, SharedModule, ChipModule]\n})\nexport class CommentsComponent implements AfterViewInit, OnDestroy {\n @ViewChild('scrollContainer') private scrollContainer!: ElementRef;\n @ViewChild('suggestionOverlay') suggestionOverlay!: OverlayPanel;\n private visibilityObserver?: IntersectionObserver;\n\n private _comments: Comment[] = [];\n groupedComments: GroupedComments[] = [];\n isRichText: boolean = false;\n commentValue: string = '';\n\n // Suggestion state\n isSuggestionVisible: boolean = false;\n suggestionType: '@' | '#' | null = null;\n filteredSuggestions: any[] = [];\n triggerIndex: number = -1;\n attachedFiles: File[] = [];\n private lastBounds: any = null;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngAfterViewInit(): void {\n this.scrollToBottom();\n this.setupVisibilityObserver();\n }\n\n ngOnDestroy(): void {\n if (this.visibilityObserver) {\n this.visibilityObserver.disconnect();\n }\n }\n\n @Input()\n set comments(value: Comment[]) {\n this._comments = value || [];\n this.recomputeGroups();\n this.scrollToBottom();\n }\n\n get comments(): Comment[] {\n return this._comments;\n }\n\n @Input() commentPlaceholder: string = 'Add your comments here...';\n private _mentionSuggestions: MentionUser[] = [];\n private _hashTagSuggestions: string[] = [];\n\n @Input()\n set mentionSuggestions(value: MentionUser[]) {\n this._mentionSuggestions = value || [];\n this.recomputeGroups();\n }\n\n get mentionSuggestions(): MentionUser[] {\n return this._mentionSuggestions;\n }\n\n @Input()\n set hashTagSuggestions(value: string[]) {\n this._hashTagSuggestions = value || [];\n this.recomputeGroups();\n }\n\n get hashTagSuggestions(): string[] {\n return this._hashTagSuggestions;\n }\n\n @Input() acceptedFiles: string[] = [];\n\n get acceptFileTypes(): string {\n if (!this.acceptedFiles || this.acceptedFiles.length === 0) return '';\n return this.acceptedFiles.map((type) => (type.startsWith('.') ? type : `.${type}`)).join(',');\n }\n\n @Output() onSendComment = new EventEmitter<{ message: string; attachments: File[] }>();\n @Output() onFileSelect = new EventEmitter<File[]>();\n @Output() onDownloadFile = new EventEmitter<any>();\n @ViewChild('editor') editor!: any;\n\n private recomputeGroups(): void {\n const groups = this._comments.reduce((acc: GroupedComments[], comment) => {\n const date = new Date(comment.timestamp);\n const dateOnly = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\n let group = acc.find((g) => g.date.getTime() === dateOnly.getTime());\n if (!group) {\n group = { date: dateOnly, comments: [] };\n acc.push(group);\n }\n group.comments.push(comment);\n return acc;\n }, []);\n\n groups.sort((a, b) => a.date.getTime() - b.date.getTime());\n\n groups.forEach((group) => {\n group.comments.forEach((comment) => {\n comment.message = this.enrichMessage(comment.message);\n });\n group.comments.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n });\n\n this.groupedComments = groups;\n }\n\n private enrichMessage(message: string): string {\n if (!message) return '';\n let processedMessage = message;\n\n // Replace empty paragraphs with line breaks for cleaner spacing\n processedMessage = processedMessage.replace(/<p><br><\\/p>/g, '<br/>');\n processedMessage = processedMessage.replace(/<p><\\/p>/g, '<br/>');\n processedMessage = processedMessage.replace(/<p> <\\/p>/g, '<br/>');\n\n // Extract and validate mentions\n this._mentionSuggestions.forEach((suggestion) => {\n const username = suggestion.userName;\n // Only wrap if not already wrapped in the mention span\n // This regex checks for @username NOT preceded by the mention span start tag\n const regex = new RegExp(`(?<!class=\"cax-comment-mention\">)@${username}\\\\b`, 'g');\n processedMessage = processedMessage.replace(regex, `<span class=\"cax-comment-mention\">@${username}</span>`);\n });\n\n // Extract and validate hashtags\n this._hashTagSuggestions.forEach((tag) => {\n // Only wrap if not already wrapped in the hashtag span\n const regex = new RegExp(`(?<!class=\"cax-comment-hashtag\">)#${tag}\\\\b`, 'g');\n processedMessage = processedMessage.replace(regex, `<span class=\"cax-comment-hashtag\">#${tag}</span>`);\n });\n\n // Trim trailing empty paragraphs or line breaks\n processedMessage = processedMessage.replace(/(<p><br><\\/p>|<p><\\/p>|<br\\s*\\/?>)+$/, '');\n\n return processedMessage;\n }\n\n getInitials(author?: { firstName: string; lastName: string }): string {\n if (!author) return '?';\n return ((author.firstName?.[0] || '') + (author.lastName?.[0] || '')).toUpperCase();\n }\n\n isLastInGroup(groupComments: Comment[], index: number): boolean {\n const current = groupComments[index];\n const next = groupComments[index + 1];\n\n if (current.currentUser) return false;\n if (!next) return true;\n\n const currentAuthor = `${current.author?.firstName} ${current.author?.lastName}`;\n const nextAuthor = `${next.author?.firstName} ${next.author?.lastName}`;\n\n return next.currentUser || currentAuthor !== nextAuthor;\n }\n\n isConsecutive(groupComments: Comment[], index: number): boolean {\n if (index === 0) return false;\n const current = groupComments[index];\n const prev = groupComments[index - 1];\n\n const currentAuthor = `${current.author?.firstName} ${current.author?.lastName}`;\n const prevAuthor = `${prev.author?.firstName} ${prev.author?.lastName}`;\n\n return current.currentUser === prev.currentUser && currentAuthor === prevAuthor;\n }\n\n toggleRichText(): void {\n this.isRichText = !this.isRichText;\n }\n\n onFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n this.attachedFiles.push(...Array.from(input.files));\n this.onFileSelect.emit(this.attachedFiles);\n }\n if (input) {\n input.value = '';\n }\n }\n\n removeAttachedFile(index: number): void {\n this.attachedFiles.splice(index, 1);\n this.onFileSelect.emit(this.attachedFiles);\n }\n\n onSendMessage(): void {\n if (this.commentValue || this.attachedFiles.length > 0) {\n const processedMessage = this.enrichMessage(this.commentValue);\n\n this.onSendComment.emit({\n message: processedMessage,\n attachments: [...this.attachedFiles]\n });\n\n this.commentValue = '';\n this.attachedFiles = [];\n this.hideSuggestions();\n this.scrollToBottom();\n }\n }\n\n onDownload(file: any): void {\n this.onDownloadFile.emit(file);\n }\n\n // Suggestion implementation\n private showSuggestions(type: '@' | '#', index: number, bounds?: any): void {\n this.suggestionType = type;\n this.triggerIndex = index;\n this.lastBounds = bounds;\n this.filterSuggestions('');\n\n const target = this.editor?.el.nativeElement.querySelector('.cax-editor-content');\n if (!target) return;\n\n this.suggestionOverlay.show(null, target);\n this.updateOverlayPosition();\n }\n\n private updateOverlayPosition(): void {\n setTimeout(() => {\n const panel = (this.suggestionOverlay as any).container;\n const target = this.editor?.el.nativeElement.querySelector('.cax-editor-content');\n if (panel && this.lastBounds && target) {\n const panelHeight = panel.offsetHeight;\n const rect = target.getBoundingClientRect();\n\n panel.style.position = 'fixed';\n panel.style.zIndex = '9999';\n panel.style.left = `${rect.left + this.lastBounds.left}px`;\n panel.style.top = `${rect.top + this.lastBounds.top - panelHeight - 10}px`;\n this.cdr.detectChanges();\n }\n }, 0);\n }\n\n hideSuggestions(): void {\n if (this.suggestionType === null) return;\n this.suggestionOverlay?.hide();\n this.suggestionType = null;\n this.filteredSuggestions = [];\n this.triggerIndex = -1;\n this.cdr.detectChanges();\n }\n\n onEditorTextChange(event: any): void {\n const quill = this.editor.getQuill();\n if (!quill) return;\n\n // 20ms delay to ensure Quill and DOM are synchronized\n setTimeout(() => {\n const range = quill.getSelection();\n if (!range) return;\n\n const text = quill.getText(0, range.index);\n const token = this.getTokenAtCursor(text, range.index);\n\n if (token) {\n const type = token.charAt(0) as '@' | '#';\n const hasSuggestions = type === '@' ? this.mentionSuggestions?.length > 0 : this.hashTagSuggestions?.length > 0;\n\n if (hasSuggestions) {\n // If trigger type changed while open, reset first\n if (this.suggestionType && this.suggestionType !== type) {\n this.hideSuggestions();\n }\n\n if (!this.suggestionType) {\n const bounds = quill.getBounds(range.index);\n this.showSuggestions(type, range.index, bounds);\n } else {\n this.filterSuggestions(token.slice(1));\n this.updateOverlayPosition();\n }\n } else if (this.suggestionType) {\n this.hideSuggestions();\n }\n } else if (this.suggestionType) {\n this.hideSuggestions();\n }\n }, 20);\n }\n\n private filterSuggestions(searchTerm: string): void {\n const term = searchTerm.toLowerCase();\n\n // Fast-path: if search term is empty, just return the full list\n if (term === '') {\n this.filteredSuggestions = this.suggestionType === '@' ? [...this._mentionSuggestions] : [...this._hashTagSuggestions];\n } else if (this.suggestionType === '@') {\n this.filteredSuggestions = this._mentionSuggestions.filter((s) => s.firstName.toLowerCase().includes(term) || s.lastName.toLowerCase().includes(term) || s.userName.toLowerCase().includes(term));\n } else {\n this.filteredSuggestions = this._hashTagSuggestions.filter((s) => s.toLowerCase().includes(term));\n }\n\n if (this.filteredSuggestions.length === 0 && searchTerm !== '') {\n this.hideSuggestions();\n }\n\n this.cdr.detectChanges();\n }\n\n onSuggestionSelect(item: any): void {\n const selectedValue = this.suggestionType === '@' ? `@${item.userName}` : `#${item}`;\n\n const quill = (this.editor as any).getQuill();\n const range = quill.getSelection();\n if (range) {\n const textBefore = quill.getText(0, range.index);\n const token = this.getTokenAtCursor(textBefore, range.index);\n const start = range.index - (token ? token.length : 0);\n quill.deleteText(start, token ? token.length : 0);\n quill.insertText(start, selectedValue + ' ');\n quill.setSelection(start + selectedValue.length + 1);\n quill.focus();\n }\n\n this.hideSuggestions();\n }\n\n private getTokenAtCursor(text: string, cursorPos: number): string | null {\n const beforeCursor = text.slice(0, cursorPos);\n const match = beforeCursor.match(/[@#][^\\s]*$/);\n return match ? match[0] : null;\n }\n\n onEditorKeyDown(event: KeyboardEvent): void {\n if (!this.isRichText && event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n event.stopPropagation();\n this.onSendMessage();\n }\n }\n\n formatBytes(bytes: number, decimals: number = 2): string {\n if (!+bytes) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n }\n\n private scrollToBottom(): void {\n setTimeout(() => {\n if (this.scrollContainer) {\n const element = this.scrollContainer.nativeElement;\n element.scrollTop = element.scrollHeight;\n this.cdr.detectChanges();\n }\n }, 100);\n }\n\n private setupVisibilityObserver(): void {\n if (typeof IntersectionObserver !== 'undefined' && this.scrollContainer) {\n this.visibilityObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n this.scrollToBottom();\n }\n });\n });\n this.visibilityObserver.observe(this.scrollContainer.nativeElement);\n }\n }\n}\n","<div class=\"cax-comments\">\n <div class=\"cax-comments-container\" #scrollContainer>\n <div class=\"cax-comments-empty\" *ngIf=\"groupedComments.length === 0\">\n <i class=\"cax cax-chat-line-bold\"></i>\n <div>\n <span class=\"cax-text-action-md-medium\">No comments yet</span>\n <span class=\"cax-text-action-sm-regular\">You can post a comment here to start the conversation. All feedback and discussions will appear here.</span>\n </div>\n </div>\n <div class=\"cax-comments-group\" *ngFor=\"let group of groupedComments\">\n <div class=\"cax-comments-date\">\n <span class=\"cax-text-action-xsm-semibold\">{{ group.date | date: 'MMM d, y' }}</span>\n </div>\n <div class=\"cax-comment-row\" *ngFor=\"let comment of group.comments; let i = index\" [class.current-user]=\"comment.currentUser\" [class.consecutive]=\"isConsecutive(group.comments, i)\">\n <div class=\"cax-avatar-container\" *ngIf=\"!comment.currentUser\">\n <cax-avatar *ngIf=\"isLastInGroup(group.comments, i); else avatarSpacer\" [label]=\"getInitials(comment.author)\" shape=\"square\" avatarSize=\"sm\"></cax-avatar>\n <ng-template #avatarSpacer>\n <div class=\"avatar-spacer\"></div>\n </ng-template>\n </div>\n <div class=\"cax-comment-bubble\">\n <div class=\"cax-comment-message-container\">\n <span class=\"cax-comment-username cax-text-body-sm-semibold\" *ngIf=\"!comment.currentUser\">{{ comment.author?.firstName }} {{ comment.author?.lastName }}</span>\n <div class=\"cax-comment-attachments\" *ngIf=\"comment.attachments?.length\">\n <div *ngFor=\"let file of comment.attachments\" class=\"cax-comment-file-preview\">\n <span class=\"cax-comment-file-name cax-text-action-md-medium\">{{ file.name }}</span>\n <span class=\"cax-comment-file-size cax-text-action-sm-medium\">{{ formatBytes(file.size) }}</span>\n <span class=\"cax cax-download cax-comment-file-download\" (click)=\"onDownload(file)\"></span>\n </div>\n </div>\n <span class=\"cax-comment-message cax-text-body-md-regular\" [innerHTML]=\"comment.message\"></span>\n <span class=\"cax-comment-time cax-text-action-sm-medium\">{{ comment.timestamp | date: 'shortTime' }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"cax-comment-bar\">\n <div class=\"cax-comment-input-wrapper\" [class.toolbar-hidden]=\"!isRichText\" (keydown)=\"onEditorKeyDown($event)\">\n <cax-editor #editor [placeholder]=\"commentPlaceholder\" [style]=\"{ maxHeight: '300px' }\" [(ngModel)]=\"commentValue\" (onTextChange)=\"onEditorTextChange($event)\">\n <ng-template caxTemplate=\"header\">\n <span class=\"ql-formats\">\n <button type=\"button\" class=\"ql-bold\" aria-label=\"Bold\"></button>\n <button type=\"button\" class=\"ql-italic\" aria-label=\"Italic\"></button>\n <button type=\"button\" class=\"ql-underline\" aria-label=\"Underline\"></button>\n <button type=\"button\" class=\"ql-list\" value=\"bullet\" aria-label=\"Bullet List\"></button>\n <button type=\"button\" class=\"ql-link\" aria-label=\"Insert Link\"></button>\n <button type=\"button\" class=\"ql-image\" aria-label=\"Insert Image\"></button>\n <button type=\"button\" class=\"ql-code-block\" aria-label=\"Code Block\"></button>\n </span>\n </ng-template>\n </cax-editor>\n <div class=\"cax-comment-input-footer\">\n <div class=\"cax-comment-attached-files\">\n <div class=\"cax-comment-attached-file\" *ngFor=\"let file of attachedFiles; let i = index\">\n <span class=\"file-name cax-text-action-md-medium\">{{ file.name }}</span>\n <i class=\"cax cax-close\" (click)=\"removeAttachedFile(i)\"></i>\n </div>\n </div>\n <div class=\"cax-comment-bar-actions\">\n <div (click)=\"toggleRichText()\" [class.active]=\"isRichText\">\n <i class=\"cax cax-text-icon\"></i>\n </div>\n <div (click)=\"fileInput.click()\">\n <i class=\"cax cax-paperclip\"></i>\n <input type=\"file\" #fileInput [accept]=\"acceptFileTypes\" style=\"display: none\" (change)=\"onFileSelected($event)\" multiple />\n </div>\n </div>\n </div>\n </div>\n <div class=\"cax-comment-bar-actions\">\n <cax-button [icon]=\"'cax cax-plain'\" [rounded]=\"true\" [size]=\"'lg'\" [disabled]=\"!commentValue && attachedFiles.length === 0\" (click)=\"onSendMessage()\"></cax-button>\n </div>\n </div>\n\n <cax-overlayPanel styleClass=\"cax-comments-suggestion-overlay\" #suggestionOverlay [style]=\"{ width: '250px', 'max-height': '300px' }\" (onHide)=\"hideSuggestions()\">\n <div class=\"cax-comments-suggestion-list\">\n <div class=\"cax-comments-suggestion-item\" *ngFor=\"let item of filteredSuggestions\" (mousedown)=\"$event.preventDefault(); onSuggestionSelect(item)\">\n <ng-container *ngIf=\"suggestionType === '@'\">\n <cax-avatar [label]=\"getInitials(item)\" shape=\"circle\" avatarSize=\"sm\"></cax-avatar>\n <div class=\"cax-comments-suggestion-info\">\n <span class=\"cax-comments-suggestion-label\">{{ item.firstName }} {{ item.lastName }}</span>\n <span class=\"cax-comments-suggestion-subtext\">@{{ item.userName }}</span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"suggestionType === '#'\">\n <div class=\"cax-comments-suggestion-info\">\n <span class=\"cax-comments-suggestion-label\">{{ item }}</span>\n </div>\n </ng-container>\n </div>\n </div>\n </cax-overlayPanel>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommentsComponent } from './comments';\n\n@NgModule({\n imports: [CommentsComponent],\n exports: [CommentsComponent]\n})\nexport class CommentsModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|