@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
@@ -2,26 +2,28 @@ import React, { ElementType, forwardRef, ImgHTMLAttributes } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import classNames from 'classnames'
4
4
 
5
+ import { PolymorphicRefForwardingComponent } from '../../helpers'
6
+
5
7
  export interface CCardImageProps
6
8
  extends ImgHTMLAttributes<HTMLImageElement | HTMLOrSVGElement | HTMLOrSVGImageElement> {
7
9
  /**
8
- * A string of all className you want applied to the base component.
10
+ * Component used for the root node. Either a string to use a HTML element or a component.
9
11
  */
10
- className?: string
12
+ as?: ElementType
11
13
  /**
12
- * Component used for the root node. Either a string to use a HTML element or a component.
14
+ * A string of all className you want applied to the base component.
13
15
  */
14
- component?: string | ElementType
16
+ className?: string
15
17
  /**
16
18
  * Optionally orientate the image to the top, bottom, or make it overlaid across the card.
17
19
  */
18
20
  orientation?: 'top' | 'bottom'
19
21
  }
20
22
 
21
- export const CCardImage = forwardRef<
23
+ export const CCardImage: PolymorphicRefForwardingComponent<'img', CCardImageProps> = forwardRef<
22
24
  HTMLImageElement | HTMLOrSVGElement | HTMLOrSVGImageElement,
23
25
  CCardImageProps
24
- >(({ children, className, component: Component = 'img', orientation, ...rest }, ref) => {
26
+ >(({ children, as: Component = 'img', className, orientation, ...rest }, ref) => {
25
27
  return (
26
28
  <Component
27
29
  className={classNames(orientation ? `card-img-${orientation}` : 'card-img', className)}
@@ -34,9 +36,9 @@ export const CCardImage = forwardRef<
34
36
  })
35
37
 
36
38
  CCardImage.propTypes = {
39
+ as: PropTypes.elementType,
37
40
  children: PropTypes.node,
38
41
  className: PropTypes.string,
39
- component: PropTypes.elementType,
40
42
  orientation: PropTypes.oneOf(['top', 'bottom']),
41
43
  }
42
44
 
@@ -2,30 +2,34 @@ 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'
6
+
5
7
  export interface CCardSubtitleProps extends HTMLAttributes<HTMLHeadingElement> {
6
8
  /**
7
- * A string of all className you want applied to the component.
9
+ * Component used for the root node. Either a string to use a HTML element or a component.
8
10
  */
9
- className?: string
11
+ as?: ElementType
10
12
  /**
11
- * Component used for the root node. Either a string to use a HTML element or a component.
13
+ * A string of all className you want applied to the component.
12
14
  */
13
- component?: string | ElementType
15
+ className?: string
14
16
  }
15
- export const CCardSubtitle = forwardRef<HTMLHeadingElement, CCardSubtitleProps>(
16
- ({ children, component: Component = 'h6', className, ...rest }, ref) => {
17
- return (
18
- <Component className={classNames('card-subtitle', className)} {...rest} ref={ref}>
19
- {children}
20
- </Component>
21
- )
22
- },
23
- )
17
+
18
+ export const CCardSubtitle: PolymorphicRefForwardingComponent<'h6', CCardSubtitleProps> =
19
+ forwardRef<HTMLHeadingElement, CCardSubtitleProps>(
20
+ ({ children, as: Component = 'h6', className, ...rest }, ref) => {
21
+ return (
22
+ <Component className={classNames('card-subtitle', className)} {...rest} ref={ref}>
23
+ {children}
24
+ </Component>
25
+ )
26
+ },
27
+ )
24
28
 
25
29
  CCardSubtitle.propTypes = {
30
+ as: PropTypes.elementType,
26
31
  children: PropTypes.node,
27
32
  className: PropTypes.string,
28
- component: PropTypes.elementType,
29
33
  }
30
34
 
31
35
  CCardSubtitle.displayName = 'CCardSubtitle'
@@ -2,31 +2,34 @@ 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'
6
+
5
7
  export interface CCardTextProps extends HTMLAttributes<HTMLParagraphElement> {
6
8
  /**
7
- * A string of all className you want applied to the component.
9
+ * Component used for the root node. Either a string to use a HTML element or a component.
8
10
  */
9
- className?: string
11
+ as?: ElementType
10
12
  /**
11
- * Component used for the root node. Either a string to use a HTML element or a component.
13
+ * A string of all className you want applied to the component.
12
14
  */
13
- component?: string | ElementType
15
+ className?: string
14
16
  }
15
17
 
16
- export const CCardText = forwardRef<HTMLParagraphElement, CCardTextProps>(
17
- ({ children, component: Component = 'p', className, ...rest }, ref) => {
18
- return (
19
- <Component className={classNames('card-text', className)} {...rest} ref={ref}>
20
- {children}
21
- </Component>
22
- )
23
- },
24
- )
18
+ export const CCardText: PolymorphicRefForwardingComponent<'p', CCardTextProps> = forwardRef<
19
+ HTMLParagraphElement,
20
+ CCardTextProps
21
+ >(({ children, as: Component = 'p', className, ...rest }, ref) => {
22
+ return (
23
+ <Component className={classNames('card-text', className)} {...rest} ref={ref}>
24
+ {children}
25
+ </Component>
26
+ )
27
+ })
25
28
 
26
29
  CCardText.propTypes = {
30
+ as: PropTypes.elementType,
27
31
  children: PropTypes.node,
28
32
  className: PropTypes.string,
29
- component: PropTypes.elementType,
30
33
  }
31
34
 
32
35
  CCardText.displayName = 'CCardText'
@@ -2,31 +2,34 @@ 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'
6
+
5
7
  export interface CCardTitleProps extends HTMLAttributes<HTMLHeadingElement> {
6
8
  /**
7
- * A string of all className you want applied to the component.
9
+ * Component used for the root node. Either a string to use a HTML element or a component.
8
10
  */
9
- className?: string
11
+ as?: ElementType
10
12
  /**
11
- * Component used for the root node. Either a string to use a HTML element or a component.
13
+ * A string of all className you want applied to the component.
12
14
  */
13
- component?: string | ElementType
15
+ className?: string
14
16
  }
15
17
 
16
- export const CCardTitle = forwardRef<HTMLHeadingElement, CCardTitleProps>(
17
- ({ children, component: Component = 'h5', className, ...rest }, ref) => {
18
- return (
19
- <Component className={classNames('card-title', className)} {...rest} ref={ref}>
20
- {children}
21
- </Component>
22
- )
23
- },
24
- )
18
+ export const CCardTitle: PolymorphicRefForwardingComponent<'h5', CCardTitleProps> = forwardRef<
19
+ HTMLHeadingElement,
20
+ CCardTitleProps
21
+ >(({ children, as: Component = 'h5', className, ...rest }, ref) => {
22
+ return (
23
+ <Component className={classNames('card-title', className)} {...rest} ref={ref}>
24
+ {children}
25
+ </Component>
26
+ )
27
+ })
25
28
 
26
29
  CCardTitle.propTypes = {
30
+ as: PropTypes.elementType,
27
31
  children: PropTypes.node,
28
32
  className: PropTypes.string,
29
- component: PropTypes.elementType,
30
33
  }
31
34
 
32
35
  CCardTitle.displayName = 'CCardTitle'
@@ -30,7 +30,7 @@ test('CCardGroup full example', async () => {
30
30
  const { container } = render(
31
31
  <CCardGroup className="bazinga">
32
32
  <CCard>
33
- <CCardImage component="svg">Image</CCardImage>
33
+ <CCardImage as="svg">Image</CCardImage>
34
34
  <CCardHeader>Header</CCardHeader>
35
35
  <CCardBody>
36
36
  <CCardTitle>Title</CCardTitle>
@@ -10,7 +10,7 @@ test('loads and displays CCardHeader component', async () => {
10
10
 
11
11
  test('CCardHeader customize', async () => {
12
12
  const { container } = render(
13
- <CCardHeader className="bazinga" component="h3">
13
+ <CCardHeader className="bazinga" as="h3">
14
14
  Test
15
15
  </CCardHeader>,
16
16
  )
@@ -9,9 +9,7 @@ test('loads and displays CCardImage component', async () => {
9
9
  })
10
10
 
11
11
  test('CCardImage customize', async () => {
12
- const { container } = render(
13
- <CCardImage className="bazinga" component="div" orientation="bottom" />,
14
- )
12
+ const { container } = render(<CCardImage className="bazinga" as="div" orientation="bottom" />)
15
13
  expect(container).toMatchSnapshot()
16
14
  expect(container.firstChild).toHaveClass('bazinga')
17
15
  expect(container.firstChild).toHaveClass('card-img-bottom')
@@ -10,7 +10,7 @@ test('loads and displays CCardSubtitle component', async () => {
10
10
 
11
11
  test('CCardSubtitle customize', async () => {
12
12
  const { container } = render(
13
- <CCardSubtitle className="bazinga" component="h3">
13
+ <CCardSubtitle className="bazinga" as="h3">
14
14
  Test
15
15
  </CCardSubtitle>,
16
16
  )
@@ -10,7 +10,7 @@ test('loads and displays CCardText component', async () => {
10
10
 
11
11
  test('CCardText customize', async () => {
12
12
  const { container } = render(
13
- <CCardText className="bazinga" component="h3">
13
+ <CCardText className="bazinga" as="h3">
14
14
  Test
15
15
  </CCardText>,
16
16
  )
@@ -10,7 +10,7 @@ test('loads and displays CCardTitle component', async () => {
10
10
 
11
11
  test('CCardTitle customize', async () => {
12
12
  const { container } = render(
13
- <CCardTitle className="bazinga" component="h3">
13
+ <CCardTitle className="bazinga" as="h3">
14
14
  Test
15
15
  </CCardTitle>,
16
16
  )
@@ -253,7 +253,7 @@ export const CCarousel = forwardRef<HTMLDivElement, CCarouselProps>(
253
253
  !animating && handleIndicatorClick(index)
254
254
  }}
255
255
  className={classNames({
256
- active: active === index
256
+ active: active === index,
257
257
  })}
258
258
  data-coreui-target=""
259
259
  {...(active === index && { 'aria-current': true })}
@@ -17,7 +17,7 @@ export interface CCloseButtonProps extends HTMLAttributes<HTMLButtonElement> {
17
17
  disabled?: boolean
18
18
  /**
19
19
  * Change the default color to white.
20
- *
20
+ *
21
21
  * @deprecated 5.0.0
22
22
  */
23
23
  white?: boolean
@@ -17,7 +17,7 @@ export interface CConditionalPortalProps {
17
17
  children: ReactNode
18
18
  /**
19
19
  * An HTML element or function that returns a single element, with `document.body` as the default.
20
- *
20
+ *
21
21
  * @since v4.11.0
22
22
  */
23
23
  container?: Element | (() => Element | null) | null
@@ -11,6 +11,7 @@ import React, {
11
11
  import PropTypes from 'prop-types'
12
12
  import classNames from 'classnames'
13
13
 
14
+ import { PolymorphicRefForwardingComponent } from '../../helpers'
14
15
  import { useForkedRef, usePopper } from '../../hooks'
15
16
  import { placementPropType } from '../../props'
16
17
  import type { Placements } from '../../types'
@@ -26,6 +27,10 @@ export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIEl
26
27
  * @type 'start' | 'end' | { xs: 'start' | 'end' } | { sm: 'start' | 'end' } | { md: 'start' | 'end' } | { lg: 'start' | 'end' } | { xl: 'start' | 'end'} | { xxl: 'start' | 'end'}
27
28
  */
28
29
  alignment?: Alignments
30
+ /**
31
+ * Component used for the root node. Either a string to use a HTML element or a component.
32
+ */
33
+ as?: ElementType
29
34
  /**
30
35
  * Configure the auto close behavior of the dropdown:
31
36
  * - `true` - the dropdown will be closed by clicking outside or inside the dropdown menu.
@@ -38,10 +43,6 @@ export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIEl
38
43
  * A string of all className you want applied to the base component.
39
44
  */
40
45
  className?: string
41
- /**
42
- * Component used for the root node. Either a string to use a HTML element or a component.
43
- */
44
- component?: string | ElementType
45
46
  /**
46
47
  * Appends the react dropdown menu to a specific element. You can pass an HTML element or function that returns a single element. By default `document.body`.
47
48
  *
@@ -106,11 +107,15 @@ interface ContextProps extends CDropdownProps {
106
107
 
107
108
  export const CDropdownContext = createContext({} as ContextProps)
108
109
 
109
- export const CDropdown = forwardRef<HTMLDivElement | HTMLLIElement, CDropdownProps>(
110
+ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps> = forwardRef<
111
+ HTMLDivElement | HTMLLIElement,
112
+ CDropdownProps
113
+ >(
110
114
  (
111
115
  {
112
116
  children,
113
117
  alignment,
118
+ as = 'div',
114
119
  autoClose = true,
115
120
  className,
116
121
  container,
@@ -123,7 +128,6 @@ export const CDropdown = forwardRef<HTMLDivElement | HTMLLIElement, CDropdownPro
123
128
  popper = true,
124
129
  portal = false,
125
130
  variant = 'btn-group',
126
- component = 'div',
127
131
  visible = false,
128
132
  ...rest
129
133
  },
@@ -137,7 +141,7 @@ export const CDropdown = forwardRef<HTMLDivElement | HTMLLIElement, CDropdownPro
137
141
  const [_visible, setVisible] = useState(visible)
138
142
  const { initPopper, destroyPopper } = usePopper()
139
143
 
140
- const Component = variant === 'nav-item' ? 'li' : component
144
+ const Component = variant === 'nav-item' ? 'li' : as
141
145
 
142
146
  // Disable popper if responsive aligment is set.
143
147
  if (typeof alignment === 'object') {
@@ -197,10 +201,16 @@ export const CDropdown = forwardRef<HTMLDivElement | HTMLLIElement, CDropdownPro
197
201
  }, [_visible])
198
202
 
199
203
  const handleKeydown = (event: KeyboardEvent) => {
200
- if (_visible && dropdownMenuRef.current && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {
204
+ if (
205
+ _visible &&
206
+ dropdownMenuRef.current &&
207
+ (event.key === 'ArrowDown' || event.key === 'ArrowUp')
208
+ ) {
201
209
  event.preventDefault()
202
210
  const target = event.target as HTMLElement
203
- const items: HTMLElement[] = Array.from(dropdownMenuRef.current.querySelectorAll('.dropdown-item:not(.disabled):not(:disabled)'))
211
+ const items: HTMLElement[] = Array.from(
212
+ dropdownMenuRef.current.querySelectorAll('.dropdown-item:not(.disabled):not(:disabled)'),
213
+ )
204
214
  getNextActiveElement(items, target, event.key === 'ArrowDown', true).focus()
205
215
  }
206
216
  }
@@ -273,13 +283,13 @@ CDropdown.propTypes = {
273
283
  PropTypes.shape({ xl: alignmentDirection.isRequired }),
274
284
  PropTypes.shape({ xxl: alignmentDirection.isRequired }),
275
285
  ]),
286
+ as: PropTypes.elementType,
276
287
  autoClose: PropTypes.oneOfType([
277
288
  PropTypes.bool,
278
289
  PropTypes.oneOf<'inside' | 'outside'>(['inside', 'outside']),
279
290
  ]),
280
291
  children: PropTypes.node,
281
292
  className: PropTypes.string,
282
- component: PropTypes.elementType,
283
293
  dark: PropTypes.bool,
284
294
  direction: PropTypes.oneOf(['center', 'dropup', 'dropup-center', 'dropend', 'dropstart']),
285
295
  offset: PropTypes.any, // TODO: find good proptype
@@ -2,31 +2,34 @@ 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'
6
+
5
7
  export interface CDropdownHeaderProps extends HTMLAttributes<HTMLHeadingElement> {
6
8
  /**
7
- * A string of all className you want applied to the component.
9
+ * Component used for the root node. Either a string to use a HTML element or a component.
8
10
  */
9
- className?: string
11
+ as?: ElementType
10
12
  /**
11
- * Component used for the root node. Either a string to use a HTML element or a component.
13
+ * A string of all className you want applied to the component.
12
14
  */
13
- component?: string | ElementType
15
+ className?: string
14
16
  }
15
17
 
16
- export const CDropdownHeader = forwardRef<HTMLHeadingElement, CDropdownHeaderProps>(
17
- ({ children, className, component: Component = 'h6', ...rest }, ref) => {
18
- return (
19
- <Component className={classNames('dropdown-header', className)} {...rest} ref={ref}>
20
- {children}
21
- </Component>
22
- )
23
- },
24
- )
18
+ export const CDropdownHeader: PolymorphicRefForwardingComponent<'h6', CDropdownHeaderProps> =
19
+ forwardRef<HTMLHeadingElement, CDropdownHeaderProps>(
20
+ ({ children, as: Component = 'h6', className, ...rest }, ref) => {
21
+ return (
22
+ <Component className={classNames('dropdown-header', className)} {...rest} ref={ref}>
23
+ {children}
24
+ </Component>
25
+ )
26
+ },
27
+ )
25
28
 
26
29
  CDropdownHeader.propTypes = {
30
+ as: PropTypes.elementType,
27
31
  children: PropTypes.node,
28
32
  className: PropTypes.string,
29
- component: PropTypes.elementType,
30
33
  }
31
34
 
32
35
  CDropdownHeader.displayName = 'CDropdownHeader'
@@ -1,39 +1,33 @@
1
- import React, { ElementType, forwardRef } from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import classNames from 'classnames'
4
4
 
5
5
  import { CLink, CLinkProps } from '../link/CLink'
6
6
 
7
+ import { PolymorphicRefForwardingComponent } from '../../helpers'
8
+
7
9
  export interface CDropdownItemProps extends CLinkProps {
8
10
  /**
9
11
  * A string of all className you want applied to the component.
10
12
  */
11
13
  className?: string
12
- /**
13
- * Component used for the root node. Either a string to use a HTML element or a component.
14
- */
15
- component?: string | ElementType
16
14
  }
17
15
 
18
- export const CDropdownItem = forwardRef<HTMLButtonElement | HTMLAnchorElement, CDropdownItemProps>(
19
- ({ children, className, component = 'a', ...rest }, ref) => {
20
- return (
21
- <CLink
22
- className={classNames('dropdown-item', className)}
23
- component={component}
24
- {...rest}
25
- ref={ref}
26
- >
27
- {children}
28
- </CLink>
29
- )
30
- },
31
- )
16
+ export const CDropdownItem: PolymorphicRefForwardingComponent<'a', CDropdownItemProps> = forwardRef<
17
+ HTMLButtonElement | HTMLAnchorElement,
18
+ CDropdownItemProps
19
+ >(({ children, as = 'a', className, ...rest }, ref) => {
20
+ return (
21
+ <CLink className={classNames('dropdown-item', className)} as={as} {...rest} ref={ref}>
22
+ {children}
23
+ </CLink>
24
+ )
25
+ })
32
26
 
33
27
  CDropdownItem.propTypes = {
28
+ as: PropTypes.elementType,
34
29
  children: PropTypes.node,
35
30
  className: PropTypes.string,
36
- component: PropTypes.elementType,
37
31
  }
38
32
 
39
33
  CDropdownItem.displayName = 'CDropdownItem'
@@ -2,19 +2,24 @@ 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'
6
+
5
7
  export interface CDropdownItemPlainProps extends HTMLAttributes<HTMLSpanElement> {
6
8
  /**
7
- * A string of all className you want applied to the component.
9
+ * Component used for the root node. Either a string to use a HTML element or a component.
8
10
  */
9
- className?: string
11
+ as?: ElementType
10
12
  /**
11
- * Component used for the root node. Either a string to use a HTML element or a component.
13
+ * A string of all className you want applied to the component.
12
14
  */
13
- component?: string | ElementType
15
+ className?: string
14
16
  }
15
17
 
16
- export const CDropdownItemPlain = forwardRef<HTMLSpanElement, CDropdownItemPlainProps>(
17
- ({ children, className, component: Component = 'span', ...rest }, ref) => {
18
+ export const CDropdownItemPlain: PolymorphicRefForwardingComponent<
19
+ 'span',
20
+ CDropdownItemPlainProps
21
+ > = forwardRef<HTMLSpanElement, CDropdownItemPlainProps>(
22
+ ({ children, as: Component = 'span', className, ...rest }, ref) => {
18
23
  return (
19
24
  <Component className={classNames('dropdown-item-text', className)} {...rest} ref={ref}>
20
25
  {children}
@@ -24,9 +29,9 @@ export const CDropdownItemPlain = forwardRef<HTMLSpanElement, CDropdownItemPlain
24
29
  )
25
30
 
26
31
  CDropdownItemPlain.propTypes = {
32
+ as: PropTypes.elementType,
27
33
  children: PropTypes.node,
28
34
  className: PropTypes.string,
29
- component: PropTypes.elementType,
30
35
  }
31
36
 
32
37
  CDropdownItemPlain.displayName = 'CDropdownItemPlain'
@@ -5,65 +5,66 @@ import classNames from 'classnames'
5
5
  import { CDropdownContext } from './CDropdown'
6
6
  import { CConditionalPortal } from '../conditional-portal'
7
7
 
8
+ import { PolymorphicRefForwardingComponent } from '../../helpers'
8
9
  import { useForkedRef } from '../../hooks'
9
10
 
10
11
  import { getAlignmentClassNames } from './utils'
11
12
 
12
-
13
13
  export interface CDropdownMenuProps extends HTMLAttributes<HTMLDivElement | HTMLUListElement> {
14
14
  /**
15
- * A string of all className you want applied to the base component.
15
+ * Component used for the root node. Either a string to use a HTML element or a component.
16
16
  */
17
- className?: string
17
+ as?: ElementType
18
18
  /**
19
- * Component used for the root node. Either a string to use a HTML element or a component.
19
+ * A string of all className you want applied to the base component.
20
20
  */
21
- component?: string | ElementType
21
+ className?: string
22
22
  }
23
23
 
24
- export const CDropdownMenu = forwardRef<HTMLDivElement | HTMLUListElement, CDropdownMenuProps>(
25
- ({ children, className, component: Component = 'ul', ...rest }, ref) => {
26
- const { alignment, container, dark, dropdownMenuRef, popper, portal, visible } =
27
- useContext(CDropdownContext)
24
+ export const CDropdownMenu: PolymorphicRefForwardingComponent<'ul', CDropdownMenuProps> =
25
+ forwardRef<HTMLDivElement | HTMLUListElement, CDropdownMenuProps>(
26
+ ({ children, as: Component = 'ul', className, ...rest }, ref) => {
27
+ const { alignment, container, dark, dropdownMenuRef, popper, portal, visible } =
28
+ useContext(CDropdownContext)
28
29
 
29
- const forkedRef = useForkedRef(ref, dropdownMenuRef)
30
+ const forkedRef = useForkedRef(ref, dropdownMenuRef)
30
31
 
31
- return (
32
- <CConditionalPortal container={container} portal={portal ?? false}>
33
- <Component
34
- className={classNames(
35
- 'dropdown-menu',
36
- {
37
- show: visible,
38
- },
39
- alignment && getAlignmentClassNames(alignment),
40
- className,
41
- )}
42
- ref={forkedRef}
43
- role="menu"
44
- aria-hidden={!visible}
45
- {...(!popper && { 'data-coreui-popper': 'static' })}
46
- {...(dark && { 'data-coreui-theme': 'dark' })}
47
- {...rest}
48
- >
49
- {Component === 'ul'
50
- ? React.Children.map(children, (child, index) => {
51
- if (React.isValidElement(child)) {
52
- return <li key={index}>{React.cloneElement(child)}</li>
53
- }
54
- return
55
- })
56
- : children}
57
- </Component>
58
- </CConditionalPortal>
59
- )
60
- },
61
- )
32
+ return (
33
+ <CConditionalPortal container={container} portal={portal ?? false}>
34
+ <Component
35
+ className={classNames(
36
+ 'dropdown-menu',
37
+ {
38
+ show: visible,
39
+ },
40
+ alignment && getAlignmentClassNames(alignment),
41
+ className,
42
+ )}
43
+ ref={forkedRef}
44
+ role="menu"
45
+ aria-hidden={!visible}
46
+ {...(!popper && { 'data-coreui-popper': 'static' })}
47
+ {...(dark && { 'data-coreui-theme': 'dark' })}
48
+ {...rest}
49
+ >
50
+ {Component === 'ul'
51
+ ? React.Children.map(children, (child, index) => {
52
+ if (React.isValidElement(child)) {
53
+ return <li key={index}>{React.cloneElement(child)}</li>
54
+ }
55
+ return
56
+ })
57
+ : children}
58
+ </Component>
59
+ </CConditionalPortal>
60
+ )
61
+ },
62
+ )
62
63
 
63
64
  CDropdownMenu.propTypes = {
65
+ as: PropTypes.elementType,
64
66
  children: PropTypes.node,
65
67
  className: PropTypes.string,
66
- component: PropTypes.elementType,
67
68
  }
68
69
 
69
70
  CDropdownMenu.displayName = 'CDropdownMenu'