@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
@@ -0,0 +1,95 @@
1
+ import * as React from 'react'
2
+ import { fireEvent, render, screen } from '@testing-library/react'
3
+ import '@testing-library/jest-dom'
4
+ import { CSearchButton } from '../index'
5
+
6
+ const originalPlatform = window.navigator.platform
7
+
8
+ beforeEach(() => {
9
+ Object.defineProperty(window.navigator, 'platform', {
10
+ configurable: true,
11
+ value: 'MacIntel',
12
+ })
13
+ })
14
+
15
+ afterEach(() => {
16
+ Object.defineProperty(window.navigator, 'platform', {
17
+ configurable: true,
18
+ value: originalPlatform,
19
+ })
20
+ })
21
+
22
+ test('loads and displays CSearchButton component', async () => {
23
+ const { container } = render(<CSearchButton />)
24
+ expect(container).toMatchSnapshot()
25
+ })
26
+
27
+ test('CSearchButton customize', async () => {
28
+ const { container } = render(
29
+ <CSearchButton className="bazinga" placeholder="Command palette" shortcut="meta+k,ctrl+k" />
30
+ )
31
+
32
+ expect(container).toMatchSnapshot()
33
+ expect(container.firstChild).toHaveClass('search-button')
34
+ expect(container.firstChild).toHaveClass('bazinga')
35
+ expect(screen.getByText('Command palette')).toBeInTheDocument()
36
+ expect(screen.getByText('⌘')).toBeInTheDocument()
37
+ expect(screen.getByText('K')).toBeInTheDocument()
38
+ })
39
+
40
+ test('CSearchButton triggers click on matching shortcut', async () => {
41
+ const onClick = jest.fn()
42
+ const onTrigger = jest.fn()
43
+
44
+ render(<CSearchButton onClick={onClick} onTrigger={onTrigger} shortcut="meta+k,ctrl+k" />)
45
+
46
+ fireEvent.keyDown(document, { key: 'k', metaKey: true })
47
+
48
+ expect(onClick).toHaveBeenCalledTimes(0)
49
+ expect(onTrigger).toHaveBeenCalledTimes(1)
50
+ })
51
+
52
+ test('CSearchButton ignores plain typing in editable fields', async () => {
53
+ const onClick = jest.fn()
54
+
55
+ render(
56
+ <>
57
+ <input aria-label="Search input" />
58
+ <CSearchButton onClick={onClick} shortcut="k" />
59
+ </>
60
+ )
61
+
62
+ fireEvent.keyDown(screen.getByLabelText('Search input'), { key: 'k' })
63
+
64
+ expect(onClick).not.toHaveBeenCalled()
65
+ })
66
+
67
+ test('CSearchButton highlights active shortcut keys', async () => {
68
+ render(<CSearchButton shortcut="meta+k,ctrl+k" />)
69
+
70
+ fireEvent.keyDown(document, { key: 'Meta', metaKey: true })
71
+
72
+ expect(screen.getByText('⌘')).toHaveClass('active')
73
+
74
+ fireEvent.keyDown(document, { key: 'k', metaKey: true })
75
+
76
+ expect(screen.getByText('⌘')).toHaveClass('active')
77
+ expect(screen.getByText('K')).toHaveClass('active')
78
+
79
+ fireEvent.keyUp(document, { key: 'k' })
80
+
81
+ expect(screen.getByText('⌘')).not.toHaveClass('active')
82
+ expect(screen.getByText('K')).not.toHaveClass('active')
83
+ })
84
+
85
+ test('CSearchButton triggers onTrigger on click', async () => {
86
+ const onClick = jest.fn()
87
+ const onTrigger = jest.fn()
88
+
89
+ render(<CSearchButton onClick={onClick} onTrigger={onTrigger} />)
90
+
91
+ fireEvent.click(screen.getByRole('button'))
92
+
93
+ expect(onClick).toHaveBeenCalledTimes(1)
94
+ expect(onTrigger).toHaveBeenCalledTimes(1)
95
+ })
@@ -0,0 +1,87 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`CSearchButton customize 1`] = `
4
+ <div>
5
+ <button
6
+ class="search-button bazinga"
7
+ type="button"
8
+ >
9
+ <svg
10
+ aria-hidden="true"
11
+ class="search-button-icon"
12
+ viewBox="0 0 512 512"
13
+ xmlns="http://www.w3.org/2000/svg"
14
+ >
15
+ <path
16
+ d="m479.6 399.716-81.084-81.084-62.368-25.767A175 175 0 0 0 368 192c0-97.047-78.953-176-176-176S16 94.953 16 192s78.953 176 176 176a175.03 175.03 0 0 0 101.619-32.377l25.7 62.2 81.081 81.088a56 56 0 1 0 79.2-79.195M48 192c0-79.4 64.6-144 144-144s144 64.6 144 144-64.6 144-144 144S48 271.4 48 192m408.971 264.284a24.03 24.03 0 0 1-33.942 0l-76.572-76.572-23.894-57.835 57.837 23.894 76.573 76.572a24.03 24.03 0 0 1-.002 33.941"
17
+ fill="currentColor"
18
+ />
19
+ </svg>
20
+ <span
21
+ class="search-button-placeholder"
22
+ >
23
+ Command palette
24
+ </span>
25
+ <span
26
+ aria-hidden="true"
27
+ class="search-button-keys"
28
+ >
29
+ <span
30
+ class="search-button-key"
31
+ data-coreui-search-button-key="⌘"
32
+ >
33
+ ⌘
34
+ </span>
35
+ <span
36
+ class="search-button-key"
37
+ data-coreui-search-button-key="K"
38
+ >
39
+ K
40
+ </span>
41
+ </span>
42
+ </button>
43
+ </div>
44
+ `;
45
+
46
+ exports[`loads and displays CSearchButton component 1`] = `
47
+ <div>
48
+ <button
49
+ class="search-button"
50
+ type="button"
51
+ >
52
+ <svg
53
+ aria-hidden="true"
54
+ class="search-button-icon"
55
+ viewBox="0 0 512 512"
56
+ xmlns="http://www.w3.org/2000/svg"
57
+ >
58
+ <path
59
+ d="m479.6 399.716-81.084-81.084-62.368-25.767A175 175 0 0 0 368 192c0-97.047-78.953-176-176-176S16 94.953 16 192s78.953 176 176 176a175.03 175.03 0 0 0 101.619-32.377l25.7 62.2 81.081 81.088a56 56 0 1 0 79.2-79.195M48 192c0-79.4 64.6-144 144-144s144 64.6 144 144-64.6 144-144 144S48 271.4 48 192m408.971 264.284a24.03 24.03 0 0 1-33.942 0l-76.572-76.572-23.894-57.835 57.837 23.894 76.573 76.572a24.03 24.03 0 0 1-.002 33.941"
60
+ fill="currentColor"
61
+ />
62
+ </svg>
63
+ <span
64
+ class="search-button-placeholder"
65
+ >
66
+ Search
67
+ </span>
68
+ <span
69
+ aria-hidden="true"
70
+ class="search-button-keys"
71
+ >
72
+ <span
73
+ class="search-button-key"
74
+ data-coreui-search-button-key="⌘"
75
+ >
76
+ ⌘
77
+ </span>
78
+ <span
79
+ class="search-button-key"
80
+ data-coreui-search-button-key="/"
81
+ >
82
+ /
83
+ </span>
84
+ </span>
85
+ </button>
86
+ </div>
87
+ `;
@@ -0,0 +1,3 @@
1
+ import { CSearchButton } from './CSearchButton'
2
+
3
+ export { CSearchButton }
@@ -0,0 +1,10 @@
1
+ export type SearchButtonShortcut = {
2
+ key: string
3
+ modifiers: {
4
+ alt: boolean
5
+ ctrl: boolean
6
+ meta: boolean
7
+ shift: boolean
8
+ }
9
+ shortcut: string
10
+ }
@@ -0,0 +1,140 @@
1
+ import type { SearchButtonShortcut } from './types'
2
+
3
+ const MODIFIER_KEYS = new Set(['alt', 'ctrl', 'meta', 'shift'])
4
+ const KEY_ALIASES: Record<string, string> = {
5
+ ' ': 'space',
6
+ cmd: 'meta',
7
+ command: 'meta',
8
+ control: 'ctrl',
9
+ esc: 'escape',
10
+ option: 'alt',
11
+ return: 'enter',
12
+ spacebar: 'space',
13
+ }
14
+ const KEY_LABELS: Record<string, string> = {
15
+ alt: 'Alt',
16
+ ctrl: 'Ctrl',
17
+ meta: '⌘',
18
+ shift: 'Shift',
19
+ space: 'Space',
20
+ }
21
+ const EDITABLE_TARGET_SELECTOR =
22
+ 'input, textarea, select, [contenteditable=""], [contenteditable="true"], [contenteditable="plaintext-only"]'
23
+
24
+ export const normalizeKey = (key: string) => KEY_ALIASES[key.toLowerCase()] || key.toLowerCase()
25
+
26
+ export const parseShortcut = (shortcut: string): SearchButtonShortcut[] =>
27
+ shortcut
28
+ .split(',')
29
+ .map((value) => value.trim())
30
+ .filter(Boolean)
31
+ .map((value) => {
32
+ const keys = value.split('+').map((part) => normalizeKey(part.trim()))
33
+ const modifiers = {
34
+ alt: false,
35
+ ctrl: false,
36
+ meta: false,
37
+ shift: false,
38
+ }
39
+
40
+ let key = ''
41
+
42
+ for (const part of keys) {
43
+ if (MODIFIER_KEYS.has(part)) {
44
+ modifiers[part as keyof typeof modifiers] = true
45
+ continue
46
+ }
47
+
48
+ key = part
49
+ }
50
+
51
+ return {
52
+ key,
53
+ modifiers,
54
+ shortcut: value,
55
+ }
56
+ })
57
+
58
+ const getPlatform = () => {
59
+ if (typeof window === 'undefined') {
60
+ return ''
61
+ }
62
+
63
+ const navigator = window.navigator as Navigator & {
64
+ userAgentData?: {
65
+ platform?: string
66
+ }
67
+ }
68
+
69
+ return navigator.userAgentData?.platform || navigator.platform || navigator.userAgent || ''
70
+ }
71
+
72
+ export const isMacOS = () => /Mac|iPhone|iPad|iPod|macOS|Macintosh/.test(getPlatform())
73
+
74
+ export const getPreferredShortcut = (shortcuts: SearchButtonShortcut[]) =>
75
+ shortcuts.find((shortcut) => (isMacOS() ? shortcut.modifiers.meta : shortcut.modifiers.ctrl)) ||
76
+ shortcuts[0] ||
77
+ null
78
+
79
+ export const getKeyLabel = (key: string) =>
80
+ KEY_LABELS[key] ||
81
+ (key.length === 1 ? key.toUpperCase() : `${key.charAt(0).toUpperCase()}${key.slice(1)}`)
82
+
83
+ export const formatShortcutTokens = (shortcut: string) =>
84
+ shortcut
85
+ .split('+')
86
+ .map((part) => normalizeKey(part.trim()))
87
+ .map((part) => getKeyLabel(part))
88
+ .filter(Boolean)
89
+
90
+ export const getPressedKeys = (event: KeyboardEvent) => {
91
+ const pressedKeys = new Set<string>()
92
+
93
+ if (event.altKey) {
94
+ pressedKeys.add(KEY_LABELS.alt)
95
+ }
96
+
97
+ if (event.ctrlKey) {
98
+ pressedKeys.add(KEY_LABELS.ctrl)
99
+ }
100
+
101
+ if (event.metaKey) {
102
+ pressedKeys.add(KEY_LABELS.meta)
103
+ }
104
+
105
+ if (event.shiftKey) {
106
+ pressedKeys.add(KEY_LABELS.shift)
107
+ }
108
+
109
+ const normalizedKey = normalizeKey(event.key)
110
+
111
+ if (!MODIFIER_KEYS.has(normalizedKey) && event.type === 'keydown') {
112
+ pressedKeys.add(getKeyLabel(normalizedKey))
113
+ }
114
+
115
+ return pressedKeys
116
+ }
117
+
118
+ export const isEditableTarget = (target: EventTarget | null) => {
119
+ if (!(target instanceof Element)) {
120
+ return false
121
+ }
122
+
123
+ return target.matches(EDITABLE_TARGET_SELECTOR) || !!target.closest(EDITABLE_TARGET_SELECTOR)
124
+ }
125
+
126
+ export const shouldIgnoreShortcut = (event: KeyboardEvent) =>
127
+ isEditableTarget(event.target) && !event.ctrlKey && !event.metaKey
128
+
129
+ export const matchesShortcut = (shortcut: SearchButtonShortcut, event: KeyboardEvent) => {
130
+ if (!shortcut.key || normalizeKey(event.key) !== shortcut.key) {
131
+ return false
132
+ }
133
+
134
+ return (
135
+ shortcut.modifiers.alt === event.altKey &&
136
+ shortcut.modifiers.ctrl === event.ctrlKey &&
137
+ shortcut.modifiers.meta === event.metaKey &&
138
+ shortcut.modifiers.shift === event.shiftKey
139
+ )
140
+ }
@@ -92,7 +92,7 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
92
92
  visible,
93
93
  ...rest
94
94
  },
95
- ref,
95
+ ref
96
96
  ) => {
97
97
  const sidebarRef = useRef<HTMLDivElement>(null)
98
98
  const forkedRef = useForkedRef(ref, sidebarRef)
@@ -101,46 +101,65 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
101
101
  const [mobile, setMobile] = useState(false)
102
102
  const [visibleMobile, setVisibleMobile] = useState<boolean>(false)
103
103
  const [visibleDesktop, setVisibleDesktop] = useState<boolean>(
104
- visible !== undefined ? visible : overlaid ? false : true,
104
+ visible === undefined ? !overlaid : visible
105
105
  )
106
106
 
107
107
  useEffect(() => {
108
- sidebarRef.current && setMobile(isOnMobile(sidebarRef.current))
109
- visible !== undefined && handleVisibleChange(visible)
108
+ if (sidebarRef.current) {
109
+ setMobile(isOnMobile(sidebarRef.current))
110
+ }
111
+
112
+ if (visible !== undefined) {
113
+ handleVisibleChange(visible)
114
+ }
110
115
  }, [visible])
111
116
 
112
117
  useEffect(() => {
113
- inViewport !== undefined && onVisibleChange && onVisibleChange(inViewport)
114
- !inViewport && onHide && onHide()
115
- inViewport && onShow && onShow()
118
+ if (inViewport !== undefined) {
119
+ onVisibleChange?.(inViewport)
120
+ }
121
+
122
+ if (inViewport) {
123
+ onShow?.()
124
+ } else {
125
+ onHide?.()
126
+ }
116
127
  }, [inViewport])
117
128
 
118
129
  useEffect(() => {
119
- mobile && setVisibleMobile(false)
130
+ if (mobile) {
131
+ setVisibleMobile(false)
132
+ }
120
133
  }, [mobile])
121
134
 
122
135
  useEffect(() => {
123
- sidebarRef.current && setMobile(isOnMobile(sidebarRef.current))
124
- sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
136
+ const element = sidebarRef.current
137
+
138
+ if (element) {
139
+ setMobile(isOnMobile(element))
140
+ setInViewport(isInViewport(element))
141
+ }
142
+
143
+ const handleTransitionEnd = () => {
144
+ if (element) {
145
+ setInViewport(isInViewport(element))
146
+ }
147
+ }
125
148
 
126
149
  window.addEventListener('resize', handleResize)
127
150
  window.addEventListener('mouseup', handleClickOutside)
128
151
  window.addEventListener('keyup', handleKeyup)
129
152
 
130
- sidebarRef.current?.addEventListener('mouseup', handleOnClick)
131
- sidebarRef.current?.addEventListener('transitionend', () => {
132
- sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
133
- })
153
+ element?.addEventListener('mouseup', handleOnClick)
154
+ element?.addEventListener('transitionend', handleTransitionEnd)
134
155
 
135
156
  return () => {
136
157
  window.removeEventListener('resize', handleResize)
137
158
  window.removeEventListener('mouseup', handleClickOutside)
138
159
  window.removeEventListener('keyup', handleKeyup)
139
160
 
140
- sidebarRef.current?.removeEventListener('mouseup', handleOnClick)
141
- sidebarRef.current?.removeEventListener('transitionend', () => {
142
- sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
143
- })
161
+ element?.removeEventListener('mouseup', handleOnClick)
162
+ element?.removeEventListener('transitionend', handleTransitionEnd)
144
163
  }
145
164
  })
146
165
 
@@ -158,8 +177,10 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
158
177
  }
159
178
 
160
179
  const handleResize = () => {
161
- sidebarRef.current && setMobile(isOnMobile(sidebarRef.current))
162
- sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
180
+ if (sidebarRef.current) {
181
+ setMobile(isOnMobile(sidebarRef.current))
182
+ setInViewport(isInViewport(sidebarRef.current))
183
+ }
163
184
  }
164
185
 
165
186
  const handleKeyup = (event: Event) => {
@@ -183,11 +204,15 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
183
204
 
184
205
  const handleOnClick = (event: Event) => {
185
206
  const target = event.target as HTMLAnchorElement
186
- target &&
207
+
208
+ if (
209
+ target &&
187
210
  target.classList.contains('nav-link') &&
188
211
  !target.classList.contains('nav-group-toggle') &&
189
- mobile &&
212
+ mobile
213
+ ) {
190
214
  handleHide()
215
+ }
191
216
  }
192
217
 
193
218
  return (
@@ -206,7 +231,7 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
206
231
  show: (mobile && visibleMobile) || (overlaid && visibleDesktop),
207
232
  hide: visibleDesktop === false && !mobile && !overlaid,
208
233
  },
209
- className,
234
+ className
210
235
  )}
211
236
  {...rest}
212
237
  ref={forkedRef}
@@ -217,11 +242,11 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
217
242
  mobile &&
218
243
  createPortal(
219
244
  <CBackdrop className="sidebar-backdrop" visible={mobile && visibleMobile} />,
220
- document.body,
245
+ document.body
221
246
  )}
222
247
  </>
223
248
  )
224
- },
249
+ }
225
250
  )
226
251
 
227
252
  CSidebar.propTypes = {
@@ -241,4 +266,4 @@ CSidebar.propTypes = {
241
266
  visible: PropTypes.bool,
242
267
  }
243
268
 
244
- CSidebar.displayName = 'CSidebar'
269
+ CSidebar.displayName = 'CSidebar'
@@ -2,18 +2,14 @@ import React, {
2
2
  ElementType,
3
3
  forwardRef,
4
4
  HTMLAttributes,
5
- ReactElement,
6
- ReactNode,
5
+ useCallback,
6
+ useMemo,
7
7
  useState,
8
8
  } from 'react'
9
9
  import PropTypes from 'prop-types'
10
10
  import classNames from 'classnames'
11
11
 
12
- import type { CNavGroupProps } from '../nav/CNavGroup'
13
- import type { CNavLinkProps } from '../nav/CNavLink'
14
- import type { CNavItemProps } from '../nav/CNavItem'
15
-
16
- import { CSidebarNavContext } from './CSidebarNavContext'
12
+ import { CNavGroupContext, CNavGroupContextValue } from '../nav/CNavGroupContext'
17
13
 
18
14
  import { PolymorphicRefForwardingComponent } from '../../helpers'
19
15
 
@@ -28,60 +24,48 @@ export interface CSidebarNavProps extends HTMLAttributes<HTMLUListElement> {
28
24
  * A string of all className you want applied to the component.
29
25
  */
30
26
  className?: string
31
- }
32
-
33
- const isNavElement = (
34
- child: ReactNode
35
- ): child is ReactElement<CNavGroupProps | CNavLinkProps | CNavItemProps> => {
36
- if (!React.isValidElement(child)) return false
37
- const type = child.type as { displayName?: string }
38
- return (
39
- type.displayName === 'CNavGroup' ||
40
- type.displayName === 'CNavLink' ||
41
- type.displayName === 'CNavItem'
42
- )
43
- }
44
-
45
- const recursiveClone = (children: ReactNode, id?: string, updateId?: boolean): ReactNode => {
46
- return React.Children.map(children, (child, index) => {
47
- if (!isNavElement(child)) {
48
- return child
49
- }
50
-
51
- const _id = id ? (updateId ? `${id}.${index}` : `${id}`) : `${index}`
52
-
53
- if (child.props.children) {
54
- const type = child.type as { displayName?: string }
55
- const shouldUpdateId = type.displayName !== 'CNavItem'
56
-
57
- return React.cloneElement(child, {
58
- idx: _id,
59
- children: recursiveClone(child.props.children, _id, shouldUpdateId),
60
- })
61
- }
62
-
63
- return React.cloneElement(child, {
64
- idx: _id,
65
- })
66
- })
27
+ /**
28
+ * Make navigation more compact by cutting link padding in half.
29
+ *
30
+ * @since 5.11.0
31
+ */
32
+ compact?: boolean
33
+ /**
34
+ * Sets the navigation variant.
35
+ *
36
+ * @since 5.11.0
37
+ */
38
+ variant?: 'tree'
67
39
  }
68
40
 
69
41
  export const CSidebarNav: PolymorphicRefForwardingComponent<'ul', CSidebarNavProps> = forwardRef<
70
42
  HTMLUListElement,
71
43
  CSidebarNavProps
72
- >(({ children, as: Component = 'ul', className, ...rest }, ref) => {
73
- const [visibleGroup, setVisibleGroup] = useState('')
74
- const CNavContextValues = {
75
- visibleGroup,
76
- setVisibleGroup,
77
- }
44
+ >(({ children, as: Component = 'ul', className, compact, variant, ...rest }, ref) => {
45
+ const [activeId, setActiveId] = useState<string | undefined>()
46
+ const openBranch = useCallback(() => {}, [])
47
+ const contextValue = useMemo<CNavGroupContextValue>(
48
+ () => ({ activeId, setActiveId, openBranch }),
49
+ [activeId, openBranch]
50
+ )
78
51
 
79
52
  return (
80
- <CSidebarNavContext.Provider value={CNavContextValues}>
81
- <Component className={classNames('sidebar-nav', className)} ref={ref} {...rest}>
82
- {recursiveClone(children)}
53
+ <CNavGroupContext.Provider value={contextValue}>
54
+ <Component
55
+ className={classNames(
56
+ 'sidebar-nav',
57
+ {
58
+ compact,
59
+ 'sidebar-nav-tree': variant === 'tree',
60
+ },
61
+ className
62
+ )}
63
+ ref={ref}
64
+ {...rest}
65
+ >
66
+ {children}
83
67
  </Component>
84
- </CSidebarNavContext.Provider>
68
+ </CNavGroupContext.Provider>
85
69
  )
86
70
  })
87
71
 
@@ -89,6 +73,8 @@ CSidebarNav.propTypes = {
89
73
  as: PropTypes.elementType,
90
74
  children: PropTypes.node,
91
75
  className: PropTypes.string,
76
+ compact: PropTypes.bool,
77
+ variant: PropTypes.oneOf(['tree']),
92
78
  }
93
79
 
94
80
  CSidebarNav.displayName = 'CSidebarNav'
@@ -44,3 +44,29 @@ test('CSidebar customize hide', async () => {
44
44
  expect(container.firstChild).toHaveClass('sidebar')
45
45
  expect(container.firstChild).toHaveClass('sidebar-sticky')
46
46
  })
47
+
48
+ test('CSidebar removes the exact transitionend listener reference on cleanup', async () => {
49
+ const addSpy = jest.spyOn(HTMLElement.prototype, 'addEventListener')
50
+ const removeSpy = jest.spyOn(HTMLElement.prototype, 'removeEventListener')
51
+
52
+ const { container, unmount } = render(<CSidebar>Test</CSidebar>)
53
+ const sidebar = container.querySelector('.sidebar')
54
+ unmount()
55
+
56
+ const handlersOn = (spy: jest.SpyInstance) =>
57
+ spy.mock.calls
58
+ .map((args, index) => ({ args, context: spy.mock.contexts[index] }))
59
+ .filter(({ args, context }) => args[0] === 'transitionend' && context === sidebar)
60
+ .map(({ args }) => args[1])
61
+
62
+ const added = handlersOn(addSpy)
63
+ const removed = handlersOn(removeSpy)
64
+
65
+ expect(added.length).toBeGreaterThan(0)
66
+ for (const handler of added) {
67
+ expect(removed).toContain(handler)
68
+ }
69
+
70
+ addSpy.mockRestore()
71
+ removeSpy.mockRestore()
72
+ })
@@ -207,9 +207,10 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
207
207
 
208
208
  const firstItemOnActivePageIndex: number = _activePage ? (_activePage - 1) * _itemsPerPage : 0
209
209
 
210
- const currentItems: Item[] = _activePage
211
- ? sortedItems.slice(firstItemOnActivePageIndex, firstItemOnActivePageIndex + _itemsPerPage)
212
- : sortedItems
210
+ const currentItems: Item[] =
211
+ _activePage && pagination
212
+ ? sortedItems.slice(firstItemOnActivePageIndex, firstItemOnActivePageIndex + _itemsPerPage)
213
+ : sortedItems
213
214
 
214
215
  useEffect(() => {
215
216
  mountedRef.current && onFilteredItemsChange && onFilteredItemsChange(sortedItems)
@@ -496,7 +497,7 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
496
497
  )}
497
498
  </div>
498
499
 
499
- {(pagination || itemsPerPageSelect) && (
500
+ {pagination && (
500
501
  <div className="row">
501
502
  <div className="col">
502
503
  {((pagination && numberOfPages > 1) ||
@@ -103,7 +103,7 @@ export interface CSmartTableProps extends HTMLAttributes<HTMLDivElement> {
103
103
  */
104
104
  itemsNumber?: number
105
105
  /**
106
- * Number of items per site, when pagination is enabled.
106
+ * Number of items per page. Only applicable when `pagination` is enabled.
107
107
  */
108
108
  itemsPerPage?: number
109
109
  /**
@@ -115,7 +115,7 @@ export interface CSmartTableProps extends HTMLAttributes<HTMLDivElement> {
115
115
  */
116
116
  itemsPerPageOptions?: number[]
117
117
  /**
118
- * Adds select element over table, which is used for control items per page in pagination. If you want to customize this element, pass object with optional values:
118
+ * Adds select element over table, which is used for control items per page in pagination. Only applicable when `pagination` is enabled. If you want to customize this element, pass object with optional values:
119
119
  * - external (Boolean) - disables automatic 'itemsPerPage' change.
120
120
  */
121
121
  itemsPerPageSelect?: boolean | ItemsPerPageSelect