@coreui/react 5.0.0-beta.1 → 5.0.0-rc.1

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 (350) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/alert/CAlertHeading.d.ts +7 -6
  3. package/dist/cjs/components/alert/CAlertHeading.js +2 -2
  4. package/dist/cjs/components/alert/CAlertHeading.js.map +1 -1
  5. package/dist/cjs/components/badge/CBadge.d.ts +7 -6
  6. package/dist/cjs/components/badge/CBadge.js +2 -2
  7. package/dist/cjs/components/badge/CBadge.js.map +1 -1
  8. package/dist/cjs/components/button/CButton.d.ts +7 -6
  9. package/dist/cjs/components/button/CButton.js +3 -3
  10. package/dist/cjs/components/button/CButton.js.map +1 -1
  11. package/dist/cjs/components/card/CCardHeader.d.ts +7 -6
  12. package/dist/cjs/components/card/CCardHeader.js +2 -2
  13. package/dist/cjs/components/card/CCardHeader.js.map +1 -1
  14. package/dist/cjs/components/card/CCardImage.d.ts +7 -6
  15. package/dist/cjs/components/card/CCardImage.js +2 -2
  16. package/dist/cjs/components/card/CCardImage.js.map +1 -1
  17. package/dist/cjs/components/card/CCardSubtitle.d.ts +7 -6
  18. package/dist/cjs/components/card/CCardSubtitle.js +2 -2
  19. package/dist/cjs/components/card/CCardSubtitle.js.map +1 -1
  20. package/dist/cjs/components/card/CCardText.d.ts +7 -6
  21. package/dist/cjs/components/card/CCardText.js +2 -2
  22. package/dist/cjs/components/card/CCardText.js.map +1 -1
  23. package/dist/cjs/components/card/CCardTitle.d.ts +7 -6
  24. package/dist/cjs/components/card/CCardTitle.js +2 -2
  25. package/dist/cjs/components/card/CCardTitle.js.map +1 -1
  26. package/dist/cjs/components/carousel/CCarousel.js +1 -1
  27. package/dist/cjs/components/dropdown/CDropdown.d.ts +6 -5
  28. package/dist/cjs/components/dropdown/CDropdown.js +6 -4
  29. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  30. package/dist/cjs/components/dropdown/CDropdownHeader.d.ts +7 -6
  31. package/dist/cjs/components/dropdown/CDropdownHeader.js +2 -2
  32. package/dist/cjs/components/dropdown/CDropdownHeader.js.map +1 -1
  33. package/dist/cjs/components/dropdown/CDropdownItem.d.ts +2 -6
  34. package/dist/cjs/components/dropdown/CDropdownItem.js +3 -3
  35. package/dist/cjs/components/dropdown/CDropdownItem.js.map +1 -1
  36. package/dist/cjs/components/dropdown/CDropdownItemPlain.d.ts +7 -6
  37. package/dist/cjs/components/dropdown/CDropdownItemPlain.js +2 -2
  38. package/dist/cjs/components/dropdown/CDropdownItemPlain.js.map +1 -1
  39. package/dist/cjs/components/dropdown/CDropdownMenu.d.ts +7 -6
  40. package/dist/cjs/components/dropdown/CDropdownMenu.js +2 -2
  41. package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
  42. package/dist/cjs/components/dropdown/CDropdownToggle.d.ts +1 -1
  43. package/dist/cjs/components/dropdown/utils.js.map +1 -1
  44. package/dist/cjs/components/form/CFormFeedback.d.ts +7 -6
  45. package/dist/cjs/components/form/CFormFeedback.js +2 -2
  46. package/dist/cjs/components/form/CFormFeedback.js.map +1 -1
  47. package/dist/cjs/components/form/CFormText.d.ts +7 -6
  48. package/dist/cjs/components/form/CFormText.js +2 -2
  49. package/dist/cjs/components/form/CFormText.js.map +1 -1
  50. package/dist/cjs/components/form/CInputGroupText.d.ts +7 -6
  51. package/dist/cjs/components/form/CInputGroupText.js +2 -2
  52. package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
  53. package/dist/cjs/components/header/CHeaderBrand.d.ts +7 -6
  54. package/dist/cjs/components/header/CHeaderBrand.js +2 -2
  55. package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
  56. package/dist/cjs/components/header/CHeaderNav.d.ts +7 -6
  57. package/dist/cjs/components/header/CHeaderNav.js +2 -2
  58. package/dist/cjs/components/header/CHeaderNav.js.map +1 -1
  59. package/dist/cjs/components/link/CLink.d.ts +8 -7
  60. package/dist/cjs/components/link/CLink.js +2 -2
  61. package/dist/cjs/components/link/CLink.js.map +1 -1
  62. package/dist/cjs/components/list-group/CListGroup.d.ts +7 -6
  63. package/dist/cjs/components/list-group/CListGroup.js +2 -2
  64. package/dist/cjs/components/list-group/CListGroup.js.map +1 -1
  65. package/dist/cjs/components/list-group/CListGroupItem.d.ts +7 -6
  66. package/dist/cjs/components/list-group/CListGroupItem.js +6 -6
  67. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  68. package/dist/cjs/components/modal/CModal.js +1 -2
  69. package/dist/cjs/components/modal/CModal.js.map +1 -1
  70. package/dist/cjs/components/modal/CModalTitle.d.ts +4 -3
  71. package/dist/cjs/components/modal/CModalTitle.js +2 -2
  72. package/dist/cjs/components/modal/CModalTitle.js.map +1 -1
  73. package/dist/cjs/components/nav/CNav.d.ts +7 -6
  74. package/dist/cjs/components/nav/CNav.js +2 -2
  75. package/dist/cjs/components/nav/CNav.js.map +1 -1
  76. package/dist/cjs/components/nav/CNavGroup.d.ts +10 -4
  77. package/dist/cjs/components/nav/CNavGroup.js +11 -16
  78. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  79. package/dist/cjs/components/nav/CNavGroupItems.d.ts +10 -3
  80. package/dist/cjs/components/nav/CNavGroupItems.js +3 -2
  81. package/dist/cjs/components/nav/CNavGroupItems.js.map +1 -1
  82. package/dist/cjs/components/nav/CNavItem.d.ts +11 -2
  83. package/dist/cjs/components/nav/CNavItem.js +3 -2
  84. package/dist/cjs/components/nav/CNavItem.js.map +1 -1
  85. package/dist/cjs/components/nav/CNavLink.d.ts +2 -18
  86. package/dist/cjs/components/nav/CNavLink.js +3 -0
  87. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  88. package/dist/cjs/components/nav/CNavTitle.d.ts +7 -2
  89. package/dist/cjs/components/nav/CNavTitle.js +3 -2
  90. package/dist/cjs/components/nav/CNavTitle.js.map +1 -1
  91. package/dist/cjs/components/navbar/CNavbar.d.ts +7 -6
  92. package/dist/cjs/components/navbar/CNavbar.js +2 -2
  93. package/dist/cjs/components/navbar/CNavbar.js.map +1 -1
  94. package/dist/cjs/components/navbar/CNavbarBrand.d.ts +8 -7
  95. package/dist/cjs/components/navbar/CNavbarBrand.js +3 -3
  96. package/dist/cjs/components/navbar/CNavbarBrand.js.map +1 -1
  97. package/dist/cjs/components/navbar/CNavbarNav.d.ts +7 -6
  98. package/dist/cjs/components/navbar/CNavbarNav.js +3 -3
  99. package/dist/cjs/components/navbar/CNavbarNav.js.map +1 -1
  100. package/dist/cjs/components/offcanvas/COffcanvasTitle.d.ts +7 -6
  101. package/dist/cjs/components/offcanvas/COffcanvasTitle.js +2 -2
  102. package/dist/cjs/components/offcanvas/COffcanvasTitle.js.map +1 -1
  103. package/dist/cjs/components/pagination/CPaginationItem.d.ts +4 -3
  104. package/dist/cjs/components/pagination/CPaginationItem.js +4 -4
  105. package/dist/cjs/components/pagination/CPaginationItem.js.map +1 -1
  106. package/dist/cjs/components/placeholder/CPlaceholder.d.ts +7 -6
  107. package/dist/cjs/components/placeholder/CPlaceholder.js +2 -2
  108. package/dist/cjs/components/placeholder/CPlaceholder.js.map +1 -1
  109. package/dist/cjs/components/popover/CPopover.js +19 -12
  110. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  111. package/dist/cjs/components/sidebar/CSidebarBrand.d.ts +10 -3
  112. package/dist/cjs/components/sidebar/CSidebarBrand.js +3 -2
  113. package/dist/cjs/components/sidebar/CSidebarBrand.js.map +1 -1
  114. package/dist/cjs/components/sidebar/CSidebarNav.d.ts +9 -2
  115. package/dist/cjs/components/sidebar/CSidebarNav.js +30 -12
  116. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  117. package/dist/cjs/components/spinner/CSpinner.d.ts +7 -6
  118. package/dist/cjs/components/spinner/CSpinner.js +2 -2
  119. package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
  120. package/dist/cjs/components/toast/CToastClose.d.ts +5 -4
  121. package/dist/cjs/components/toast/CToastClose.js +2 -2
  122. package/dist/cjs/components/toast/CToastClose.js.map +1 -1
  123. package/dist/cjs/components/toast/CToaster.js +1 -1
  124. package/dist/cjs/components/toast/CToaster.js.map +1 -1
  125. package/dist/cjs/components/tooltip/CTooltip.js +19 -12
  126. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  127. package/dist/cjs/components/widgets/CWidgetStatsA.js.map +1 -1
  128. package/dist/cjs/components/widgets/CWidgetStatsC.js +2 -1
  129. package/dist/cjs/components/widgets/CWidgetStatsC.js.map +1 -1
  130. package/dist/cjs/helpers/index.d.ts +2 -0
  131. package/dist/cjs/helpers/polymorphicComponent.d.ts +14 -0
  132. package/dist/esm/components/alert/CAlertHeading.d.ts +7 -6
  133. package/dist/esm/components/alert/CAlertHeading.js +2 -2
  134. package/dist/esm/components/alert/CAlertHeading.js.map +1 -1
  135. package/dist/esm/components/badge/CBadge.d.ts +7 -6
  136. package/dist/esm/components/badge/CBadge.js +2 -2
  137. package/dist/esm/components/badge/CBadge.js.map +1 -1
  138. package/dist/esm/components/button/CButton.d.ts +7 -6
  139. package/dist/esm/components/button/CButton.js +3 -3
  140. package/dist/esm/components/button/CButton.js.map +1 -1
  141. package/dist/esm/components/card/CCardHeader.d.ts +7 -6
  142. package/dist/esm/components/card/CCardHeader.js +2 -2
  143. package/dist/esm/components/card/CCardHeader.js.map +1 -1
  144. package/dist/esm/components/card/CCardImage.d.ts +7 -6
  145. package/dist/esm/components/card/CCardImage.js +2 -2
  146. package/dist/esm/components/card/CCardImage.js.map +1 -1
  147. package/dist/esm/components/card/CCardSubtitle.d.ts +7 -6
  148. package/dist/esm/components/card/CCardSubtitle.js +2 -2
  149. package/dist/esm/components/card/CCardSubtitle.js.map +1 -1
  150. package/dist/esm/components/card/CCardText.d.ts +7 -6
  151. package/dist/esm/components/card/CCardText.js +2 -2
  152. package/dist/esm/components/card/CCardText.js.map +1 -1
  153. package/dist/esm/components/card/CCardTitle.d.ts +7 -6
  154. package/dist/esm/components/card/CCardTitle.js +2 -2
  155. package/dist/esm/components/card/CCardTitle.js.map +1 -1
  156. package/dist/esm/components/carousel/CCarousel.js +1 -1
  157. package/dist/esm/components/dropdown/CDropdown.d.ts +6 -5
  158. package/dist/esm/components/dropdown/CDropdown.js +6 -4
  159. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  160. package/dist/esm/components/dropdown/CDropdownHeader.d.ts +7 -6
  161. package/dist/esm/components/dropdown/CDropdownHeader.js +2 -2
  162. package/dist/esm/components/dropdown/CDropdownHeader.js.map +1 -1
  163. package/dist/esm/components/dropdown/CDropdownItem.d.ts +2 -6
  164. package/dist/esm/components/dropdown/CDropdownItem.js +3 -3
  165. package/dist/esm/components/dropdown/CDropdownItem.js.map +1 -1
  166. package/dist/esm/components/dropdown/CDropdownItemPlain.d.ts +7 -6
  167. package/dist/esm/components/dropdown/CDropdownItemPlain.js +2 -2
  168. package/dist/esm/components/dropdown/CDropdownItemPlain.js.map +1 -1
  169. package/dist/esm/components/dropdown/CDropdownMenu.d.ts +7 -6
  170. package/dist/esm/components/dropdown/CDropdownMenu.js +2 -2
  171. package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
  172. package/dist/esm/components/dropdown/CDropdownToggle.d.ts +1 -1
  173. package/dist/esm/components/dropdown/utils.js.map +1 -1
  174. package/dist/esm/components/form/CFormFeedback.d.ts +7 -6
  175. package/dist/esm/components/form/CFormFeedback.js +2 -2
  176. package/dist/esm/components/form/CFormFeedback.js.map +1 -1
  177. package/dist/esm/components/form/CFormText.d.ts +7 -6
  178. package/dist/esm/components/form/CFormText.js +2 -2
  179. package/dist/esm/components/form/CFormText.js.map +1 -1
  180. package/dist/esm/components/form/CInputGroupText.d.ts +7 -6
  181. package/dist/esm/components/form/CInputGroupText.js +2 -2
  182. package/dist/esm/components/form/CInputGroupText.js.map +1 -1
  183. package/dist/esm/components/header/CHeaderBrand.d.ts +7 -6
  184. package/dist/esm/components/header/CHeaderBrand.js +2 -2
  185. package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
  186. package/dist/esm/components/header/CHeaderNav.d.ts +7 -6
  187. package/dist/esm/components/header/CHeaderNav.js +2 -2
  188. package/dist/esm/components/header/CHeaderNav.js.map +1 -1
  189. package/dist/esm/components/link/CLink.d.ts +8 -7
  190. package/dist/esm/components/link/CLink.js +2 -2
  191. package/dist/esm/components/link/CLink.js.map +1 -1
  192. package/dist/esm/components/list-group/CListGroup.d.ts +7 -6
  193. package/dist/esm/components/list-group/CListGroup.js +2 -2
  194. package/dist/esm/components/list-group/CListGroup.js.map +1 -1
  195. package/dist/esm/components/list-group/CListGroupItem.d.ts +7 -6
  196. package/dist/esm/components/list-group/CListGroupItem.js +6 -6
  197. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  198. package/dist/esm/components/modal/CModal.js +1 -2
  199. package/dist/esm/components/modal/CModal.js.map +1 -1
  200. package/dist/esm/components/modal/CModalTitle.d.ts +4 -3
  201. package/dist/esm/components/modal/CModalTitle.js +2 -2
  202. package/dist/esm/components/modal/CModalTitle.js.map +1 -1
  203. package/dist/esm/components/nav/CNav.d.ts +7 -6
  204. package/dist/esm/components/nav/CNav.js +2 -2
  205. package/dist/esm/components/nav/CNav.js.map +1 -1
  206. package/dist/esm/components/nav/CNavGroup.d.ts +10 -4
  207. package/dist/esm/components/nav/CNavGroup.js +11 -16
  208. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  209. package/dist/esm/components/nav/CNavGroupItems.d.ts +10 -3
  210. package/dist/esm/components/nav/CNavGroupItems.js +3 -2
  211. package/dist/esm/components/nav/CNavGroupItems.js.map +1 -1
  212. package/dist/esm/components/nav/CNavItem.d.ts +11 -2
  213. package/dist/esm/components/nav/CNavItem.js +3 -2
  214. package/dist/esm/components/nav/CNavItem.js.map +1 -1
  215. package/dist/esm/components/nav/CNavLink.d.ts +2 -18
  216. package/dist/esm/components/nav/CNavLink.js +3 -0
  217. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  218. package/dist/esm/components/nav/CNavTitle.d.ts +7 -2
  219. package/dist/esm/components/nav/CNavTitle.js +3 -2
  220. package/dist/esm/components/nav/CNavTitle.js.map +1 -1
  221. package/dist/esm/components/navbar/CNavbar.d.ts +7 -6
  222. package/dist/esm/components/navbar/CNavbar.js +2 -2
  223. package/dist/esm/components/navbar/CNavbar.js.map +1 -1
  224. package/dist/esm/components/navbar/CNavbarBrand.d.ts +8 -7
  225. package/dist/esm/components/navbar/CNavbarBrand.js +3 -3
  226. package/dist/esm/components/navbar/CNavbarBrand.js.map +1 -1
  227. package/dist/esm/components/navbar/CNavbarNav.d.ts +7 -6
  228. package/dist/esm/components/navbar/CNavbarNav.js +3 -3
  229. package/dist/esm/components/navbar/CNavbarNav.js.map +1 -1
  230. package/dist/esm/components/offcanvas/COffcanvasTitle.d.ts +7 -6
  231. package/dist/esm/components/offcanvas/COffcanvasTitle.js +2 -2
  232. package/dist/esm/components/offcanvas/COffcanvasTitle.js.map +1 -1
  233. package/dist/esm/components/pagination/CPaginationItem.d.ts +4 -3
  234. package/dist/esm/components/pagination/CPaginationItem.js +4 -4
  235. package/dist/esm/components/pagination/CPaginationItem.js.map +1 -1
  236. package/dist/esm/components/placeholder/CPlaceholder.d.ts +7 -6
  237. package/dist/esm/components/placeholder/CPlaceholder.js +2 -2
  238. package/dist/esm/components/placeholder/CPlaceholder.js.map +1 -1
  239. package/dist/esm/components/popover/CPopover.js +19 -12
  240. package/dist/esm/components/popover/CPopover.js.map +1 -1
  241. package/dist/esm/components/sidebar/CSidebarBrand.d.ts +10 -3
  242. package/dist/esm/components/sidebar/CSidebarBrand.js +3 -2
  243. package/dist/esm/components/sidebar/CSidebarBrand.js.map +1 -1
  244. package/dist/esm/components/sidebar/CSidebarNav.d.ts +9 -2
  245. package/dist/esm/components/sidebar/CSidebarNav.js +30 -12
  246. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  247. package/dist/esm/components/spinner/CSpinner.d.ts +7 -6
  248. package/dist/esm/components/spinner/CSpinner.js +2 -2
  249. package/dist/esm/components/spinner/CSpinner.js.map +1 -1
  250. package/dist/esm/components/toast/CToastClose.d.ts +5 -4
  251. package/dist/esm/components/toast/CToastClose.js +2 -2
  252. package/dist/esm/components/toast/CToastClose.js.map +1 -1
  253. package/dist/esm/components/toast/CToaster.js +1 -1
  254. package/dist/esm/components/toast/CToaster.js.map +1 -1
  255. package/dist/esm/components/tooltip/CTooltip.js +19 -12
  256. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  257. package/dist/esm/components/widgets/CWidgetStatsA.js.map +1 -1
  258. package/dist/esm/components/widgets/CWidgetStatsC.js +2 -1
  259. package/dist/esm/components/widgets/CWidgetStatsC.js.map +1 -1
  260. package/dist/esm/helpers/index.d.ts +2 -0
  261. package/dist/esm/helpers/polymorphicComponent.d.ts +14 -0
  262. package/package.json +14 -16
  263. package/src/components/alert/CAlertHeading.tsx +17 -14
  264. package/src/components/alert/__tests__/CAlertHeading.spec.tsx +1 -1
  265. package/src/components/badge/CBadge.tsx +11 -7
  266. package/src/components/badge/__tests__/CBadge.spec.tsx +1 -1
  267. package/src/components/button/CButton.tsx +12 -18
  268. package/src/components/button/__tests__/CButton.spec.tsx +2 -2
  269. package/src/components/card/CCardHeader.tsx +17 -14
  270. package/src/components/card/CCardImage.tsx +9 -7
  271. package/src/components/card/CCardSubtitle.tsx +18 -14
  272. package/src/components/card/CCardText.tsx +17 -14
  273. package/src/components/card/CCardTitle.tsx +17 -14
  274. package/src/components/card/__tests__/CCardGroup.spec.tsx +1 -1
  275. package/src/components/card/__tests__/CCardHeader.spec.tsx +1 -1
  276. package/src/components/card/__tests__/CCardImage.spec.tsx +1 -3
  277. package/src/components/card/__tests__/CCardSubtitle.spec.tsx +1 -1
  278. package/src/components/card/__tests__/CCardText.spec.tsx +1 -1
  279. package/src/components/card/__tests__/CCardTitle.spec.tsx +1 -1
  280. package/src/components/carousel/CCarousel.tsx +1 -1
  281. package/src/components/close-button/CCloseButton.tsx +1 -1
  282. package/src/components/conditional-portal/CConditionalPortal.tsx +1 -1
  283. package/src/components/dropdown/CDropdown.tsx +20 -10
  284. package/src/components/dropdown/CDropdownHeader.tsx +17 -14
  285. package/src/components/dropdown/CDropdownItem.tsx +14 -20
  286. package/src/components/dropdown/CDropdownItemPlain.tsx +12 -7
  287. package/src/components/dropdown/CDropdownMenu.tsx +43 -42
  288. package/src/components/dropdown/CDropdownToggle.tsx +2 -2
  289. package/src/components/dropdown/__tests__/CDropdown.spec.tsx +13 -13
  290. package/src/components/dropdown/__tests__/CDropdownHeader.spec.tsx +1 -1
  291. package/src/components/dropdown/__tests__/CDropdownItem.spec.tsx +1 -1
  292. package/src/components/dropdown/__tests__/CDropdownItemPlain.spec.tsx +1 -1
  293. package/src/components/dropdown/__tests__/CDropdownMenu.spec.tsx +1 -1
  294. package/src/components/dropdown/types.ts +1 -1
  295. package/src/components/dropdown/utils.ts +5 -4
  296. package/src/components/form/CFormFeedback.tsx +28 -27
  297. package/src/components/form/CFormText.tsx +17 -14
  298. package/src/components/form/CInputGroupText.tsx +17 -14
  299. package/src/components/form/__tests__/CFormText.spec.tsx +1 -1
  300. package/src/components/form/__tests__/CInputGroupText.spec.tsx +1 -1
  301. package/src/components/header/CHeaderBrand.tsx +17 -14
  302. package/src/components/header/CHeaderNav.tsx +22 -19
  303. package/src/components/header/__tests__/CHeaderBrand.spec.tsx +1 -1
  304. package/src/components/header/__tests__/CHeaderNav.spec.tsx +1 -1
  305. package/src/components/link/CLink.tsx +33 -29
  306. package/src/components/link/__tests__/CLink.spec.tsx +2 -2
  307. package/src/components/list-group/CListGroup.tsx +27 -24
  308. package/src/components/list-group/CListGroupItem.tsx +38 -37
  309. package/src/components/list-group/__tests__/CListGroup.spec.tsx +1 -1
  310. package/src/components/list-group/__tests__/CListGroupItem.spec.tsx +1 -7
  311. package/src/components/modal/CModal.tsx +1 -4
  312. package/src/components/modal/CModalTitle.tsx +14 -11
  313. package/src/components/modal/__tests__/CModalTitle.spec.tsx +1 -1
  314. package/src/components/nav/CNav.tsx +29 -26
  315. package/src/components/nav/CNavGroup.tsx +111 -100
  316. package/src/components/nav/CNavGroupItems.tsx +21 -11
  317. package/src/components/nav/CNavItem.tsx +29 -16
  318. package/src/components/nav/CNavLink.tsx +7 -19
  319. package/src/components/nav/CNavTitle.tsx +18 -10
  320. package/src/components/nav/__tests__/CNav.spec.tsx +1 -1
  321. package/src/components/nav/__tests__/CNavItem.spec.tsx +1 -1
  322. package/src/components/nav/__tests__/CNavLink.spec.tsx +1 -1
  323. package/src/components/navbar/CNavbar.tsx +11 -7
  324. package/src/components/navbar/CNavbarBrand.tsx +19 -16
  325. package/src/components/navbar/CNavbarNav.tsx +22 -19
  326. package/src/components/navbar/__tests__/CNavbar.spec.tsx +1 -1
  327. package/src/components/navbar/__tests__/CNavbarBrand.spec.tsx +1 -1
  328. package/src/components/navbar/__tests__/CNavbarNav.spec.tsx +1 -1
  329. package/src/components/offcanvas/COffcanvasTitle.tsx +17 -14
  330. package/src/components/offcanvas/__tests__/COffcanvasTitle.spec.tsx +1 -1
  331. package/src/components/pagination/CPaginationItem.tsx +33 -30
  332. package/src/components/pagination/__tests__/CPaginationItem.spec.tsx +1 -1
  333. package/src/components/placeholder/CPlaceholder.tsx +40 -41
  334. package/src/components/popover/CPopover.tsx +24 -13
  335. package/src/components/sidebar/CSidebarBrand.tsx +21 -11
  336. package/src/components/sidebar/CSidebarNav.tsx +68 -24
  337. package/src/components/sidebar/__tests__/__snapshots__/CSidebar.spec.tsx.snap +1 -1
  338. package/src/components/spinner/CSpinner.tsx +11 -7
  339. package/src/components/spinner/__tests__/CSpinner.spec.tsx +1 -1
  340. package/src/components/toast/CToastClose.tsx +8 -7
  341. package/src/components/toast/CToaster.tsx +1 -1
  342. package/src/components/toast/__tests__/__snapshots__/CToaster.spec.tsx.snap +2 -2
  343. package/src/components/tooltip/CTooltip.tsx +24 -12
  344. package/src/components/tooltip/__tests__/CTooltip.spec.tsx +7 -12
  345. package/src/components/widgets/CWidgetStatsA.tsx +1 -4
  346. package/src/components/widgets/CWidgetStatsC.tsx +11 -1
  347. package/src/components/widgets/__tests__/CWidgetStatsD.spec.tsx +1 -3
  348. package/src/helpers/index.ts +3 -0
  349. package/src/helpers/polymorphicComponent.ts +21 -0
  350. package/src/utils/getTransitionDurationFromElement.ts +1 -1
@@ -1,25 +1,35 @@
1
- import React, { forwardRef, HTMLAttributes } from 'react'
1
+ import React, { ElementType, forwardRef, HTMLAttributes } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import classNames from 'classnames'
4
4
 
5
- export interface CSidebarBrandProps extends HTMLAttributes<HTMLDivElement> {
5
+ import { PolymorphicRefForwardingComponent } from '../../helpers'
6
+
7
+ export interface CSidebarBrandProps extends HTMLAttributes<HTMLAnchorElement | HTMLDivElement> {
8
+ /**
9
+ * Component used for the root node. Either a string to use a HTML element or a component.
10
+ *
11
+ * @since 5.0.0-rc.1
12
+ */
13
+ as?: ElementType
6
14
  /**
7
15
  * A string of all className you want applied to the component.
8
16
  */
9
17
  className?: string
10
18
  }
11
19
 
12
- export const CSidebarBrand = forwardRef<HTMLDivElement, CSidebarBrandProps>(
13
- ({ children, className, ...rest }, ref) => {
14
- return (
15
- <div className={classNames('sidebar-brand', className)} ref={ref} {...rest}>
16
- {children}
17
- </div>
18
- )
19
- },
20
- )
20
+ export const CSidebarBrand: PolymorphicRefForwardingComponent<'a', CSidebarBrandProps> = forwardRef<
21
+ HTMLAnchorElement | HTMLDivElement,
22
+ CSidebarBrandProps
23
+ >(({ children, as: Component = 'a', className, ...rest }, ref) => {
24
+ return (
25
+ <Component className={classNames('sidebar-brand', className)} ref={ref} {...rest}>
26
+ {children}
27
+ </Component>
28
+ )
29
+ })
21
30
 
22
31
  CSidebarBrand.propTypes = {
32
+ as: PropTypes.elementType,
23
33
  children: PropTypes.node,
24
34
  className: PropTypes.string,
25
35
  }
@@ -1,8 +1,24 @@
1
- import React, { createContext, forwardRef, HTMLAttributes, useState } from 'react'
1
+ import React, {
2
+ createContext,
3
+ ElementType,
4
+ forwardRef,
5
+ HTMLAttributes,
6
+ ReactElement,
7
+ ReactNode,
8
+ useState,
9
+ } from 'react'
2
10
  import PropTypes from 'prop-types'
3
11
  import classNames from 'classnames'
4
12
 
13
+ import { PolymorphicRefForwardingComponent } from '../../helpers'
14
+
5
15
  export interface CSidebarNavProps extends HTMLAttributes<HTMLUListElement> {
16
+ /**
17
+ * Component used for the root node. Either a string to use a HTML element or a component.
18
+ *
19
+ * @since 5.0.0-rc.1
20
+ */
21
+ as?: ElementType
6
22
  /**
7
23
  * A string of all className you want applied to the component.
8
24
  */
@@ -16,33 +32,61 @@ interface ContextProps {
16
32
 
17
33
  export const CNavContext = createContext({} as ContextProps)
18
34
 
19
- export const CSidebarNav = forwardRef<HTMLUListElement, CSidebarNavProps>(
20
- ({ children, className, ...rest }, ref) => {
21
- const [visibleGroup, setVisibleGroup] = useState('')
22
- const CNavContextValues = {
23
- visibleGroup,
24
- setVisibleGroup,
35
+ const recursiveClone = (children: ReactNode, id?: string, updateId?: boolean): ReactNode => {
36
+ return React.Children.map(children, (child: ReactNode, index: number) => {
37
+ if (
38
+ !React.isValidElement(child) ||
39
+ // @ts-expect-error the `children` exist in each component. TODO: resolve
40
+ (child.type.displayName !== 'CNavGroup' &&
41
+ // @ts-expect-error the `children` exist in each component. TODO: resolve
42
+ child.type.displayName !== 'CNavLink' &&
43
+ // @ts-expect-error the `children` exist in each component. TODO: resolve
44
+ child.type.displayName !== 'CNavItem')
45
+ ) {
46
+ return child
25
47
  }
26
48
 
27
- return (
28
- <ul className={classNames('sidebar-nav', className)} ref={ref} {...rest}>
29
- <CNavContext.Provider value={CNavContextValues}>
30
- {React.Children.map(children, (child, index) => {
31
- if (React.isValidElement(child)) {
32
- return React.cloneElement(child as React.ReactElement<any>, {
33
- key: index,
34
- idx: `${index}`,
35
- })
36
- }
37
- return
38
- })}
39
- </CNavContext.Provider>
40
- </ul>
41
- )
42
- },
43
- )
49
+ const _id = id ? (updateId ? `${id}.${index}` : `${id}`) : `${index}`
50
+
51
+ if (child.props && child.props.children) {
52
+ return React.cloneElement(child as ReactElement<any>, {
53
+ idx: _id,
54
+ children: recursiveClone(
55
+ child.props.children,
56
+ _id,
57
+ // @ts-expect-error the `displayName` exist in each component. TODO: resolve
58
+ child.type.displayName === 'CNavItem' ? false : true,
59
+ ),
60
+ })
61
+ }
62
+
63
+ return React.cloneElement(child as ReactElement<any>, {
64
+ idx: _id,
65
+ })
66
+ })
67
+ }
68
+
69
+ export const CSidebarNav: PolymorphicRefForwardingComponent<'ul', CSidebarNavProps> = forwardRef<
70
+ HTMLUListElement,
71
+ CSidebarNavProps
72
+ >(({ children, as: Component = 'ul', className, ...rest }, ref) => {
73
+ const [visibleGroup, setVisibleGroup] = useState('')
74
+ const CNavContextValues = {
75
+ visibleGroup,
76
+ setVisibleGroup,
77
+ }
78
+
79
+ return (
80
+ <CNavContext.Provider value={CNavContextValues}>
81
+ <Component className={classNames('sidebar-nav', className)} ref={ref} {...rest}>
82
+ {recursiveClone(children)}
83
+ </Component>
84
+ </CNavContext.Provider>
85
+ )
86
+ })
44
87
 
45
88
  CSidebarNav.propTypes = {
89
+ as: PropTypes.elementType,
46
90
  children: PropTypes.node,
47
91
  className: PropTypes.string,
48
92
  }
@@ -13,7 +13,7 @@ exports[`CSidebar customize hide 1`] = `
13
13
  exports[`CSidebar customize show 1`] = `
14
14
  <div>
15
15
  <div
16
- class="sidebar sidebar-narrow sidebar-overlaid sidebar-fixed sidebar-narrow-unfoldable bazinga"
16
+ class="sidebar sidebar-narrow sidebar-overlaid sidebar-fixed sidebar-narrow-unfoldable show bazinga"
17
17
  >
18
18
  Test
19
19
  </div>
@@ -2,10 +2,15 @@ import React, { ElementType, forwardRef, HTMLAttributes } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import classNames from 'classnames'
4
4
 
5
+ import { PolymorphicRefForwardingComponent } from '../../helpers'
5
6
  import { colorPropType } from '../../props'
6
7
  import type { Colors } from '../../types'
7
8
 
8
9
  export interface CSpinnerProps extends HTMLAttributes<HTMLDivElement | HTMLSpanElement> {
10
+ /**
11
+ * Component used for the root node. Either a string to use a HTML element or a component.
12
+ */
13
+ as?: ElementType
9
14
  /**
10
15
  * A string of all className you want applied to the component.
11
16
  */
@@ -16,10 +21,6 @@ export interface CSpinnerProps extends HTMLAttributes<HTMLDivElement | HTMLSpanE
16
21
  * @type 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | string
17
22
  */
18
23
  color?: Colors
19
- /**
20
- * Component used for the root node. Either a string to use a HTML element or a component.
21
- */
22
- component?: string | ElementType
23
24
  /**
24
25
  * Size the component small.
25
26
  */
@@ -34,12 +35,15 @@ export interface CSpinnerProps extends HTMLAttributes<HTMLDivElement | HTMLSpanE
34
35
  visuallyHiddenLabel?: string
35
36
  }
36
37
 
37
- export const CSpinner = forwardRef<HTMLDivElement | HTMLSpanElement, CSpinnerProps>(
38
+ export const CSpinner: PolymorphicRefForwardingComponent<'div', CSpinnerProps> = forwardRef<
39
+ HTMLDivElement | HTMLSpanElement,
40
+ CSpinnerProps
41
+ >(
38
42
  (
39
43
  {
44
+ as: Component = 'div',
40
45
  className,
41
46
  color,
42
- component: Component = 'div',
43
47
  size,
44
48
  variant = 'border',
45
49
  visuallyHiddenLabel = 'Loading...',
@@ -68,9 +72,9 @@ export const CSpinner = forwardRef<HTMLDivElement | HTMLSpanElement, CSpinnerPro
68
72
  )
69
73
 
70
74
  CSpinner.propTypes = {
75
+ as: PropTypes.string,
71
76
  className: PropTypes.string,
72
77
  color: colorPropType,
73
- component: PropTypes.string,
74
78
  size: PropTypes.oneOf(['sm']),
75
79
  variant: PropTypes.oneOf(['border', 'grow']),
76
80
  visuallyHiddenLabel: PropTypes.string,
@@ -10,7 +10,7 @@ test('loads and displays CSpinner component', async () => {
10
10
 
11
11
  test('CSpinner customize', async () => {
12
12
  const { container } = render(
13
- <CSpinner className="bazinga" color="warning" component="h3" size="sm" variant="grow">
13
+ <CSpinner className="bazinga" color="warning" as="h3" size="sm" variant="grow">
14
14
  Test
15
15
  </CSpinner>,
16
16
  )
@@ -6,17 +6,19 @@ import { CCloseButton, CCloseButtonProps } from '../close-button/CCloseButton'
6
6
 
7
7
  import { CToastContext } from './CToast'
8
8
 
9
+ import { PolymorphicRefForwardingComponent } from '../../helpers'
10
+
9
11
  type CombineButtonProps = CCloseButtonProps & CButtonProps
10
12
 
11
- export interface CToastCloseProps extends CombineButtonProps {
13
+ export interface CToastCloseProps extends Omit<CombineButtonProps, 'as'> {
12
14
  /**
13
15
  * Component used for the root node. Either a string to use a HTML element or a component.
14
16
  */
15
- component?: string | ElementType
17
+ as?: string | ElementType
16
18
  }
17
19
 
18
- export const CToastClose = forwardRef<HTMLButtonElement, CToastCloseProps>(
19
- ({ children, component: Component, ...rest }, ref) => {
20
+ export const CToastClose: PolymorphicRefForwardingComponent<'button', CToastCloseProps> =
21
+ forwardRef<HTMLButtonElement, CToastCloseProps>(({ children, as: Component, ...rest }, ref) => {
20
22
  const { setVisible } = useContext(CToastContext)
21
23
  return Component ? (
22
24
  <Component onClick={() => setVisible(false)} {...rest} ref={ref}>
@@ -25,12 +27,11 @@ export const CToastClose = forwardRef<HTMLButtonElement, CToastCloseProps>(
25
27
  ) : (
26
28
  <CCloseButton onClick={() => setVisible(false)} {...rest} ref={ref} />
27
29
  )
28
- },
29
- )
30
+ })
30
31
 
31
32
  CToastClose.propTypes = {
32
33
  ...CCloseButton.propTypes,
33
- component: PropTypes.elementType,
34
+ as: PropTypes.elementType,
34
35
  }
35
36
 
36
37
  CToastClose.displayName = 'CToastClose'
@@ -57,7 +57,7 @@ export const CToaster = forwardRef<HTMLDivElement, CToasterProps>(
57
57
  {toasts.length > 0 || children ? (
58
58
  <div
59
59
  className={classNames(
60
- 'toaster toast-container p-3',
60
+ 'toaster toast-container',
61
61
  {
62
62
  'position-fixed': placement,
63
63
  'top-0': placement && placement.includes('top'),
@@ -3,7 +3,7 @@
3
3
  exports[`CToaster customize 1`] = `
4
4
  <div>
5
5
  <div
6
- class="toaster toast-container p-3 bazinga"
6
+ class="toaster toast-container bazinga"
7
7
  />
8
8
  <button
9
9
  class="btn btn-primary"
@@ -17,7 +17,7 @@ exports[`CToaster customize 1`] = `
17
17
  exports[`loads and displays CToaster component 1`] = `
18
18
  <div>
19
19
  <div
20
- class="toaster toast-container p-3"
20
+ class="toaster toast-container"
21
21
  >
22
22
  Test
23
23
  </div>
@@ -90,9 +90,10 @@ export const CTooltip = forwardRef<HTMLDivElement, CTooltipProps>(
90
90
  },
91
91
  ref,
92
92
  ) => {
93
- const tooltipRef = useRef(null)
93
+ const tooltipRef = useRef<HTMLDivElement>(null)
94
94
  const togglerRef = useRef(null)
95
95
  const forkedRef = useForkedRef(ref, tooltipRef)
96
+ const uID = useRef(`tooltip${Math.floor(Math.random() * 1_000_000)}`)
96
97
 
97
98
  const { initPopper, destroyPopper } = usePopper()
98
99
  const [_visible, setVisible] = useState(visible)
@@ -127,16 +128,6 @@ export const CTooltip = forwardRef<HTMLDivElement, CTooltipProps>(
127
128
  setVisible(visible)
128
129
  }, [visible])
129
130
 
130
- useEffect(() => {
131
- if (_visible && togglerRef.current && tooltipRef.current) {
132
- initPopper(togglerRef.current, tooltipRef.current, popperConfig)
133
- }
134
-
135
- return () => {
136
- destroyPopper()
137
- }
138
- }, [_visible])
139
-
140
131
  const toggleVisible = (visible: boolean) => {
141
132
  if (visible) {
142
133
  setTimeout(() => setVisible(true), _delay.show)
@@ -149,6 +140,9 @@ export const CTooltip = forwardRef<HTMLDivElement, CTooltipProps>(
149
140
  return (
150
141
  <>
151
142
  {React.cloneElement(children as React.ReactElement<any>, {
143
+ ...(_visible && {
144
+ 'aria-describedby': uID.current,
145
+ }),
152
146
  ref: togglerRef,
153
147
  ...((trigger === 'click' || trigger.includes('click')) && {
154
148
  onClick: () => toggleVisible(!_visible),
@@ -167,8 +161,22 @@ export const CTooltip = forwardRef<HTMLDivElement, CTooltipProps>(
167
161
  in={_visible}
168
162
  mountOnEnter
169
163
  nodeRef={tooltipRef}
170
- onEnter={onShow}
164
+ onEnter={() => {
165
+ if (togglerRef.current && tooltipRef.current) {
166
+ initPopper(togglerRef.current, tooltipRef.current, popperConfig)
167
+ }
168
+
169
+ onShow
170
+ }}
171
+ onEntering={() => {
172
+ if (togglerRef.current && tooltipRef.current) {
173
+ tooltipRef.current.style.display = 'initial'
174
+ }
175
+ }}
171
176
  onExit={onHide}
177
+ onExited={() => {
178
+ destroyPopper()
179
+ }}
172
180
  timeout={{
173
181
  enter: 0,
174
182
  exit: tooltipRef.current
@@ -188,8 +196,12 @@ export const CTooltip = forwardRef<HTMLDivElement, CTooltipProps>(
188
196
  },
189
197
  className,
190
198
  )}
199
+ id={uID.current}
191
200
  ref={forkedRef}
192
201
  role="tooltip"
202
+ style={{
203
+ display: 'none',
204
+ }}
193
205
  {...rest}
194
206
  >
195
207
  <div className="tooltip-arrow"></div>
@@ -1,7 +1,6 @@
1
1
  import * as React from 'react'
2
- import ReactDOM from 'react-dom'
3
2
  import { act } from 'react-dom/test-utils'
4
- import { fireEvent } from '@testing-library/react'
3
+ import { fireEvent, render } from '@testing-library/react'
5
4
  import '@testing-library/jest-dom'
6
5
  import { CTooltip, CLink } from '../../../index'
7
6
 
@@ -18,24 +17,20 @@ afterEach(() => {
18
17
  })
19
18
 
20
19
  test('loads and displays CTooltip component', async () => {
21
- ReactDOM.render(
20
+ const { container } = render(
22
21
  <CTooltip content="content">
23
22
  <CLink>Test</CLink>
24
23
  </CTooltip>,
25
- container,
26
24
  )
27
25
  expect(container).toMatchSnapshot()
28
26
  })
29
27
 
30
28
  test('CTooltip customize', async () => {
31
- act(() => {
32
- ReactDOM.render(
33
- <CTooltip trigger="hover" placement="right" content="content">
34
- <CLink className="link">Test</CLink>
35
- </CTooltip>,
36
- container,
37
- )
38
- })
29
+ const { container } = render(
30
+ <CTooltip trigger="hover" placement="right" content="content">
31
+ <CLink className="link">Test</CLink>
32
+ </CTooltip>,
33
+ )
39
34
  const link = document.querySelector('.link')
40
35
  act(() => {
41
36
  if (link !== null) {
@@ -40,10 +40,7 @@ export const CWidgetStatsA = forwardRef<HTMLDivElement, CWidgetStatsAProps>(
40
40
  ({ action, chart, className, color, title, value, ...rest }, ref) => {
41
41
  return (
42
42
  <CCard
43
- className={classNames(
44
- { [`bg-${color}`]: color, 'text-white': color },
45
- className,
46
- )}
43
+ className={classNames({ [`bg-${color}`]: color, 'text-white': color }, className)}
47
44
  {...rest}
48
45
  ref={ref}
49
46
  >
@@ -6,6 +6,7 @@ import { CProgress, CProgressProps } from '../progress/CProgress'
6
6
 
7
7
  import { colorPropType } from '../../props'
8
8
  import type { Colors } from '../../types'
9
+ import classNames from 'classnames'
9
10
 
10
11
  export interface CWidgetStatsCProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
11
12
  /**
@@ -53,7 +54,16 @@ export const CWidgetStatsC = forwardRef<HTMLDivElement, CWidgetStatsCProps>(
53
54
  ref={ref}
54
55
  >
55
56
  <CCardBody>
56
- {icon && <div className="text-end mb-4">{icon}</div>}
57
+ {icon && (
58
+ <div
59
+ className={classNames(
60
+ 'text-end mb-4',
61
+ inverse ? 'text-white text-opacity-75' : 'text-body-secondary',
62
+ )}
63
+ >
64
+ {icon}
65
+ </div>
66
+ )}
57
67
  {value && <div className="fs-4 fw-semibold">{value}</div>}
58
68
  {title && (
59
69
  <div className={inverse ? 'text-white text-opacity-75' : 'text-body-secondary'}>
@@ -41,9 +41,7 @@ test('CWidgetStatsD customize', async () => {
41
41
  expect(container.firstChild.lastChild.firstChild.firstChild).toHaveClass('fw-semibold')
42
42
  expect(container.firstChild.lastChild.firstChild.firstChild).toHaveTextContent('89K')
43
43
  expect(container.firstChild.lastChild.firstChild.lastChild).toHaveClass('text-uppercase')
44
- expect(container.firstChild.lastChild.firstChild.lastChild).toHaveClass(
45
- 'text-body-secondary',
46
- )
44
+ expect(container.firstChild.lastChild.firstChild.lastChild).toHaveClass('text-body-secondary')
47
45
  expect(container.firstChild.lastChild.firstChild.lastChild).toHaveClass('small')
48
46
  expect(container.firstChild.lastChild.firstChild.lastChild).toHaveTextContent('friends')
49
47
  }
@@ -0,0 +1,3 @@
1
+ import { PolymorphicRefForwardingComponent } from './polymorphicComponent'
2
+
3
+ export { PolymorphicRefForwardingComponent }
@@ -0,0 +1,21 @@
1
+ import { ComponentPropsWithRef, ElementType, PropsWithChildren, ReactNode } from 'react'
2
+
3
+ export type Omit<T, U> = Pick<T, Exclude<keyof T, keyof U>>
4
+
5
+ export type ReplaceProps<Inner extends ElementType, P> = Omit<ComponentPropsWithRef<Inner>, P> & P
6
+
7
+ export interface AsProp<As extends ElementType = ElementType> {
8
+ as?: As
9
+ }
10
+
11
+ export interface Props<As extends ElementType = ElementType> extends AsProp<As> {}
12
+
13
+ export interface PolymorphicRefForwardingComponent<TInitial extends ElementType, P = unknown> {
14
+ <As extends ElementType = TInitial>(
15
+ props: PropsWithChildren<ReplaceProps<As, Props<As> & P>>,
16
+ context?: any, // eslint-disable-line @typescript-eslint/no-explicit-any
17
+ ): ReactNode | null
18
+ propTypes?: any // eslint-disable-line @typescript-eslint/no-explicit-any
19
+ defaultProps?: Partial<P>
20
+ displayName?: string
21
+ }
@@ -21,4 +21,4 @@ const getTransitionDurationFromElement = (element: HTMLElement) => {
21
21
  return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * 1000
22
22
  }
23
23
 
24
- export default getTransitionDurationFromElement
24
+ export default getTransitionDurationFromElement