@coreui/react-pro 5.24.1 → 5.26.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/card/CCardImage.js.map +1 -1
- package/dist/cjs/components/carousel/CCarousel.js +44 -33
- package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
- package/dist/cjs/components/carousel/CCarouselItem.js +19 -28
- package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/cjs/components/chip/CChip.d.ts +12 -0
- package/dist/cjs/components/chip/CChip.js +16 -63
- 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-set/CChipSet.d.ts +73 -0
- package/dist/cjs/components/chip-set/CChipSet.js +66 -0
- package/dist/cjs/components/chip-set/CChipSet.js.map +1 -0
- package/dist/cjs/components/chip-set/index.d.ts +2 -0
- package/dist/cjs/components/chip-set/useChipSet.d.ts +48 -0
- package/dist/cjs/components/chip-set/useChipSet.js +163 -0
- package/dist/cjs/components/chip-set/useChipSet.js.map +1 -0
- package/dist/cjs/components/chip-set/utils.d.ts +7 -0
- package/dist/cjs/components/chip-set/utils.js +18 -0
- package/dist/cjs/components/chip-set/utils.js.map +1 -0
- package/dist/cjs/components/collapse/CCollapse.js +14 -6
- package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
- package/dist/cjs/components/conditional-portal/CConditionalPortal.js +3 -1
- package/dist/cjs/components/conditional-portal/CConditionalPortal.js.map +1 -1
- package/dist/cjs/components/date-picker/CDatePicker.d.ts +1 -1
- package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
- package/dist/cjs/components/date-range-picker/CDateRangePicker.js +2 -0
- package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdown.js +23 -30
- package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/cjs/components/form/CChipInput.d.ts +14 -2
- package/dist/cjs/components/form/CChipInput.js +77 -49
- package/dist/cjs/components/form/CChipInput.js.map +1 -1
- package/dist/cjs/components/form/CFormCheck.js.map +1 -1
- package/dist/cjs/components/form/CFormInput.js.map +1 -1
- package/dist/cjs/components/form/CFormSelect.js.map +1 -1
- package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
- package/dist/cjs/components/form/CInputGroupText.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/header/CHeaderBrand.js.map +1 -1
- package/dist/cjs/components/index.d.ts +2 -0
- package/dist/cjs/components/link/CLink.js +4 -2
- package/dist/cjs/components/link/CLink.js.map +1 -1
- package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
- package/dist/cjs/components/modal/CModal.js +14 -2
- package/dist/cjs/components/modal/CModal.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelect.d.ts +73 -1
- package/dist/cjs/components/multi-select/CMultiSelect.js +157 -18
- package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +3 -0
- package/dist/cjs/components/multi-select/CMultiSelectOptions.js +45 -2
- package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +1 -0
- package/dist/cjs/components/multi-select/CMultiSelectSelection.js +4 -3
- package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
- package/dist/cjs/components/multi-select/types.d.ts +12 -0
- package/dist/cjs/components/multi-select/utils.js +1 -4
- package/dist/cjs/components/multi-select/utils.js.map +1 -1
- package/dist/cjs/components/nav/CNav.js.map +1 -1
- package/dist/cjs/components/nav/CNavGroup.d.ts +13 -6
- package/dist/cjs/components/nav/CNavGroup.js +86 -23
- package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
- package/dist/cjs/components/nav/CNavGroupContext.d.ts +25 -0
- package/dist/cjs/components/nav/CNavGroupContext.js +13 -0
- package/dist/cjs/components/nav/CNavGroupContext.js.map +1 -0
- package/dist/cjs/components/nav/CNavLink.d.ts +1 -5
- package/dist/cjs/components/nav/CNavLink.js +21 -8
- package/dist/cjs/components/nav/CNavLink.js.map +1 -1
- package/dist/cjs/components/one-time-password-input/COneTimePassword.js +3 -3
- package/dist/cjs/components/one-time-password-input/COneTimePassword.js.map +1 -1
- package/dist/cjs/components/popover/CPopover.js +69 -24
- package/dist/cjs/components/popover/CPopover.js.map +1 -1
- package/dist/cjs/components/progress/CProgress.js.map +1 -1
- package/dist/cjs/components/rating/CRating.d.ts +1 -1
- package/dist/cjs/components/rating/CRating.js.map +1 -1
- package/dist/cjs/components/search-button/CSearchButton.d.ts +32 -0
- package/dist/cjs/components/search-button/CSearchButton.js +77 -0
- package/dist/cjs/components/search-button/CSearchButton.js.map +1 -0
- package/dist/cjs/components/search-button/index.d.ts +2 -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 +115 -0
- package/dist/cjs/components/search-button/utils.js.map +1 -0
- package/dist/cjs/components/sidebar/CSidebar.js +40 -23
- package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
- package/dist/cjs/components/sidebar/CSidebarNav.d.ts +12 -0
- package/dist/cjs/components/sidebar/CSidebarNav.js +12 -36
- package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTable.js +2 -2
- package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTableInterface.d.ts +2 -2
- package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
- package/dist/cjs/components/table/types.d.ts +2 -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/CTabPanel.js +3 -1
- package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
- package/dist/cjs/components/time-picker/CTimePicker.d.ts +1 -1
- package/dist/cjs/components/time-picker/CTimePicker.js +1 -1
- package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
- package/dist/cjs/components/tooltip/CTooltip.js +69 -24
- package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
- package/dist/cjs/components/virtual-scroller/CVirtualScroller.js +11 -8
- package/dist/cjs/components/virtual-scroller/CVirtualScroller.js.map +1 -1
- package/dist/cjs/helpers/polymorphicComponent.d.ts +1 -2
- package/dist/cjs/hooks/useDebouncedCallback.d.ts +1 -1
- package/dist/cjs/hooks/useDebouncedCallback.js +1 -1
- package/dist/cjs/hooks/useDebouncedCallback.js.map +1 -1
- package/dist/cjs/hooks/useForkedRef.d.ts +1 -1
- package/dist/cjs/hooks/useForkedRef.js +6 -3
- package/dist/cjs/hooks/useForkedRef.js.map +1 -1
- package/dist/cjs/hooks/usePopper.js +8 -6
- package/dist/cjs/hooks/usePopper.js.map +1 -1
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.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/node_modules/ua-parser-js/dist/ua-parser.min.js +4 -4
- package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
- package/dist/cjs/utils/executeAfterTransition.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/esm/components/card/CCardImage.js.map +1 -1
- package/dist/esm/components/carousel/CCarousel.js +44 -33
- package/dist/esm/components/carousel/CCarousel.js.map +1 -1
- package/dist/esm/components/carousel/CCarouselItem.js +19 -28
- package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/esm/components/chip/CChip.d.ts +12 -0
- package/dist/esm/components/chip/CChip.js +16 -63
- 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-set/CChipSet.d.ts +73 -0
- package/dist/esm/components/chip-set/CChipSet.js +64 -0
- package/dist/esm/components/chip-set/CChipSet.js.map +1 -0
- package/dist/esm/components/chip-set/index.d.ts +2 -0
- package/dist/esm/components/chip-set/useChipSet.d.ts +48 -0
- package/dist/esm/components/chip-set/useChipSet.js +161 -0
- package/dist/esm/components/chip-set/useChipSet.js.map +1 -0
- package/dist/esm/components/chip-set/utils.d.ts +7 -0
- package/dist/esm/components/chip-set/utils.js +16 -0
- package/dist/esm/components/chip-set/utils.js.map +1 -0
- package/dist/esm/components/collapse/CCollapse.js +14 -6
- package/dist/esm/components/collapse/CCollapse.js.map +1 -1
- package/dist/esm/components/conditional-portal/CConditionalPortal.js +3 -1
- package/dist/esm/components/conditional-portal/CConditionalPortal.js.map +1 -1
- package/dist/esm/components/date-picker/CDatePicker.d.ts +1 -1
- package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
- package/dist/esm/components/date-range-picker/CDateRangePicker.js +2 -0
- package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdown.js +23 -30
- package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/esm/components/form/CChipInput.d.ts +14 -2
- package/dist/esm/components/form/CChipInput.js +78 -50
- package/dist/esm/components/form/CChipInput.js.map +1 -1
- package/dist/esm/components/form/CFormCheck.js.map +1 -1
- package/dist/esm/components/form/CFormInput.js.map +1 -1
- package/dist/esm/components/form/CFormSelect.js.map +1 -1
- package/dist/esm/components/form/CFormTextarea.js.map +1 -1
- package/dist/esm/components/form/CInputGroupText.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/header/CHeaderBrand.js.map +1 -1
- package/dist/esm/components/index.d.ts +2 -0
- package/dist/esm/components/link/CLink.js +4 -2
- package/dist/esm/components/link/CLink.js.map +1 -1
- package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
- package/dist/esm/components/modal/CModal.js +14 -2
- package/dist/esm/components/modal/CModal.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelect.d.ts +73 -1
- package/dist/esm/components/multi-select/CMultiSelect.js +158 -19
- package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +1 -1
- package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +3 -0
- package/dist/esm/components/multi-select/CMultiSelectOptions.js +45 -2
- package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +1 -0
- package/dist/esm/components/multi-select/CMultiSelectSelection.js +4 -3
- package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
- package/dist/esm/components/multi-select/types.d.ts +12 -0
- package/dist/esm/components/multi-select/utils.js +1 -4
- package/dist/esm/components/multi-select/utils.js.map +1 -1
- package/dist/esm/components/nav/CNav.js.map +1 -1
- package/dist/esm/components/nav/CNavGroup.d.ts +13 -6
- package/dist/esm/components/nav/CNavGroup.js +87 -24
- package/dist/esm/components/nav/CNavGroup.js.map +1 -1
- package/dist/esm/components/nav/CNavGroupContext.d.ts +25 -0
- package/dist/esm/components/nav/CNavGroupContext.js +11 -0
- package/dist/esm/components/nav/CNavGroupContext.js.map +1 -0
- package/dist/esm/components/nav/CNavLink.d.ts +1 -5
- package/dist/esm/components/nav/CNavLink.js +21 -8
- package/dist/esm/components/nav/CNavLink.js.map +1 -1
- package/dist/esm/components/one-time-password-input/COneTimePassword.js +3 -3
- package/dist/esm/components/one-time-password-input/COneTimePassword.js.map +1 -1
- package/dist/esm/components/popover/CPopover.js +69 -24
- package/dist/esm/components/popover/CPopover.js.map +1 -1
- package/dist/esm/components/progress/CProgress.js.map +1 -1
- package/dist/esm/components/rating/CRating.d.ts +1 -1
- package/dist/esm/components/rating/CRating.js.map +1 -1
- package/dist/esm/components/search-button/CSearchButton.d.ts +32 -0
- package/dist/esm/components/search-button/CSearchButton.js +75 -0
- package/dist/esm/components/search-button/CSearchButton.js.map +1 -0
- package/dist/esm/components/search-button/index.d.ts +2 -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 +104 -0
- package/dist/esm/components/search-button/utils.js.map +1 -0
- package/dist/esm/components/sidebar/CSidebar.js +40 -23
- package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
- package/dist/esm/components/sidebar/CSidebarNav.d.ts +12 -0
- package/dist/esm/components/sidebar/CSidebarNav.js +13 -37
- package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTable.js +2 -2
- package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTableInterface.d.ts +2 -2
- package/dist/esm/components/table/CTableDataCell.js.map +1 -1
- package/dist/esm/components/table/types.d.ts +2 -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/CTabPanel.js +3 -1
- package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
- package/dist/esm/components/time-picker/CTimePicker.d.ts +1 -1
- package/dist/esm/components/time-picker/CTimePicker.js +1 -1
- package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
- package/dist/esm/components/tooltip/CTooltip.js +69 -24
- package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
- package/dist/esm/components/virtual-scroller/CVirtualScroller.js +11 -8
- package/dist/esm/components/virtual-scroller/CVirtualScroller.js.map +1 -1
- package/dist/esm/helpers/polymorphicComponent.d.ts +1 -2
- package/dist/esm/hooks/useDebouncedCallback.d.ts +1 -1
- package/dist/esm/hooks/useDebouncedCallback.js +1 -1
- package/dist/esm/hooks/useDebouncedCallback.js.map +1 -1
- package/dist/esm/hooks/useForkedRef.d.ts +1 -1
- package/dist/esm/hooks/useForkedRef.js +6 -3
- package/dist/esm/hooks/useForkedRef.js.map +1 -1
- package/dist/esm/hooks/usePopper.js +9 -7
- package/dist/esm/hooks/usePopper.js.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.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/node_modules/ua-parser-js/dist/ua-parser.min.js +4 -4
- package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
- package/dist/esm/utils/executeAfterTransition.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/package.json +8 -6
- package/src/components/autocomplete/CAutocompleteOptions.tsx +1 -1
- package/src/components/autocomplete/__tests__/CAutocomplete.spec.tsx +18 -16
- package/src/components/autocomplete/__tests__/CAutocompleteOptions.spec.tsx +37 -28
- package/src/components/autocomplete/__tests__/__snapshots__/CAutocomplete.spec.tsx.snap +129 -0
- package/src/components/autocomplete/__tests__/__snapshots__/CAutocompleteOptions.spec.tsx.snap +36 -0
- package/src/components/calendar/__tests__/CCalendar.spec.tsx +40 -45
- package/src/components/calendar/__tests__/__snapshots__/CCalendar.spec.tsx.snap +99 -75
- package/src/components/calendar/__tests__/utils.spec.tsx +8 -18
- package/src/components/card/CCardImage.tsx +3 -2
- package/src/components/carousel/CCarousel.tsx +48 -51
- package/src/components/carousel/CCarouselContext.ts +1 -1
- package/src/components/carousel/CCarouselItem.tsx +25 -26
- package/src/components/carousel/__tests__/CCarousel.spec.tsx +47 -4
- package/src/components/carousel/__tests__/CCarouselItem.spec.tsx +37 -0
- package/src/components/chip/CChip.tsx +45 -78
- package/src/components/chip/__tests__/CChip.spec.tsx +26 -19
- package/src/components/chip/const.ts +3 -0
- package/src/components/chip-set/CChipSet.tsx +183 -0
- package/src/components/chip-set/__tests__/CChipSet.spec.tsx +215 -0
- package/src/components/chip-set/__tests__/__snapshots__/CChipSet.spec.tsx.snap +22 -0
- package/src/components/chip-set/index.ts +3 -0
- package/src/components/chip-set/useChipSet.ts +243 -0
- package/src/components/chip-set/utils.ts +19 -0
- package/src/components/collapse/CCollapse.tsx +18 -6
- package/src/components/conditional-portal/CConditionalPortal.tsx +4 -2
- package/src/components/date-picker/CDatePicker.tsx +12 -13
- package/src/components/date-picker/__tests__/CDatePicker.spec.tsx +1 -1
- package/src/components/date-picker/__tests__/__snapshots__/CDatePicker.spec.tsx.snap +12 -640
- package/src/components/date-range-picker/CDateRangePicker.tsx +2 -0
- package/src/components/date-range-picker/__tests__/CDateRangePicker.spec.tsx +1 -1
- package/src/components/date-range-picker/__tests__/__snapshots__/CDateRangePicker.spec.tsx.snap +21 -1259
- package/src/components/dropdown/CDropdown.tsx +29 -34
- package/src/components/dropdown/CDropdownToggle.tsx +1 -1
- package/src/components/dropdown/__tests__/CDropdown.spec.tsx +56 -1
- package/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.tsx.snap +2 -2
- package/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.tsx.snap +1 -1
- package/src/components/focus-trap/__tests__/CFocusTrap.spec.tsx +1 -1
- package/src/components/form/CChipInput.tsx +105 -67
- package/src/components/form/CFormCheck.tsx +1 -2
- package/src/components/form/CFormInput.tsx +1 -2
- package/src/components/form/CFormSelect.tsx +1 -2
- package/src/components/form/CFormTextarea.tsx +1 -2
- package/src/components/form/CInputGroupText.tsx +3 -2
- package/src/components/form/__tests__/CChipInput.spec.tsx +67 -1
- package/src/components/form/__tests__/CFormInput.spec.tsx +17 -20
- package/src/components/form/__tests__/__snapshots__/CChipInput.spec.tsx.snap +7 -0
- package/src/components/form/__tests__/__snapshots__/CFormInput.spec.tsx.snap +12 -3
- package/src/components/grid/CContainer.tsx +3 -1
- package/src/components/header/CHeaderBrand.tsx +3 -2
- package/src/components/index.ts +2 -0
- package/src/components/link/CLink.tsx +7 -4
- package/src/components/list-group/CListGroupItem.tsx +3 -2
- package/src/components/loading-button/__tests__/CLoadingButton.spec.tsx +1 -1
- package/src/components/loading-button/__tests__/__snapshots__/CLoadingButton.spec.tsx.snap +4 -4
- package/src/components/modal/CModal.tsx +19 -2
- package/src/components/modal/__tests__/CModal.spec.tsx +43 -0
- package/src/components/multi-select/CMultiSelect.tsx +341 -46
- package/src/components/multi-select/CMultiSelectNativeSelect.tsx +1 -1
- package/src/components/multi-select/CMultiSelectOptions.tsx +74 -3
- package/src/components/multi-select/CMultiSelectSelection.tsx +5 -1
- package/src/components/multi-select/__tests__/CMultiSelect.spec.tsx +27 -69
- package/src/components/multi-select/__tests__/CMultiSelectNativeSelect.spec.tsx +4 -5
- package/src/components/multi-select/__tests__/CMultiSelectOptions.spec.tsx +4 -4
- package/src/components/multi-select/__tests__/CMultiSelectSelection.spec.tsx +7 -24
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelect.spec.tsx.snap +108 -61
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectNativeSelect.spec.tsx.snap +2 -4
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectOptions.spec.tsx.snap +7 -0
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectSelection.spec.tsx.snap +16 -9
- package/src/components/multi-select/types.ts +14 -0
- package/src/components/nav/CNav.tsx +3 -2
- package/src/components/nav/CNavGroup.tsx +196 -105
- package/src/components/nav/CNavGroupContext.ts +27 -0
- package/src/components/nav/CNavLink.tsx +26 -12
- package/src/components/nav/__tests__/CNavGroup.spec.tsx +207 -4
- package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.tsx.snap +3 -1
- package/src/components/offcanvas/__tests__/COffcanvas.spec.tsx +1 -0
- package/src/components/one-time-password-input/COneTimePassword.tsx +10 -11
- package/src/components/picker/__tests__/CPicker.spec.tsx +1 -1
- package/src/components/picker/__tests__/__snapshots__/CPicker.spec.tsx.snap +2 -16
- package/src/components/popover/CPopover.tsx +71 -26
- package/src/components/popover/__tests__/CPopover.spec.tsx +85 -4
- package/src/components/progress/CProgress.tsx +1 -2
- package/src/components/rating/CRating.tsx +1 -0
- package/src/components/search-button/CSearchButton.tsx +195 -0
- package/src/components/search-button/__tests__/CSearchButton.spec.tsx +95 -0
- package/src/components/search-button/__tests__/__snapshots__/CSearchButton.spec.tsx.snap +87 -0
- package/src/components/search-button/index.ts +3 -0
- package/src/components/search-button/types.ts +10 -0
- package/src/components/search-button/utils.ts +140 -0
- package/src/components/sidebar/CSidebar.tsx +51 -26
- package/src/components/sidebar/CSidebarNav.tsx +39 -53
- package/src/components/sidebar/__tests__/CSidebar.spec.tsx +26 -0
- package/src/components/smart-table/CSmartTable.tsx +5 -4
- package/src/components/smart-table/CSmartTableInterface.tsx +2 -2
- package/src/components/smart-table/__tests__/CSmartTable.spec.tsx +3 -2
- package/src/components/smart-table/__tests__/__snapshots__/CSmartTable.spec.tsx.snap +7 -15
- package/src/components/stepper/__tests__/CStepper.spec.tsx +24 -21
- package/src/components/stepper/__tests__/__snapshots__/CStepper.spec.tsx.snap +295 -0
- package/src/components/table/CTableDataCell.tsx +2 -1
- package/src/components/table/types.ts +3 -1
- package/src/components/table/utils.ts +4 -4
- package/src/components/tabs/CTabPanel.tsx +3 -1
- package/src/components/tabs/CTabsContext.ts +1 -1
- package/src/components/tabs/__tests__/CTabContent.spec.tsx +1 -0
- package/src/components/tabs/__tests__/CTabPane.spec.tsx +1 -0
- package/src/components/time-picker/CTimePicker.tsx +6 -7
- package/src/components/time-picker/__tests__/CTimePicker.spec.tsx +10 -1
- package/src/components/time-picker/__tests__/__snapshots__/CTimePicker.spec.tsx.snap +599 -315
- package/src/components/tooltip/CTooltip.tsx +72 -27
- package/src/components/tooltip/__tests__/CTooltip.spec.tsx +102 -1
- package/src/components/virtual-scroller/CVirtualScroller.tsx +13 -14
- package/src/helpers/polymorphicComponent.ts +1 -1
- package/src/hooks/useColorModes.ts +2 -2
- package/src/hooks/useDebouncedCallback.ts +7 -4
- package/src/hooks/useForkedRef.ts +20 -15
- package/src/hooks/usePopper.ts +13 -9
- package/src/utils/__tests__/swipe.spec.ts +82 -0
- package/src/utils/executeAfterTransition.ts +1 -1
- package/src/utils/index.ts +2 -0
- package/src/utils/mergeClassNames.ts +1 -1
- package/src/utils/swipe.ts +114 -0
- package/dist/cjs/components/accordion/CAccordionCollapse.d.ts +0 -3
- package/dist/cjs/components/sidebar/CSidebarNavContext.d.ts +0 -5
- package/dist/cjs/components/sidebar/CSidebarNavContext.js +0 -8
- package/dist/cjs/components/sidebar/CSidebarNavContext.js.map +0 -1
- package/dist/esm/components/accordion/CAccordionCollapse.d.ts +0 -3
- package/dist/esm/components/sidebar/CSidebarNavContext.d.ts +0 -5
- package/dist/esm/components/sidebar/CSidebarNavContext.js +0 -6
- package/dist/esm/components/sidebar/CSidebarNavContext.js.map +0 -1
- package/src/components/accordion/CAccordionCollapse.tsx +0 -20
- package/src/components/accordion/__tests__/CAccordionCollapse.spec.tsx +0 -10
- package/src/components/accordion/__tests__/__snapshots__/CAccordionCollapse.spec.tsx.snap +0 -11
- package/src/components/button/__tests__/__snapshots__/CButtonClose.spec.tsx.snap +0 -26
- package/src/components/calendar/__tests__/CCalendar.accessibility.spec.tsx +0 -595
- package/src/components/calendar/__tests__/CCalendar.comprehensive.spec.tsx +0 -402
- package/src/components/calendar/__tests__/CCalendar.edge-cases.spec.tsx +0 -416
- package/src/components/calendar/__tests__/CCalendar.interactions.spec.tsx +0 -593
- package/src/components/header/CHeaderBrand.tsx~HEAD +0 -36
- package/src/components/sidebar/CSidebarNavContext.ts +0 -8
- /package/src/components/calendar/__tests__/{test-setup.ts → setup.ts} +0 -0
|
@@ -1,595 +0,0 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
|
-
import { render, screen, fireEvent } from '@testing-library/react'
|
|
3
|
-
import userEvent from '@testing-library/user-event'
|
|
4
|
-
import '@testing-library/jest-dom'
|
|
5
|
-
import { CCalendar } from '../CCalendar'
|
|
6
|
-
|
|
7
|
-
// Mock axe for accessibility testing
|
|
8
|
-
import { axe, toHaveNoViolations } from 'jest-axe'
|
|
9
|
-
|
|
10
|
-
expect.extend(toHaveNoViolations)
|
|
11
|
-
|
|
12
|
-
describe('CCalendar Accessibility', () => {
|
|
13
|
-
let user: ReturnType<typeof userEvent.setup>
|
|
14
|
-
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
user = userEvent.setup()
|
|
17
|
-
jest.clearAllMocks()
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
describe('ARIA Compliance', () => {
|
|
21
|
-
it('has proper role attribute', () => {
|
|
22
|
-
render(<CCalendar />)
|
|
23
|
-
const calendar = screen.getByRole('application')
|
|
24
|
-
expect(calendar).toBeInTheDocument()
|
|
25
|
-
expect(calendar).toHaveAttribute('role', 'application')
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
it('has accessible name', () => {
|
|
29
|
-
render(<CCalendar aria-label="Date picker" />)
|
|
30
|
-
const calendar = screen.getByRole('application')
|
|
31
|
-
expect(calendar).toHaveAccessibleName('Date picker')
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
it('has describedby for help text', () => {
|
|
35
|
-
render(
|
|
36
|
-
<div>
|
|
37
|
-
<CCalendar aria-describedby="calendar-help" />
|
|
38
|
-
<div id="calendar-help">Use arrow keys to navigate dates</div>
|
|
39
|
-
</div>
|
|
40
|
-
)
|
|
41
|
-
const calendar = screen.getByRole('application')
|
|
42
|
-
expect(calendar).toHaveAttribute('aria-describedby', 'calendar-help')
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
it('has proper tabindex for focus management', () => {
|
|
46
|
-
render(<CCalendar />)
|
|
47
|
-
const calendar = screen.getByRole('application')
|
|
48
|
-
expect(calendar).toHaveAttribute('tabindex', '0')
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it('announces selected date changes', () => {
|
|
52
|
-
render(<CCalendar aria-live="polite" />)
|
|
53
|
-
const calendar = screen.getByRole('application')
|
|
54
|
-
expect(calendar).toHaveAttribute('aria-live', 'polite')
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
it('has proper aria-expanded for dropdowns', () => {
|
|
58
|
-
render(<CCalendar navigation />)
|
|
59
|
-
// This would check month/year dropdowns if they exist
|
|
60
|
-
const calendar = screen.getByRole('application')
|
|
61
|
-
expect(calendar).toBeInTheDocument()
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
it('has aria-disabled for disabled dates', () => {
|
|
65
|
-
const disabledDate = new Date(2022, 1, 16)
|
|
66
|
-
render(<CCalendar disabledDate={[disabledDate]} />)
|
|
67
|
-
|
|
68
|
-
// This would check for specific date cells with aria-disabled
|
|
69
|
-
const calendar = screen.getByRole('application')
|
|
70
|
-
expect(calendar).toBeInTheDocument()
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it('has aria-selected for selected dates', () => {
|
|
74
|
-
render(<CCalendar calendarDate="2/16/2022" />)
|
|
75
|
-
|
|
76
|
-
// This would check for specific date cells with aria-selected
|
|
77
|
-
const calendar = screen.getByRole('application')
|
|
78
|
-
expect(calendar).toBeInTheDocument()
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
it('has proper heading structure', () => {
|
|
82
|
-
render(<CCalendar navigation />)
|
|
83
|
-
|
|
84
|
-
// Check for proper heading hierarchy (h1, h2, etc.)
|
|
85
|
-
// Month/year headers should be proper headings
|
|
86
|
-
const calendar = screen.getByRole('application')
|
|
87
|
-
expect(calendar).toBeInTheDocument()
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it('has landmark regions', () => {
|
|
91
|
-
render(<CCalendar />)
|
|
92
|
-
|
|
93
|
-
// Calendar should be within a proper landmark
|
|
94
|
-
const calendar = screen.getByRole('application')
|
|
95
|
-
expect(calendar).toBeInTheDocument()
|
|
96
|
-
})
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
describe('Keyboard Navigation', () => {
|
|
100
|
-
it('is keyboard accessible', async () => {
|
|
101
|
-
render(<CCalendar />)
|
|
102
|
-
const calendar = screen.getByRole('application')
|
|
103
|
-
|
|
104
|
-
// Should be focusable
|
|
105
|
-
calendar.focus()
|
|
106
|
-
expect(calendar).toHaveFocus()
|
|
107
|
-
|
|
108
|
-
// Should respond to arrow keys
|
|
109
|
-
await user.keyboard('{ArrowRight}')
|
|
110
|
-
await user.keyboard('{ArrowDown}')
|
|
111
|
-
await user.keyboard('{ArrowLeft}')
|
|
112
|
-
await user.keyboard('{ArrowUp}')
|
|
113
|
-
|
|
114
|
-
expect(calendar).toBeInTheDocument()
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
it('supports Enter for selection', async () => {
|
|
118
|
-
const onCalendarDateChange = jest.fn()
|
|
119
|
-
render(<CCalendar onCalendarDateChange={onCalendarDateChange} />)
|
|
120
|
-
|
|
121
|
-
const calendar = screen.getByRole('application')
|
|
122
|
-
calendar.focus()
|
|
123
|
-
|
|
124
|
-
await user.keyboard('{Enter}')
|
|
125
|
-
|
|
126
|
-
expect(calendar).toBeInTheDocument()
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
it('supports Space for selection', async () => {
|
|
130
|
-
const onCalendarDateChange = jest.fn()
|
|
131
|
-
render(<CCalendar onCalendarDateChange={onCalendarDateChange} />)
|
|
132
|
-
|
|
133
|
-
const calendar = screen.getByRole('application')
|
|
134
|
-
calendar.focus()
|
|
135
|
-
|
|
136
|
-
await user.keyboard('{Space}')
|
|
137
|
-
|
|
138
|
-
expect(calendar).toBeInTheDocument()
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
it('supports Escape to close', async () => {
|
|
142
|
-
render(<CCalendar />)
|
|
143
|
-
|
|
144
|
-
const calendar = screen.getByRole('application')
|
|
145
|
-
calendar.focus()
|
|
146
|
-
|
|
147
|
-
await user.keyboard('{Escape}')
|
|
148
|
-
|
|
149
|
-
expect(calendar).toBeInTheDocument()
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
it('supports Tab for focus management', async () => {
|
|
153
|
-
render(
|
|
154
|
-
<div>
|
|
155
|
-
<button>Previous element</button>
|
|
156
|
-
<CCalendar />
|
|
157
|
-
<button>Next element</button>
|
|
158
|
-
</div>
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
const prevButton = screen.getByText('Previous element')
|
|
162
|
-
const nextButton = screen.getByText('Next element')
|
|
163
|
-
|
|
164
|
-
prevButton.focus()
|
|
165
|
-
|
|
166
|
-
// Tab into calendar
|
|
167
|
-
await user.keyboard('{Tab}')
|
|
168
|
-
|
|
169
|
-
const calendar = screen.getByRole('application')
|
|
170
|
-
expect(calendar).toHaveFocus()
|
|
171
|
-
|
|
172
|
-
// Tab out of calendar
|
|
173
|
-
await user.keyboard('{Tab}')
|
|
174
|
-
expect(nextButton).toHaveFocus()
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
it('supports Home/End for navigation', async () => {
|
|
178
|
-
render(<CCalendar />)
|
|
179
|
-
|
|
180
|
-
const calendar = screen.getByRole('application')
|
|
181
|
-
calendar.focus()
|
|
182
|
-
|
|
183
|
-
await user.keyboard('{Home}')
|
|
184
|
-
await user.keyboard('{End}')
|
|
185
|
-
|
|
186
|
-
expect(calendar).toBeInTheDocument()
|
|
187
|
-
})
|
|
188
|
-
|
|
189
|
-
it('supports PageUp/PageDown for month navigation', async () => {
|
|
190
|
-
render(<CCalendar />)
|
|
191
|
-
|
|
192
|
-
const calendar = screen.getByRole('application')
|
|
193
|
-
calendar.focus()
|
|
194
|
-
|
|
195
|
-
await user.keyboard('{PageUp}')
|
|
196
|
-
await user.keyboard('{PageDown}')
|
|
197
|
-
|
|
198
|
-
expect(calendar).toBeInTheDocument()
|
|
199
|
-
})
|
|
200
|
-
|
|
201
|
-
it('skips disabled dates during keyboard navigation', async () => {
|
|
202
|
-
const disabledDate = new Date(2022, 1, 16)
|
|
203
|
-
render(<CCalendar disabledDate={[disabledDate]} />)
|
|
204
|
-
|
|
205
|
-
const calendar = screen.getByRole('application')
|
|
206
|
-
calendar.focus()
|
|
207
|
-
|
|
208
|
-
// Navigation should skip over disabled dates
|
|
209
|
-
await user.keyboard('{ArrowRight}')
|
|
210
|
-
|
|
211
|
-
expect(calendar).toBeInTheDocument()
|
|
212
|
-
})
|
|
213
|
-
|
|
214
|
-
it('handles keyboard navigation in range mode', async () => {
|
|
215
|
-
render(<CCalendar range />)
|
|
216
|
-
|
|
217
|
-
const calendar = screen.getByRole('application')
|
|
218
|
-
calendar.focus()
|
|
219
|
-
|
|
220
|
-
// Start range selection
|
|
221
|
-
await user.keyboard('{Enter}')
|
|
222
|
-
|
|
223
|
-
// Navigate to end date
|
|
224
|
-
await user.keyboard('{ArrowRight}{ArrowRight}{ArrowRight}')
|
|
225
|
-
|
|
226
|
-
// Complete range selection
|
|
227
|
-
await user.keyboard('{Enter}')
|
|
228
|
-
|
|
229
|
-
expect(calendar).toBeInTheDocument()
|
|
230
|
-
})
|
|
231
|
-
})
|
|
232
|
-
|
|
233
|
-
describe('Screen Reader Support', () => {
|
|
234
|
-
it('has proper accessible names for dates', () => {
|
|
235
|
-
render(<CCalendar calendarDate="2/16/2022" />)
|
|
236
|
-
|
|
237
|
-
// Date cells should have accessible names like "February 16, 2022"
|
|
238
|
-
const calendar = screen.getByRole('application')
|
|
239
|
-
expect(calendar).toBeInTheDocument()
|
|
240
|
-
})
|
|
241
|
-
|
|
242
|
-
it('announces navigation changes', () => {
|
|
243
|
-
render(<CCalendar />)
|
|
244
|
-
|
|
245
|
-
// Should have live regions for announcements
|
|
246
|
-
const calendar = screen.getByRole('application')
|
|
247
|
-
expect(calendar).toBeInTheDocument()
|
|
248
|
-
})
|
|
249
|
-
|
|
250
|
-
it('provides context for date states', () => {
|
|
251
|
-
const disabledDate = new Date(2022, 1, 16)
|
|
252
|
-
render(<CCalendar disabledDate={[disabledDate]} />)
|
|
253
|
-
|
|
254
|
-
// Disabled dates should be announced as such
|
|
255
|
-
const calendar = screen.getByRole('application')
|
|
256
|
-
expect(calendar).toBeInTheDocument()
|
|
257
|
-
})
|
|
258
|
-
|
|
259
|
-
it('announces range selection state', () => {
|
|
260
|
-
render(<CCalendar range startDate="2/16/2022" endDate="2/20/2022" />)
|
|
261
|
-
|
|
262
|
-
// Range dates should be properly announced
|
|
263
|
-
const calendar = screen.getByRole('application')
|
|
264
|
-
expect(calendar).toBeInTheDocument()
|
|
265
|
-
})
|
|
266
|
-
|
|
267
|
-
it('provides month and year context', () => {
|
|
268
|
-
render(<CCalendar calendarDate="2/16/2022" />)
|
|
269
|
-
|
|
270
|
-
// Current month/year should be announced or available to screen readers
|
|
271
|
-
const calendar = screen.getByRole('application')
|
|
272
|
-
expect(calendar).toBeInTheDocument()
|
|
273
|
-
})
|
|
274
|
-
|
|
275
|
-
it('announces view changes', () => {
|
|
276
|
-
render(<CCalendar />)
|
|
277
|
-
|
|
278
|
-
// View changes (day/month/year view) should be announced
|
|
279
|
-
const calendar = screen.getByRole('application')
|
|
280
|
-
expect(calendar).toBeInTheDocument()
|
|
281
|
-
})
|
|
282
|
-
})
|
|
283
|
-
|
|
284
|
-
describe('High Contrast Mode', () => {
|
|
285
|
-
beforeEach(() => {
|
|
286
|
-
// Mock high contrast media query
|
|
287
|
-
Object.defineProperty(window, 'matchMedia', {
|
|
288
|
-
writable: true,
|
|
289
|
-
value: jest.fn().mockImplementation(query => ({
|
|
290
|
-
matches: query.includes('prefers-contrast: high'),
|
|
291
|
-
media: query,
|
|
292
|
-
onchange: null,
|
|
293
|
-
addListener: jest.fn(),
|
|
294
|
-
removeListener: jest.fn(),
|
|
295
|
-
addEventListener: jest.fn(),
|
|
296
|
-
removeEventListener: jest.fn(),
|
|
297
|
-
dispatchEvent: jest.fn(),
|
|
298
|
-
})),
|
|
299
|
-
})
|
|
300
|
-
})
|
|
301
|
-
|
|
302
|
-
it('maintains visibility in high contrast mode', () => {
|
|
303
|
-
render(<CCalendar />)
|
|
304
|
-
|
|
305
|
-
const calendar = screen.getByRole('application')
|
|
306
|
-
|
|
307
|
-
// Elements should still be visible and accessible
|
|
308
|
-
expect(calendar).toBeInTheDocument()
|
|
309
|
-
expect(calendar).toBeVisible()
|
|
310
|
-
})
|
|
311
|
-
|
|
312
|
-
it('has sufficient contrast for text', () => {
|
|
313
|
-
render(<CCalendar />)
|
|
314
|
-
|
|
315
|
-
// Text should maintain adequate contrast ratios
|
|
316
|
-
const calendar = screen.getByRole('application')
|
|
317
|
-
expect(calendar).toBeInTheDocument()
|
|
318
|
-
})
|
|
319
|
-
|
|
320
|
-
it('has visible focus indicators', () => {
|
|
321
|
-
render(<CCalendar />)
|
|
322
|
-
|
|
323
|
-
const calendar = screen.getByRole('application')
|
|
324
|
-
calendar.focus()
|
|
325
|
-
|
|
326
|
-
// Focus should be clearly visible in high contrast mode
|
|
327
|
-
expect(calendar).toHaveFocus()
|
|
328
|
-
})
|
|
329
|
-
})
|
|
330
|
-
|
|
331
|
-
describe('Reduced Motion', () => {
|
|
332
|
-
beforeEach(() => {
|
|
333
|
-
// Mock reduced motion preference
|
|
334
|
-
Object.defineProperty(window, 'matchMedia', {
|
|
335
|
-
writable: true,
|
|
336
|
-
value: jest.fn().mockImplementation(query => ({
|
|
337
|
-
matches: query.includes('prefers-reduced-motion: reduce'),
|
|
338
|
-
media: query,
|
|
339
|
-
onchange: null,
|
|
340
|
-
addListener: jest.fn(),
|
|
341
|
-
removeListener: jest.fn(),
|
|
342
|
-
addEventListener: jest.fn(),
|
|
343
|
-
removeEventListener: jest.fn(),
|
|
344
|
-
dispatchEvent: jest.fn(),
|
|
345
|
-
})),
|
|
346
|
-
})
|
|
347
|
-
})
|
|
348
|
-
|
|
349
|
-
it('respects reduced motion preferences', () => {
|
|
350
|
-
render(<CCalendar />)
|
|
351
|
-
|
|
352
|
-
// Animations should be reduced or disabled
|
|
353
|
-
const calendar = screen.getByRole('application')
|
|
354
|
-
expect(calendar).toBeInTheDocument()
|
|
355
|
-
})
|
|
356
|
-
|
|
357
|
-
it('maintains functionality without animations', () => {
|
|
358
|
-
render(<CCalendar />)
|
|
359
|
-
|
|
360
|
-
// All functionality should work without animations
|
|
361
|
-
const calendar = screen.getByRole('application')
|
|
362
|
-
expect(calendar).toBeInTheDocument()
|
|
363
|
-
})
|
|
364
|
-
})
|
|
365
|
-
|
|
366
|
-
describe('Touch Accessibility', () => {
|
|
367
|
-
it('has adequate touch targets', () => {
|
|
368
|
-
render(<CCalendar />)
|
|
369
|
-
|
|
370
|
-
const calendar = screen.getByRole('application')
|
|
371
|
-
|
|
372
|
-
// Touch targets should be at least 44x44 pixels
|
|
373
|
-
// This would need to check actual date cell sizes
|
|
374
|
-
expect(calendar).toBeInTheDocument()
|
|
375
|
-
})
|
|
376
|
-
|
|
377
|
-
it('supports touch navigation', () => {
|
|
378
|
-
render(<CCalendar />)
|
|
379
|
-
|
|
380
|
-
const calendar = screen.getByRole('application')
|
|
381
|
-
|
|
382
|
-
// Should work with touch gestures
|
|
383
|
-
fireEvent.touchStart(calendar, {
|
|
384
|
-
touches: [{ clientX: 100, clientY: 100 }]
|
|
385
|
-
})
|
|
386
|
-
|
|
387
|
-
fireEvent.touchEnd(calendar, {
|
|
388
|
-
changedTouches: [{ clientX: 100, clientY: 100 }]
|
|
389
|
-
})
|
|
390
|
-
|
|
391
|
-
expect(calendar).toBeInTheDocument()
|
|
392
|
-
})
|
|
393
|
-
|
|
394
|
-
it('provides touch feedback', () => {
|
|
395
|
-
render(<CCalendar />)
|
|
396
|
-
|
|
397
|
-
const calendar = screen.getByRole('application')
|
|
398
|
-
|
|
399
|
-
// Touch interactions should provide appropriate feedback
|
|
400
|
-
expect(calendar).toBeInTheDocument()
|
|
401
|
-
})
|
|
402
|
-
})
|
|
403
|
-
|
|
404
|
-
describe('Localization Accessibility', () => {
|
|
405
|
-
it('supports RTL languages', () => {
|
|
406
|
-
render(<CCalendar locale="ar-SA" />)
|
|
407
|
-
|
|
408
|
-
// Should work properly with right-to-left languages
|
|
409
|
-
const calendar = screen.getByRole('application')
|
|
410
|
-
expect(calendar).toBeInTheDocument()
|
|
411
|
-
})
|
|
412
|
-
|
|
413
|
-
it('has proper language attributes', () => {
|
|
414
|
-
render(<CCalendar locale="pl-PL" />)
|
|
415
|
-
|
|
416
|
-
// Should have appropriate lang attributes
|
|
417
|
-
const calendar = screen.getByRole('application')
|
|
418
|
-
expect(calendar).toBeInTheDocument()
|
|
419
|
-
})
|
|
420
|
-
|
|
421
|
-
it('uses locale-appropriate date formats', () => {
|
|
422
|
-
render(<CCalendar locale="de-DE" />)
|
|
423
|
-
|
|
424
|
-
// Date formats should match locale expectations
|
|
425
|
-
const calendar = screen.getByRole('application')
|
|
426
|
-
expect(calendar).toBeInTheDocument()
|
|
427
|
-
})
|
|
428
|
-
|
|
429
|
-
it('provides translated content', () => {
|
|
430
|
-
render(<CCalendar locale="fr-FR" />)
|
|
431
|
-
|
|
432
|
-
// Month names, day names should be localized
|
|
433
|
-
const calendar = screen.getByRole('application')
|
|
434
|
-
expect(calendar).toBeInTheDocument()
|
|
435
|
-
})
|
|
436
|
-
})
|
|
437
|
-
|
|
438
|
-
describe('Automated Accessibility Testing', () => {
|
|
439
|
-
it('passes axe accessibility tests', async () => {
|
|
440
|
-
const { container } = render(<CCalendar />)
|
|
441
|
-
|
|
442
|
-
const results = await axe(container)
|
|
443
|
-
expect(results).toHaveNoViolations()
|
|
444
|
-
})
|
|
445
|
-
|
|
446
|
-
it('passes axe tests with various props', async () => {
|
|
447
|
-
const { container } = render(
|
|
448
|
-
<CCalendar
|
|
449
|
-
navigation
|
|
450
|
-
range
|
|
451
|
-
calendarDate="2/16/2022"
|
|
452
|
-
startDate="2/10/2022"
|
|
453
|
-
endDate="2/20/2022"
|
|
454
|
-
minDate="1/1/2022"
|
|
455
|
-
maxDate="12/31/2022"
|
|
456
|
-
disabledDate={[new Date(2022, 1, 15)]}
|
|
457
|
-
locale="en-US"
|
|
458
|
-
/>
|
|
459
|
-
)
|
|
460
|
-
|
|
461
|
-
const results = await axe(container)
|
|
462
|
-
expect(results).toHaveNoViolations()
|
|
463
|
-
})
|
|
464
|
-
|
|
465
|
-
it('passes axe tests in different locales', async () => {
|
|
466
|
-
const locales = ['en-US', 'pl-PL', 'de-DE', 'fr-FR']
|
|
467
|
-
|
|
468
|
-
for (const locale of locales) {
|
|
469
|
-
const { container } = render(<CCalendar locale={locale} />)
|
|
470
|
-
const results = await axe(container)
|
|
471
|
-
expect(results).toHaveNoViolations()
|
|
472
|
-
}
|
|
473
|
-
})
|
|
474
|
-
|
|
475
|
-
it('passes axe tests with dynamic content', async () => {
|
|
476
|
-
const TestComponent = () => {
|
|
477
|
-
const [date, setDate] = React.useState<string | null>("2/16/2022")
|
|
478
|
-
|
|
479
|
-
React.useEffect(() => {
|
|
480
|
-
const timer = setTimeout(() => setDate("3/16/2022"), 100)
|
|
481
|
-
return () => clearTimeout(timer)
|
|
482
|
-
}, [])
|
|
483
|
-
|
|
484
|
-
return <CCalendar calendarDate={date} />
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
const { container } = render(<TestComponent />)
|
|
488
|
-
|
|
489
|
-
// Test both initial and updated states
|
|
490
|
-
const initialResults = await axe(container)
|
|
491
|
-
expect(initialResults).toHaveNoViolations()
|
|
492
|
-
|
|
493
|
-
// Wait for update
|
|
494
|
-
await new Promise(resolve => setTimeout(resolve, 150))
|
|
495
|
-
|
|
496
|
-
const updatedResults = await axe(container)
|
|
497
|
-
expect(updatedResults).toHaveNoViolations()
|
|
498
|
-
})
|
|
499
|
-
})
|
|
500
|
-
|
|
501
|
-
describe('Error States Accessibility', () => {
|
|
502
|
-
it('announces validation errors', () => {
|
|
503
|
-
// Mock a validation error scenario
|
|
504
|
-
render(
|
|
505
|
-
<div>
|
|
506
|
-
<CCalendar aria-describedby="date-error" />
|
|
507
|
-
<div id="date-error" role="alert">
|
|
508
|
-
Please select a date within the allowed range
|
|
509
|
-
</div>
|
|
510
|
-
</div>
|
|
511
|
-
)
|
|
512
|
-
|
|
513
|
-
const errorMessage = screen.getByRole('alert')
|
|
514
|
-
expect(errorMessage).toBeInTheDocument()
|
|
515
|
-
expect(errorMessage).toHaveTextContent('Please select a date within the allowed range')
|
|
516
|
-
})
|
|
517
|
-
|
|
518
|
-
it('maintains focus during error states', () => {
|
|
519
|
-
render(<CCalendar />)
|
|
520
|
-
|
|
521
|
-
const calendar = screen.getByRole('application')
|
|
522
|
-
calendar.focus()
|
|
523
|
-
|
|
524
|
-
// Even if there are errors, focus should be maintained appropriately
|
|
525
|
-
expect(calendar).toHaveFocus()
|
|
526
|
-
})
|
|
527
|
-
|
|
528
|
-
it('provides recovery instructions', () => {
|
|
529
|
-
render(
|
|
530
|
-
<div>
|
|
531
|
-
<CCalendar aria-describedby="instructions" />
|
|
532
|
-
<div id="instructions">
|
|
533
|
-
Use arrow keys to navigate. Press Enter to select a date.
|
|
534
|
-
</div>
|
|
535
|
-
</div>
|
|
536
|
-
)
|
|
537
|
-
|
|
538
|
-
const instructions = screen.getByText(/Use arrow keys to navigate/)
|
|
539
|
-
expect(instructions).toBeInTheDocument()
|
|
540
|
-
})
|
|
541
|
-
})
|
|
542
|
-
|
|
543
|
-
describe('Complex Interaction Accessibility', () => {
|
|
544
|
-
it('maintains accessibility during range selection', async () => {
|
|
545
|
-
const { container } = render(<CCalendar range />)
|
|
546
|
-
|
|
547
|
-
const calendar = screen.getByRole('application')
|
|
548
|
-
calendar.focus()
|
|
549
|
-
|
|
550
|
-
// Start range selection
|
|
551
|
-
await user.keyboard('{Enter}')
|
|
552
|
-
|
|
553
|
-
// Should maintain accessibility during partial selection
|
|
554
|
-
const results = await axe(container)
|
|
555
|
-
expect(results).toHaveNoViolations()
|
|
556
|
-
})
|
|
557
|
-
|
|
558
|
-
it('handles accessibility during view transitions', async () => {
|
|
559
|
-
const { container } = render(<CCalendar />)
|
|
560
|
-
|
|
561
|
-
// Simulate view change (day -> month -> year)
|
|
562
|
-
const calendar = screen.getByRole('application')
|
|
563
|
-
|
|
564
|
-
// Each view should be accessible
|
|
565
|
-
const results = await axe(container)
|
|
566
|
-
expect(results).toHaveNoViolations()
|
|
567
|
-
})
|
|
568
|
-
|
|
569
|
-
it('maintains accessibility with dynamic disabled dates', async () => {
|
|
570
|
-
const TestComponent = () => {
|
|
571
|
-
const [disabled, setDisabled] = React.useState<Date[]>([])
|
|
572
|
-
|
|
573
|
-
React.useEffect(() => {
|
|
574
|
-
const timer = setTimeout(() => {
|
|
575
|
-
setDisabled([new Date(2022, 1, 16)])
|
|
576
|
-
}, 100)
|
|
577
|
-
return () => clearTimeout(timer)
|
|
578
|
-
}, [])
|
|
579
|
-
|
|
580
|
-
return <CCalendar disabledDate={disabled} />
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
const { container } = render(<TestComponent />)
|
|
584
|
-
|
|
585
|
-
// Should be accessible both before and after disabled dates are added
|
|
586
|
-
const initialResults = await axe(container)
|
|
587
|
-
expect(initialResults).toHaveNoViolations()
|
|
588
|
-
|
|
589
|
-
await new Promise(resolve => setTimeout(resolve, 150))
|
|
590
|
-
|
|
591
|
-
const updatedResults = await axe(container)
|
|
592
|
-
expect(updatedResults).toHaveNoViolations()
|
|
593
|
-
})
|
|
594
|
-
})
|
|
595
|
-
})
|