@coreui/vue-pro 5.18.0 → 5.19.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 +1 -1
- package/dist/cjs/components/carousel/CCarousel.d.ts +24 -2
- package/dist/cjs/components/carousel/CCarousel.js +51 -14
- package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
- package/dist/cjs/components/carousel/CCarouselItem.js +3 -3
- package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/cjs/components/chip/CChip.d.ts +97 -11
- package/dist/cjs/components/chip/CChip.js +107 -79
- package/dist/cjs/components/chip/CChip.js.map +1 -1
- package/dist/cjs/components/chip/const.d.ts +1 -0
- package/dist/cjs/components/chip/const.js +8 -0
- package/dist/cjs/components/chip/const.js.map +1 -0
- package/dist/cjs/components/chip-input/CChipInput.d.ts +30 -2
- package/dist/cjs/components/chip-input/CChipInput.js +108 -66
- package/dist/cjs/components/chip-input/CChipInput.js.map +1 -1
- package/dist/cjs/components/chip-set/CChipSet.d.ts +145 -0
- package/dist/cjs/components/chip-set/CChipSet.js +127 -0
- package/dist/cjs/components/chip-set/CChipSet.js.map +1 -0
- package/dist/cjs/components/chip-set/buildChips.d.ts +13 -0
- package/dist/cjs/components/chip-set/buildChips.js +19 -0
- package/dist/cjs/components/chip-set/buildChips.js.map +1 -0
- package/dist/cjs/components/chip-set/index.d.ts +2 -0
- package/dist/cjs/components/chip-set/useChipSet.d.ts +42 -0
- package/dist/cjs/components/chip-set/useChipSet.js +115 -0
- package/dist/cjs/components/chip-set/useChipSet.js.map +1 -0
- package/dist/cjs/components/collapse/CCollapse.js +2 -2
- package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdown.d.ts +24 -1
- package/dist/cjs/components/dropdown/CDropdown.js +34 -17
- package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownToggle.js +1 -1
- package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/cjs/components/focus-trap/CFocusTrap.js +4 -1
- package/dist/cjs/components/focus-trap/CFocusTrap.js.map +1 -1
- package/dist/cjs/components/form/CFormInput.d.ts +3 -0
- package/dist/cjs/components/form/CFormRange.d.ts +2 -2
- package/dist/cjs/components/form/CFormRange.js +2 -2
- package/dist/cjs/components/form/CFormRange.js.map +1 -1
- package/dist/cjs/components/grid/CContainer.js +3 -1
- package/dist/cjs/components/grid/CContainer.js.map +1 -1
- package/dist/cjs/components/index.d.ts +2 -0
- package/dist/cjs/components/index.js +30 -24
- package/dist/cjs/components/index.js.map +1 -1
- package/dist/cjs/components/modal/CModal.js +3 -2
- package/dist/cjs/components/modal/CModal.js.map +1 -1
- package/dist/cjs/components/modal/CModalHeader.js +6 -3
- package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelect.d.ts +206 -3
- package/dist/cjs/components/multi-select/CMultiSelect.js +304 -28
- package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +1 -2
- package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +16 -1
- package/dist/cjs/components/multi-select/CMultiSelectOptions.js +59 -3
- package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +9 -0
- package/dist/cjs/components/multi-select/CMultiSelectSelection.js +6 -1
- package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
- package/dist/cjs/components/multi-select/utils.js +0 -3
- package/dist/cjs/components/multi-select/utils.js.map +1 -1
- package/dist/cjs/components/nav/CNav.js +8 -1
- package/dist/cjs/components/nav/CNav.js.map +1 -1
- package/dist/cjs/components/nav/CNavGroup.d.ts +15 -7
- package/dist/cjs/components/nav/CNavGroup.js +113 -88
- package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
- package/dist/cjs/components/nav/CNavLink.js +11 -0
- package/dist/cjs/components/nav/CNavLink.js.map +1 -1
- package/dist/cjs/components/popover/CPopover.d.ts +24 -1
- package/dist/cjs/components/popover/CPopover.js +18 -1
- package/dist/cjs/components/popover/CPopover.js.map +1 -1
- package/dist/cjs/components/range-slider/CRangeSlider.d.ts +1 -1
- package/dist/cjs/components/search-button/CSearchButton.d.ts +63 -0
- package/dist/cjs/components/search-button/CSearchButton.js +125 -0
- package/dist/cjs/components/search-button/CSearchButton.js.map +1 -0
- package/dist/cjs/components/search-button/index.d.ts +6 -0
- package/dist/cjs/components/search-button/index.js +13 -0
- package/dist/cjs/components/search-button/index.js.map +1 -0
- package/dist/cjs/components/search-button/types.d.ts +10 -0
- package/dist/cjs/components/search-button/utils.d.ts +11 -0
- package/dist/cjs/components/search-button/utils.js +114 -0
- package/dist/cjs/components/search-button/utils.js.map +1 -0
- package/dist/cjs/components/sidebar/CSidebar.js +4 -3
- package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
- package/dist/cjs/components/sidebar/CSidebarNav.d.ts +32 -0
- package/dist/cjs/components/sidebar/CSidebarNav.js +28 -24
- package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/cjs/components/spinner/CSpinner.d.ts +4 -4
- package/dist/cjs/components/spinner/CSpinner.js +2 -2
- package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
- package/dist/cjs/components/table/utils.js +4 -4
- package/dist/cjs/components/table/utils.js.map +1 -1
- package/dist/cjs/components/tabs/CTabList.js +8 -2
- package/dist/cjs/components/tabs/CTabList.js.map +1 -1
- package/dist/cjs/components/tabs/CTabs.js +1 -1
- package/dist/cjs/components/tabs/CTabs.js.map +1 -1
- package/dist/cjs/components/toast/CToast.js +12 -2
- package/dist/cjs/components/toast/CToast.js.map +1 -1
- package/dist/cjs/components/toast/CToastClose.d.ts +3 -2
- package/dist/cjs/components/toast/CToastClose.js +2 -3
- package/dist/cjs/components/toast/CToastClose.js.map +1 -1
- package/dist/cjs/components/tooltip/CTooltip.d.ts +24 -1
- package/dist/cjs/components/tooltip/CTooltip.js +18 -1
- package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
- package/dist/cjs/directives/v-c-popover.js +6 -3
- package/dist/cjs/directives/v-c-popover.js.map +1 -1
- package/dist/cjs/directives/v-c-tooltip.js +6 -3
- package/dist/cjs/directives/v-c-tooltip.js.map +1 -1
- package/dist/cjs/directives/v-c-visible.js +1 -1
- package/dist/cjs/directives/v-c-visible.js.map +1 -1
- package/dist/cjs/index.js +36 -30
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +2 -1
- package/dist/cjs/utils/swipe.d.ts +26 -0
- package/dist/cjs/utils/swipe.js +94 -0
- package/dist/cjs/utils/swipe.js.map +1 -0
- package/dist/cjs/utils/transition.js.map +1 -1
- package/dist/esm/components/carousel/CCarousel.d.ts +24 -2
- package/dist/esm/components/carousel/CCarousel.js +52 -15
- package/dist/esm/components/carousel/CCarousel.js.map +1 -1
- package/dist/esm/components/carousel/CCarouselItem.js +3 -3
- package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/esm/components/chip/CChip.d.ts +97 -11
- package/dist/esm/components/chip/CChip.js +108 -80
- package/dist/esm/components/chip/CChip.js.map +1 -1
- package/dist/esm/components/chip/const.d.ts +1 -0
- package/dist/esm/components/chip/const.js +6 -0
- package/dist/esm/components/chip/const.js.map +1 -0
- package/dist/esm/components/chip-input/CChipInput.d.ts +30 -2
- package/dist/esm/components/chip-input/CChipInput.js +109 -67
- package/dist/esm/components/chip-input/CChipInput.js.map +1 -1
- package/dist/esm/components/chip-set/CChipSet.d.ts +145 -0
- package/dist/esm/components/chip-set/CChipSet.js +125 -0
- package/dist/esm/components/chip-set/CChipSet.js.map +1 -0
- package/dist/esm/components/chip-set/buildChips.d.ts +13 -0
- package/dist/esm/components/chip-set/buildChips.js +17 -0
- package/dist/esm/components/chip-set/buildChips.js.map +1 -0
- package/dist/esm/components/chip-set/index.d.ts +2 -0
- package/dist/esm/components/chip-set/useChipSet.d.ts +42 -0
- package/dist/esm/components/chip-set/useChipSet.js +112 -0
- package/dist/esm/components/chip-set/useChipSet.js.map +1 -0
- package/dist/esm/components/collapse/CCollapse.js +2 -2
- package/dist/esm/components/collapse/CCollapse.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdown.d.ts +24 -1
- package/dist/esm/components/dropdown/CDropdown.js +34 -17
- package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownToggle.js +1 -1
- package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/esm/components/focus-trap/CFocusTrap.js +4 -1
- package/dist/esm/components/focus-trap/CFocusTrap.js.map +1 -1
- package/dist/esm/components/form/CFormInput.d.ts +3 -0
- package/dist/esm/components/form/CFormRange.d.ts +2 -2
- package/dist/esm/components/form/CFormRange.js +2 -2
- package/dist/esm/components/form/CFormRange.js.map +1 -1
- package/dist/esm/components/grid/CContainer.js +3 -1
- package/dist/esm/components/grid/CContainer.js.map +1 -1
- package/dist/esm/components/index.d.ts +2 -0
- package/dist/esm/components/index.js +3 -0
- package/dist/esm/components/index.js.map +1 -1
- package/dist/esm/components/modal/CModal.js +3 -2
- package/dist/esm/components/modal/CModal.js.map +1 -1
- package/dist/esm/components/modal/CModalHeader.js +6 -3
- package/dist/esm/components/modal/CModalHeader.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelect.d.ts +206 -3
- package/dist/esm/components/multi-select/CMultiSelect.js +305 -29
- package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +1 -2
- package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +16 -1
- package/dist/esm/components/multi-select/CMultiSelectOptions.js +59 -3
- package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +9 -0
- package/dist/esm/components/multi-select/CMultiSelectSelection.js +6 -1
- package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
- package/dist/esm/components/multi-select/utils.js +0 -3
- package/dist/esm/components/multi-select/utils.js.map +1 -1
- package/dist/esm/components/nav/CNav.js +8 -1
- package/dist/esm/components/nav/CNav.js.map +1 -1
- package/dist/esm/components/nav/CNavGroup.d.ts +15 -7
- package/dist/esm/components/nav/CNavGroup.js +114 -89
- package/dist/esm/components/nav/CNavGroup.js.map +1 -1
- package/dist/esm/components/nav/CNavLink.js +12 -1
- package/dist/esm/components/nav/CNavLink.js.map +1 -1
- package/dist/esm/components/popover/CPopover.d.ts +24 -1
- package/dist/esm/components/popover/CPopover.js +18 -1
- package/dist/esm/components/popover/CPopover.js.map +1 -1
- package/dist/esm/components/range-slider/CRangeSlider.d.ts +1 -1
- package/dist/esm/components/search-button/CSearchButton.d.ts +63 -0
- package/dist/esm/components/search-button/CSearchButton.js +123 -0
- package/dist/esm/components/search-button/CSearchButton.js.map +1 -0
- package/dist/esm/components/search-button/index.d.ts +6 -0
- package/dist/esm/components/search-button/index.js +10 -0
- package/dist/esm/components/search-button/index.js.map +1 -0
- package/dist/esm/components/search-button/types.d.ts +10 -0
- package/dist/esm/components/search-button/utils.d.ts +11 -0
- package/dist/esm/components/search-button/utils.js +103 -0
- package/dist/esm/components/search-button/utils.js.map +1 -0
- package/dist/esm/components/sidebar/CSidebar.js +4 -3
- package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
- package/dist/esm/components/sidebar/CSidebarNav.d.ts +32 -0
- package/dist/esm/components/sidebar/CSidebarNav.js +29 -25
- package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/esm/components/spinner/CSpinner.d.ts +4 -4
- package/dist/esm/components/spinner/CSpinner.js +2 -2
- package/dist/esm/components/spinner/CSpinner.js.map +1 -1
- package/dist/esm/components/table/utils.js +4 -4
- package/dist/esm/components/table/utils.js.map +1 -1
- package/dist/esm/components/tabs/CTabList.js +8 -2
- package/dist/esm/components/tabs/CTabList.js.map +1 -1
- package/dist/esm/components/tabs/CTabs.js +1 -1
- package/dist/esm/components/tabs/CTabs.js.map +1 -1
- package/dist/esm/components/toast/CToast.js +12 -2
- package/dist/esm/components/toast/CToast.js.map +1 -1
- package/dist/esm/components/toast/CToastClose.d.ts +3 -2
- package/dist/esm/components/toast/CToastClose.js +2 -3
- package/dist/esm/components/toast/CToastClose.js.map +1 -1
- package/dist/esm/components/tooltip/CTooltip.d.ts +24 -1
- package/dist/esm/components/tooltip/CTooltip.js +18 -1
- package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
- package/dist/esm/directives/v-c-popover.js +6 -3
- package/dist/esm/directives/v-c-popover.js.map +1 -1
- package/dist/esm/directives/v-c-tooltip.js +6 -3
- package/dist/esm/directives/v-c-tooltip.js.map +1 -1
- package/dist/esm/directives/v-c-visible.js +1 -1
- package/dist/esm/directives/v-c-visible.js.map +1 -1
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
- package/dist/esm/utils/index.d.ts +2 -1
- package/dist/esm/utils/swipe.d.ts +26 -0
- package/dist/esm/utils/swipe.js +90 -0
- package/dist/esm/utils/swipe.js.map +1 -0
- package/dist/esm/utils/transition.js.map +1 -1
- package/package.json +6 -6
- package/src/components/accordion/CAccordion.ts +2 -2
- package/src/components/accordion/CAccordionBody.ts +1 -1
- package/src/components/accordion/CAccordionButton.ts +1 -1
- package/src/components/accordion/CAccordionHeader.ts +2 -2
- package/src/components/accordion/__tests__/__snapshots__/CAccordionButton.spec.ts.snap +1 -1
- package/src/components/accordion/__tests__/__snapshots__/CAccordionHeader.spec.ts.snap +1 -1
- package/src/components/alert/CAlert.ts +3 -3
- package/src/components/alert/CAlertHeading.ts +1 -1
- package/src/components/alert/CAlertLink.ts +1 -1
- package/src/components/autocomplete/__tests__/CAutocomplete.spec.ts +5 -1
- package/src/components/autocomplete/__tests__/CAutocompleteOptions.spec.ts +8 -5
- package/src/components/avatar/CAvatar.ts +1 -1
- package/src/components/backdrop/CBackdrop.ts +1 -1
- package/src/components/badge/CBadge.ts +1 -1
- package/src/components/breadcrumb/CBreadcrumb.ts +1 -1
- package/src/components/breadcrumb/CBreadcrumbItem.ts +1 -1
- package/src/components/button/CButton.ts +1 -1
- package/src/components/button/__tests__/CButton.spec.ts +0 -1
- package/src/components/button/__tests__/__snapshots__/CButton.spec.ts.snap +1 -1
- package/src/components/button-group/CButtonGroup.ts +1 -1
- package/src/components/callout/CCallout.ts +1 -1
- package/src/components/card/CCard.ts +1 -1
- package/src/components/card/CCardImage.ts +1 -1
- package/src/components/card/CCardLink.ts +1 -1
- package/src/components/carousel/CCarousel.ts +61 -22
- package/src/components/carousel/CCarouselCaption.ts +1 -1
- package/src/components/carousel/CCarouselItem.ts +5 -4
- package/src/components/carousel/__tests__/CCarousel.spec.ts +1 -1
- package/src/components/chip/CChip.ts +123 -101
- package/src/components/chip/__tests__/CChip.spec.ts +26 -0
- package/src/components/chip/const.ts +3 -0
- package/src/components/chip-input/CChipInput.ts +134 -82
- package/src/components/chip-input/__tests__/CChipInput.spec.ts +80 -4
- package/src/components/chip-input/__tests__/__snapshots__/CChipInput.spec.ts.snap +1 -1
- package/src/components/chip-set/CChipSet.ts +140 -0
- package/src/components/chip-set/__tests__/CChipSet.spec.ts +174 -0
- package/src/components/chip-set/buildChips.ts +29 -0
- package/src/components/chip-set/index.ts +3 -0
- package/src/components/chip-set/useChipSet.ts +168 -0
- package/src/components/collapse/CCollapse.ts +5 -5
- package/src/components/collapse/__tests__/CCollapse.spec.ts +48 -0
- package/src/components/collapse/__tests__/__snapshots__/CCollapse.spec.ts.snap +7 -0
- package/src/components/conditional-teleport/CConditionalTeleport.ts +3 -3
- package/src/components/conditional-teleport/__tests__/CConditionalTeleport.spec.ts +28 -0
- package/src/components/dropdown/CDropdown.ts +43 -23
- package/src/components/dropdown/CDropdownHeader.ts +1 -1
- package/src/components/dropdown/CDropdownItem.ts +1 -1
- package/src/components/dropdown/CDropdownMenu.ts +2 -2
- package/src/components/dropdown/CDropdownToggle.ts +4 -4
- package/src/components/dropdown/__tests__/CDropdown.spec.ts +1 -1
- package/src/components/dropdown/__tests__/CDropdownMenu.spec.ts +11 -7
- package/src/components/dropdown/__tests__/CDropdownPopperConfig.spec.ts +63 -0
- package/src/components/dropdown/__tests__/CDropdownToggle.spec.ts +0 -2
- package/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.ts.snap +1 -1
- package/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.ts.snap +4 -0
- package/src/components/dropdown/utils.ts +2 -2
- package/src/components/focus-trap/CFocusTrap.ts +9 -6
- package/src/components/focus-trap/__tests__/CFocusTrap.spec.ts +42 -0
- package/src/components/footer/CFooter.ts +1 -1
- package/src/components/form/CForm.ts +1 -1
- package/src/components/form/CFormCheck.ts +5 -5
- package/src/components/form/CFormControlValidation.ts +3 -3
- package/src/components/form/CFormFeedback.ts +1 -1
- package/src/components/form/CFormFloating.ts +1 -1
- package/src/components/form/CFormInput.ts +2 -2
- package/src/components/form/CFormLabel.ts +1 -1
- package/src/components/form/CFormRange.ts +4 -4
- package/src/components/form/CFormSelect.ts +3 -3
- package/src/components/form/CFormSwitch.ts +2 -2
- package/src/components/form/CFormTextarea.ts +2 -2
- package/src/components/form/CInputGroup.ts +1 -1
- package/src/components/form/__tests__/CFormRange.spec.ts +2 -2
- package/src/components/form/__tests__/CFormText.spec.ts +1 -1
- package/src/components/form/__tests__/__snapshots__/CFormRange.spec.ts.snap +1 -1
- package/src/components/grid/CCol.ts +1 -1
- package/src/components/grid/CContainer.ts +4 -2
- package/src/components/grid/CRow.ts +1 -1
- package/src/components/header/CHeader.ts +2 -2
- package/src/components/header/CHeaderNav.ts +1 -1
- package/src/components/header/CHeaderToggler.ts +1 -1
- package/src/components/header/__tests__/CHeader.spec.ts +1 -2
- package/src/components/index.ts +2 -0
- package/src/components/link/CLink.ts +1 -1
- package/src/components/list-group/CListGroup.ts +1 -1
- package/src/components/list-group/CListGroupItem.ts +1 -1
- package/src/components/modal/CModal.ts +3 -2
- package/src/components/modal/CModalHeader.ts +10 -3
- package/src/components/modal/__tests__/__snapshots__/CModal.spec.ts.snap +9 -4
- package/src/components/multi-select/CMultiSelect.ts +380 -41
- package/src/components/multi-select/CMultiSelectNativeSelect.ts +1 -2
- package/src/components/multi-select/CMultiSelectOptions.ts +77 -3
- package/src/components/multi-select/CMultiSelectSelection.ts +6 -1
- package/src/components/nav/CNav.ts +9 -2
- package/src/components/nav/CNavGroup.ts +147 -99
- package/src/components/nav/CNavItem.ts +2 -2
- package/src/components/nav/CNavLink.ts +19 -2
- package/src/components/nav/__tests__/CNavGroup.spec.ts +188 -6
- package/src/components/nav/__tests__/CNavItem.spec.ts +6 -6
- package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.ts.snap +3 -7
- package/src/components/nav/__tests__/__snapshots__/CNavItem.spec.ts.snap +1 -5
- package/src/components/navbar/CNavbar.ts +2 -2
- package/src/components/navbar/CNavbarBrand.ts +1 -1
- package/src/components/navbar/CNavbarNav.ts +1 -1
- package/src/components/navbar/CNavbarToggler.ts +1 -1
- package/src/components/navbar/__tests__/CNavbar.spec.ts +1 -1
- package/src/components/pagination/CPagination.ts +2 -2
- package/src/components/pagination/CPaginationItem.ts +2 -2
- package/src/components/placeholder/CPlaceholder.ts +1 -1
- package/src/components/popover/CPopover.ts +27 -7
- package/src/components/popover/__tests__/CPopover.spec.ts +43 -0
- package/src/components/progress/CProgress.ts +2 -2
- package/src/components/progress/CProgressBar.ts +1 -1
- package/src/components/progress/CProgressStacked.ts +1 -1
- package/src/components/progress/__tests__/CProgressBar.spec.ts +0 -4
- package/src/components/search-button/CSearchButton.ts +163 -0
- package/src/components/search-button/__tests__/CSearchButton.spec.ts +128 -0
- package/src/components/search-button/__tests__/__snapshots__/CSearchButton.spec.ts.snap +13 -0
- package/src/components/search-button/index.ts +10 -0
- package/src/components/search-button/types.ts +10 -0
- package/src/components/search-button/utils.ts +140 -0
- package/src/components/sidebar/CSidebar.ts +9 -6
- package/src/components/sidebar/CSidebarBrand.ts +1 -1
- package/src/components/sidebar/CSidebarNav.ts +30 -28
- package/src/components/sidebar/__tests__/CSidebar.spec.ts +1 -1
- package/src/components/spinner/CSpinner.ts +6 -6
- package/src/components/spinner/__tests__/CSpinner.spec.ts +0 -1
- package/src/components/stepper/__tests__/CStepper.spec.ts +13 -8
- package/src/components/table/CTable.ts +16 -16
- package/src/components/table/CTableBody.ts +1 -1
- package/src/components/table/CTableDataCell.ts +1 -1
- package/src/components/table/CTableFoot.ts +1 -1
- package/src/components/table/CTableHead.ts +1 -1
- package/src/components/table/CTableHeaderCell.ts +1 -1
- package/src/components/table/CTableRow.ts +1 -1
- package/src/components/table/types.ts +1 -0
- package/src/components/table/utils.ts +4 -4
- package/src/components/tabs/CTab.ts +1 -1
- package/src/components/tabs/CTabList.ts +12 -5
- package/src/components/tabs/CTabPane.ts +3 -3
- package/src/components/tabs/CTabPanel.ts +5 -5
- package/src/components/tabs/CTabs.ts +2 -2
- package/src/components/tabs/__tests__/__snapshots__/CTabPane.spec.ts.snap +1 -1
- package/src/components/toast/CToast.ts +12 -4
- package/src/components/toast/CToastClose.ts +5 -6
- package/src/components/toast/CToaster.ts +1 -1
- package/src/components/toast/__tests__/CToaster.spec.ts +0 -2
- package/src/components/toast/__tests__/__snapshots__/CToastClose.spec.ts.snap +1 -1
- package/src/components/tooltip/CTooltip.ts +26 -6
- package/src/components/tooltip/__tests__/CTooltip.spec.ts +43 -0
- package/src/components/widgets/CWidgetStatsA.ts +4 -4
- package/src/components/widgets/CWidgetStatsB.ts +5 -5
- package/src/components/widgets/CWidgetStatsC.ts +5 -5
- package/src/components/widgets/CWidgetStatsD.ts +5 -5
- package/src/components/widgets/CWidgetStatsE.ts +4 -4
- package/src/components/widgets/CWidgetStatsF.ts +5 -5
- package/src/directives/__tests__/v-c-placeholder.spec.ts +33 -0
- package/src/directives/__tests__/v-c-popover.spec.ts +67 -0
- package/src/directives/__tests__/v-c-tooltip.spec.ts +66 -0
- package/src/directives/v-c-popover.ts +8 -5
- package/src/directives/v-c-tooltip.ts +8 -5
- package/src/directives/v-c-visible.ts +1 -1
- package/src/index.ts +1 -1
- package/src/utils/ComponentProps.ts +1 -0
- package/src/utils/__tests__/swipe.spec.ts +82 -0
- package/src/utils/getNextActiveElement.ts +1 -1
- package/src/utils/index.ts +2 -0
- package/src/utils/swipe.ts +114 -0
- package/src/utils/transition.ts +2 -2
- package/dist/cjs/components/collapse/__test__/CCollapse.spec.d.ts +0 -1
- package/dist/esm/components/collapse/__test__/CCollapse.spec.d.ts +0 -1
- package/src/components/accordion/__tests__/CAccordionCollapse.spec.ts +0 -28
- package/src/components/accordion/__tests__/__snapshots__/CAccordionCollapse.spec.ts.snap +0 -7
- package/src/components/collapse/__test__/CCollapse.spec.ts +0 -44
- package/src/components/collapse/__test__/__snapshots__/CCollapse.spec.ts.snap +0 -13
|
@@ -1,16 +1,53 @@
|
|
|
1
|
-
import { computed, defineComponent, h, ref,
|
|
1
|
+
import { computed, defineComponent, h, ref, useId, PropType, type VNode } from 'vue'
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { chipsFromData } from '../chip-set/buildChips'
|
|
4
|
+
import { useChipSet, type ChipSetConfig } from '../chip-set/useChipSet'
|
|
5
|
+
import { isRTL } from '../../utils'
|
|
4
6
|
|
|
5
7
|
type ChipClassName = string | ((value: string) => string)
|
|
6
8
|
|
|
9
|
+
// Initial chip values can be supplied declaratively as CChip slot content
|
|
10
|
+
// (parity with the vanilla ChipInput, which reads existing .chip elements).
|
|
11
|
+
const slotText = (slot: unknown): string | undefined => {
|
|
12
|
+
if (typeof slot !== 'function') {
|
|
13
|
+
return undefined
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const rendered = slot()
|
|
17
|
+
const first = Array.isArray(rendered) ? rendered[0] : rendered
|
|
18
|
+
if (typeof first === 'string') {
|
|
19
|
+
return first
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return typeof first?.children === 'string' ? first.children : undefined
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const valuesFromSlot = (nodes: VNode[] = []): string[] => {
|
|
26
|
+
const values: string[] = []
|
|
27
|
+
for (const node of nodes) {
|
|
28
|
+
if (Array.isArray(node.children)) {
|
|
29
|
+
values.push(...valuesFromSlot(node.children as VNode[]))
|
|
30
|
+
continue
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const value =
|
|
34
|
+
(node.props?.value as string | undefined) ??
|
|
35
|
+
slotText((node.children as { default?: unknown } | null)?.default)
|
|
36
|
+
if (value) {
|
|
37
|
+
values.push(value)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return values
|
|
42
|
+
}
|
|
43
|
+
|
|
7
44
|
const uniqueValues = (values: string[]): string[] => [
|
|
8
45
|
...new Set(values.map((value) => value.trim()).filter(Boolean)),
|
|
9
46
|
]
|
|
10
47
|
|
|
11
48
|
const resolveChipClassName = (
|
|
12
49
|
chipClassName: ChipClassName | undefined,
|
|
13
|
-
value: string
|
|
50
|
+
value: string
|
|
14
51
|
): string | undefined => {
|
|
15
52
|
if (!chipClassName) {
|
|
16
53
|
return undefined
|
|
@@ -52,6 +89,10 @@ const CChipInput = defineComponent({
|
|
|
52
89
|
* Toggle the disabled state for the component.
|
|
53
90
|
*/
|
|
54
91
|
disabled: Boolean,
|
|
92
|
+
/**
|
|
93
|
+
* Renders the chips as filter chips, each showing a leading check icon while selected. Implies `selectable`.
|
|
94
|
+
*/
|
|
95
|
+
filter: Boolean,
|
|
55
96
|
/**
|
|
56
97
|
* Sets the `id` of the internal text input rendered by the component.
|
|
57
98
|
*/
|
|
@@ -100,6 +141,15 @@ const CChipInput = defineComponent({
|
|
|
100
141
|
* Enables chip selection behavior in the component.
|
|
101
142
|
*/
|
|
102
143
|
selectable: Boolean,
|
|
144
|
+
/**
|
|
145
|
+
* Sets how many chips can be selected at once.
|
|
146
|
+
*
|
|
147
|
+
* @values 'single', 'multiple'
|
|
148
|
+
*/
|
|
149
|
+
selectionMode: {
|
|
150
|
+
type: String as PropType<'single' | 'multiple'>,
|
|
151
|
+
default: 'multiple',
|
|
152
|
+
},
|
|
103
153
|
/**
|
|
104
154
|
* Sets the separator character used to create chips while typing or pasting in the component.
|
|
105
155
|
*/
|
|
@@ -145,21 +195,39 @@ const CChipInput = defineComponent({
|
|
|
145
195
|
*/
|
|
146
196
|
'update:modelValue',
|
|
147
197
|
],
|
|
148
|
-
setup(props, { attrs, emit, expose }) {
|
|
149
|
-
const internalValues = ref<string[]>(
|
|
198
|
+
setup(props, { attrs, emit, expose, slots }) {
|
|
199
|
+
const internalValues = ref<string[]>(
|
|
200
|
+
uniqueValues(
|
|
201
|
+
props.defaultValue.length > 0 ? props.defaultValue : valuesFromSlot(slots.default?.())
|
|
202
|
+
)
|
|
203
|
+
)
|
|
150
204
|
const inputValue = ref('')
|
|
151
|
-
const selectedValues = ref<string[]>([])
|
|
152
|
-
const rootRef = ref<HTMLDivElement>()
|
|
153
205
|
const inputRef = ref<HTMLInputElement>()
|
|
206
|
+
const generatedName = useId()
|
|
154
207
|
|
|
155
208
|
const values = computed(() =>
|
|
156
|
-
props.modelValue
|
|
157
|
-
? uniqueValues(
|
|
158
|
-
: uniqueValues(
|
|
209
|
+
props.modelValue === undefined
|
|
210
|
+
? uniqueValues(internalValues.value)
|
|
211
|
+
: uniqueValues(props.modelValue as string[])
|
|
159
212
|
)
|
|
160
213
|
|
|
161
|
-
|
|
162
|
-
|
|
214
|
+
// CChipInput builds on the same engine as CChipSet: useChipSet owns selection
|
|
215
|
+
// coordination, roving focus, and chip prop forwarding (provided to the chips
|
|
216
|
+
// below). CChipInput owns the chip list and adds the text-input layer.
|
|
217
|
+
const config = computed<ChipSetConfig>(() => ({
|
|
218
|
+
disabled: props.disabled,
|
|
219
|
+
filter: props.filter,
|
|
220
|
+
removable: Boolean(props.removable && !props.disabled && !props.readOnly),
|
|
221
|
+
selectable: props.selectable,
|
|
222
|
+
}))
|
|
223
|
+
|
|
224
|
+
const { rootRef, clearSelection, getFocusableChips, handleKeydown } = useChipSet({
|
|
225
|
+
config,
|
|
226
|
+
selectionMode: () => props.selectionMode,
|
|
227
|
+
selected: () => undefined,
|
|
228
|
+
restoreFocusOnRemove: false,
|
|
229
|
+
onSelectionChange: (selected) => emit('select', selected),
|
|
230
|
+
onRemove: (value) => remove(value),
|
|
163
231
|
})
|
|
164
232
|
|
|
165
233
|
const emitValuesChange = (nextValues: string[]): void => {
|
|
@@ -172,7 +240,7 @@ const CChipInput = defineComponent({
|
|
|
172
240
|
}
|
|
173
241
|
|
|
174
242
|
const canAddMore = computed(
|
|
175
|
-
() => props.maxChips === null || values.value.length < props.maxChips
|
|
243
|
+
() => props.maxChips === null || values.value.length < props.maxChips
|
|
176
244
|
)
|
|
177
245
|
|
|
178
246
|
const add = (rawValue: string): boolean => {
|
|
@@ -200,16 +268,10 @@ const CChipInput = defineComponent({
|
|
|
200
268
|
return false
|
|
201
269
|
}
|
|
202
270
|
|
|
203
|
-
|
|
204
|
-
emitValuesChange(
|
|
205
|
-
selectedValues.value = selectedValues.value.filter((item) => {
|
|
206
|
-
const wasSelected = item === valueToRemove
|
|
207
|
-
if (wasSelected && selectedValues.value.length !== nextValues.length) {
|
|
208
|
-
emit('select', selectedValues.value.filter((v) => v !== valueToRemove))
|
|
209
|
-
}
|
|
210
|
-
return item !== valueToRemove
|
|
211
|
-
})
|
|
271
|
+
// Selection is cleaned up by useChipSet; here we just drop the value.
|
|
272
|
+
emitValuesChange(values.value.filter((item) => item !== valueToRemove))
|
|
212
273
|
emit('remove', valueToRemove)
|
|
274
|
+
inputRef.value?.focus()
|
|
213
275
|
return true
|
|
214
276
|
}
|
|
215
277
|
|
|
@@ -220,19 +282,8 @@ const CChipInput = defineComponent({
|
|
|
220
282
|
}
|
|
221
283
|
|
|
222
284
|
const focusLastChip = (): void => {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
const focusableChips = [
|
|
228
|
-
...rootRef.value.querySelectorAll<HTMLElement>(
|
|
229
|
-
'[data-coreui-chip-focusable="true"]:not(.disabled)',
|
|
230
|
-
),
|
|
231
|
-
]
|
|
232
|
-
if (focusableChips.length === 0) {
|
|
233
|
-
return
|
|
234
|
-
}
|
|
235
|
-
focusableChips[focusableChips.length - 1].focus()
|
|
285
|
+
const chips = getFocusableChips()
|
|
286
|
+
chips[chips.length - 1]?.focus()
|
|
236
287
|
}
|
|
237
288
|
|
|
238
289
|
const handleInputKeydown = (event: KeyboardEvent): void => {
|
|
@@ -252,9 +303,17 @@ const CChipInput = defineComponent({
|
|
|
252
303
|
break
|
|
253
304
|
}
|
|
254
305
|
|
|
255
|
-
case 'ArrowLeft':
|
|
306
|
+
case 'ArrowLeft':
|
|
307
|
+
case 'ArrowRight': {
|
|
308
|
+
// The arrow pointing toward the chips (left in LTR, right in RTL) jumps
|
|
309
|
+
// to the last chip when the caret is at the start of the input.
|
|
310
|
+
const towardChipsKey = isRTL(rootRef.value) ? 'ArrowRight' : 'ArrowLeft'
|
|
256
311
|
const target = event.currentTarget as HTMLInputElement
|
|
257
|
-
if (
|
|
312
|
+
if (
|
|
313
|
+
event.key === towardChipsKey &&
|
|
314
|
+
target.selectionStart === 0 &&
|
|
315
|
+
target.selectionEnd === 0
|
|
316
|
+
) {
|
|
258
317
|
event.preventDefault()
|
|
259
318
|
focusLastChip()
|
|
260
319
|
}
|
|
@@ -280,13 +339,14 @@ const CChipInput = defineComponent({
|
|
|
280
339
|
const parts = value.split(props.separator)
|
|
281
340
|
const chipsToAdd = uniqueValues(parts.slice(0, -1))
|
|
282
341
|
|
|
283
|
-
const newChips = chipsToAdd.filter(chip => !values.value.includes(chip))
|
|
284
|
-
const availableSlots =
|
|
342
|
+
const newChips = chipsToAdd.filter((chip) => !values.value.includes(chip))
|
|
343
|
+
const availableSlots =
|
|
344
|
+
props.maxChips === null ? Infinity : props.maxChips - values.value.length
|
|
285
345
|
const chipsToEmit = newChips.slice(0, availableSlots)
|
|
286
346
|
|
|
287
347
|
if (chipsToEmit.length > 0) {
|
|
288
348
|
const nextValues = [...values.value, ...chipsToEmit]
|
|
289
|
-
chipsToEmit.forEach(chip => emit('add', chip))
|
|
349
|
+
chipsToEmit.forEach((chip) => emit('add', chip))
|
|
290
350
|
emitValuesChange(nextValues)
|
|
291
351
|
}
|
|
292
352
|
|
|
@@ -313,13 +373,14 @@ const CChipInput = defineComponent({
|
|
|
313
373
|
event.preventDefault()
|
|
314
374
|
const chipsToAdd = uniqueValues(pastedData.split(props.separator))
|
|
315
375
|
|
|
316
|
-
const newChips = chipsToAdd.filter(chip => !values.value.includes(chip))
|
|
317
|
-
const availableSlots =
|
|
376
|
+
const newChips = chipsToAdd.filter((chip) => !values.value.includes(chip))
|
|
377
|
+
const availableSlots =
|
|
378
|
+
props.maxChips === null ? Infinity : props.maxChips - values.value.length
|
|
318
379
|
const chipsToEmit = newChips.slice(0, availableSlots)
|
|
319
380
|
|
|
320
381
|
if (chipsToEmit.length > 0) {
|
|
321
382
|
const nextValues = [...values.value, ...chipsToEmit]
|
|
322
|
-
chipsToEmit.forEach(chip => emit('add', chip))
|
|
383
|
+
chipsToEmit.forEach((chip) => emit('add', chip))
|
|
323
384
|
emitValuesChange(nextValues)
|
|
324
385
|
}
|
|
325
386
|
|
|
@@ -344,6 +405,21 @@ const CChipInput = defineComponent({
|
|
|
344
405
|
return
|
|
345
406
|
}
|
|
346
407
|
|
|
408
|
+
// The arrow past the last chip moves focus into the text field (mirrored in RTL).
|
|
409
|
+
if (event.key === (isRTL(rootRef.value) ? 'ArrowLeft' : 'ArrowRight')) {
|
|
410
|
+
const chips = getFocusableChips()
|
|
411
|
+
const lastChip = chips[chips.length - 1]
|
|
412
|
+
if (lastChip?.contains(event.target as Node)) {
|
|
413
|
+
event.preventDefault()
|
|
414
|
+
inputRef.value?.focus()
|
|
415
|
+
return
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
if (handleKeydown(event)) {
|
|
420
|
+
return
|
|
421
|
+
}
|
|
422
|
+
|
|
347
423
|
if (event.key.length === 1) {
|
|
348
424
|
inputRef.value?.focus()
|
|
349
425
|
}
|
|
@@ -355,13 +431,6 @@ const CChipInput = defineComponent({
|
|
|
355
431
|
}
|
|
356
432
|
}
|
|
357
433
|
|
|
358
|
-
const handleSelectedChange = (chipValue: string, selected: boolean): void => {
|
|
359
|
-
selectedValues.value = selected
|
|
360
|
-
? uniqueValues([...selectedValues.value, chipValue])
|
|
361
|
-
: selectedValues.value.filter((value) => value !== chipValue)
|
|
362
|
-
emit('select', selectedValues.value)
|
|
363
|
-
}
|
|
364
|
-
|
|
365
434
|
expose({ rootRef, inputRef })
|
|
366
435
|
|
|
367
436
|
return () => {
|
|
@@ -375,26 +444,15 @@ const CChipInput = defineComponent({
|
|
|
375
444
|
class: 'chip-input-label',
|
|
376
445
|
for: props.id,
|
|
377
446
|
},
|
|
378
|
-
props.label
|
|
379
|
-
),
|
|
380
|
-
...values.value.map((chipValue) =>
|
|
381
|
-
h(
|
|
382
|
-
CChip,
|
|
383
|
-
{
|
|
384
|
-
ariaRemoveLabel: `Remove ${chipValue}`,
|
|
385
|
-
class: resolveChipClassName(props.chipClassName, chipValue),
|
|
386
|
-
disabled: props.disabled,
|
|
387
|
-
key: chipValue,
|
|
388
|
-
onRemove: () => remove(chipValue),
|
|
389
|
-
onSelectedChange: (selected: boolean) => handleSelectedChange(chipValue, selected),
|
|
390
|
-
removable: Boolean(props.removable && !props.disabled && !props.readOnly),
|
|
391
|
-
selectable: props.selectable,
|
|
392
|
-
selected: selectedValues.value.includes(chipValue),
|
|
393
|
-
},
|
|
394
|
-
{
|
|
395
|
-
default: () => chipValue,
|
|
396
|
-
},
|
|
447
|
+
props.label
|
|
397
448
|
),
|
|
449
|
+
...chipsFromData(
|
|
450
|
+
values.value.map((chipValue) => ({
|
|
451
|
+
value: chipValue,
|
|
452
|
+
label: chipValue,
|
|
453
|
+
ariaRemoveLabel: `Remove ${chipValue}`,
|
|
454
|
+
class: resolveChipClassName(props.chipClassName, chipValue),
|
|
455
|
+
}))
|
|
398
456
|
),
|
|
399
457
|
h('input', {
|
|
400
458
|
ref: inputRef,
|
|
@@ -410,19 +468,13 @@ const CChipInput = defineComponent({
|
|
|
410
468
|
onInput: (event: Event) => handleInputChange((event.target as HTMLInputElement).value),
|
|
411
469
|
onKeydown: handleInputKeydown,
|
|
412
470
|
onPaste: handlePaste,
|
|
413
|
-
onFocus:
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
471
|
+
onFocus: clearSelection,
|
|
472
|
+
}),
|
|
473
|
+
h('input', {
|
|
474
|
+
type: 'hidden',
|
|
475
|
+
name: props.name ?? generatedName,
|
|
476
|
+
value: values.value.join(','),
|
|
419
477
|
}),
|
|
420
|
-
props.name &&
|
|
421
|
-
h('input', {
|
|
422
|
-
type: 'hidden',
|
|
423
|
-
name: props.name,
|
|
424
|
-
value: values.value.join(','),
|
|
425
|
-
}),
|
|
426
478
|
].filter(Boolean)
|
|
427
479
|
|
|
428
480
|
return h(
|
|
@@ -442,7 +494,7 @@ const CChipInput = defineComponent({
|
|
|
442
494
|
onClick: handleContainerClick,
|
|
443
495
|
onKeydown: handleContainerKeydown,
|
|
444
496
|
},
|
|
445
|
-
children
|
|
497
|
+
children
|
|
446
498
|
)
|
|
447
499
|
}
|
|
448
500
|
},
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { mount } from '@vue/test-utils'
|
|
2
|
-
import {
|
|
2
|
+
import { h } from 'vue'
|
|
3
|
+
import { CChip, CChipInput } from '../../../index'
|
|
3
4
|
|
|
4
5
|
describe('CChipInput', () => {
|
|
5
6
|
it('has correct name', () => {
|
|
@@ -185,6 +186,18 @@ describe('CChipInput', () => {
|
|
|
185
186
|
expect(hiddenInput.attributes('value')).toBe('tag1,tag2')
|
|
186
187
|
})
|
|
187
188
|
|
|
189
|
+
it('always renders a hidden input even without a name', () => {
|
|
190
|
+
const wrapper = mount(CChipInput, {
|
|
191
|
+
props: {
|
|
192
|
+
modelValue: ['tag1'],
|
|
193
|
+
},
|
|
194
|
+
})
|
|
195
|
+
const hiddenInput = wrapper.find('input[type="hidden"]')
|
|
196
|
+
expect(hiddenInput.exists()).toBe(true)
|
|
197
|
+
expect(hiddenInput.attributes('name')).toBeTruthy()
|
|
198
|
+
expect(hiddenInput.attributes('value')).toBe('tag1')
|
|
199
|
+
})
|
|
200
|
+
|
|
188
201
|
it('applies size classes', () => {
|
|
189
202
|
const wrapperSm = mount(CChipInput, {
|
|
190
203
|
props: {
|
|
@@ -268,7 +281,26 @@ describe('CChipInput', () => {
|
|
|
268
281
|
})
|
|
269
282
|
|
|
270
283
|
const chips = wrapper.findAllComponents({ name: 'CChip' })
|
|
271
|
-
|
|
284
|
+
// CChipInput forwards `selectable` to chips through the shared set config, not as a prop, so
|
|
285
|
+
// the chips are selectable in effect—`aria-selected` is only rendered for a selectable chip.
|
|
286
|
+
expect(chips[0].attributes('aria-selected')).toBe('false')
|
|
287
|
+
})
|
|
288
|
+
|
|
289
|
+
it('single selection deselects siblings', async () => {
|
|
290
|
+
const wrapper = mount(CChipInput, {
|
|
291
|
+
props: {
|
|
292
|
+
selectable: true,
|
|
293
|
+
selectionMode: 'single',
|
|
294
|
+
modelValue: ['a', 'b'],
|
|
295
|
+
},
|
|
296
|
+
})
|
|
297
|
+
|
|
298
|
+
const chips = wrapper.findAll('.chip')
|
|
299
|
+
await chips[0].trigger('click')
|
|
300
|
+
await chips[1].trigger('click')
|
|
301
|
+
|
|
302
|
+
expect(chips[0].classes()).not.toContain('active')
|
|
303
|
+
expect(chips[1].classes()).toContain('active')
|
|
272
304
|
})
|
|
273
305
|
|
|
274
306
|
it('handles paste with separator', async () => {
|
|
@@ -307,10 +339,9 @@ describe('CChipInput', () => {
|
|
|
307
339
|
})
|
|
308
340
|
|
|
309
341
|
it('applies chipClassName as function', async () => {
|
|
310
|
-
const classNameFn = (value: string) => `chip-${value}`
|
|
311
342
|
const wrapper = mount(CChipInput, {
|
|
312
343
|
props: {
|
|
313
|
-
chipClassName:
|
|
344
|
+
chipClassName: (value: string) => `chip-${value}`,
|
|
314
345
|
modelValue: ['primary', 'secondary'],
|
|
315
346
|
},
|
|
316
347
|
})
|
|
@@ -364,4 +395,49 @@ describe('CChipInput', () => {
|
|
|
364
395
|
const removeBtn = wrapper.find('.chip-remove')
|
|
365
396
|
expect(removeBtn.exists()).toBe(false)
|
|
366
397
|
})
|
|
398
|
+
|
|
399
|
+
it('moves focus to the input on ArrowRight from the last chip', async () => {
|
|
400
|
+
const wrapper = mount(CChipInput, {
|
|
401
|
+
attachTo: document.body,
|
|
402
|
+
props: { defaultValue: ['React', 'Vue'] },
|
|
403
|
+
})
|
|
404
|
+
const chips = wrapper.findAll('.chip')
|
|
405
|
+
const lastChip = chips[chips.length - 1]
|
|
406
|
+
const input = wrapper.find('input.chip-input-field').element as HTMLInputElement
|
|
407
|
+
;(lastChip.element as HTMLElement).focus()
|
|
408
|
+
await lastChip.trigger('keydown', { key: 'ArrowRight' })
|
|
409
|
+
expect(document.activeElement).toBe(input)
|
|
410
|
+
wrapper.unmount()
|
|
411
|
+
})
|
|
412
|
+
|
|
413
|
+
it('moves focus to the input on ArrowLeft from the last chip in RTL', async () => {
|
|
414
|
+
document.documentElement.dir = 'rtl'
|
|
415
|
+
const wrapper = mount(CChipInput, {
|
|
416
|
+
attachTo: document.body,
|
|
417
|
+
props: { defaultValue: ['React', 'Vue'] },
|
|
418
|
+
})
|
|
419
|
+
const chips = wrapper.findAll('.chip')
|
|
420
|
+
const lastChip = chips[chips.length - 1]
|
|
421
|
+
const input = wrapper.find('input.chip-input-field').element as HTMLInputElement
|
|
422
|
+
;(lastChip.element as HTMLElement).focus()
|
|
423
|
+
await lastChip.trigger('keydown', { key: 'ArrowLeft' })
|
|
424
|
+
expect(document.activeElement).toBe(input)
|
|
425
|
+
wrapper.unmount()
|
|
426
|
+
document.documentElement.dir = ''
|
|
427
|
+
})
|
|
428
|
+
|
|
429
|
+
it('seeds initial chips from CChip slot content', () => {
|
|
430
|
+
const wrapper = mount(CChipInput, {
|
|
431
|
+
slots: {
|
|
432
|
+
default: () => [
|
|
433
|
+
h(CChip, { value: 'React' }, { default: () => 'React' }),
|
|
434
|
+
h(CChip, { value: 'Vue' }, { default: () => 'Vue' }),
|
|
435
|
+
],
|
|
436
|
+
},
|
|
437
|
+
})
|
|
438
|
+
const chips = wrapper.findAll('.chip')
|
|
439
|
+
expect(chips).toHaveLength(2)
|
|
440
|
+
expect(wrapper.text()).toContain('React')
|
|
441
|
+
expect(wrapper.text()).toContain('Vue')
|
|
442
|
+
})
|
|
367
443
|
})
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
|
-
exports[`CChipInput renders correctly 1`] = `"<div class="chip-input"><input type="text" class="chip-input-field" placeholder="" size="1" value=""></div>"`;
|
|
3
|
+
exports[`CChipInput renders correctly 1`] = `"<div class="chip-input"><input type="text" class="chip-input-field" placeholder="" size="1" value=""><input type="hidden" name="v-0" value=""></div>"`;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { computed, defineComponent, h, PropType } from 'vue'
|
|
2
|
+
|
|
3
|
+
import { chipsFromData, type CChipSetItem } from './buildChips'
|
|
4
|
+
import { useChipSet, type ChipSetConfig } from './useChipSet'
|
|
5
|
+
|
|
6
|
+
export type { CChipSetItem }
|
|
7
|
+
|
|
8
|
+
const itemValue = (item: string | CChipSetItem): string =>
|
|
9
|
+
typeof item === 'string' ? item : item.value
|
|
10
|
+
|
|
11
|
+
const CChipSet = defineComponent({
|
|
12
|
+
name: 'CChipSet',
|
|
13
|
+
props: {
|
|
14
|
+
/**
|
|
15
|
+
* Component used for the root node. Either a string to use a HTML element or a component.
|
|
16
|
+
*/
|
|
17
|
+
as: {
|
|
18
|
+
type: String,
|
|
19
|
+
default: 'div',
|
|
20
|
+
},
|
|
21
|
+
/**
|
|
22
|
+
* Renders chips from data instead of the default slot. Each item is a string or an object with a `value`, an optional `label`, and any `CChip` props. The slot is used when this is omitted.
|
|
23
|
+
*/
|
|
24
|
+
chips: {
|
|
25
|
+
type: Array as PropType<(string | CChipSetItem)[]>,
|
|
26
|
+
default: undefined,
|
|
27
|
+
},
|
|
28
|
+
/**
|
|
29
|
+
* Disables every chip rendered by the component.
|
|
30
|
+
*/
|
|
31
|
+
disabled: Boolean,
|
|
32
|
+
/**
|
|
33
|
+
* Turns the chips into filter chips, each showing a leading check icon while selected.
|
|
34
|
+
*/
|
|
35
|
+
filter: Boolean,
|
|
36
|
+
/**
|
|
37
|
+
* Displays a remove button on every chip rendered by the component.
|
|
38
|
+
*/
|
|
39
|
+
removable: Boolean,
|
|
40
|
+
/**
|
|
41
|
+
* Replaces the default remove icon on every chip with a custom icon node.
|
|
42
|
+
*/
|
|
43
|
+
removeIcon: {
|
|
44
|
+
type: [String, Object],
|
|
45
|
+
default: undefined,
|
|
46
|
+
},
|
|
47
|
+
/**
|
|
48
|
+
* Enables selection behavior for the chips rendered by the component.
|
|
49
|
+
*/
|
|
50
|
+
selectable: Boolean,
|
|
51
|
+
/**
|
|
52
|
+
* The selected chip values passed using `v-model:selected`.
|
|
53
|
+
*/
|
|
54
|
+
selected: {
|
|
55
|
+
type: Array as PropType<string[]>,
|
|
56
|
+
default: undefined,
|
|
57
|
+
},
|
|
58
|
+
/**
|
|
59
|
+
* Replaces the default selected icon shown by filter chips with a custom icon node.
|
|
60
|
+
*/
|
|
61
|
+
selectedIcon: {
|
|
62
|
+
type: [String, Object],
|
|
63
|
+
default: undefined,
|
|
64
|
+
},
|
|
65
|
+
/**
|
|
66
|
+
* Sets how many chips can be selected at once.
|
|
67
|
+
*
|
|
68
|
+
* @values 'single', 'multiple'
|
|
69
|
+
*/
|
|
70
|
+
selectionMode: {
|
|
71
|
+
type: String as PropType<'single' | 'multiple'>,
|
|
72
|
+
default: 'multiple',
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
emits: [
|
|
76
|
+
/**
|
|
77
|
+
* Event occurs when a chip requests removal, with its value.
|
|
78
|
+
*/
|
|
79
|
+
'remove',
|
|
80
|
+
/**
|
|
81
|
+
* Event occurs when the selected chip values change.
|
|
82
|
+
*/
|
|
83
|
+
'select',
|
|
84
|
+
/**
|
|
85
|
+
* Emit the chips without the removed one (for `v-model:chips`).
|
|
86
|
+
*/
|
|
87
|
+
'update:chips',
|
|
88
|
+
/**
|
|
89
|
+
* Emit the new selected values whenever the selection changes (for `v-model:selected`).
|
|
90
|
+
*/
|
|
91
|
+
'update:selected',
|
|
92
|
+
],
|
|
93
|
+
setup(props, { attrs, emit, slots, expose }) {
|
|
94
|
+
const config = computed<ChipSetConfig>(() => ({
|
|
95
|
+
disabled: props.disabled,
|
|
96
|
+
filter: props.filter,
|
|
97
|
+
removable: props.removable,
|
|
98
|
+
removeIcon: props.removeIcon,
|
|
99
|
+
selectable: props.selectable,
|
|
100
|
+
selectedIcon: props.selectedIcon,
|
|
101
|
+
}))
|
|
102
|
+
|
|
103
|
+
const { rootRef, handleKeydown } = useChipSet({
|
|
104
|
+
config,
|
|
105
|
+
selectionMode: () => props.selectionMode,
|
|
106
|
+
selected: () => props.selected,
|
|
107
|
+
onSelectionChange: (selected) => {
|
|
108
|
+
emit('update:selected', selected)
|
|
109
|
+
emit('select', selected)
|
|
110
|
+
},
|
|
111
|
+
onRemove: (value) => {
|
|
112
|
+
// With `v-model:chips` the parent stays in sync automatically; a one-way
|
|
113
|
+
// `:chips` binding ignores the update and handles removal via `@remove`.
|
|
114
|
+
if (props.chips) {
|
|
115
|
+
emit(
|
|
116
|
+
'update:chips',
|
|
117
|
+
props.chips.filter((item) => itemValue(item) !== value)
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
emit('remove', value)
|
|
121
|
+
},
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
expose({ rootRef })
|
|
125
|
+
|
|
126
|
+
return () =>
|
|
127
|
+
h(
|
|
128
|
+
props.as,
|
|
129
|
+
{
|
|
130
|
+
ref: rootRef,
|
|
131
|
+
class: ['chip-set', { disabled: props.disabled }, attrs.class],
|
|
132
|
+
...(props.disabled && { 'aria-disabled': true }),
|
|
133
|
+
onKeydown: handleKeydown,
|
|
134
|
+
},
|
|
135
|
+
props.chips ? chipsFromData(props.chips) : slots.default && slots.default()
|
|
136
|
+
)
|
|
137
|
+
},
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
export { CChipSet }
|