@coreui/react 5.7.1 → 5.8.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 (833) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/accordion/CAccordion.js +5 -5
  3. package/dist/cjs/components/accordion/CAccordion.js.map +1 -1
  4. package/dist/cjs/components/accordion/CAccordionBody.js +4 -4
  5. package/dist/cjs/components/accordion/CAccordionBody.js.map +1 -1
  6. package/dist/cjs/components/accordion/CAccordionButton.js +4 -4
  7. package/dist/cjs/components/accordion/CAccordionButton.js.map +1 -1
  8. package/dist/cjs/components/accordion/CAccordionContext.js +1 -1
  9. package/dist/cjs/components/accordion/CAccordionContext.js.map +1 -1
  10. package/dist/cjs/components/accordion/CAccordionHeader.js +3 -3
  11. package/dist/cjs/components/accordion/CAccordionHeader.js.map +1 -1
  12. package/dist/cjs/components/accordion/CAccordionItem.js +11 -11
  13. package/dist/cjs/components/accordion/CAccordionItem.js.map +1 -1
  14. package/dist/cjs/components/accordion/CAccordionItemContext.js +1 -1
  15. package/dist/cjs/components/accordion/CAccordionItemContext.js.map +1 -1
  16. package/dist/cjs/components/alert/CAlert.js +8 -8
  17. package/dist/cjs/components/alert/CAlert.js.map +1 -1
  18. package/dist/cjs/components/alert/CAlertHeading.js +3 -3
  19. package/dist/cjs/components/alert/CAlertHeading.js.map +1 -1
  20. package/dist/cjs/components/alert/CAlertLink.js +3 -3
  21. package/dist/cjs/components/alert/CAlertLink.js.map +1 -1
  22. package/dist/cjs/components/avatar/CAvatar.js +8 -9
  23. package/dist/cjs/components/avatar/CAvatar.js.map +1 -1
  24. package/dist/cjs/components/backdrop/CBackdrop.js +6 -6
  25. package/dist/cjs/components/backdrop/CBackdrop.js.map +1 -1
  26. package/dist/cjs/components/badge/CBadge.js +13 -14
  27. package/dist/cjs/components/badge/CBadge.js.map +1 -1
  28. package/dist/cjs/components/breadcrumb/CBreadcrumb.js +3 -3
  29. package/dist/cjs/components/breadcrumb/CBreadcrumb.js.map +1 -1
  30. package/dist/cjs/components/breadcrumb/CBreadcrumbItem.js +3 -3
  31. package/dist/cjs/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  32. package/dist/cjs/components/button/CButton.js +8 -9
  33. package/dist/cjs/components/button/CButton.js.map +1 -1
  34. package/dist/cjs/components/button-group/CButtonGroup.js +3 -4
  35. package/dist/cjs/components/button-group/CButtonGroup.js.map +1 -1
  36. package/dist/cjs/components/button-group/CButtonToolbar.js +3 -3
  37. package/dist/cjs/components/button-group/CButtonToolbar.js.map +1 -1
  38. package/dist/cjs/components/callout/CCallout.js +5 -6
  39. package/dist/cjs/components/callout/CCallout.js.map +1 -1
  40. package/dist/cjs/components/card/CCard.js +7 -8
  41. package/dist/cjs/components/card/CCard.js.map +1 -1
  42. package/dist/cjs/components/card/CCardBody.js +3 -3
  43. package/dist/cjs/components/card/CCardBody.js.map +1 -1
  44. package/dist/cjs/components/card/CCardFooter.js +3 -3
  45. package/dist/cjs/components/card/CCardFooter.js.map +1 -1
  46. package/dist/cjs/components/card/CCardGroup.js +3 -3
  47. package/dist/cjs/components/card/CCardGroup.js.map +1 -1
  48. package/dist/cjs/components/card/CCardHeader.js +3 -3
  49. package/dist/cjs/components/card/CCardHeader.js.map +1 -1
  50. package/dist/cjs/components/card/CCardImage.js +3 -3
  51. package/dist/cjs/components/card/CCardImage.js.map +1 -1
  52. package/dist/cjs/components/card/CCardImageOverlay.js +3 -3
  53. package/dist/cjs/components/card/CCardImageOverlay.js.map +1 -1
  54. package/dist/cjs/components/card/CCardLink.js +3 -3
  55. package/dist/cjs/components/card/CCardLink.js.map +1 -1
  56. package/dist/cjs/components/card/CCardSubtitle.js +3 -3
  57. package/dist/cjs/components/card/CCardSubtitle.js.map +1 -1
  58. package/dist/cjs/components/card/CCardText.js +3 -3
  59. package/dist/cjs/components/card/CCardText.js.map +1 -1
  60. package/dist/cjs/components/card/CCardTitle.js +3 -3
  61. package/dist/cjs/components/card/CCardTitle.js.map +1 -1
  62. package/dist/cjs/components/carousel/CCarousel.js +41 -41
  63. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  64. package/dist/cjs/components/carousel/CCarouselCaption.js +3 -3
  65. package/dist/cjs/components/carousel/CCarouselCaption.js.map +1 -1
  66. package/dist/cjs/components/carousel/CCarouselContext.js +1 -1
  67. package/dist/cjs/components/carousel/CCarouselContext.js.map +1 -1
  68. package/dist/cjs/components/carousel/CCarouselItem.js +21 -21
  69. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  70. package/dist/cjs/components/close-button/CCloseButton.js +3 -3
  71. package/dist/cjs/components/close-button/CCloseButton.js.map +1 -1
  72. package/dist/cjs/components/collapse/CCollapse.js +16 -16
  73. package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
  74. package/dist/cjs/components/conditional-portal/CConditionalPortal.js +4 -5
  75. package/dist/cjs/components/conditional-portal/CConditionalPortal.js.map +1 -1
  76. package/dist/cjs/components/dropdown/CDropdown.d.ts +20 -9
  77. package/dist/cjs/components/dropdown/CDropdown.js +90 -70
  78. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  79. package/dist/cjs/components/dropdown/CDropdownContext.d.ts +1 -1
  80. package/dist/cjs/components/dropdown/CDropdownContext.js +1 -1
  81. package/dist/cjs/components/dropdown/CDropdownContext.js.map +1 -1
  82. package/dist/cjs/components/dropdown/CDropdownDivider.js +3 -3
  83. package/dist/cjs/components/dropdown/CDropdownDivider.js.map +1 -1
  84. package/dist/cjs/components/dropdown/CDropdownHeader.js +3 -3
  85. package/dist/cjs/components/dropdown/CDropdownHeader.js.map +1 -1
  86. package/dist/cjs/components/dropdown/CDropdownItem.js +3 -3
  87. package/dist/cjs/components/dropdown/CDropdownItem.js.map +1 -1
  88. package/dist/cjs/components/dropdown/CDropdownItemPlain.js +3 -3
  89. package/dist/cjs/components/dropdown/CDropdownItemPlain.js.map +1 -1
  90. package/dist/cjs/components/dropdown/CDropdownMenu.js +6 -6
  91. package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
  92. package/dist/cjs/components/dropdown/CDropdownToggle.d.ts +7 -3
  93. package/dist/cjs/components/dropdown/CDropdownToggle.js +18 -13
  94. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  95. package/dist/cjs/components/dropdown/utils.js +7 -7
  96. package/dist/cjs/components/dropdown/utils.js.map +1 -1
  97. package/dist/cjs/components/focus-trap/CFocusTrap.d.ts +59 -0
  98. package/dist/cjs/components/focus-trap/CFocusTrap.js +162 -0
  99. package/dist/cjs/components/focus-trap/CFocusTrap.js.map +1 -0
  100. package/dist/cjs/components/focus-trap/index.d.ts +2 -0
  101. package/dist/cjs/components/focus-trap/utils.d.ts +36 -0
  102. package/dist/cjs/components/focus-trap/utils.js +113 -0
  103. package/dist/cjs/components/focus-trap/utils.js.map +1 -0
  104. package/dist/cjs/components/footer/CFooter.js +3 -4
  105. package/dist/cjs/components/footer/CFooter.js.map +1 -1
  106. package/dist/cjs/components/form/CForm.js +3 -3
  107. package/dist/cjs/components/form/CForm.js.map +1 -1
  108. package/dist/cjs/components/form/CFormCheck.js +16 -19
  109. package/dist/cjs/components/form/CFormCheck.js.map +1 -1
  110. package/dist/cjs/components/form/CFormControlValidation.js +2 -4
  111. package/dist/cjs/components/form/CFormControlValidation.js.map +1 -1
  112. package/dist/cjs/components/form/CFormControlWrapper.js +3 -5
  113. package/dist/cjs/components/form/CFormControlWrapper.js.map +1 -1
  114. package/dist/cjs/components/form/CFormFeedback.js +6 -7
  115. package/dist/cjs/components/form/CFormFeedback.js.map +1 -1
  116. package/dist/cjs/components/form/CFormFloating.js +3 -3
  117. package/dist/cjs/components/form/CFormFloating.js.map +1 -1
  118. package/dist/cjs/components/form/CFormInput.js +13 -14
  119. package/dist/cjs/components/form/CFormInput.js.map +1 -1
  120. package/dist/cjs/components/form/CFormLabel.js +3 -3
  121. package/dist/cjs/components/form/CFormLabel.js.map +1 -1
  122. package/dist/cjs/components/form/CFormRange.js +3 -3
  123. package/dist/cjs/components/form/CFormRange.js.map +1 -1
  124. package/dist/cjs/components/form/CFormSelect.js +10 -11
  125. package/dist/cjs/components/form/CFormSelect.js.map +1 -1
  126. package/dist/cjs/components/form/CFormSwitch.js +10 -12
  127. package/dist/cjs/components/form/CFormSwitch.js.map +1 -1
  128. package/dist/cjs/components/form/CFormText.js +3 -3
  129. package/dist/cjs/components/form/CFormText.js.map +1 -1
  130. package/dist/cjs/components/form/CFormTextarea.js +4 -4
  131. package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
  132. package/dist/cjs/components/form/CInputGroup.js +5 -6
  133. package/dist/cjs/components/form/CInputGroup.js.map +1 -1
  134. package/dist/cjs/components/form/CInputGroupText.js +3 -3
  135. package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
  136. package/dist/cjs/components/grid/CCol.js +16 -16
  137. package/dist/cjs/components/grid/CCol.js.map +1 -1
  138. package/dist/cjs/components/grid/CContainer.js +8 -8
  139. package/dist/cjs/components/grid/CContainer.js.map +1 -1
  140. package/dist/cjs/components/grid/CRow.js +13 -13
  141. package/dist/cjs/components/grid/CRow.js.map +1 -1
  142. package/dist/cjs/components/header/CHeader.js +3 -4
  143. package/dist/cjs/components/header/CHeader.js.map +1 -1
  144. package/dist/cjs/components/header/CHeaderBrand.js +3 -3
  145. package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
  146. package/dist/cjs/components/header/CHeaderDivider.js +3 -3
  147. package/dist/cjs/components/header/CHeaderDivider.js.map +1 -1
  148. package/dist/cjs/components/header/CHeaderNav.js +3 -3
  149. package/dist/cjs/components/header/CHeaderNav.js.map +1 -1
  150. package/dist/cjs/components/header/CHeaderText.js +3 -3
  151. package/dist/cjs/components/header/CHeaderText.js.map +1 -1
  152. package/dist/cjs/components/header/CHeaderToggler.js +3 -3
  153. package/dist/cjs/components/header/CHeaderToggler.js.map +1 -1
  154. package/dist/cjs/components/image/CImage.js +9 -10
  155. package/dist/cjs/components/image/CImage.js.map +1 -1
  156. package/dist/cjs/components/index.d.ts +1 -0
  157. package/dist/cjs/components/link/CLink.js +5 -5
  158. package/dist/cjs/components/link/CLink.js.map +1 -1
  159. package/dist/cjs/components/list-group/CListGroup.js +6 -8
  160. package/dist/cjs/components/list-group/CListGroup.js.map +1 -1
  161. package/dist/cjs/components/list-group/CListGroupItem.js +13 -14
  162. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  163. package/dist/cjs/components/modal/CModal.js +26 -34
  164. package/dist/cjs/components/modal/CModal.js.map +1 -1
  165. package/dist/cjs/components/modal/CModalBody.js +3 -3
  166. package/dist/cjs/components/modal/CModalBody.js.map +1 -1
  167. package/dist/cjs/components/modal/CModalContent.js +3 -3
  168. package/dist/cjs/components/modal/CModalContent.js.map +1 -1
  169. package/dist/cjs/components/modal/CModalContext.js +1 -1
  170. package/dist/cjs/components/modal/CModalContext.js.map +1 -1
  171. package/dist/cjs/components/modal/CModalDialog.js +9 -11
  172. package/dist/cjs/components/modal/CModalDialog.js.map +1 -1
  173. package/dist/cjs/components/modal/CModalFooter.js +3 -3
  174. package/dist/cjs/components/modal/CModalFooter.js.map +1 -1
  175. package/dist/cjs/components/modal/CModalHeader.js +5 -5
  176. package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
  177. package/dist/cjs/components/modal/CModalTitle.js +3 -3
  178. package/dist/cjs/components/modal/CModalTitle.js.map +1 -1
  179. package/dist/cjs/components/nav/CNav.js +7 -7
  180. package/dist/cjs/components/nav/CNav.js.map +1 -1
  181. package/dist/cjs/components/nav/CNavGroup.js +24 -24
  182. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  183. package/dist/cjs/components/nav/CNavGroupItems.js +3 -3
  184. package/dist/cjs/components/nav/CNavGroupItems.js.map +1 -1
  185. package/dist/cjs/components/nav/CNavItem.js +3 -3
  186. package/dist/cjs/components/nav/CNavItem.js.map +1 -1
  187. package/dist/cjs/components/nav/CNavLink.js +7 -7
  188. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  189. package/dist/cjs/components/nav/CNavTitle.js +3 -3
  190. package/dist/cjs/components/nav/CNavTitle.js.map +1 -1
  191. package/dist/cjs/components/navbar/CNavbar.js +6 -7
  192. package/dist/cjs/components/navbar/CNavbar.js.map +1 -1
  193. package/dist/cjs/components/navbar/CNavbarBrand.js +4 -4
  194. package/dist/cjs/components/navbar/CNavbarBrand.js.map +1 -1
  195. package/dist/cjs/components/navbar/CNavbarNav.js +3 -3
  196. package/dist/cjs/components/navbar/CNavbarNav.js.map +1 -1
  197. package/dist/cjs/components/navbar/CNavbarText.js +3 -3
  198. package/dist/cjs/components/navbar/CNavbarText.js.map +1 -1
  199. package/dist/cjs/components/navbar/CNavbarToggler.js +3 -3
  200. package/dist/cjs/components/navbar/CNavbarToggler.js.map +1 -1
  201. package/dist/cjs/components/offcanvas/COffcanvas.js +20 -21
  202. package/dist/cjs/components/offcanvas/COffcanvas.js.map +1 -1
  203. package/dist/cjs/components/offcanvas/COffcanvasBody.js +3 -3
  204. package/dist/cjs/components/offcanvas/COffcanvasBody.js.map +1 -1
  205. package/dist/cjs/components/offcanvas/COffcanvasHeader.js +3 -3
  206. package/dist/cjs/components/offcanvas/COffcanvasHeader.js.map +1 -1
  207. package/dist/cjs/components/offcanvas/COffcanvasTitle.js +3 -3
  208. package/dist/cjs/components/offcanvas/COffcanvasTitle.js.map +1 -1
  209. package/dist/cjs/components/pagination/CPagination.js +7 -8
  210. package/dist/cjs/components/pagination/CPagination.js.map +1 -1
  211. package/dist/cjs/components/pagination/CPaginationItem.js +5 -5
  212. package/dist/cjs/components/pagination/CPaginationItem.js.map +1 -1
  213. package/dist/cjs/components/placeholder/CPlaceholder.js +13 -14
  214. package/dist/cjs/components/placeholder/CPlaceholder.js.map +1 -1
  215. package/dist/cjs/components/popover/CPopover.js +29 -29
  216. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  217. package/dist/cjs/components/progress/CProgress.js +8 -8
  218. package/dist/cjs/components/progress/CProgress.js.map +1 -1
  219. package/dist/cjs/components/progress/CProgressBar.js +8 -9
  220. package/dist/cjs/components/progress/CProgressBar.js.map +1 -1
  221. package/dist/cjs/components/progress/CProgressStacked.js +3 -3
  222. package/dist/cjs/components/progress/CProgressStacked.js.map +1 -1
  223. package/dist/cjs/components/progress/CProgressStackedContext.js +1 -1
  224. package/dist/cjs/components/progress/CProgressStackedContext.js.map +1 -1
  225. package/dist/cjs/components/sidebar/CSidebar.js +34 -37
  226. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  227. package/dist/cjs/components/sidebar/CSidebarBrand.js +3 -3
  228. package/dist/cjs/components/sidebar/CSidebarBrand.js.map +1 -1
  229. package/dist/cjs/components/sidebar/CSidebarFooter.js +3 -3
  230. package/dist/cjs/components/sidebar/CSidebarFooter.js.map +1 -1
  231. package/dist/cjs/components/sidebar/CSidebarHeader.js +3 -3
  232. package/dist/cjs/components/sidebar/CSidebarHeader.js.map +1 -1
  233. package/dist/cjs/components/sidebar/CSidebarNav.js +14 -14
  234. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  235. package/dist/cjs/components/sidebar/CSidebarNavContext.js +1 -1
  236. package/dist/cjs/components/sidebar/CSidebarNavContext.js.map +1 -1
  237. package/dist/cjs/components/sidebar/CSidebarToggler.js +3 -3
  238. package/dist/cjs/components/sidebar/CSidebarToggler.js.map +1 -1
  239. package/dist/cjs/components/spinner/CSpinner.js +6 -7
  240. package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
  241. package/dist/cjs/components/table/CTable.js +25 -26
  242. package/dist/cjs/components/table/CTable.js.map +1 -1
  243. package/dist/cjs/components/table/CTableBody.js +5 -6
  244. package/dist/cjs/components/table/CTableBody.js.map +1 -1
  245. package/dist/cjs/components/table/CTableCaption.js +3 -3
  246. package/dist/cjs/components/table/CTableCaption.js.map +1 -1
  247. package/dist/cjs/components/table/CTableDataCell.js +8 -9
  248. package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
  249. package/dist/cjs/components/table/CTableFoot.js +5 -6
  250. package/dist/cjs/components/table/CTableFoot.js.map +1 -1
  251. package/dist/cjs/components/table/CTableHead.js +5 -6
  252. package/dist/cjs/components/table/CTableHead.js.map +1 -1
  253. package/dist/cjs/components/table/CTableHeaderCell.js +5 -6
  254. package/dist/cjs/components/table/CTableHeaderCell.js.map +1 -1
  255. package/dist/cjs/components/table/CTableResponsiveWrapper.js +3 -3
  256. package/dist/cjs/components/table/CTableResponsiveWrapper.js.map +1 -1
  257. package/dist/cjs/components/table/CTableRow.js +7 -8
  258. package/dist/cjs/components/table/CTableRow.js.map +1 -1
  259. package/dist/cjs/components/table/utils.js +9 -13
  260. package/dist/cjs/components/table/utils.js.map +1 -1
  261. package/dist/cjs/components/tabs/CTab.js +6 -6
  262. package/dist/cjs/components/tabs/CTab.js.map +1 -1
  263. package/dist/cjs/components/tabs/CTabContent.js +3 -3
  264. package/dist/cjs/components/tabs/CTabContent.js.map +1 -1
  265. package/dist/cjs/components/tabs/CTabList.js +13 -13
  266. package/dist/cjs/components/tabs/CTabList.js.map +1 -1
  267. package/dist/cjs/components/tabs/CTabPane.js +6 -6
  268. package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
  269. package/dist/cjs/components/tabs/CTabPanel.js +10 -10
  270. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
  271. package/dist/cjs/components/tabs/CTabs.js +7 -8
  272. package/dist/cjs/components/tabs/CTabs.js.map +1 -1
  273. package/dist/cjs/components/tabs/CTabsContext.js +1 -1
  274. package/dist/cjs/components/tabs/CTabsContext.js.map +1 -1
  275. package/dist/cjs/components/toast/CToast.js +21 -25
  276. package/dist/cjs/components/toast/CToast.js.map +1 -1
  277. package/dist/cjs/components/toast/CToastBody.js +3 -3
  278. package/dist/cjs/components/toast/CToastBody.js.map +1 -1
  279. package/dist/cjs/components/toast/CToastClose.js +5 -5
  280. package/dist/cjs/components/toast/CToastClose.js.map +1 -1
  281. package/dist/cjs/components/toast/CToastContext.js +1 -1
  282. package/dist/cjs/components/toast/CToastContext.js.map +1 -1
  283. package/dist/cjs/components/toast/CToastHeader.js +3 -3
  284. package/dist/cjs/components/toast/CToastHeader.js.map +1 -1
  285. package/dist/cjs/components/toast/CToaster.js +12 -13
  286. package/dist/cjs/components/toast/CToaster.js.map +1 -1
  287. package/dist/cjs/components/tooltip/CTooltip.js +30 -30
  288. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  289. package/dist/cjs/components/widgets/CWidgetStatsA.js +3 -4
  290. package/dist/cjs/components/widgets/CWidgetStatsA.js.map +1 -1
  291. package/dist/cjs/components/widgets/CWidgetStatsB.js +4 -4
  292. package/dist/cjs/components/widgets/CWidgetStatsB.js.map +1 -1
  293. package/dist/cjs/components/widgets/CWidgetStatsC.js +4 -4
  294. package/dist/cjs/components/widgets/CWidgetStatsC.js.map +1 -1
  295. package/dist/cjs/components/widgets/CWidgetStatsD.js +7 -8
  296. package/dist/cjs/components/widgets/CWidgetStatsD.js.map +1 -1
  297. package/dist/cjs/components/widgets/CWidgetStatsE.js +3 -3
  298. package/dist/cjs/components/widgets/CWidgetStatsE.js.map +1 -1
  299. package/dist/cjs/components/widgets/CWidgetStatsF.js +6 -6
  300. package/dist/cjs/components/widgets/CWidgetStatsF.js.map +1 -1
  301. package/dist/cjs/hooks/useClipboard.js +21 -33
  302. package/dist/cjs/hooks/useClipboard.js.map +1 -1
  303. package/dist/cjs/hooks/useColorModes.js +15 -20
  304. package/dist/cjs/hooks/useColorModes.js.map +1 -1
  305. package/dist/cjs/hooks/useForkedRef.js +6 -10
  306. package/dist/cjs/hooks/useForkedRef.js.map +1 -1
  307. package/dist/cjs/hooks/usePopper.js +11 -11
  308. package/dist/cjs/hooks/usePopper.js.map +1 -1
  309. package/dist/cjs/index.js +2 -0
  310. package/dist/cjs/index.js.map +1 -1
  311. package/dist/cjs/node_modules/tslib/tslib.es6.js +0 -51
  312. package/dist/cjs/node_modules/tslib/tslib.es6.js.map +1 -1
  313. package/dist/cjs/props.js +6 -6
  314. package/dist/cjs/props.js.map +1 -1
  315. package/dist/cjs/utils/executeAfterTransition.js +8 -10
  316. package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
  317. package/dist/cjs/utils/getNextActiveElement.js +3 -3
  318. package/dist/cjs/utils/getNextActiveElement.js.map +1 -1
  319. package/dist/cjs/utils/getRTLPlacement.js +1 -1
  320. package/dist/cjs/utils/getRTLPlacement.js.map +1 -1
  321. package/dist/cjs/utils/getTransitionDurationFromElement.js +4 -4
  322. package/dist/cjs/utils/getTransitionDurationFromElement.js.map +1 -1
  323. package/dist/cjs/utils/isInViewport.js +2 -2
  324. package/dist/cjs/utils/isInViewport.js.map +1 -1
  325. package/dist/cjs/utils/isRTL.js +1 -1
  326. package/dist/cjs/utils/isRTL.js.map +1 -1
  327. package/dist/esm/components/accordion/CAccordion.js +6 -6
  328. package/dist/esm/components/accordion/CAccordion.js.map +1 -1
  329. package/dist/esm/components/accordion/CAccordionBody.js +5 -5
  330. package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
  331. package/dist/esm/components/accordion/CAccordionButton.js +5 -5
  332. package/dist/esm/components/accordion/CAccordionButton.js.map +1 -1
  333. package/dist/esm/components/accordion/CAccordionContext.js +1 -1
  334. package/dist/esm/components/accordion/CAccordionContext.js.map +1 -1
  335. package/dist/esm/components/accordion/CAccordionHeader.js +4 -4
  336. package/dist/esm/components/accordion/CAccordionHeader.js.map +1 -1
  337. package/dist/esm/components/accordion/CAccordionItem.js +12 -12
  338. package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
  339. package/dist/esm/components/accordion/CAccordionItemContext.js +1 -1
  340. package/dist/esm/components/accordion/CAccordionItemContext.js.map +1 -1
  341. package/dist/esm/components/alert/CAlert.js +9 -9
  342. package/dist/esm/components/alert/CAlert.js.map +1 -1
  343. package/dist/esm/components/alert/CAlertHeading.js +4 -4
  344. package/dist/esm/components/alert/CAlertHeading.js.map +1 -1
  345. package/dist/esm/components/alert/CAlertLink.js +4 -4
  346. package/dist/esm/components/alert/CAlertLink.js.map +1 -1
  347. package/dist/esm/components/avatar/CAvatar.js +9 -10
  348. package/dist/esm/components/avatar/CAvatar.js.map +1 -1
  349. package/dist/esm/components/backdrop/CBackdrop.js +7 -7
  350. package/dist/esm/components/backdrop/CBackdrop.js.map +1 -1
  351. package/dist/esm/components/badge/CBadge.js +14 -15
  352. package/dist/esm/components/badge/CBadge.js.map +1 -1
  353. package/dist/esm/components/breadcrumb/CBreadcrumb.js +4 -4
  354. package/dist/esm/components/breadcrumb/CBreadcrumb.js.map +1 -1
  355. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js +4 -4
  356. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  357. package/dist/esm/components/button/CButton.js +9 -10
  358. package/dist/esm/components/button/CButton.js.map +1 -1
  359. package/dist/esm/components/button-group/CButtonGroup.js +4 -5
  360. package/dist/esm/components/button-group/CButtonGroup.js.map +1 -1
  361. package/dist/esm/components/button-group/CButtonToolbar.js +4 -4
  362. package/dist/esm/components/button-group/CButtonToolbar.js.map +1 -1
  363. package/dist/esm/components/callout/CCallout.js +6 -7
  364. package/dist/esm/components/callout/CCallout.js.map +1 -1
  365. package/dist/esm/components/card/CCard.js +8 -9
  366. package/dist/esm/components/card/CCard.js.map +1 -1
  367. package/dist/esm/components/card/CCardBody.js +4 -4
  368. package/dist/esm/components/card/CCardBody.js.map +1 -1
  369. package/dist/esm/components/card/CCardFooter.js +4 -4
  370. package/dist/esm/components/card/CCardFooter.js.map +1 -1
  371. package/dist/esm/components/card/CCardGroup.js +4 -4
  372. package/dist/esm/components/card/CCardGroup.js.map +1 -1
  373. package/dist/esm/components/card/CCardHeader.js +4 -4
  374. package/dist/esm/components/card/CCardHeader.js.map +1 -1
  375. package/dist/esm/components/card/CCardImage.js +4 -4
  376. package/dist/esm/components/card/CCardImage.js.map +1 -1
  377. package/dist/esm/components/card/CCardImageOverlay.js +4 -4
  378. package/dist/esm/components/card/CCardImageOverlay.js.map +1 -1
  379. package/dist/esm/components/card/CCardLink.js +4 -4
  380. package/dist/esm/components/card/CCardLink.js.map +1 -1
  381. package/dist/esm/components/card/CCardSubtitle.js +4 -4
  382. package/dist/esm/components/card/CCardSubtitle.js.map +1 -1
  383. package/dist/esm/components/card/CCardText.js +4 -4
  384. package/dist/esm/components/card/CCardText.js.map +1 -1
  385. package/dist/esm/components/card/CCardTitle.js +4 -4
  386. package/dist/esm/components/card/CCardTitle.js.map +1 -1
  387. package/dist/esm/components/carousel/CCarousel.js +42 -42
  388. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  389. package/dist/esm/components/carousel/CCarouselCaption.js +4 -4
  390. package/dist/esm/components/carousel/CCarouselCaption.js.map +1 -1
  391. package/dist/esm/components/carousel/CCarouselContext.js +1 -1
  392. package/dist/esm/components/carousel/CCarouselContext.js.map +1 -1
  393. package/dist/esm/components/carousel/CCarouselItem.js +22 -22
  394. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  395. package/dist/esm/components/close-button/CCloseButton.js +4 -4
  396. package/dist/esm/components/close-button/CCloseButton.js.map +1 -1
  397. package/dist/esm/components/collapse/CCollapse.js +17 -17
  398. package/dist/esm/components/collapse/CCollapse.js.map +1 -1
  399. package/dist/esm/components/conditional-portal/CConditionalPortal.js +4 -5
  400. package/dist/esm/components/conditional-portal/CConditionalPortal.js.map +1 -1
  401. package/dist/esm/components/dropdown/CDropdown.d.ts +20 -9
  402. package/dist/esm/components/dropdown/CDropdown.js +91 -71
  403. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  404. package/dist/esm/components/dropdown/CDropdownContext.d.ts +1 -1
  405. package/dist/esm/components/dropdown/CDropdownContext.js +1 -1
  406. package/dist/esm/components/dropdown/CDropdownContext.js.map +1 -1
  407. package/dist/esm/components/dropdown/CDropdownDivider.js +4 -4
  408. package/dist/esm/components/dropdown/CDropdownDivider.js.map +1 -1
  409. package/dist/esm/components/dropdown/CDropdownHeader.js +4 -4
  410. package/dist/esm/components/dropdown/CDropdownHeader.js.map +1 -1
  411. package/dist/esm/components/dropdown/CDropdownItem.js +4 -4
  412. package/dist/esm/components/dropdown/CDropdownItem.js.map +1 -1
  413. package/dist/esm/components/dropdown/CDropdownItemPlain.js +4 -4
  414. package/dist/esm/components/dropdown/CDropdownItemPlain.js.map +1 -1
  415. package/dist/esm/components/dropdown/CDropdownMenu.js +7 -7
  416. package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
  417. package/dist/esm/components/dropdown/CDropdownToggle.d.ts +7 -3
  418. package/dist/esm/components/dropdown/CDropdownToggle.js +19 -14
  419. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  420. package/dist/esm/components/dropdown/utils.js +7 -7
  421. package/dist/esm/components/dropdown/utils.js.map +1 -1
  422. package/dist/esm/components/focus-trap/CFocusTrap.d.ts +59 -0
  423. package/dist/esm/components/focus-trap/CFocusTrap.js +160 -0
  424. package/dist/esm/components/focus-trap/CFocusTrap.js.map +1 -0
  425. package/dist/esm/components/focus-trap/index.d.ts +2 -0
  426. package/dist/esm/components/focus-trap/utils.d.ts +36 -0
  427. package/dist/esm/components/focus-trap/utils.js +107 -0
  428. package/dist/esm/components/focus-trap/utils.js.map +1 -0
  429. package/dist/esm/components/footer/CFooter.js +4 -5
  430. package/dist/esm/components/footer/CFooter.js.map +1 -1
  431. package/dist/esm/components/form/CForm.js +4 -4
  432. package/dist/esm/components/form/CForm.js.map +1 -1
  433. package/dist/esm/components/form/CFormCheck.js +17 -20
  434. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  435. package/dist/esm/components/form/CFormControlValidation.js +2 -4
  436. package/dist/esm/components/form/CFormControlValidation.js.map +1 -1
  437. package/dist/esm/components/form/CFormControlWrapper.js +3 -5
  438. package/dist/esm/components/form/CFormControlWrapper.js.map +1 -1
  439. package/dist/esm/components/form/CFormFeedback.js +7 -8
  440. package/dist/esm/components/form/CFormFeedback.js.map +1 -1
  441. package/dist/esm/components/form/CFormFloating.js +4 -4
  442. package/dist/esm/components/form/CFormFloating.js.map +1 -1
  443. package/dist/esm/components/form/CFormInput.js +14 -15
  444. package/dist/esm/components/form/CFormInput.js.map +1 -1
  445. package/dist/esm/components/form/CFormLabel.js +4 -4
  446. package/dist/esm/components/form/CFormLabel.js.map +1 -1
  447. package/dist/esm/components/form/CFormRange.js +4 -4
  448. package/dist/esm/components/form/CFormRange.js.map +1 -1
  449. package/dist/esm/components/form/CFormSelect.js +11 -12
  450. package/dist/esm/components/form/CFormSelect.js.map +1 -1
  451. package/dist/esm/components/form/CFormSwitch.js +11 -13
  452. package/dist/esm/components/form/CFormSwitch.js.map +1 -1
  453. package/dist/esm/components/form/CFormText.js +4 -4
  454. package/dist/esm/components/form/CFormText.js.map +1 -1
  455. package/dist/esm/components/form/CFormTextarea.js +5 -5
  456. package/dist/esm/components/form/CFormTextarea.js.map +1 -1
  457. package/dist/esm/components/form/CInputGroup.js +6 -7
  458. package/dist/esm/components/form/CInputGroup.js.map +1 -1
  459. package/dist/esm/components/form/CInputGroupText.js +4 -4
  460. package/dist/esm/components/form/CInputGroupText.js.map +1 -1
  461. package/dist/esm/components/grid/CCol.js +17 -17
  462. package/dist/esm/components/grid/CCol.js.map +1 -1
  463. package/dist/esm/components/grid/CContainer.js +9 -9
  464. package/dist/esm/components/grid/CContainer.js.map +1 -1
  465. package/dist/esm/components/grid/CRow.js +14 -14
  466. package/dist/esm/components/grid/CRow.js.map +1 -1
  467. package/dist/esm/components/header/CHeader.js +4 -5
  468. package/dist/esm/components/header/CHeader.js.map +1 -1
  469. package/dist/esm/components/header/CHeaderBrand.js +4 -4
  470. package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
  471. package/dist/esm/components/header/CHeaderDivider.js +4 -4
  472. package/dist/esm/components/header/CHeaderDivider.js.map +1 -1
  473. package/dist/esm/components/header/CHeaderNav.js +4 -4
  474. package/dist/esm/components/header/CHeaderNav.js.map +1 -1
  475. package/dist/esm/components/header/CHeaderText.js +4 -4
  476. package/dist/esm/components/header/CHeaderText.js.map +1 -1
  477. package/dist/esm/components/header/CHeaderToggler.js +4 -4
  478. package/dist/esm/components/header/CHeaderToggler.js.map +1 -1
  479. package/dist/esm/components/image/CImage.js +10 -11
  480. package/dist/esm/components/image/CImage.js.map +1 -1
  481. package/dist/esm/components/index.d.ts +1 -0
  482. package/dist/esm/components/link/CLink.js +6 -6
  483. package/dist/esm/components/link/CLink.js.map +1 -1
  484. package/dist/esm/components/list-group/CListGroup.js +7 -9
  485. package/dist/esm/components/list-group/CListGroup.js.map +1 -1
  486. package/dist/esm/components/list-group/CListGroupItem.js +14 -15
  487. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  488. package/dist/esm/components/modal/CModal.js +27 -35
  489. package/dist/esm/components/modal/CModal.js.map +1 -1
  490. package/dist/esm/components/modal/CModalBody.js +4 -4
  491. package/dist/esm/components/modal/CModalBody.js.map +1 -1
  492. package/dist/esm/components/modal/CModalContent.js +4 -4
  493. package/dist/esm/components/modal/CModalContent.js.map +1 -1
  494. package/dist/esm/components/modal/CModalContext.js +1 -1
  495. package/dist/esm/components/modal/CModalContext.js.map +1 -1
  496. package/dist/esm/components/modal/CModalDialog.js +10 -12
  497. package/dist/esm/components/modal/CModalDialog.js.map +1 -1
  498. package/dist/esm/components/modal/CModalFooter.js +4 -4
  499. package/dist/esm/components/modal/CModalFooter.js.map +1 -1
  500. package/dist/esm/components/modal/CModalHeader.js +6 -6
  501. package/dist/esm/components/modal/CModalHeader.js.map +1 -1
  502. package/dist/esm/components/modal/CModalTitle.js +4 -4
  503. package/dist/esm/components/modal/CModalTitle.js.map +1 -1
  504. package/dist/esm/components/nav/CNav.js +8 -8
  505. package/dist/esm/components/nav/CNav.js.map +1 -1
  506. package/dist/esm/components/nav/CNavGroup.js +25 -25
  507. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  508. package/dist/esm/components/nav/CNavGroupItems.js +4 -4
  509. package/dist/esm/components/nav/CNavGroupItems.js.map +1 -1
  510. package/dist/esm/components/nav/CNavItem.js +4 -4
  511. package/dist/esm/components/nav/CNavItem.js.map +1 -1
  512. package/dist/esm/components/nav/CNavLink.js +8 -8
  513. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  514. package/dist/esm/components/nav/CNavTitle.js +4 -4
  515. package/dist/esm/components/nav/CNavTitle.js.map +1 -1
  516. package/dist/esm/components/navbar/CNavbar.js +7 -8
  517. package/dist/esm/components/navbar/CNavbar.js.map +1 -1
  518. package/dist/esm/components/navbar/CNavbarBrand.js +5 -5
  519. package/dist/esm/components/navbar/CNavbarBrand.js.map +1 -1
  520. package/dist/esm/components/navbar/CNavbarNav.js +4 -4
  521. package/dist/esm/components/navbar/CNavbarNav.js.map +1 -1
  522. package/dist/esm/components/navbar/CNavbarText.js +4 -4
  523. package/dist/esm/components/navbar/CNavbarText.js.map +1 -1
  524. package/dist/esm/components/navbar/CNavbarToggler.js +4 -4
  525. package/dist/esm/components/navbar/CNavbarToggler.js.map +1 -1
  526. package/dist/esm/components/offcanvas/COffcanvas.js +21 -22
  527. package/dist/esm/components/offcanvas/COffcanvas.js.map +1 -1
  528. package/dist/esm/components/offcanvas/COffcanvasBody.js +4 -4
  529. package/dist/esm/components/offcanvas/COffcanvasBody.js.map +1 -1
  530. package/dist/esm/components/offcanvas/COffcanvasHeader.js +4 -4
  531. package/dist/esm/components/offcanvas/COffcanvasHeader.js.map +1 -1
  532. package/dist/esm/components/offcanvas/COffcanvasTitle.js +4 -4
  533. package/dist/esm/components/offcanvas/COffcanvasTitle.js.map +1 -1
  534. package/dist/esm/components/pagination/CPagination.js +8 -9
  535. package/dist/esm/components/pagination/CPagination.js.map +1 -1
  536. package/dist/esm/components/pagination/CPaginationItem.js +6 -6
  537. package/dist/esm/components/pagination/CPaginationItem.js.map +1 -1
  538. package/dist/esm/components/placeholder/CPlaceholder.js +14 -15
  539. package/dist/esm/components/placeholder/CPlaceholder.js.map +1 -1
  540. package/dist/esm/components/popover/CPopover.js +30 -30
  541. package/dist/esm/components/popover/CPopover.js.map +1 -1
  542. package/dist/esm/components/progress/CProgress.js +9 -9
  543. package/dist/esm/components/progress/CProgress.js.map +1 -1
  544. package/dist/esm/components/progress/CProgressBar.js +9 -10
  545. package/dist/esm/components/progress/CProgressBar.js.map +1 -1
  546. package/dist/esm/components/progress/CProgressStacked.js +4 -4
  547. package/dist/esm/components/progress/CProgressStacked.js.map +1 -1
  548. package/dist/esm/components/progress/CProgressStackedContext.js +1 -1
  549. package/dist/esm/components/progress/CProgressStackedContext.js.map +1 -1
  550. package/dist/esm/components/sidebar/CSidebar.js +35 -38
  551. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  552. package/dist/esm/components/sidebar/CSidebarBrand.js +4 -4
  553. package/dist/esm/components/sidebar/CSidebarBrand.js.map +1 -1
  554. package/dist/esm/components/sidebar/CSidebarFooter.js +4 -4
  555. package/dist/esm/components/sidebar/CSidebarFooter.js.map +1 -1
  556. package/dist/esm/components/sidebar/CSidebarHeader.js +4 -4
  557. package/dist/esm/components/sidebar/CSidebarHeader.js.map +1 -1
  558. package/dist/esm/components/sidebar/CSidebarNav.js +15 -15
  559. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  560. package/dist/esm/components/sidebar/CSidebarNavContext.js +1 -1
  561. package/dist/esm/components/sidebar/CSidebarNavContext.js.map +1 -1
  562. package/dist/esm/components/sidebar/CSidebarToggler.js +4 -4
  563. package/dist/esm/components/sidebar/CSidebarToggler.js.map +1 -1
  564. package/dist/esm/components/spinner/CSpinner.js +7 -8
  565. package/dist/esm/components/spinner/CSpinner.js.map +1 -1
  566. package/dist/esm/components/table/CTable.js +26 -27
  567. package/dist/esm/components/table/CTable.js.map +1 -1
  568. package/dist/esm/components/table/CTableBody.js +6 -7
  569. package/dist/esm/components/table/CTableBody.js.map +1 -1
  570. package/dist/esm/components/table/CTableCaption.js +4 -4
  571. package/dist/esm/components/table/CTableCaption.js.map +1 -1
  572. package/dist/esm/components/table/CTableDataCell.js +9 -10
  573. package/dist/esm/components/table/CTableDataCell.js.map +1 -1
  574. package/dist/esm/components/table/CTableFoot.js +6 -7
  575. package/dist/esm/components/table/CTableFoot.js.map +1 -1
  576. package/dist/esm/components/table/CTableHead.js +6 -7
  577. package/dist/esm/components/table/CTableHead.js.map +1 -1
  578. package/dist/esm/components/table/CTableHeaderCell.js +6 -7
  579. package/dist/esm/components/table/CTableHeaderCell.js.map +1 -1
  580. package/dist/esm/components/table/CTableResponsiveWrapper.js +4 -4
  581. package/dist/esm/components/table/CTableResponsiveWrapper.js.map +1 -1
  582. package/dist/esm/components/table/CTableRow.js +8 -9
  583. package/dist/esm/components/table/CTableRow.js.map +1 -1
  584. package/dist/esm/components/table/utils.js +9 -13
  585. package/dist/esm/components/table/utils.js.map +1 -1
  586. package/dist/esm/components/tabs/CTab.js +7 -7
  587. package/dist/esm/components/tabs/CTab.js.map +1 -1
  588. package/dist/esm/components/tabs/CTabContent.js +4 -4
  589. package/dist/esm/components/tabs/CTabContent.js.map +1 -1
  590. package/dist/esm/components/tabs/CTabList.js +14 -14
  591. package/dist/esm/components/tabs/CTabList.js.map +1 -1
  592. package/dist/esm/components/tabs/CTabPane.js +7 -7
  593. package/dist/esm/components/tabs/CTabPane.js.map +1 -1
  594. package/dist/esm/components/tabs/CTabPanel.js +11 -11
  595. package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
  596. package/dist/esm/components/tabs/CTabs.js +7 -8
  597. package/dist/esm/components/tabs/CTabs.js.map +1 -1
  598. package/dist/esm/components/tabs/CTabsContext.js +1 -1
  599. package/dist/esm/components/tabs/CTabsContext.js.map +1 -1
  600. package/dist/esm/components/toast/CToast.js +22 -26
  601. package/dist/esm/components/toast/CToast.js.map +1 -1
  602. package/dist/esm/components/toast/CToastBody.js +4 -4
  603. package/dist/esm/components/toast/CToastBody.js.map +1 -1
  604. package/dist/esm/components/toast/CToastClose.js +6 -6
  605. package/dist/esm/components/toast/CToastClose.js.map +1 -1
  606. package/dist/esm/components/toast/CToastContext.js +1 -1
  607. package/dist/esm/components/toast/CToastContext.js.map +1 -1
  608. package/dist/esm/components/toast/CToastHeader.js +4 -4
  609. package/dist/esm/components/toast/CToastHeader.js.map +1 -1
  610. package/dist/esm/components/toast/CToaster.js +13 -14
  611. package/dist/esm/components/toast/CToaster.js.map +1 -1
  612. package/dist/esm/components/tooltip/CTooltip.js +31 -31
  613. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  614. package/dist/esm/components/widgets/CWidgetStatsA.js +4 -5
  615. package/dist/esm/components/widgets/CWidgetStatsA.js.map +1 -1
  616. package/dist/esm/components/widgets/CWidgetStatsB.js +5 -5
  617. package/dist/esm/components/widgets/CWidgetStatsB.js.map +1 -1
  618. package/dist/esm/components/widgets/CWidgetStatsC.js +5 -5
  619. package/dist/esm/components/widgets/CWidgetStatsC.js.map +1 -1
  620. package/dist/esm/components/widgets/CWidgetStatsD.js +8 -9
  621. package/dist/esm/components/widgets/CWidgetStatsD.js.map +1 -1
  622. package/dist/esm/components/widgets/CWidgetStatsE.js +4 -4
  623. package/dist/esm/components/widgets/CWidgetStatsE.js.map +1 -1
  624. package/dist/esm/components/widgets/CWidgetStatsF.js +7 -7
  625. package/dist/esm/components/widgets/CWidgetStatsF.js.map +1 -1
  626. package/dist/esm/hooks/useClipboard.js +22 -34
  627. package/dist/esm/hooks/useClipboard.js.map +1 -1
  628. package/dist/esm/hooks/useColorModes.js +15 -20
  629. package/dist/esm/hooks/useColorModes.js.map +1 -1
  630. package/dist/esm/hooks/useForkedRef.js +6 -10
  631. package/dist/esm/hooks/useForkedRef.js.map +1 -1
  632. package/dist/esm/hooks/usePopper.js +11 -11
  633. package/dist/esm/hooks/usePopper.js.map +1 -1
  634. package/dist/esm/index.js +1 -0
  635. package/dist/esm/index.js.map +1 -1
  636. package/dist/esm/node_modules/tslib/tslib.es6.js +1 -50
  637. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
  638. package/dist/esm/props.js +6 -6
  639. package/dist/esm/props.js.map +1 -1
  640. package/dist/esm/utils/executeAfterTransition.js +8 -10
  641. package/dist/esm/utils/executeAfterTransition.js.map +1 -1
  642. package/dist/esm/utils/getNextActiveElement.js +3 -3
  643. package/dist/esm/utils/getNextActiveElement.js.map +1 -1
  644. package/dist/esm/utils/getRTLPlacement.js +1 -1
  645. package/dist/esm/utils/getRTLPlacement.js.map +1 -1
  646. package/dist/esm/utils/getTransitionDurationFromElement.js +4 -4
  647. package/dist/esm/utils/getTransitionDurationFromElement.js.map +1 -1
  648. package/dist/esm/utils/isInViewport.js +2 -2
  649. package/dist/esm/utils/isInViewport.js.map +1 -1
  650. package/dist/esm/utils/isRTL.js +1 -1
  651. package/dist/esm/utils/isRTL.js.map +1 -1
  652. package/package.json +11 -11
  653. package/src/components/accordion/CAccordion.tsx +1 -1
  654. package/src/components/accordion/CAccordionHeader.tsx +1 -1
  655. package/src/components/alert/CAlert.tsx +3 -3
  656. package/src/components/alert/CAlertHeading.tsx +1 -1
  657. package/src/components/alert/CAlertLink.tsx +1 -1
  658. package/src/components/alert/__tests__/CAlertHeading.spec.tsx +1 -1
  659. package/src/components/alert/__tests__/CAlertLink.spec.tsx +1 -1
  660. package/src/components/avatar/CAvatar.tsx +2 -2
  661. package/src/components/avatar/__tests__/CAvatar.spec.tsx +2 -2
  662. package/src/components/backdrop/CBackdrop.tsx +1 -1
  663. package/src/components/backdrop/__tests__/CBackdrop.spec.tsx +1 -1
  664. package/src/components/badge/CBadge.tsx +3 -3
  665. package/src/components/badge/__tests__/CBadge.spec.tsx +1 -1
  666. package/src/components/breadcrumb/CBreadcrumb.tsx +1 -1
  667. package/src/components/breadcrumb/CBreadcrumbItem.tsx +2 -2
  668. package/src/components/breadcrumb/__tests__/CBreadcrumb.spec.tsx +1 -1
  669. package/src/components/breadcrumb/__tests__/CBreadcrumbItem.spec.tsx +1 -1
  670. package/src/components/button/__tests__/CButton.spec.tsx +2 -2
  671. package/src/components/button-group/CButtonGroup.tsx +2 -2
  672. package/src/components/button-group/CButtonToolbar.tsx +1 -1
  673. package/src/components/button-group/__tests__/CButtonGroup.spec.tsx +2 -2
  674. package/src/components/button-group/__tests__/CButtonToolbar.spec.tsx +1 -1
  675. package/src/components/callout/CCallout.tsx +2 -2
  676. package/src/components/callout/__tests__/CCallout.spec.tsx +1 -1
  677. package/src/components/card/CCard.tsx +2 -2
  678. package/src/components/card/CCardBody.tsx +1 -1
  679. package/src/components/card/CCardFooter.tsx +1 -1
  680. package/src/components/card/CCardGroup.tsx +1 -1
  681. package/src/components/card/CCardImageOverlay.tsx +1 -1
  682. package/src/components/card/CCardLink.tsx +1 -1
  683. package/src/components/card/CCardSubtitle.tsx +1 -1
  684. package/src/components/card/__tests__/CCard.spec.tsx +1 -1
  685. package/src/components/card/__tests__/CCardGroup.spec.tsx +1 -1
  686. package/src/components/card/__tests__/CCardHeader.spec.tsx +1 -1
  687. package/src/components/card/__tests__/CCardLink.spec.tsx +1 -1
  688. package/src/components/card/__tests__/CCardSubtitle.spec.tsx +1 -1
  689. package/src/components/card/__tests__/CCardText.spec.tsx +1 -1
  690. package/src/components/card/__tests__/CCardTitle.spec.tsx +1 -1
  691. package/src/components/carousel/__tests__/CCarousel.spec.tsx +3 -3
  692. package/src/components/close-button/CCloseButton.tsx +2 -2
  693. package/src/components/collapse/CCollapse.tsx +1 -1
  694. package/src/components/dropdown/CDropdown.tsx +107 -65
  695. package/src/components/dropdown/CDropdownContext.ts +1 -1
  696. package/src/components/dropdown/CDropdownToggle.tsx +13 -3
  697. package/src/components/dropdown/__tests__/CDropdown.spec.tsx +3 -3
  698. package/src/components/dropdown/__tests__/CDropdownHeader.spec.tsx +1 -1
  699. package/src/components/dropdown/__tests__/CDropdownItem.spec.tsx +1 -1
  700. package/src/components/dropdown/__tests__/CDropdownItemPlain.spec.tsx +1 -1
  701. package/src/components/dropdown/__tests__/CDropdownMenu.spec.tsx +1 -1
  702. package/src/components/dropdown/__tests__/CDropdownToggle.spec.tsx +1 -1
  703. package/src/components/dropdown/utils.ts +2 -2
  704. package/src/components/focus-trap/CFocusTrap.tsx +254 -0
  705. package/src/components/focus-trap/__tests__/CFocusTrap.spec.tsx +232 -0
  706. package/src/components/focus-trap/__tests__/__snapshots__/CFocusTrap.spec.tsx.snap +21 -0
  707. package/src/components/focus-trap/index.ts +3 -0
  708. package/src/components/focus-trap/utils.ts +121 -0
  709. package/src/components/footer/CFooter.tsx +1 -1
  710. package/src/components/footer/__tests__/CFooter.spec.tsx +1 -1
  711. package/src/components/form/CForm.tsx +1 -1
  712. package/src/components/form/CFormCheck.tsx +5 -5
  713. package/src/components/form/CFormFeedback.tsx +2 -2
  714. package/src/components/form/CFormFloating.tsx +1 -1
  715. package/src/components/form/CFormInput.tsx +4 -4
  716. package/src/components/form/CFormLabel.tsx +1 -1
  717. package/src/components/form/CFormRange.tsx +1 -1
  718. package/src/components/form/CFormSelect.tsx +3 -3
  719. package/src/components/form/CFormSwitch.tsx +2 -2
  720. package/src/components/form/CFormTextarea.tsx +3 -3
  721. package/src/components/form/CInputGroup.tsx +2 -2
  722. package/src/components/form/CInputGroupText.tsx +1 -1
  723. package/src/components/form/__tests__/CForm.spec.tsx +2 -2
  724. package/src/components/form/__tests__/CFormCheck.spec.tsx +2 -2
  725. package/src/components/form/__tests__/CFormControl.spec.tsx +1 -1
  726. package/src/components/form/__tests__/CFormFeedback.spec.tsx +2 -2
  727. package/src/components/form/__tests__/CFormInput.spec.tsx +1 -1
  728. package/src/components/form/__tests__/CFormRange.spec.tsx +1 -1
  729. package/src/components/form/__tests__/CFormSelect.spec.tsx +1 -1
  730. package/src/components/form/__tests__/CFormSwitch.spec.tsx +1 -1
  731. package/src/components/form/__tests__/CFormText.spec.tsx +1 -1
  732. package/src/components/form/__tests__/CFormTextarea.spec.tsx +1 -1
  733. package/src/components/form/__tests__/CInputGroup.spec.tsx +1 -1
  734. package/src/components/form/__tests__/CInputGroupText.spec.tsx +1 -1
  735. package/src/components/grid/CCol.tsx +2 -2
  736. package/src/components/grid/CContainer.tsx +2 -2
  737. package/src/components/grid/CRow.tsx +1 -1
  738. package/src/components/grid/__tests__/CCol.spec.tsx +2 -2
  739. package/src/components/grid/__tests__/CContainer.spec.tsx +2 -2
  740. package/src/components/grid/__tests__/CRow.spec.tsx +5 -5
  741. package/src/components/header/CHeader.tsx +1 -1
  742. package/src/components/header/CHeaderDivider.tsx +1 -1
  743. package/src/components/header/CHeaderText.tsx +1 -1
  744. package/src/components/header/CHeaderToggler.tsx +1 -1
  745. package/src/components/header/__tests__/CHeader.spec.tsx +1 -1
  746. package/src/components/header/__tests__/CHeaderBrand.spec.tsx +1 -1
  747. package/src/components/header/__tests__/CHeaderNav.spec.tsx +1 -1
  748. package/src/components/image/CImage.tsx +2 -2
  749. package/src/components/image/__tests__/CImage.spec.tsx +1 -1
  750. package/src/components/index.ts +1 -0
  751. package/src/components/link/__tests__/CLink.spec.tsx +3 -3
  752. package/src/components/list-group/CListGroup.tsx +1 -1
  753. package/src/components/list-group/CListGroupItem.tsx +2 -2
  754. package/src/components/list-group/__tests__/CListGroup.spec.tsx +2 -2
  755. package/src/components/list-group/__tests__/CListGroupItem.spec.tsx +1 -1
  756. package/src/components/modal/CModal.tsx +5 -13
  757. package/src/components/modal/CModalBody.tsx +1 -1
  758. package/src/components/modal/CModalContent.tsx +1 -1
  759. package/src/components/modal/CModalDialog.tsx +2 -2
  760. package/src/components/modal/CModalFooter.tsx +1 -1
  761. package/src/components/modal/CModalHeader.tsx +1 -1
  762. package/src/components/modal/__tests__/CModal.spec.tsx +2 -2
  763. package/src/components/modal/__tests__/CModalDialog.spec.tsx +1 -1
  764. package/src/components/modal/__tests__/CModalTitle.spec.tsx +1 -1
  765. package/src/components/nav/CNavGroup.tsx +2 -2
  766. package/src/components/nav/CNavGroupItems.tsx +1 -1
  767. package/src/components/nav/__tests__/CNavGroup.spec.tsx +1 -1
  768. package/src/components/nav/__tests__/CNavItem.spec.tsx +1 -1
  769. package/src/components/nav/__tests__/CNavLink.spec.tsx +1 -1
  770. package/src/components/navbar/CNavbar.tsx +3 -3
  771. package/src/components/navbar/CNavbarText.tsx +1 -1
  772. package/src/components/navbar/CNavbarToggler.tsx +1 -1
  773. package/src/components/navbar/__tests__/CNavbar.spec.tsx +2 -2
  774. package/src/components/navbar/__tests__/CNavbarBrand.spec.tsx +1 -1
  775. package/src/components/navbar/__tests__/CNavbarNav.spec.tsx +1 -1
  776. package/src/components/offcanvas/COffcanvas.tsx +26 -24
  777. package/src/components/offcanvas/COffcanvasBody.tsx +1 -1
  778. package/src/components/offcanvas/COffcanvasHeader.tsx +1 -1
  779. package/src/components/offcanvas/COffcanvasTitle.tsx +1 -1
  780. package/src/components/offcanvas/__tests__/COffcanvasTitle.spec.tsx +1 -1
  781. package/src/components/pagination/CPagination.tsx +2 -2
  782. package/src/components/pagination/CPaginationItem.tsx +2 -2
  783. package/src/components/pagination/__tests__/CPagination.spec.tsx +2 -2
  784. package/src/components/pagination/__tests__/CPaginationItem.spec.tsx +1 -1
  785. package/src/components/placeholder/CPlaceholder.tsx +2 -2
  786. package/src/components/placeholder/__tests__/CPlaceholder.spec.tsx +1 -1
  787. package/src/components/progress/CProgress.tsx +3 -3
  788. package/src/components/progress/CProgressBar.tsx +2 -2
  789. package/src/components/progress/__tests__/CProgress.spec.tsx +1 -1
  790. package/src/components/progress/__tests__/CProgressBar.spec.tsx +1 -1
  791. package/src/components/sidebar/CSidebarFooter.tsx +1 -1
  792. package/src/components/sidebar/CSidebarHeader.tsx +1 -1
  793. package/src/components/sidebar/CSidebarToggler.tsx +1 -1
  794. package/src/components/sidebar/__tests__/CSidebar.spec.tsx +2 -2
  795. package/src/components/spinner/CSpinner.tsx +3 -3
  796. package/src/components/spinner/__tests__/CSpinner.spec.tsx +1 -1
  797. package/src/components/table/CTable.tsx +3 -3
  798. package/src/components/table/CTableBody.tsx +2 -2
  799. package/src/components/table/CTableDataCell.tsx +2 -2
  800. package/src/components/table/CTableFoot.tsx +2 -2
  801. package/src/components/table/CTableHead.tsx +2 -2
  802. package/src/components/table/CTableHeaderCell.tsx +2 -2
  803. package/src/components/table/CTableRow.tsx +2 -2
  804. package/src/components/table/__tests__/CTable.spec.tsx +2 -2
  805. package/src/components/table/__tests__/CTableBody.spec.tsx +1 -1
  806. package/src/components/table/__tests__/CTableDataCell.spec.tsx +2 -2
  807. package/src/components/table/__tests__/CTableFoot.spec.tsx +1 -1
  808. package/src/components/table/__tests__/CTableHead.spec.tsx +1 -1
  809. package/src/components/table/__tests__/CTableHeaderCell.spec.tsx +2 -2
  810. package/src/components/table/__tests__/CTableRow.spec.tsx +2 -2
  811. package/src/components/tabs/CTab.tsx +2 -2
  812. package/src/components/tabs/CTabContent.tsx +1 -1
  813. package/src/components/tabs/CTabPane.tsx +2 -2
  814. package/src/components/tabs/CTabPanel.tsx +2 -2
  815. package/src/components/toast/CToastBody.tsx +1 -1
  816. package/src/components/toast/CToastHeader.tsx +1 -1
  817. package/src/components/toast/__tests__/CToaster.spec.tsx +2 -2
  818. package/src/components/widgets/CWidgetStatsA.tsx +1 -1
  819. package/src/components/widgets/CWidgetStatsB.tsx +1 -1
  820. package/src/components/widgets/CWidgetStatsC.tsx +2 -2
  821. package/src/components/widgets/CWidgetStatsD.tsx +2 -2
  822. package/src/components/widgets/CWidgetStatsE.tsx +1 -1
  823. package/src/components/widgets/CWidgetStatsF.tsx +1 -1
  824. package/src/components/widgets/__tests__/CWidgetStatsA.spec.tsx +1 -1
  825. package/src/components/widgets/__tests__/CWidgetStatsB.spec.tsx +1 -1
  826. package/src/components/widgets/__tests__/CWidgetStatsC.spec.tsx +1 -1
  827. package/src/components/widgets/__tests__/CWidgetStatsD.spec.tsx +1 -1
  828. package/src/components/widgets/__tests__/CWidgetStatsE.spec.tsx +1 -1
  829. package/src/components/widgets/__tests__/CWidgetStatsF.spec.tsx +2 -2
  830. package/src/helpers/polymorphicComponent.ts +1 -1
  831. package/src/utils/executeAfterTransition.ts +1 -1
  832. package/src/utils/getNextActiveElement.ts +1 -1
  833. package/src/utils/mergeClassNames.ts +1 -1
@@ -37,12 +37,15 @@ export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIEl
37
37
  * </CDropdownMenu>
38
38
  * </CDropdown>
39
39
  *
40
- * @type 'start' | 'end' | { xs: 'start' | 'end' } | { sm: 'start' | 'end' } | { md: 'start' | 'end' } | { lg: 'start' | 'end' } | { xl: 'start' | 'end'} | { xxl: 'start' | 'end'}
40
+ * @type 'start' | 'end' | { xs: 'start' | 'end' } | { sm: 'start' | 'end' } |
41
+ * { md: 'start' | 'end' } | { lg: 'start' | 'end' } | { xl: 'start' | 'end'} |
42
+ * { xxl: 'start' | 'end'}
41
43
  */
42
44
  alignment?: Alignments
43
45
 
44
46
  /**
45
- * Determines the root node component (native HTML element or a custom React component) for the React Dropdown.
47
+ * Determines the root node component (native HTML element or a custom React
48
+ * component) for the React Dropdown.
46
49
  */
47
50
  as?: ElementType
48
51
 
@@ -65,7 +68,8 @@ export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIEl
65
68
  className?: string
66
69
 
67
70
  /**
68
- * Appends the React Dropdown Menu to a specific element. You can pass an HTML element or a function returning an element. Defaults to `document.body`.
71
+ * Appends the React Dropdown Menu to a specific element. You can pass an HTML
72
+ * element or a function returning an element. Defaults to `document.body`.
69
73
  *
70
74
  * @example
71
75
  * // Append the menu to a custom container
@@ -78,7 +82,8 @@ export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIEl
78
82
  container?: DocumentFragment | Element | (() => DocumentFragment | Element | null) | null
79
83
 
80
84
  /**
81
- * Applies a darker color scheme to the React Dropdown Menu, often used within dark navbars.
85
+ * Applies a darker color scheme to the React Dropdown Menu, often used within
86
+ * dark navbars.
82
87
  */
83
88
  dark?: boolean
84
89
 
@@ -88,7 +93,8 @@ export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIEl
88
93
  direction?: 'center' | 'dropup' | 'dropup-center' | 'dropend' | 'dropstart'
89
94
 
90
95
  /**
91
- * Defines x and y offsets ([x, y]) for the React Dropdown Menu relative to its target.
96
+ * Defines x and y offsets ([x, y]) for the React Dropdown Menu relative to
97
+ * its target.
92
98
  *
93
99
  * @example
94
100
  * // Offset the menu 10px in X and 5px in Y direction
@@ -111,19 +117,23 @@ export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIEl
111
117
  onShow?: () => void
112
118
 
113
119
  /**
114
- * Determines the placement of the React Dropdown Menu after Popper.js modifiers.
120
+ * Determines the placement of the React Dropdown Menu after Popper.js
121
+ * modifiers.
115
122
  *
116
123
  * @type 'auto' | 'auto-start' | 'auto-end' | 'top-end' | 'top' | 'top-start' | 'bottom-end' | 'bottom' | 'bottom-start' | 'right-start' | 'right' | 'right-end' | 'left-start' | 'left' | 'left-end'
117
124
  */
118
125
  placement?: Placements
119
126
 
120
127
  /**
121
- * Enables or disables dynamic positioning via Popper.js for the React Dropdown Menu.
128
+ * Enables or disables dynamic positioning via Popper.js for the React
129
+ * Dropdown Menu.
122
130
  */
123
131
  popper?: boolean
124
132
 
125
133
  /**
126
- * Provides a custom Popper.js configuration or a function that returns a modified Popper.js configuration for advanced positioning of the React Dropdown Menu. [Read more](https://popper.js.org/docs/v2/constructors/#options)
134
+ * Provides a custom Popper.js configuration or a function that returns a
135
+ * modified Popper.js configuration for advanced positioning of the React
136
+ * Dropdown Menu. [Read more](https://popper.js.org/docs/v2/constructors/#options)
127
137
  *
128
138
  * @example
129
139
  * // Providing a custom popper config
@@ -143,7 +153,8 @@ export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIEl
143
153
  popperConfig?: Partial<Options> | ((defaultPopperConfig: Partial<Options>) => Partial<Options>)
144
154
 
145
155
  /**
146
- * Renders the React Dropdown Menu using a React Portal, allowing it to escape the DOM hierarchy for improved positioning.
156
+ * Renders the React Dropdown Menu using a React Portal, allowing it to escape
157
+ * the DOM hierarchy for improved positioning.
147
158
  *
148
159
  * @since 4.8.0
149
160
  */
@@ -202,6 +213,7 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
202
213
  const dropdownMenuRef = useRef<HTMLDivElement | HTMLUListElement>(null)
203
214
  const forkedRef = useForkedRef(ref, dropdownRef)
204
215
  const [dropdownToggleElement, setDropdownToggleElement] = useState<HTMLElement | null>(null)
216
+ const [pendingKeyDownEvent, setPendingKeyDownEvent] = useState<KeyboardEvent | null>(null)
205
217
  const [_visible, setVisible] = useState(visible)
206
218
  const { initPopper, destroyPopper } = usePopper()
207
219
 
@@ -249,29 +261,14 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
249
261
  }
250
262
  }, [dropdownToggleElement])
251
263
 
252
- const handleShow = () => {
253
- const toggleElement = dropdownToggleElement
254
- const menuElement = dropdownMenuRef.current
255
-
256
- if (toggleElement && menuElement) {
257
- setVisible(true)
258
-
259
- if (allowPopperUse) {
260
- initPopper(toggleElement, menuElement, computedPopperConfig)
261
- }
262
-
263
- toggleElement.focus()
264
- toggleElement.addEventListener('keydown', handleKeydown)
265
- menuElement.addEventListener('keydown', handleKeydown)
266
-
267
- window.addEventListener('mouseup', handleMouseUp)
268
- window.addEventListener('keyup', handleKeyup)
269
-
270
- onShow?.()
264
+ useEffect(() => {
265
+ if (pendingKeyDownEvent !== null) {
266
+ handleKeydown(pendingKeyDownEvent)
267
+ setPendingKeyDownEvent(null)
271
268
  }
272
- }
269
+ }, [pendingKeyDownEvent])
273
270
 
274
- const handleHide = () => {
271
+ const handleHide = useCallback(() => {
275
272
  setVisible(false)
276
273
 
277
274
  const toggleElement = dropdownToggleElement
@@ -288,51 +285,96 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
288
285
  window.removeEventListener('keyup', handleKeyup)
289
286
 
290
287
  onHide?.()
291
- }
288
+ }, [dropdownToggleElement, allowPopperUse, destroyPopper, onHide])
292
289
 
293
- const handleKeydown = (event: KeyboardEvent) => {
294
- if (
295
- _visible &&
296
- dropdownMenuRef.current &&
297
- (event.key === 'ArrowDown' || event.key === 'ArrowUp')
298
- ) {
290
+ const handleKeydown = useCallback((event: KeyboardEvent) => {
291
+ if (dropdownMenuRef.current && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {
299
292
  event.preventDefault()
300
293
  const target = event.target as HTMLElement
301
- const items: HTMLElement[] = Array.from(
302
- dropdownMenuRef.current.querySelectorAll('.dropdown-item:not(.disabled):not(:disabled)')
303
- )
294
+ const items = [
295
+ ...dropdownMenuRef.current.querySelectorAll(
296
+ '.dropdown-item:not(.disabled):not(:disabled)'
297
+ ),
298
+ ] as HTMLElement[]
304
299
  getNextActiveElement(items, target, event.key === 'ArrowDown', true).focus()
305
300
  }
306
- }
301
+ }, [])
307
302
 
308
- const handleKeyup = (event: KeyboardEvent) => {
309
- if (autoClose === false) {
310
- return
311
- }
303
+ const handleKeyup = useCallback(
304
+ (event: KeyboardEvent) => {
305
+ if (autoClose === false) {
306
+ return
307
+ }
312
308
 
313
- if (event.key === 'Escape') {
314
- handleHide()
315
- }
316
- }
309
+ if (event.key === 'Escape') {
310
+ handleHide()
311
+ dropdownToggleElement?.focus()
312
+ }
313
+ },
314
+ [autoClose, handleHide]
315
+ )
317
316
 
318
- const handleMouseUp = (event: Event) => {
319
- if (!dropdownToggleElement || !dropdownMenuRef.current) {
320
- return
321
- }
317
+ const handleMouseUp = useCallback(
318
+ (event: Event) => {
319
+ if (!dropdownToggleElement || !dropdownMenuRef.current) {
320
+ return
321
+ }
322
322
 
323
- if (dropdownToggleElement.contains(event.target as HTMLElement)) {
324
- return
325
- }
323
+ if (dropdownToggleElement.contains(event.target as HTMLElement)) {
324
+ return
325
+ }
326
326
 
327
- if (
328
- autoClose === true ||
329
- (autoClose === 'inside' && dropdownMenuRef.current.contains(event.target as HTMLElement)) ||
330
- (autoClose === 'outside' && !dropdownMenuRef.current.contains(event.target as HTMLElement))
331
- ) {
332
- setTimeout(() => handleHide(), 1)
333
- return
334
- }
335
- }
327
+ if (
328
+ autoClose === true ||
329
+ (autoClose === 'inside' &&
330
+ dropdownMenuRef.current.contains(event.target as HTMLElement)) ||
331
+ (autoClose === 'outside' &&
332
+ !dropdownMenuRef.current.contains(event.target as HTMLElement))
333
+ ) {
334
+ setTimeout(() => handleHide(), 1)
335
+ return
336
+ }
337
+ },
338
+ [autoClose, dropdownToggleElement, handleHide]
339
+ )
340
+
341
+ const handleShow = useCallback(
342
+ (event?: KeyboardEvent) => {
343
+ const toggleElement = dropdownToggleElement
344
+ const menuElement = dropdownMenuRef.current
345
+
346
+ if (toggleElement && menuElement) {
347
+ setVisible(true)
348
+
349
+ if (allowPopperUse) {
350
+ initPopper(toggleElement, menuElement, computedPopperConfig)
351
+ }
352
+
353
+ toggleElement.focus()
354
+ toggleElement.addEventListener('keydown', handleKeydown)
355
+ menuElement.addEventListener('keydown', handleKeydown)
356
+
357
+ window.addEventListener('mouseup', handleMouseUp)
358
+ window.addEventListener('keyup', handleKeyup)
359
+
360
+ if (event && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {
361
+ setPendingKeyDownEvent(event)
362
+ }
363
+
364
+ onShow?.()
365
+ }
366
+ },
367
+ [
368
+ dropdownToggleElement,
369
+ allowPopperUse,
370
+ initPopper,
371
+ computedPopperConfig,
372
+ handleKeydown,
373
+ handleMouseUp,
374
+ handleKeyup,
375
+ onShow,
376
+ ]
377
+ )
336
378
 
337
379
  const contextValues = {
338
380
  alignment,
@@ -8,7 +8,7 @@ export interface CDropdownContextProps {
8
8
  dropdownMenuRef: RefObject<HTMLDivElement | HTMLUListElement | null>
9
9
  dropdownToggleRef: (node: HTMLElement | null) => void
10
10
  handleHide?: () => void
11
- handleShow?: () => void
11
+ handleShow?: (event?: KeyboardEvent) => void
12
12
  popper?: boolean
13
13
  portal?: boolean
14
14
  variant?: 'btn-group' | 'dropdown' | 'input-group' | 'nav-item'
@@ -18,17 +18,21 @@ export interface CDropdownToggleProps extends Omit<CButtonProps, 'type'> {
18
18
  */
19
19
  custom?: boolean
20
20
  /**
21
- * If a dropdown `variant` is set to `nav-item` then render the toggler as a link instead of a button.
21
+ * If a dropdown `variant` is set to `nav-item` then render the toggler as a
22
+ * link instead of a button.
22
23
  *
23
24
  * @since 5.0.0
24
25
  */
25
26
  navLink?: boolean
26
27
  /**
27
- * Similarly, create split button dropdowns with virtually the same markup as single button dropdowns, but with the addition of `.dropdown-toggle-split` className for proper spacing around the dropdown caret.
28
+ * Similarly, create split button dropdowns with virtually the same markup as
29
+ * single button dropdowns, but with the addition of `.dropdown-toggle-split`
30
+ * className for proper spacing around the dropdown caret.
28
31
  */
29
32
  split?: boolean
30
33
  /**
31
- * Sets which event handlers youd like provided to your toggle prop. You can specify one trigger or an array of them.
34
+ * Sets which event handlers you'd like provided to your toggle prop. You can
35
+ * specify one trigger or an array of them.
32
36
  *
33
37
  * @type 'hover' | 'focus' | 'click'
34
38
  */
@@ -64,6 +68,12 @@ export const CDropdownToggle: FC<CDropdownToggleProps> = ({
64
68
  onFocus: () => handleShow?.(),
65
69
  onBlur: () => handleHide?.(),
66
70
  }),
71
+ onKeyDown: (event: React.KeyboardEvent) => {
72
+ if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
73
+ event.preventDefault()
74
+ handleShow?.(event.nativeEvent)
75
+ }
76
+ },
67
77
  }
68
78
 
69
79
  const togglerProps = {
@@ -30,7 +30,7 @@ test('CDropdown customize', async () => {
30
30
  visible={true}
31
31
  >
32
32
  Test
33
- </CDropdown>,
33
+ </CDropdown>
34
34
  )
35
35
  expect(container).toMatchSnapshot()
36
36
  expect(container.firstChild).toHaveClass('bazinga')
@@ -66,7 +66,7 @@ test('CDropdown opens on toggle click and closes on clicking outside', async ()
66
66
  <CDropdownItem>B</CDropdownItem>
67
67
  </CDropdownMenu>
68
68
  </CDropdown>
69
- </div>,
69
+ </div>
70
70
  )
71
71
 
72
72
  // Ensure the dropdown is initially closed
@@ -110,7 +110,7 @@ test('CDropdown example', async () => {
110
110
  <CDropdownDivider />
111
111
  <CDropdownItem>D</CDropdownItem>
112
112
  </CDropdownMenu>
113
- </CDropdown>,
113
+ </CDropdown>
114
114
  )
115
115
  expect(container).toMatchSnapshot()
116
116
  })
@@ -12,7 +12,7 @@ test('CDropdownHeader customize', async () => {
12
12
  const { container } = render(
13
13
  <CDropdownHeader className="bazinga" as="h3">
14
14
  Test
15
- </CDropdownHeader>,
15
+ </CDropdownHeader>
16
16
  )
17
17
  expect(container).toMatchSnapshot()
18
18
  expect(container.firstChild).toHaveClass('bazinga')
@@ -12,7 +12,7 @@ test('CDropdownItem customize', async () => {
12
12
  const { container } = render(
13
13
  <CDropdownItem className="bazinga" as="div">
14
14
  Test
15
- </CDropdownItem>,
15
+ </CDropdownItem>
16
16
  )
17
17
  expect(container).toMatchSnapshot()
18
18
  expect(container.firstChild).toHaveClass('bazinga')
@@ -12,7 +12,7 @@ test('CDropdownItemPlain customize', async () => {
12
12
  const { container } = render(
13
13
  <CDropdownItemPlain className="bazinga" as="div">
14
14
  Test
15
- </CDropdownItemPlain>,
15
+ </CDropdownItemPlain>
16
16
  )
17
17
  expect(container).toMatchSnapshot()
18
18
  expect(container.firstChild).toHaveClass('bazinga')
@@ -14,7 +14,7 @@ test('CDropdownMenu customize', async () => {
14
14
  <CDropdownMenu className="bazinga" as="div">
15
15
  Test
16
16
  </CDropdownMenu>
17
- </CDropdown>,
17
+ </CDropdown>
18
18
  )
19
19
  expect(container).toMatchSnapshot()
20
20
  expect(container.firstChild?.firstChild).toHaveClass('bazinga')
@@ -12,7 +12,7 @@ test('CDropdownToggle customize', async () => {
12
12
  const { container } = render(
13
13
  <CDropdownToggle caret={true} color="primary" split={true} trigger="focus">
14
14
  Test
15
- </CDropdownToggle>,
15
+ </CDropdownToggle>
16
16
  )
17
17
  expect(container).toMatchSnapshot()
18
18
  expect(container.firstChild).toHaveClass('dropdown-toggle')
@@ -7,7 +7,7 @@ export const getAlignmentClassNames = (alignment: Alignments) => {
7
7
  if (typeof alignment === 'object') {
8
8
  for (const key in alignment) {
9
9
  classNames.push(
10
- `dropdown-menu${key === 'xs' ? '' : `-${key}`}-${alignment[key as keyof Breakpoints]}`,
10
+ `dropdown-menu${key === 'xs' ? '' : `-${key}`}-${alignment[key as keyof Breakpoints]}`
11
11
  )
12
12
  }
13
13
  }
@@ -23,7 +23,7 @@ export const getPlacement = (
23
23
  placement: Placement,
24
24
  direction: string | undefined,
25
25
  alignment: Alignments | string | undefined,
26
- isRTL: boolean,
26
+ isRTL: boolean
27
27
  ): Placements => {
28
28
  let _placement = placement
29
29
 
@@ -0,0 +1,254 @@
1
+ import React, { FC, ReactElement, cloneElement, useEffect, useRef } from 'react'
2
+ import { mergeRefs, focusableChildren } from './utils'
3
+
4
+ export interface CFocusTrapProps {
5
+ /**
6
+ * Controls whether the focus trap is active or inactive.
7
+ * When `true`, focus will be trapped within the child element.
8
+ * When `false`, normal focus behavior is restored.
9
+ *
10
+ * @default true
11
+ */
12
+ active?: boolean
13
+
14
+ /**
15
+ * Additional container elements to include in the focus trap.
16
+ * Useful for floating elements like tooltips or popovers that are
17
+ * rendered outside the main container but should be part of the trap.
18
+ */
19
+ additionalContainer?: React.RefObject<HTMLElement | null>
20
+
21
+ /**
22
+ * Single React element that renders a DOM node and forwards refs properly.
23
+ * The focus trap will be applied to this element and all its focusable descendants.
24
+ *
25
+ * Requirements:
26
+ * - Must be a single ReactElement (not an array or fragment)
27
+ * - Must forward the ref to a DOM element
28
+ * - Should contain focusable elements for proper trap behavior
29
+ */
30
+ children: ReactElement
31
+
32
+ /**
33
+ * Controls whether to focus the first selectable element or the container itself.
34
+ * When `true`, focuses the first tabbable element within the container.
35
+ * When `false`, focuses the container element directly.
36
+ *
37
+ * This is useful for containers that should receive focus themselves,
38
+ * such as scrollable regions or custom interactive components.
39
+ *
40
+ * @default false
41
+ */
42
+ focusFirstElement?: boolean
43
+
44
+ /**
45
+ * Callback function invoked when the focus trap becomes active.
46
+ * Useful for triggering additional accessibility announcements or analytics.
47
+ */
48
+ onActivate?: () => void
49
+
50
+ /**
51
+ * Callback function invoked when the focus trap is deactivated.
52
+ * Can be used for cleanup, analytics, or triggering state changes.
53
+ */
54
+ onDeactivate?: () => void
55
+
56
+ /**
57
+ * Automatically restores focus to the previously focused element when the trap is deactivated.
58
+ * This is crucial for accessibility as it maintains the user's place in the document
59
+ * when returning from modal dialogs or overlay components.
60
+ *
61
+ * Recommended to be `true` for modal dialogs and popover components.
62
+ *
63
+ * @default true
64
+ */
65
+ restoreFocus?: boolean
66
+ }
67
+
68
+ export const CFocusTrap: FC<CFocusTrapProps> = ({
69
+ active = true,
70
+ additionalContainer,
71
+ children,
72
+ focusFirstElement = false,
73
+ onActivate,
74
+ onDeactivate,
75
+ restoreFocus = true,
76
+ }) => {
77
+ const containerRef = useRef<HTMLElement | null>(null)
78
+ const prevFocusedRef = useRef<HTMLElement | null>(null)
79
+ const isActiveRef = useRef<boolean>(false)
80
+ const lastTabNavDirectionRef = useRef<'forward' | 'backward'>('forward')
81
+ const tabEventSourceRef = useRef<HTMLElement | null>(null)
82
+
83
+ useEffect(() => {
84
+ const container = containerRef.current
85
+ const _additionalContainer = additionalContainer?.current || null
86
+
87
+ if (!active || !container) {
88
+ if (isActiveRef.current) {
89
+ // Deactivate cleanup
90
+ if (restoreFocus && prevFocusedRef.current?.isConnected) {
91
+ prevFocusedRef.current.focus({ preventScroll: true })
92
+ }
93
+
94
+ onDeactivate?.()
95
+ isActiveRef.current = false
96
+ prevFocusedRef.current = null
97
+ }
98
+
99
+ return
100
+ }
101
+
102
+ // Remember focused element BEFORE we move focus into the trap
103
+ prevFocusedRef.current = document.activeElement as HTMLElement | null
104
+
105
+ // Activating…
106
+ isActiveRef.current = true
107
+
108
+ // Set initial focus
109
+ if (focusFirstElement) {
110
+ const elements = focusableChildren(container)
111
+ if (elements.length > 0) {
112
+ elements[0].focus({ preventScroll: true })
113
+ } else {
114
+ // Fallback to container if no focusable elements
115
+ container.focus({ preventScroll: true })
116
+ }
117
+ } else {
118
+ container.focus({ preventScroll: true })
119
+ }
120
+
121
+ onActivate?.()
122
+
123
+ const handleFocusIn = (event: FocusEvent) => {
124
+ // Only handle focus events from tab navigation
125
+ if (containerRef.current !== tabEventSourceRef.current) {
126
+ return
127
+ }
128
+
129
+ const target = event.target as Node
130
+
131
+ // Allow focus within container
132
+ if (target === document || target === container || container.contains(target)) {
133
+ return
134
+ }
135
+
136
+ // Allow focus within additional elements
137
+ if (
138
+ _additionalContainer &&
139
+ (target === _additionalContainer || _additionalContainer.contains(target))
140
+ ) {
141
+ return
142
+ }
143
+
144
+ // Focus escaped, bring it back
145
+ const elements = focusableChildren(container)
146
+
147
+ if (elements.length === 0) {
148
+ container.focus({ preventScroll: true })
149
+ } else if (lastTabNavDirectionRef.current === 'backward') {
150
+ elements.at(-1)?.focus({ preventScroll: true })
151
+ } else {
152
+ elements[0].focus({ preventScroll: true })
153
+ }
154
+ }
155
+
156
+ const handleKeyDown = (event: KeyboardEvent) => {
157
+ if (event.key !== 'Tab') {
158
+ return
159
+ }
160
+
161
+ tabEventSourceRef.current = container
162
+ lastTabNavDirectionRef.current = event.shiftKey ? 'backward' : 'forward'
163
+
164
+ if (!_additionalContainer) {
165
+ return
166
+ }
167
+
168
+ const containerElements = focusableChildren(container)
169
+ const additionalElements = focusableChildren(_additionalContainer)
170
+
171
+ if (containerElements.length === 0 && additionalElements.length === 0) {
172
+ // No focusable elements, prevent tab
173
+ event.preventDefault()
174
+ return
175
+ }
176
+
177
+ const activeElement = document.activeElement as HTMLElement
178
+ const isInContainer = containerElements.includes(activeElement)
179
+ const isInAdditional = additionalElements.includes(activeElement)
180
+
181
+ // Handle tab navigation between container and additional elements
182
+ if (isInContainer) {
183
+ const index = containerElements.indexOf(activeElement)
184
+
185
+ if (
186
+ !event.shiftKey &&
187
+ index === containerElements.length - 1 &&
188
+ additionalElements.length > 0
189
+ ) {
190
+ // Tab forward from last container element to first additional element
191
+ event.preventDefault()
192
+ additionalElements[0].focus({ preventScroll: true })
193
+ } else if (event.shiftKey && index === 0 && additionalElements.length > 0) {
194
+ // Tab backward from first container element to last additional element
195
+ event.preventDefault()
196
+ additionalElements.at(-1)?.focus({ preventScroll: true })
197
+ }
198
+ } else if (isInAdditional) {
199
+ const index = additionalElements.indexOf(activeElement)
200
+
201
+ if (
202
+ !event.shiftKey &&
203
+ index === additionalElements.length - 1 &&
204
+ containerElements.length > 0
205
+ ) {
206
+ // Tab forward from last additional element to first container element
207
+ event.preventDefault()
208
+ containerElements[0].focus({ preventScroll: true })
209
+ } else if (event.shiftKey && index === 0 && containerElements.length > 0) {
210
+ // Tab backward from first additional element to last container element
211
+ event.preventDefault()
212
+ containerElements.at(-1)?.focus({ preventScroll: true })
213
+ }
214
+ }
215
+ }
216
+
217
+ // Add event listeners
218
+ container.addEventListener('keydown', handleKeyDown, true)
219
+ if (_additionalContainer) {
220
+ _additionalContainer.addEventListener('keydown', handleKeyDown, true)
221
+ }
222
+ document.addEventListener('focusin', handleFocusIn, true)
223
+
224
+ // Cleanup function
225
+ return () => {
226
+ container.removeEventListener('keydown', handleKeyDown, true)
227
+ if (_additionalContainer) {
228
+ _additionalContainer.removeEventListener('keydown', handleKeyDown, true)
229
+ }
230
+ document.removeEventListener('focusin', handleFocusIn, true)
231
+
232
+ // On unmount (also considered deactivation)
233
+ if (restoreFocus && prevFocusedRef.current?.isConnected) {
234
+ prevFocusedRef.current.focus({ preventScroll: true })
235
+ }
236
+
237
+ if (isActiveRef.current) {
238
+ onDeactivate?.()
239
+ isActiveRef.current = false
240
+ }
241
+
242
+ prevFocusedRef.current = null
243
+ }
244
+ }, [active, additionalContainer, focusFirstElement, onActivate, onDeactivate, restoreFocus])
245
+
246
+ // Attach our ref to the ONLY child — no extra wrappers
247
+ const onlyChild = React.Children.only(children)
248
+ const childRef = (onlyChild as React.ReactElement & { ref?: React.Ref<HTMLElement> }).ref
249
+ const mergedRef = mergeRefs(childRef, (node: HTMLElement | null) => {
250
+ containerRef.current = node
251
+ })
252
+
253
+ return cloneElement(onlyChild, { ref: mergedRef } as { ref: React.Ref<HTMLElement> })
254
+ }