@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.
Files changed (416) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/card/CCardImage.js.map +1 -1
  3. package/dist/cjs/components/carousel/CCarousel.js +44 -33
  4. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  5. package/dist/cjs/components/carousel/CCarouselItem.js +19 -28
  6. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  7. package/dist/cjs/components/chip/CChip.d.ts +12 -0
  8. package/dist/cjs/components/chip/CChip.js +16 -63
  9. package/dist/cjs/components/chip/CChip.js.map +1 -1
  10. package/dist/cjs/components/chip/const.d.ts +1 -0
  11. package/dist/cjs/components/chip/const.js +8 -0
  12. package/dist/cjs/components/chip/const.js.map +1 -0
  13. package/dist/cjs/components/chip-set/CChipSet.d.ts +73 -0
  14. package/dist/cjs/components/chip-set/CChipSet.js +66 -0
  15. package/dist/cjs/components/chip-set/CChipSet.js.map +1 -0
  16. package/dist/cjs/components/chip-set/index.d.ts +2 -0
  17. package/dist/cjs/components/chip-set/useChipSet.d.ts +48 -0
  18. package/dist/cjs/components/chip-set/useChipSet.js +163 -0
  19. package/dist/cjs/components/chip-set/useChipSet.js.map +1 -0
  20. package/dist/cjs/components/chip-set/utils.d.ts +7 -0
  21. package/dist/cjs/components/chip-set/utils.js +18 -0
  22. package/dist/cjs/components/chip-set/utils.js.map +1 -0
  23. package/dist/cjs/components/collapse/CCollapse.js +14 -6
  24. package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
  25. package/dist/cjs/components/conditional-portal/CConditionalPortal.js +3 -1
  26. package/dist/cjs/components/conditional-portal/CConditionalPortal.js.map +1 -1
  27. package/dist/cjs/components/date-picker/CDatePicker.d.ts +1 -1
  28. package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
  29. package/dist/cjs/components/date-range-picker/CDateRangePicker.js +2 -0
  30. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  31. package/dist/cjs/components/dropdown/CDropdown.js +23 -30
  32. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  33. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  34. package/dist/cjs/components/form/CChipInput.d.ts +14 -2
  35. package/dist/cjs/components/form/CChipInput.js +77 -49
  36. package/dist/cjs/components/form/CChipInput.js.map +1 -1
  37. package/dist/cjs/components/form/CFormCheck.js.map +1 -1
  38. package/dist/cjs/components/form/CFormInput.js.map +1 -1
  39. package/dist/cjs/components/form/CFormSelect.js.map +1 -1
  40. package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
  41. package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
  42. package/dist/cjs/components/grid/CContainer.js +3 -1
  43. package/dist/cjs/components/grid/CContainer.js.map +1 -1
  44. package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
  45. package/dist/cjs/components/index.d.ts +2 -0
  46. package/dist/cjs/components/link/CLink.js +4 -2
  47. package/dist/cjs/components/link/CLink.js.map +1 -1
  48. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  49. package/dist/cjs/components/modal/CModal.js +14 -2
  50. package/dist/cjs/components/modal/CModal.js.map +1 -1
  51. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +73 -1
  52. package/dist/cjs/components/multi-select/CMultiSelect.js +157 -18
  53. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  54. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +1 -1
  55. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  56. package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +3 -0
  57. package/dist/cjs/components/multi-select/CMultiSelectOptions.js +45 -2
  58. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  59. package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +1 -0
  60. package/dist/cjs/components/multi-select/CMultiSelectSelection.js +4 -3
  61. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  62. package/dist/cjs/components/multi-select/types.d.ts +12 -0
  63. package/dist/cjs/components/multi-select/utils.js +1 -4
  64. package/dist/cjs/components/multi-select/utils.js.map +1 -1
  65. package/dist/cjs/components/nav/CNav.js.map +1 -1
  66. package/dist/cjs/components/nav/CNavGroup.d.ts +13 -6
  67. package/dist/cjs/components/nav/CNavGroup.js +86 -23
  68. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  69. package/dist/cjs/components/nav/CNavGroupContext.d.ts +25 -0
  70. package/dist/cjs/components/nav/CNavGroupContext.js +13 -0
  71. package/dist/cjs/components/nav/CNavGroupContext.js.map +1 -0
  72. package/dist/cjs/components/nav/CNavLink.d.ts +1 -5
  73. package/dist/cjs/components/nav/CNavLink.js +21 -8
  74. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  75. package/dist/cjs/components/one-time-password-input/COneTimePassword.js +3 -3
  76. package/dist/cjs/components/one-time-password-input/COneTimePassword.js.map +1 -1
  77. package/dist/cjs/components/popover/CPopover.js +69 -24
  78. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  79. package/dist/cjs/components/progress/CProgress.js.map +1 -1
  80. package/dist/cjs/components/rating/CRating.d.ts +1 -1
  81. package/dist/cjs/components/rating/CRating.js.map +1 -1
  82. package/dist/cjs/components/search-button/CSearchButton.d.ts +32 -0
  83. package/dist/cjs/components/search-button/CSearchButton.js +77 -0
  84. package/dist/cjs/components/search-button/CSearchButton.js.map +1 -0
  85. package/dist/cjs/components/search-button/index.d.ts +2 -0
  86. package/dist/cjs/components/search-button/types.d.ts +10 -0
  87. package/dist/cjs/components/search-button/utils.d.ts +11 -0
  88. package/dist/cjs/components/search-button/utils.js +115 -0
  89. package/dist/cjs/components/search-button/utils.js.map +1 -0
  90. package/dist/cjs/components/sidebar/CSidebar.js +40 -23
  91. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  92. package/dist/cjs/components/sidebar/CSidebarNav.d.ts +12 -0
  93. package/dist/cjs/components/sidebar/CSidebarNav.js +12 -36
  94. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  95. package/dist/cjs/components/smart-table/CSmartTable.js +2 -2
  96. package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
  97. package/dist/cjs/components/smart-table/CSmartTableInterface.d.ts +2 -2
  98. package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
  99. package/dist/cjs/components/table/types.d.ts +2 -1
  100. package/dist/cjs/components/table/utils.js +4 -4
  101. package/dist/cjs/components/table/utils.js.map +1 -1
  102. package/dist/cjs/components/tabs/CTabPanel.js +3 -1
  103. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
  104. package/dist/cjs/components/time-picker/CTimePicker.d.ts +1 -1
  105. package/dist/cjs/components/time-picker/CTimePicker.js +1 -1
  106. package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
  107. package/dist/cjs/components/tooltip/CTooltip.js +69 -24
  108. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  109. package/dist/cjs/components/virtual-scroller/CVirtualScroller.js +11 -8
  110. package/dist/cjs/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  111. package/dist/cjs/helpers/polymorphicComponent.d.ts +1 -2
  112. package/dist/cjs/hooks/useDebouncedCallback.d.ts +1 -1
  113. package/dist/cjs/hooks/useDebouncedCallback.js +1 -1
  114. package/dist/cjs/hooks/useDebouncedCallback.js.map +1 -1
  115. package/dist/cjs/hooks/useForkedRef.d.ts +1 -1
  116. package/dist/cjs/hooks/useForkedRef.js +6 -3
  117. package/dist/cjs/hooks/useForkedRef.js.map +1 -1
  118. package/dist/cjs/hooks/usePopper.js +8 -6
  119. package/dist/cjs/hooks/usePopper.js.map +1 -1
  120. package/dist/cjs/index.js +4 -0
  121. package/dist/cjs/index.js.map +1 -1
  122. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
  123. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  124. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
  125. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
  126. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
  127. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
  128. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
  129. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
  130. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
  131. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
  132. package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js +4 -4
  133. package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
  134. package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
  135. package/dist/cjs/utils/index.d.ts +2 -1
  136. package/dist/cjs/utils/swipe.d.ts +26 -0
  137. package/dist/cjs/utils/swipe.js +94 -0
  138. package/dist/cjs/utils/swipe.js.map +1 -0
  139. package/dist/esm/components/card/CCardImage.js.map +1 -1
  140. package/dist/esm/components/carousel/CCarousel.js +44 -33
  141. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  142. package/dist/esm/components/carousel/CCarouselItem.js +19 -28
  143. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  144. package/dist/esm/components/chip/CChip.d.ts +12 -0
  145. package/dist/esm/components/chip/CChip.js +16 -63
  146. package/dist/esm/components/chip/CChip.js.map +1 -1
  147. package/dist/esm/components/chip/const.d.ts +1 -0
  148. package/dist/esm/components/chip/const.js +6 -0
  149. package/dist/esm/components/chip/const.js.map +1 -0
  150. package/dist/esm/components/chip-set/CChipSet.d.ts +73 -0
  151. package/dist/esm/components/chip-set/CChipSet.js +64 -0
  152. package/dist/esm/components/chip-set/CChipSet.js.map +1 -0
  153. package/dist/esm/components/chip-set/index.d.ts +2 -0
  154. package/dist/esm/components/chip-set/useChipSet.d.ts +48 -0
  155. package/dist/esm/components/chip-set/useChipSet.js +161 -0
  156. package/dist/esm/components/chip-set/useChipSet.js.map +1 -0
  157. package/dist/esm/components/chip-set/utils.d.ts +7 -0
  158. package/dist/esm/components/chip-set/utils.js +16 -0
  159. package/dist/esm/components/chip-set/utils.js.map +1 -0
  160. package/dist/esm/components/collapse/CCollapse.js +14 -6
  161. package/dist/esm/components/collapse/CCollapse.js.map +1 -1
  162. package/dist/esm/components/conditional-portal/CConditionalPortal.js +3 -1
  163. package/dist/esm/components/conditional-portal/CConditionalPortal.js.map +1 -1
  164. package/dist/esm/components/date-picker/CDatePicker.d.ts +1 -1
  165. package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
  166. package/dist/esm/components/date-range-picker/CDateRangePicker.js +2 -0
  167. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  168. package/dist/esm/components/dropdown/CDropdown.js +23 -30
  169. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  170. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  171. package/dist/esm/components/form/CChipInput.d.ts +14 -2
  172. package/dist/esm/components/form/CChipInput.js +78 -50
  173. package/dist/esm/components/form/CChipInput.js.map +1 -1
  174. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  175. package/dist/esm/components/form/CFormInput.js.map +1 -1
  176. package/dist/esm/components/form/CFormSelect.js.map +1 -1
  177. package/dist/esm/components/form/CFormTextarea.js.map +1 -1
  178. package/dist/esm/components/form/CInputGroupText.js.map +1 -1
  179. package/dist/esm/components/grid/CContainer.js +3 -1
  180. package/dist/esm/components/grid/CContainer.js.map +1 -1
  181. package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
  182. package/dist/esm/components/index.d.ts +2 -0
  183. package/dist/esm/components/link/CLink.js +4 -2
  184. package/dist/esm/components/link/CLink.js.map +1 -1
  185. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  186. package/dist/esm/components/modal/CModal.js +14 -2
  187. package/dist/esm/components/modal/CModal.js.map +1 -1
  188. package/dist/esm/components/multi-select/CMultiSelect.d.ts +73 -1
  189. package/dist/esm/components/multi-select/CMultiSelect.js +158 -19
  190. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  191. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +1 -1
  192. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  193. package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +3 -0
  194. package/dist/esm/components/multi-select/CMultiSelectOptions.js +45 -2
  195. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  196. package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +1 -0
  197. package/dist/esm/components/multi-select/CMultiSelectSelection.js +4 -3
  198. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  199. package/dist/esm/components/multi-select/types.d.ts +12 -0
  200. package/dist/esm/components/multi-select/utils.js +1 -4
  201. package/dist/esm/components/multi-select/utils.js.map +1 -1
  202. package/dist/esm/components/nav/CNav.js.map +1 -1
  203. package/dist/esm/components/nav/CNavGroup.d.ts +13 -6
  204. package/dist/esm/components/nav/CNavGroup.js +87 -24
  205. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  206. package/dist/esm/components/nav/CNavGroupContext.d.ts +25 -0
  207. package/dist/esm/components/nav/CNavGroupContext.js +11 -0
  208. package/dist/esm/components/nav/CNavGroupContext.js.map +1 -0
  209. package/dist/esm/components/nav/CNavLink.d.ts +1 -5
  210. package/dist/esm/components/nav/CNavLink.js +21 -8
  211. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  212. package/dist/esm/components/one-time-password-input/COneTimePassword.js +3 -3
  213. package/dist/esm/components/one-time-password-input/COneTimePassword.js.map +1 -1
  214. package/dist/esm/components/popover/CPopover.js +69 -24
  215. package/dist/esm/components/popover/CPopover.js.map +1 -1
  216. package/dist/esm/components/progress/CProgress.js.map +1 -1
  217. package/dist/esm/components/rating/CRating.d.ts +1 -1
  218. package/dist/esm/components/rating/CRating.js.map +1 -1
  219. package/dist/esm/components/search-button/CSearchButton.d.ts +32 -0
  220. package/dist/esm/components/search-button/CSearchButton.js +75 -0
  221. package/dist/esm/components/search-button/CSearchButton.js.map +1 -0
  222. package/dist/esm/components/search-button/index.d.ts +2 -0
  223. package/dist/esm/components/search-button/types.d.ts +10 -0
  224. package/dist/esm/components/search-button/utils.d.ts +11 -0
  225. package/dist/esm/components/search-button/utils.js +104 -0
  226. package/dist/esm/components/search-button/utils.js.map +1 -0
  227. package/dist/esm/components/sidebar/CSidebar.js +40 -23
  228. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  229. package/dist/esm/components/sidebar/CSidebarNav.d.ts +12 -0
  230. package/dist/esm/components/sidebar/CSidebarNav.js +13 -37
  231. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  232. package/dist/esm/components/smart-table/CSmartTable.js +2 -2
  233. package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
  234. package/dist/esm/components/smart-table/CSmartTableInterface.d.ts +2 -2
  235. package/dist/esm/components/table/CTableDataCell.js.map +1 -1
  236. package/dist/esm/components/table/types.d.ts +2 -1
  237. package/dist/esm/components/table/utils.js +4 -4
  238. package/dist/esm/components/table/utils.js.map +1 -1
  239. package/dist/esm/components/tabs/CTabPanel.js +3 -1
  240. package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
  241. package/dist/esm/components/time-picker/CTimePicker.d.ts +1 -1
  242. package/dist/esm/components/time-picker/CTimePicker.js +1 -1
  243. package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
  244. package/dist/esm/components/tooltip/CTooltip.js +69 -24
  245. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  246. package/dist/esm/components/virtual-scroller/CVirtualScroller.js +11 -8
  247. package/dist/esm/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  248. package/dist/esm/helpers/polymorphicComponent.d.ts +1 -2
  249. package/dist/esm/hooks/useDebouncedCallback.d.ts +1 -1
  250. package/dist/esm/hooks/useDebouncedCallback.js +1 -1
  251. package/dist/esm/hooks/useDebouncedCallback.js.map +1 -1
  252. package/dist/esm/hooks/useForkedRef.d.ts +1 -1
  253. package/dist/esm/hooks/useForkedRef.js +6 -3
  254. package/dist/esm/hooks/useForkedRef.js.map +1 -1
  255. package/dist/esm/hooks/usePopper.js +9 -7
  256. package/dist/esm/hooks/usePopper.js.map +1 -1
  257. package/dist/esm/index.js +2 -0
  258. package/dist/esm/index.js.map +1 -1
  259. package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
  260. package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  261. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
  262. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
  263. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
  264. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
  265. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
  266. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
  267. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
  268. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
  269. package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js +4 -4
  270. package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
  271. package/dist/esm/utils/executeAfterTransition.js.map +1 -1
  272. package/dist/esm/utils/index.d.ts +2 -1
  273. package/dist/esm/utils/swipe.d.ts +26 -0
  274. package/dist/esm/utils/swipe.js +90 -0
  275. package/dist/esm/utils/swipe.js.map +1 -0
  276. package/package.json +8 -6
  277. package/src/components/autocomplete/CAutocompleteOptions.tsx +1 -1
  278. package/src/components/autocomplete/__tests__/CAutocomplete.spec.tsx +18 -16
  279. package/src/components/autocomplete/__tests__/CAutocompleteOptions.spec.tsx +37 -28
  280. package/src/components/autocomplete/__tests__/__snapshots__/CAutocomplete.spec.tsx.snap +129 -0
  281. package/src/components/autocomplete/__tests__/__snapshots__/CAutocompleteOptions.spec.tsx.snap +36 -0
  282. package/src/components/calendar/__tests__/CCalendar.spec.tsx +40 -45
  283. package/src/components/calendar/__tests__/__snapshots__/CCalendar.spec.tsx.snap +99 -75
  284. package/src/components/calendar/__tests__/utils.spec.tsx +8 -18
  285. package/src/components/card/CCardImage.tsx +3 -2
  286. package/src/components/carousel/CCarousel.tsx +48 -51
  287. package/src/components/carousel/CCarouselContext.ts +1 -1
  288. package/src/components/carousel/CCarouselItem.tsx +25 -26
  289. package/src/components/carousel/__tests__/CCarousel.spec.tsx +47 -4
  290. package/src/components/carousel/__tests__/CCarouselItem.spec.tsx +37 -0
  291. package/src/components/chip/CChip.tsx +45 -78
  292. package/src/components/chip/__tests__/CChip.spec.tsx +26 -19
  293. package/src/components/chip/const.ts +3 -0
  294. package/src/components/chip-set/CChipSet.tsx +183 -0
  295. package/src/components/chip-set/__tests__/CChipSet.spec.tsx +215 -0
  296. package/src/components/chip-set/__tests__/__snapshots__/CChipSet.spec.tsx.snap +22 -0
  297. package/src/components/chip-set/index.ts +3 -0
  298. package/src/components/chip-set/useChipSet.ts +243 -0
  299. package/src/components/chip-set/utils.ts +19 -0
  300. package/src/components/collapse/CCollapse.tsx +18 -6
  301. package/src/components/conditional-portal/CConditionalPortal.tsx +4 -2
  302. package/src/components/date-picker/CDatePicker.tsx +12 -13
  303. package/src/components/date-picker/__tests__/CDatePicker.spec.tsx +1 -1
  304. package/src/components/date-picker/__tests__/__snapshots__/CDatePicker.spec.tsx.snap +12 -640
  305. package/src/components/date-range-picker/CDateRangePicker.tsx +2 -0
  306. package/src/components/date-range-picker/__tests__/CDateRangePicker.spec.tsx +1 -1
  307. package/src/components/date-range-picker/__tests__/__snapshots__/CDateRangePicker.spec.tsx.snap +21 -1259
  308. package/src/components/dropdown/CDropdown.tsx +29 -34
  309. package/src/components/dropdown/CDropdownToggle.tsx +1 -1
  310. package/src/components/dropdown/__tests__/CDropdown.spec.tsx +56 -1
  311. package/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.tsx.snap +2 -2
  312. package/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.tsx.snap +1 -1
  313. package/src/components/focus-trap/__tests__/CFocusTrap.spec.tsx +1 -1
  314. package/src/components/form/CChipInput.tsx +105 -67
  315. package/src/components/form/CFormCheck.tsx +1 -2
  316. package/src/components/form/CFormInput.tsx +1 -2
  317. package/src/components/form/CFormSelect.tsx +1 -2
  318. package/src/components/form/CFormTextarea.tsx +1 -2
  319. package/src/components/form/CInputGroupText.tsx +3 -2
  320. package/src/components/form/__tests__/CChipInput.spec.tsx +67 -1
  321. package/src/components/form/__tests__/CFormInput.spec.tsx +17 -20
  322. package/src/components/form/__tests__/__snapshots__/CChipInput.spec.tsx.snap +7 -0
  323. package/src/components/form/__tests__/__snapshots__/CFormInput.spec.tsx.snap +12 -3
  324. package/src/components/grid/CContainer.tsx +3 -1
  325. package/src/components/header/CHeaderBrand.tsx +3 -2
  326. package/src/components/index.ts +2 -0
  327. package/src/components/link/CLink.tsx +7 -4
  328. package/src/components/list-group/CListGroupItem.tsx +3 -2
  329. package/src/components/loading-button/__tests__/CLoadingButton.spec.tsx +1 -1
  330. package/src/components/loading-button/__tests__/__snapshots__/CLoadingButton.spec.tsx.snap +4 -4
  331. package/src/components/modal/CModal.tsx +19 -2
  332. package/src/components/modal/__tests__/CModal.spec.tsx +43 -0
  333. package/src/components/multi-select/CMultiSelect.tsx +341 -46
  334. package/src/components/multi-select/CMultiSelectNativeSelect.tsx +1 -1
  335. package/src/components/multi-select/CMultiSelectOptions.tsx +74 -3
  336. package/src/components/multi-select/CMultiSelectSelection.tsx +5 -1
  337. package/src/components/multi-select/__tests__/CMultiSelect.spec.tsx +27 -69
  338. package/src/components/multi-select/__tests__/CMultiSelectNativeSelect.spec.tsx +4 -5
  339. package/src/components/multi-select/__tests__/CMultiSelectOptions.spec.tsx +4 -4
  340. package/src/components/multi-select/__tests__/CMultiSelectSelection.spec.tsx +7 -24
  341. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelect.spec.tsx.snap +108 -61
  342. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectNativeSelect.spec.tsx.snap +2 -4
  343. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectOptions.spec.tsx.snap +7 -0
  344. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectSelection.spec.tsx.snap +16 -9
  345. package/src/components/multi-select/types.ts +14 -0
  346. package/src/components/nav/CNav.tsx +3 -2
  347. package/src/components/nav/CNavGroup.tsx +196 -105
  348. package/src/components/nav/CNavGroupContext.ts +27 -0
  349. package/src/components/nav/CNavLink.tsx +26 -12
  350. package/src/components/nav/__tests__/CNavGroup.spec.tsx +207 -4
  351. package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.tsx.snap +3 -1
  352. package/src/components/offcanvas/__tests__/COffcanvas.spec.tsx +1 -0
  353. package/src/components/one-time-password-input/COneTimePassword.tsx +10 -11
  354. package/src/components/picker/__tests__/CPicker.spec.tsx +1 -1
  355. package/src/components/picker/__tests__/__snapshots__/CPicker.spec.tsx.snap +2 -16
  356. package/src/components/popover/CPopover.tsx +71 -26
  357. package/src/components/popover/__tests__/CPopover.spec.tsx +85 -4
  358. package/src/components/progress/CProgress.tsx +1 -2
  359. package/src/components/rating/CRating.tsx +1 -0
  360. package/src/components/search-button/CSearchButton.tsx +195 -0
  361. package/src/components/search-button/__tests__/CSearchButton.spec.tsx +95 -0
  362. package/src/components/search-button/__tests__/__snapshots__/CSearchButton.spec.tsx.snap +87 -0
  363. package/src/components/search-button/index.ts +3 -0
  364. package/src/components/search-button/types.ts +10 -0
  365. package/src/components/search-button/utils.ts +140 -0
  366. package/src/components/sidebar/CSidebar.tsx +51 -26
  367. package/src/components/sidebar/CSidebarNav.tsx +39 -53
  368. package/src/components/sidebar/__tests__/CSidebar.spec.tsx +26 -0
  369. package/src/components/smart-table/CSmartTable.tsx +5 -4
  370. package/src/components/smart-table/CSmartTableInterface.tsx +2 -2
  371. package/src/components/smart-table/__tests__/CSmartTable.spec.tsx +3 -2
  372. package/src/components/smart-table/__tests__/__snapshots__/CSmartTable.spec.tsx.snap +7 -15
  373. package/src/components/stepper/__tests__/CStepper.spec.tsx +24 -21
  374. package/src/components/stepper/__tests__/__snapshots__/CStepper.spec.tsx.snap +295 -0
  375. package/src/components/table/CTableDataCell.tsx +2 -1
  376. package/src/components/table/types.ts +3 -1
  377. package/src/components/table/utils.ts +4 -4
  378. package/src/components/tabs/CTabPanel.tsx +3 -1
  379. package/src/components/tabs/CTabsContext.ts +1 -1
  380. package/src/components/tabs/__tests__/CTabContent.spec.tsx +1 -0
  381. package/src/components/tabs/__tests__/CTabPane.spec.tsx +1 -0
  382. package/src/components/time-picker/CTimePicker.tsx +6 -7
  383. package/src/components/time-picker/__tests__/CTimePicker.spec.tsx +10 -1
  384. package/src/components/time-picker/__tests__/__snapshots__/CTimePicker.spec.tsx.snap +599 -315
  385. package/src/components/tooltip/CTooltip.tsx +72 -27
  386. package/src/components/tooltip/__tests__/CTooltip.spec.tsx +102 -1
  387. package/src/components/virtual-scroller/CVirtualScroller.tsx +13 -14
  388. package/src/helpers/polymorphicComponent.ts +1 -1
  389. package/src/hooks/useColorModes.ts +2 -2
  390. package/src/hooks/useDebouncedCallback.ts +7 -4
  391. package/src/hooks/useForkedRef.ts +20 -15
  392. package/src/hooks/usePopper.ts +13 -9
  393. package/src/utils/__tests__/swipe.spec.ts +82 -0
  394. package/src/utils/executeAfterTransition.ts +1 -1
  395. package/src/utils/index.ts +2 -0
  396. package/src/utils/mergeClassNames.ts +1 -1
  397. package/src/utils/swipe.ts +114 -0
  398. package/dist/cjs/components/accordion/CAccordionCollapse.d.ts +0 -3
  399. package/dist/cjs/components/sidebar/CSidebarNavContext.d.ts +0 -5
  400. package/dist/cjs/components/sidebar/CSidebarNavContext.js +0 -8
  401. package/dist/cjs/components/sidebar/CSidebarNavContext.js.map +0 -1
  402. package/dist/esm/components/accordion/CAccordionCollapse.d.ts +0 -3
  403. package/dist/esm/components/sidebar/CSidebarNavContext.d.ts +0 -5
  404. package/dist/esm/components/sidebar/CSidebarNavContext.js +0 -6
  405. package/dist/esm/components/sidebar/CSidebarNavContext.js.map +0 -1
  406. package/src/components/accordion/CAccordionCollapse.tsx +0 -20
  407. package/src/components/accordion/__tests__/CAccordionCollapse.spec.tsx +0 -10
  408. package/src/components/accordion/__tests__/__snapshots__/CAccordionCollapse.spec.tsx.snap +0 -11
  409. package/src/components/button/__tests__/__snapshots__/CButtonClose.spec.tsx.snap +0 -26
  410. package/src/components/calendar/__tests__/CCalendar.accessibility.spec.tsx +0 -595
  411. package/src/components/calendar/__tests__/CCalendar.comprehensive.spec.tsx +0 -402
  412. package/src/components/calendar/__tests__/CCalendar.edge-cases.spec.tsx +0 -416
  413. package/src/components/calendar/__tests__/CCalendar.interactions.spec.tsx +0 -593
  414. package/src/components/header/CHeaderBrand.tsx~HEAD +0 -36
  415. package/src/components/sidebar/CSidebarNavContext.ts +0 -8
  416. /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
- })