@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,6 +1,7 @@
1
1
  import * as React from 'react'
2
2
  import { fireEvent, render } from '@testing-library/react'
3
3
  import '@testing-library/jest-dom'
4
+ import { CChip } from '../../chip'
4
5
  import { CChipInput } from '../index'
5
6
 
6
7
  test('loads and displays CChipInput component', async () => {
@@ -52,7 +53,9 @@ test('CChipInput removes chip via remove button', async () => {
52
53
 
53
54
  test('CChipInput selectable chips', async () => {
54
55
  const onSelect = jest.fn()
55
- const { container } = render(<CChipInput defaultValue={['React']} selectable onSelect={onSelect} />)
56
+ const { container } = render(
57
+ <CChipInput defaultValue={['React']} selectable onSelect={onSelect} />
58
+ )
56
59
 
57
60
  const chip = container.querySelector('.chip') as HTMLElement
58
61
  fireEvent.click(chip)
@@ -60,3 +63,66 @@ test('CChipInput selectable chips', async () => {
60
63
  expect(chip).toHaveClass('active')
61
64
  expect(onSelect).toHaveBeenCalledWith(['React'])
62
65
  })
66
+
67
+ test('CChipInput always renders a hidden input for form submission', async () => {
68
+ const { container } = render(<CChipInput defaultValue={['React']} />)
69
+
70
+ const hidden = container.querySelector('input[type="hidden"]')
71
+ expect(hidden).not.toBeNull()
72
+ expect(hidden).toHaveAttribute('name')
73
+ expect(hidden).toHaveValue('React')
74
+ })
75
+
76
+ test('CChipInput single selection deselects siblings', async () => {
77
+ const { container } = render(
78
+ <CChipInput defaultValue={['React', 'Vue']} selectable selectionMode="single" />
79
+ )
80
+
81
+ const chips = container.querySelectorAll<HTMLElement>('.chip')
82
+ fireEvent.click(chips[0])
83
+ fireEvent.click(chips[1])
84
+
85
+ expect(chips[0]).not.toHaveClass('active')
86
+ expect(chips[1]).toHaveClass('active')
87
+ })
88
+
89
+ test('CChipInput ArrowRight on the last chip moves focus to the input', async () => {
90
+ const { container } = render(<CChipInput defaultValue={['React', 'Vue']} />)
91
+
92
+ const chips = container.querySelectorAll<HTMLElement>('.chip')
93
+ const lastChip = chips[chips.length - 1]
94
+ const input = container.querySelector('.chip-input-field') as HTMLInputElement
95
+ lastChip.focus()
96
+
97
+ fireEvent.keyDown(lastChip, { key: 'ArrowRight' })
98
+ expect(input).toHaveFocus()
99
+ })
100
+
101
+ test('CChipInput ArrowLeft on the last chip moves focus to the input in RTL', async () => {
102
+ document.documentElement.dir = 'rtl'
103
+
104
+ const { container } = render(<CChipInput defaultValue={['React', 'Vue']} />)
105
+
106
+ const chips = container.querySelectorAll<HTMLElement>('.chip')
107
+ const lastChip = chips[chips.length - 1]
108
+ const input = container.querySelector('.chip-input-field') as HTMLInputElement
109
+ lastChip.focus()
110
+
111
+ fireEvent.keyDown(lastChip, { key: 'ArrowLeft' })
112
+ expect(input).toHaveFocus()
113
+
114
+ document.documentElement.dir = ''
115
+ })
116
+
117
+ test('CChipInput seeds initial chips from CChip children', () => {
118
+ const { container, getByText } = render(
119
+ <CChipInput>
120
+ <CChip value="React">React</CChip>
121
+ <CChip value="Vue">Vue</CChip>
122
+ </CChipInput>
123
+ )
124
+
125
+ expect(container.querySelectorAll('.chip')).toHaveLength(2)
126
+ expect(getByText('React')).toBeInTheDocument()
127
+ expect(getByText('Vue')).toBeInTheDocument()
128
+ })
@@ -8,11 +8,18 @@ test('loads and displays CFormInput component', async () => {
8
8
  expect(container).toMatchSnapshot()
9
9
  })
10
10
 
11
- test('CFormInput customize', async () => {
11
+ test('CFormInput customize one', async () => {
12
+ const { container } = render(<CFormInput />)
13
+ expect(container).toMatchSnapshot()
14
+ expect(container.firstChild).toHaveClass('form-control')
15
+ })
16
+
17
+ test('CFormInput customize two', async () => {
12
18
  const { container } = render(
13
19
  <CFormInput
14
20
  className="bazinga"
15
21
  disabled={true}
22
+ invalid={true}
16
23
  plainText={true}
17
24
  readOnly={true}
18
25
  size="lg"
@@ -22,24 +29,14 @@ test('CFormInput customize', async () => {
22
29
  />
23
30
  )
24
31
  expect(container).toMatchSnapshot()
25
- expect(container.firstChild).toHaveClass('bazinga')
26
- expect(container.firstChild).toHaveClass('form-control-plaintext')
27
- expect(container.firstChild).toHaveClass('form-control-color')
28
32
  expect(container.firstChild).toHaveClass('form-control-lg')
29
- })
30
-
31
- test('CFormInput change input', async () => {
32
- jest.useFakeTimers()
33
- const onChange = jest.fn()
34
- render(<CFormInput onChange={onChange} />)
35
- expect(onChange).toHaveBeenCalledTimes(0)
36
- const input = document.querySelector('input')
37
- if (input !== null) {
38
- fireEvent.change(input, { target: { value: 'bazinga' } })
39
- }
40
- expect(onChange).toHaveBeenCalledTimes(1)
41
- if (input !== null) {
42
- fireEvent.change(input, { target: { value: '2' } })
43
- }
44
- expect(onChange).toHaveBeenCalledTimes(2)
33
+ expect(container.firstChild).toHaveClass('form-control-color')
34
+ expect(container.firstChild).toHaveClass('is-invalid')
35
+ expect(container.firstChild).toHaveClass('is-valid')
36
+ expect(container.firstChild).toHaveClass('form-control-plaintext')
37
+ expect(container.firstChild).toHaveClass('bazinga')
38
+ expect(container.firstChild).toHaveAttribute('value', '#888888')
39
+ expect(container.firstChild).toHaveAttribute('type', 'color')
40
+ expect(container.firstChild).toHaveAttribute('disabled', '')
41
+ expect(container.firstChild).toHaveAttribute('readonly', '')
45
42
  })
@@ -8,6 +8,7 @@ exports[`loads and displays CChipInput component 1`] = `
8
8
  <span
9
9
  class="chip"
10
10
  data-coreui-chip-focusable="true"
11
+ data-coreui-chip-value="React"
11
12
  tabindex="0"
12
13
  >
13
14
  React
@@ -45,6 +46,7 @@ exports[`loads and displays CChipInput component 1`] = `
45
46
  <span
46
47
  class="chip"
47
48
  data-coreui-chip-focusable="true"
49
+ data-coreui-chip-value="TypeScript"
48
50
  tabindex="0"
49
51
  >
50
52
  TypeScript
@@ -86,6 +88,11 @@ exports[`loads and displays CChipInput component 1`] = `
86
88
  type="text"
87
89
  value=""
88
90
  />
91
+ <input
92
+ name=":r0:"
93
+ type="hidden"
94
+ value="React,TypeScript"
95
+ />
89
96
  </div>
90
97
  </div>
91
98
  `;
@@ -1,13 +1,22 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`CFormInput customize 1`] = `
3
+ exports[`CFormInput customize one 1`] = `
4
4
  <div>
5
5
  <input
6
- class="form-control-plaintext form-control-lg form-control-color bazinga"
6
+ class="form-control"
7
+ type="text"
8
+ />
9
+ </div>
10
+ `;
11
+
12
+ exports[`CFormInput customize two 1`] = `
13
+ <div>
14
+ <input
15
+ class="form-control-plaintext form-control-lg form-control-color is-invalid is-valid bazinga"
7
16
  disabled=""
8
17
  readonly=""
9
18
  type="color"
10
- value="value"
19
+ value="#888888"
11
20
  />
12
21
  </div>
13
22
  `;
@@ -50,7 +50,9 @@ export const CContainer = forwardRef<HTMLDivElement, CContainerProps>(
50
50
  const breakpoint = rest[bp]
51
51
  delete rest[bp]
52
52
 
53
- breakpoint && repsonsiveClassNames.push(`container-${bp}`)
53
+ if (breakpoint) {
54
+ repsonsiveClassNames.push(`container-${bp}`)
55
+ }
54
56
  })
55
57
 
56
58
  return (
@@ -4,8 +4,9 @@ import classNames from 'classnames'
4
4
 
5
5
  import { PolymorphicRefForwardingComponent } from '../../helpers'
6
6
 
7
- export interface CHeaderBrandProps
8
- extends AnchorHTMLAttributes<HTMLAnchorElement | HTMLSpanElement> {
7
+ export interface CHeaderBrandProps extends AnchorHTMLAttributes<
8
+ HTMLAnchorElement | HTMLSpanElement
9
+ > {
9
10
  /**
10
11
  * Component used for the root node. Either a string to use a HTML element or a component.
11
12
  */
@@ -12,6 +12,7 @@ export * from './callout'
12
12
  export * from './card'
13
13
  export * from './carousel'
14
14
  export * from './chip'
15
+ export * from './chip-set'
15
16
  export * from './close-button'
16
17
  export * from './collapse'
17
18
  export * from './conditional-portal'
@@ -41,6 +42,7 @@ export * from './progress'
41
42
  export * from './popover'
42
43
  export * from './range-slider'
43
44
  export * from './rating'
45
+ export * from './search-button'
44
46
  export * from './smart-table'
45
47
  export * from './smart-pagination'
46
48
  export * from './sidebar'
@@ -4,8 +4,10 @@ import classNames from 'classnames'
4
4
 
5
5
  import { PolymorphicRefForwardingComponent } from '../../helpers'
6
6
 
7
- export interface CLinkProps
8
- extends Omit<AllHTMLAttributes<HTMLButtonElement | HTMLAnchorElement>, 'as'> {
7
+ export interface CLinkProps extends Omit<
8
+ AllHTMLAttributes<HTMLButtonElement | HTMLAnchorElement>,
9
+ 'as'
10
+ > {
9
11
  /**
10
12
  * Toggle the active state for the component.
11
13
  */
@@ -40,8 +42,9 @@ export const CLink: PolymorphicRefForwardingComponent<'a', CLinkProps> = forward
40
42
  {...(Component === 'a' && disabled && { 'aria-disabled': true, tabIndex: -1 })}
41
43
  {...((Component === 'a' || Component === 'button') && {
42
44
  onClick: (event: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {
43
- event.preventDefault
44
- !disabled && rest.onClick && rest.onClick(event)
45
+ if (!disabled) {
46
+ rest.onClick?.(event)
47
+ }
45
48
  },
46
49
  })}
47
50
  disabled={disabled}
@@ -8,8 +8,9 @@ import { PolymorphicRefForwardingComponent } from '../../helpers'
8
8
  import { colorPropType } from '../../props'
9
9
  import type { Colors } from '../../types'
10
10
 
11
- export interface CListGroupItemProps
12
- extends AnchorHTMLAttributes<HTMLLIElement | HTMLAnchorElement | HTMLButtonElement> {
11
+ export interface CListGroupItemProps extends AnchorHTMLAttributes<
12
+ HTMLLIElement | HTMLAnchorElement | HTMLButtonElement
13
+ > {
13
14
  /**
14
15
  * Toggle the active state for the component.
15
16
  */
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react'
2
2
  import { render, fireEvent } from '@testing-library/react'
3
- import '@testing-library/jest-dom/extend-expect'
3
+ import '@testing-library/jest-dom'
4
4
  import { CLoadingButton } from '../index'
5
5
 
6
6
  test('loads and displays CLoadingButton component', async () => {
@@ -3,12 +3,12 @@
3
3
  exports[`CLoadingButton customize 1`] = `
4
4
  <div>
5
5
  <button
6
- class="btn btn-primary btn-loading is-loading bazinga disabled"
6
+ class="btn btn-loading is-loading bazinga disabled"
7
7
  disabled=""
8
8
  type="button"
9
9
  >
10
10
  <div
11
- class="spinner-grow text-undefined spinner-grow-sm btn-loading-spinner"
11
+ class="spinner-grow spinner-grow-sm btn-loading-spinner"
12
12
  role="status"
13
13
  >
14
14
  <span
@@ -25,11 +25,11 @@ exports[`CLoadingButton customize 1`] = `
25
25
  exports[`loads and displays CLoadingButton component 1`] = `
26
26
  <div>
27
27
  <button
28
- class="btn btn-primary btn-loading"
28
+ class="btn btn-loading"
29
29
  type="button"
30
30
  >
31
31
  <div
32
- class="spinner-border text-undefined spinner-border-sm btn-loading-spinner"
32
+ class="spinner-border spinner-border-sm btn-loading-spinner"
33
33
  role="status"
34
34
  >
35
35
  <span
@@ -120,6 +120,7 @@ export const CModal = forwardRef<HTMLDivElement, CModalProps>(
120
120
  ref
121
121
  ) => {
122
122
  const modalRef = useRef<HTMLDivElement>(null)
123
+ const mouseDownTarget = useRef<EventTarget | null>(null)
123
124
  const forkedRef = useForkedRef(ref, modalRef)
124
125
 
125
126
  const [_visible, setVisible] = useState(visible)
@@ -136,11 +137,13 @@ export const CModal = forwardRef<HTMLDivElement, CModalProps>(
136
137
 
137
138
  useEffect(() => {
138
139
  if (_visible) {
140
+ document.addEventListener('mousedown', handleMouseDown)
139
141
  document.addEventListener('mouseup', handleClickOutside)
140
142
  document.addEventListener('keydown', handleKeyDown)
141
143
  }
142
144
 
143
145
  return () => {
146
+ document.removeEventListener('mousedown', handleMouseDown)
144
147
  document.removeEventListener('mouseup', handleClickOutside)
145
148
  document.removeEventListener('keydown', handleKeyDown)
146
149
  }
@@ -155,8 +158,14 @@ export const CModal = forwardRef<HTMLDivElement, CModalProps>(
155
158
  }
156
159
 
157
160
  useLayoutEffect(() => {
161
+ if (!staticBackdrop) {
162
+ return
163
+ }
164
+
158
165
  onClosePrevented?.()
159
- setTimeout(() => setStaticBackdrop(false), duration)
166
+ const timeout = setTimeout(() => setStaticBackdrop(false), duration)
167
+
168
+ return () => clearTimeout(timeout)
160
169
  }, [staticBackdrop])
161
170
 
162
171
  // Set focus to modal after open
@@ -186,8 +195,16 @@ export const CModal = forwardRef<HTMLDivElement, CModalProps>(
186
195
  }
187
196
  }, [_visible])
188
197
 
198
+ const handleMouseDown = (event: Event) => {
199
+ mouseDownTarget.current = event.target
200
+ }
201
+
189
202
  const handleClickOutside = (event: Event) => {
190
- if (modalRef.current && modalRef.current == event.target) {
203
+ if (
204
+ modalRef.current &&
205
+ modalRef.current == event.target &&
206
+ mouseDownTarget.current == event.target
207
+ ) {
191
208
  handleDismiss()
192
209
  }
193
210
  }
@@ -48,6 +48,49 @@ test('CModal dialog close on press ESC', async () => {
48
48
  }
49
49
  })
50
50
 
51
+ test('CModal calls onClosePrevented only when closing is actually prevented', async () => {
52
+ const onClosePrevented = jest.fn()
53
+
54
+ render(
55
+ <CModal backdrop="static" onClosePrevented={onClosePrevented} portal={false} visible>
56
+ Test
57
+ </CModal>
58
+ )
59
+
60
+ expect(onClosePrevented).toHaveBeenCalledTimes(0)
61
+
62
+ const modal = screen.getByText('Test').closest('.modal') as HTMLElement
63
+ fireEvent.keyDown(modal, { key: 'Escape' })
64
+
65
+ await waitFor(() => {
66
+ expect(onClosePrevented).toHaveBeenCalledTimes(1)
67
+ expect(modal).toHaveClass('modal-static')
68
+ })
69
+ })
70
+
71
+ test('CModal does not close when a press started inside the dialog is released over the backdrop area', async () => {
72
+ const onClose = jest.fn()
73
+
74
+ render(
75
+ <CModal onClose={onClose} portal={false} visible>
76
+ <div data-testid="content">Test</div>
77
+ </CModal>
78
+ )
79
+
80
+ const modal = screen.getByText('Test').closest('.modal') as HTMLElement
81
+ const content = screen.getByTestId('content')
82
+
83
+ fireEvent.mouseDown(content)
84
+ fireEvent.mouseUp(modal)
85
+ expect(onClose).toHaveBeenCalledTimes(0)
86
+
87
+ fireEvent.mouseDown(modal)
88
+ fireEvent.mouseUp(modal)
89
+ await waitFor(() => {
90
+ expect(onClose).toHaveBeenCalledTimes(1)
91
+ })
92
+ })
93
+
51
94
  // test('CModal dialog closes when clicking outside the modal', async () => {
52
95
  // const onClose = jest.fn()
53
96