@coreui/react 5.7.0 → 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 (848) 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 -7
  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 +127 -93
  78. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  79. package/dist/cjs/components/dropdown/CDropdownContext.d.ts +3 -2
  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 +30 -23
  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/@babel/runtime/helpers/esm/extends.js.map +1 -1
  312. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  313. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -1
  314. package/dist/cjs/node_modules/classnames/index.js.map +1 -1
  315. package/dist/cjs/node_modules/dom-helpers/esm/removeClass.js.map +1 -1
  316. package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  317. package/dist/cjs/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  318. package/dist/cjs/node_modules/tslib/tslib.es6.js +0 -51
  319. package/dist/cjs/node_modules/tslib/tslib.es6.js.map +1 -1
  320. package/dist/cjs/props.js +6 -6
  321. package/dist/cjs/props.js.map +1 -1
  322. package/dist/cjs/utils/executeAfterTransition.js +8 -10
  323. package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
  324. package/dist/cjs/utils/getNextActiveElement.js +3 -3
  325. package/dist/cjs/utils/getNextActiveElement.js.map +1 -1
  326. package/dist/cjs/utils/getRTLPlacement.js +1 -1
  327. package/dist/cjs/utils/getRTLPlacement.js.map +1 -1
  328. package/dist/cjs/utils/getTransitionDurationFromElement.js +4 -4
  329. package/dist/cjs/utils/getTransitionDurationFromElement.js.map +1 -1
  330. package/dist/cjs/utils/isInViewport.js +2 -2
  331. package/dist/cjs/utils/isInViewport.js.map +1 -1
  332. package/dist/cjs/utils/isRTL.js +1 -1
  333. package/dist/cjs/utils/isRTL.js.map +1 -1
  334. package/dist/esm/components/accordion/CAccordion.js +6 -6
  335. package/dist/esm/components/accordion/CAccordion.js.map +1 -1
  336. package/dist/esm/components/accordion/CAccordionBody.js +5 -5
  337. package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
  338. package/dist/esm/components/accordion/CAccordionButton.js +5 -5
  339. package/dist/esm/components/accordion/CAccordionButton.js.map +1 -1
  340. package/dist/esm/components/accordion/CAccordionContext.js +1 -1
  341. package/dist/esm/components/accordion/CAccordionContext.js.map +1 -1
  342. package/dist/esm/components/accordion/CAccordionHeader.js +4 -4
  343. package/dist/esm/components/accordion/CAccordionHeader.js.map +1 -1
  344. package/dist/esm/components/accordion/CAccordionItem.js +12 -12
  345. package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
  346. package/dist/esm/components/accordion/CAccordionItemContext.js +1 -1
  347. package/dist/esm/components/accordion/CAccordionItemContext.js.map +1 -1
  348. package/dist/esm/components/alert/CAlert.js +9 -9
  349. package/dist/esm/components/alert/CAlert.js.map +1 -1
  350. package/dist/esm/components/alert/CAlertHeading.js +4 -4
  351. package/dist/esm/components/alert/CAlertHeading.js.map +1 -1
  352. package/dist/esm/components/alert/CAlertLink.js +4 -4
  353. package/dist/esm/components/alert/CAlertLink.js.map +1 -1
  354. package/dist/esm/components/avatar/CAvatar.js +9 -10
  355. package/dist/esm/components/avatar/CAvatar.js.map +1 -1
  356. package/dist/esm/components/backdrop/CBackdrop.js +7 -7
  357. package/dist/esm/components/backdrop/CBackdrop.js.map +1 -1
  358. package/dist/esm/components/badge/CBadge.js +14 -15
  359. package/dist/esm/components/badge/CBadge.js.map +1 -1
  360. package/dist/esm/components/breadcrumb/CBreadcrumb.js +4 -4
  361. package/dist/esm/components/breadcrumb/CBreadcrumb.js.map +1 -1
  362. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js +4 -4
  363. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  364. package/dist/esm/components/button/CButton.js +9 -8
  365. package/dist/esm/components/button/CButton.js.map +1 -1
  366. package/dist/esm/components/button-group/CButtonGroup.js +4 -5
  367. package/dist/esm/components/button-group/CButtonGroup.js.map +1 -1
  368. package/dist/esm/components/button-group/CButtonToolbar.js +4 -4
  369. package/dist/esm/components/button-group/CButtonToolbar.js.map +1 -1
  370. package/dist/esm/components/callout/CCallout.js +6 -7
  371. package/dist/esm/components/callout/CCallout.js.map +1 -1
  372. package/dist/esm/components/card/CCard.js +8 -9
  373. package/dist/esm/components/card/CCard.js.map +1 -1
  374. package/dist/esm/components/card/CCardBody.js +4 -4
  375. package/dist/esm/components/card/CCardBody.js.map +1 -1
  376. package/dist/esm/components/card/CCardFooter.js +4 -4
  377. package/dist/esm/components/card/CCardFooter.js.map +1 -1
  378. package/dist/esm/components/card/CCardGroup.js +4 -4
  379. package/dist/esm/components/card/CCardGroup.js.map +1 -1
  380. package/dist/esm/components/card/CCardHeader.js +4 -4
  381. package/dist/esm/components/card/CCardHeader.js.map +1 -1
  382. package/dist/esm/components/card/CCardImage.js +4 -4
  383. package/dist/esm/components/card/CCardImage.js.map +1 -1
  384. package/dist/esm/components/card/CCardImageOverlay.js +4 -4
  385. package/dist/esm/components/card/CCardImageOverlay.js.map +1 -1
  386. package/dist/esm/components/card/CCardLink.js +4 -4
  387. package/dist/esm/components/card/CCardLink.js.map +1 -1
  388. package/dist/esm/components/card/CCardSubtitle.js +4 -4
  389. package/dist/esm/components/card/CCardSubtitle.js.map +1 -1
  390. package/dist/esm/components/card/CCardText.js +4 -4
  391. package/dist/esm/components/card/CCardText.js.map +1 -1
  392. package/dist/esm/components/card/CCardTitle.js +4 -4
  393. package/dist/esm/components/card/CCardTitle.js.map +1 -1
  394. package/dist/esm/components/carousel/CCarousel.js +42 -42
  395. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  396. package/dist/esm/components/carousel/CCarouselCaption.js +4 -4
  397. package/dist/esm/components/carousel/CCarouselCaption.js.map +1 -1
  398. package/dist/esm/components/carousel/CCarouselContext.js +1 -1
  399. package/dist/esm/components/carousel/CCarouselContext.js.map +1 -1
  400. package/dist/esm/components/carousel/CCarouselItem.js +22 -22
  401. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  402. package/dist/esm/components/close-button/CCloseButton.js +4 -4
  403. package/dist/esm/components/close-button/CCloseButton.js.map +1 -1
  404. package/dist/esm/components/collapse/CCollapse.js +17 -17
  405. package/dist/esm/components/collapse/CCollapse.js.map +1 -1
  406. package/dist/esm/components/conditional-portal/CConditionalPortal.js +4 -5
  407. package/dist/esm/components/conditional-portal/CConditionalPortal.js.map +1 -1
  408. package/dist/esm/components/dropdown/CDropdown.d.ts +20 -9
  409. package/dist/esm/components/dropdown/CDropdown.js +129 -95
  410. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  411. package/dist/esm/components/dropdown/CDropdownContext.d.ts +3 -2
  412. package/dist/esm/components/dropdown/CDropdownContext.js +1 -1
  413. package/dist/esm/components/dropdown/CDropdownContext.js.map +1 -1
  414. package/dist/esm/components/dropdown/CDropdownDivider.js +4 -4
  415. package/dist/esm/components/dropdown/CDropdownDivider.js.map +1 -1
  416. package/dist/esm/components/dropdown/CDropdownHeader.js +4 -4
  417. package/dist/esm/components/dropdown/CDropdownHeader.js.map +1 -1
  418. package/dist/esm/components/dropdown/CDropdownItem.js +4 -4
  419. package/dist/esm/components/dropdown/CDropdownItem.js.map +1 -1
  420. package/dist/esm/components/dropdown/CDropdownItemPlain.js +4 -4
  421. package/dist/esm/components/dropdown/CDropdownItemPlain.js.map +1 -1
  422. package/dist/esm/components/dropdown/CDropdownMenu.js +7 -7
  423. package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
  424. package/dist/esm/components/dropdown/CDropdownToggle.d.ts +7 -3
  425. package/dist/esm/components/dropdown/CDropdownToggle.js +31 -24
  426. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  427. package/dist/esm/components/dropdown/utils.js +7 -7
  428. package/dist/esm/components/dropdown/utils.js.map +1 -1
  429. package/dist/esm/components/focus-trap/CFocusTrap.d.ts +59 -0
  430. package/dist/esm/components/focus-trap/CFocusTrap.js +160 -0
  431. package/dist/esm/components/focus-trap/CFocusTrap.js.map +1 -0
  432. package/dist/esm/components/focus-trap/index.d.ts +2 -0
  433. package/dist/esm/components/focus-trap/utils.d.ts +36 -0
  434. package/dist/esm/components/focus-trap/utils.js +107 -0
  435. package/dist/esm/components/focus-trap/utils.js.map +1 -0
  436. package/dist/esm/components/footer/CFooter.js +4 -5
  437. package/dist/esm/components/footer/CFooter.js.map +1 -1
  438. package/dist/esm/components/form/CForm.js +4 -4
  439. package/dist/esm/components/form/CForm.js.map +1 -1
  440. package/dist/esm/components/form/CFormCheck.js +17 -20
  441. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  442. package/dist/esm/components/form/CFormControlValidation.js +2 -4
  443. package/dist/esm/components/form/CFormControlValidation.js.map +1 -1
  444. package/dist/esm/components/form/CFormControlWrapper.js +3 -5
  445. package/dist/esm/components/form/CFormControlWrapper.js.map +1 -1
  446. package/dist/esm/components/form/CFormFeedback.js +7 -8
  447. package/dist/esm/components/form/CFormFeedback.js.map +1 -1
  448. package/dist/esm/components/form/CFormFloating.js +4 -4
  449. package/dist/esm/components/form/CFormFloating.js.map +1 -1
  450. package/dist/esm/components/form/CFormInput.js +14 -15
  451. package/dist/esm/components/form/CFormInput.js.map +1 -1
  452. package/dist/esm/components/form/CFormLabel.js +4 -4
  453. package/dist/esm/components/form/CFormLabel.js.map +1 -1
  454. package/dist/esm/components/form/CFormRange.js +4 -4
  455. package/dist/esm/components/form/CFormRange.js.map +1 -1
  456. package/dist/esm/components/form/CFormSelect.js +11 -12
  457. package/dist/esm/components/form/CFormSelect.js.map +1 -1
  458. package/dist/esm/components/form/CFormSwitch.js +11 -13
  459. package/dist/esm/components/form/CFormSwitch.js.map +1 -1
  460. package/dist/esm/components/form/CFormText.js +4 -4
  461. package/dist/esm/components/form/CFormText.js.map +1 -1
  462. package/dist/esm/components/form/CFormTextarea.js +5 -5
  463. package/dist/esm/components/form/CFormTextarea.js.map +1 -1
  464. package/dist/esm/components/form/CInputGroup.js +6 -7
  465. package/dist/esm/components/form/CInputGroup.js.map +1 -1
  466. package/dist/esm/components/form/CInputGroupText.js +4 -4
  467. package/dist/esm/components/form/CInputGroupText.js.map +1 -1
  468. package/dist/esm/components/grid/CCol.js +17 -17
  469. package/dist/esm/components/grid/CCol.js.map +1 -1
  470. package/dist/esm/components/grid/CContainer.js +9 -9
  471. package/dist/esm/components/grid/CContainer.js.map +1 -1
  472. package/dist/esm/components/grid/CRow.js +14 -14
  473. package/dist/esm/components/grid/CRow.js.map +1 -1
  474. package/dist/esm/components/header/CHeader.js +4 -5
  475. package/dist/esm/components/header/CHeader.js.map +1 -1
  476. package/dist/esm/components/header/CHeaderBrand.js +4 -4
  477. package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
  478. package/dist/esm/components/header/CHeaderDivider.js +4 -4
  479. package/dist/esm/components/header/CHeaderDivider.js.map +1 -1
  480. package/dist/esm/components/header/CHeaderNav.js +4 -4
  481. package/dist/esm/components/header/CHeaderNav.js.map +1 -1
  482. package/dist/esm/components/header/CHeaderText.js +4 -4
  483. package/dist/esm/components/header/CHeaderText.js.map +1 -1
  484. package/dist/esm/components/header/CHeaderToggler.js +4 -4
  485. package/dist/esm/components/header/CHeaderToggler.js.map +1 -1
  486. package/dist/esm/components/image/CImage.js +10 -11
  487. package/dist/esm/components/image/CImage.js.map +1 -1
  488. package/dist/esm/components/index.d.ts +1 -0
  489. package/dist/esm/components/link/CLink.js +6 -6
  490. package/dist/esm/components/link/CLink.js.map +1 -1
  491. package/dist/esm/components/list-group/CListGroup.js +7 -9
  492. package/dist/esm/components/list-group/CListGroup.js.map +1 -1
  493. package/dist/esm/components/list-group/CListGroupItem.js +14 -15
  494. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  495. package/dist/esm/components/modal/CModal.js +27 -35
  496. package/dist/esm/components/modal/CModal.js.map +1 -1
  497. package/dist/esm/components/modal/CModalBody.js +4 -4
  498. package/dist/esm/components/modal/CModalBody.js.map +1 -1
  499. package/dist/esm/components/modal/CModalContent.js +4 -4
  500. package/dist/esm/components/modal/CModalContent.js.map +1 -1
  501. package/dist/esm/components/modal/CModalContext.js +1 -1
  502. package/dist/esm/components/modal/CModalContext.js.map +1 -1
  503. package/dist/esm/components/modal/CModalDialog.js +10 -12
  504. package/dist/esm/components/modal/CModalDialog.js.map +1 -1
  505. package/dist/esm/components/modal/CModalFooter.js +4 -4
  506. package/dist/esm/components/modal/CModalFooter.js.map +1 -1
  507. package/dist/esm/components/modal/CModalHeader.js +6 -6
  508. package/dist/esm/components/modal/CModalHeader.js.map +1 -1
  509. package/dist/esm/components/modal/CModalTitle.js +4 -4
  510. package/dist/esm/components/modal/CModalTitle.js.map +1 -1
  511. package/dist/esm/components/nav/CNav.js +8 -8
  512. package/dist/esm/components/nav/CNav.js.map +1 -1
  513. package/dist/esm/components/nav/CNavGroup.js +25 -25
  514. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  515. package/dist/esm/components/nav/CNavGroupItems.js +4 -4
  516. package/dist/esm/components/nav/CNavGroupItems.js.map +1 -1
  517. package/dist/esm/components/nav/CNavItem.js +4 -4
  518. package/dist/esm/components/nav/CNavItem.js.map +1 -1
  519. package/dist/esm/components/nav/CNavLink.js +8 -8
  520. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  521. package/dist/esm/components/nav/CNavTitle.js +4 -4
  522. package/dist/esm/components/nav/CNavTitle.js.map +1 -1
  523. package/dist/esm/components/navbar/CNavbar.js +7 -8
  524. package/dist/esm/components/navbar/CNavbar.js.map +1 -1
  525. package/dist/esm/components/navbar/CNavbarBrand.js +5 -5
  526. package/dist/esm/components/navbar/CNavbarBrand.js.map +1 -1
  527. package/dist/esm/components/navbar/CNavbarNav.js +4 -4
  528. package/dist/esm/components/navbar/CNavbarNav.js.map +1 -1
  529. package/dist/esm/components/navbar/CNavbarText.js +4 -4
  530. package/dist/esm/components/navbar/CNavbarText.js.map +1 -1
  531. package/dist/esm/components/navbar/CNavbarToggler.js +4 -4
  532. package/dist/esm/components/navbar/CNavbarToggler.js.map +1 -1
  533. package/dist/esm/components/offcanvas/COffcanvas.js +21 -22
  534. package/dist/esm/components/offcanvas/COffcanvas.js.map +1 -1
  535. package/dist/esm/components/offcanvas/COffcanvasBody.js +4 -4
  536. package/dist/esm/components/offcanvas/COffcanvasBody.js.map +1 -1
  537. package/dist/esm/components/offcanvas/COffcanvasHeader.js +4 -4
  538. package/dist/esm/components/offcanvas/COffcanvasHeader.js.map +1 -1
  539. package/dist/esm/components/offcanvas/COffcanvasTitle.js +4 -4
  540. package/dist/esm/components/offcanvas/COffcanvasTitle.js.map +1 -1
  541. package/dist/esm/components/pagination/CPagination.js +8 -9
  542. package/dist/esm/components/pagination/CPagination.js.map +1 -1
  543. package/dist/esm/components/pagination/CPaginationItem.js +6 -6
  544. package/dist/esm/components/pagination/CPaginationItem.js.map +1 -1
  545. package/dist/esm/components/placeholder/CPlaceholder.js +14 -15
  546. package/dist/esm/components/placeholder/CPlaceholder.js.map +1 -1
  547. package/dist/esm/components/popover/CPopover.js +30 -30
  548. package/dist/esm/components/popover/CPopover.js.map +1 -1
  549. package/dist/esm/components/progress/CProgress.js +9 -9
  550. package/dist/esm/components/progress/CProgress.js.map +1 -1
  551. package/dist/esm/components/progress/CProgressBar.js +9 -10
  552. package/dist/esm/components/progress/CProgressBar.js.map +1 -1
  553. package/dist/esm/components/progress/CProgressStacked.js +4 -4
  554. package/dist/esm/components/progress/CProgressStacked.js.map +1 -1
  555. package/dist/esm/components/progress/CProgressStackedContext.js +1 -1
  556. package/dist/esm/components/progress/CProgressStackedContext.js.map +1 -1
  557. package/dist/esm/components/sidebar/CSidebar.js +35 -38
  558. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  559. package/dist/esm/components/sidebar/CSidebarBrand.js +4 -4
  560. package/dist/esm/components/sidebar/CSidebarBrand.js.map +1 -1
  561. package/dist/esm/components/sidebar/CSidebarFooter.js +4 -4
  562. package/dist/esm/components/sidebar/CSidebarFooter.js.map +1 -1
  563. package/dist/esm/components/sidebar/CSidebarHeader.js +4 -4
  564. package/dist/esm/components/sidebar/CSidebarHeader.js.map +1 -1
  565. package/dist/esm/components/sidebar/CSidebarNav.js +15 -15
  566. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  567. package/dist/esm/components/sidebar/CSidebarNavContext.js +1 -1
  568. package/dist/esm/components/sidebar/CSidebarNavContext.js.map +1 -1
  569. package/dist/esm/components/sidebar/CSidebarToggler.js +4 -4
  570. package/dist/esm/components/sidebar/CSidebarToggler.js.map +1 -1
  571. package/dist/esm/components/spinner/CSpinner.js +7 -8
  572. package/dist/esm/components/spinner/CSpinner.js.map +1 -1
  573. package/dist/esm/components/table/CTable.js +26 -27
  574. package/dist/esm/components/table/CTable.js.map +1 -1
  575. package/dist/esm/components/table/CTableBody.js +6 -7
  576. package/dist/esm/components/table/CTableBody.js.map +1 -1
  577. package/dist/esm/components/table/CTableCaption.js +4 -4
  578. package/dist/esm/components/table/CTableCaption.js.map +1 -1
  579. package/dist/esm/components/table/CTableDataCell.js +9 -10
  580. package/dist/esm/components/table/CTableDataCell.js.map +1 -1
  581. package/dist/esm/components/table/CTableFoot.js +6 -7
  582. package/dist/esm/components/table/CTableFoot.js.map +1 -1
  583. package/dist/esm/components/table/CTableHead.js +6 -7
  584. package/dist/esm/components/table/CTableHead.js.map +1 -1
  585. package/dist/esm/components/table/CTableHeaderCell.js +6 -7
  586. package/dist/esm/components/table/CTableHeaderCell.js.map +1 -1
  587. package/dist/esm/components/table/CTableResponsiveWrapper.js +4 -4
  588. package/dist/esm/components/table/CTableResponsiveWrapper.js.map +1 -1
  589. package/dist/esm/components/table/CTableRow.js +8 -9
  590. package/dist/esm/components/table/CTableRow.js.map +1 -1
  591. package/dist/esm/components/table/utils.js +9 -13
  592. package/dist/esm/components/table/utils.js.map +1 -1
  593. package/dist/esm/components/tabs/CTab.js +7 -7
  594. package/dist/esm/components/tabs/CTab.js.map +1 -1
  595. package/dist/esm/components/tabs/CTabContent.js +4 -4
  596. package/dist/esm/components/tabs/CTabContent.js.map +1 -1
  597. package/dist/esm/components/tabs/CTabList.js +14 -14
  598. package/dist/esm/components/tabs/CTabList.js.map +1 -1
  599. package/dist/esm/components/tabs/CTabPane.js +7 -7
  600. package/dist/esm/components/tabs/CTabPane.js.map +1 -1
  601. package/dist/esm/components/tabs/CTabPanel.js +11 -11
  602. package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
  603. package/dist/esm/components/tabs/CTabs.js +7 -8
  604. package/dist/esm/components/tabs/CTabs.js.map +1 -1
  605. package/dist/esm/components/tabs/CTabsContext.js +1 -1
  606. package/dist/esm/components/tabs/CTabsContext.js.map +1 -1
  607. package/dist/esm/components/toast/CToast.js +22 -26
  608. package/dist/esm/components/toast/CToast.js.map +1 -1
  609. package/dist/esm/components/toast/CToastBody.js +4 -4
  610. package/dist/esm/components/toast/CToastBody.js.map +1 -1
  611. package/dist/esm/components/toast/CToastClose.js +6 -6
  612. package/dist/esm/components/toast/CToastClose.js.map +1 -1
  613. package/dist/esm/components/toast/CToastContext.js +1 -1
  614. package/dist/esm/components/toast/CToastContext.js.map +1 -1
  615. package/dist/esm/components/toast/CToastHeader.js +4 -4
  616. package/dist/esm/components/toast/CToastHeader.js.map +1 -1
  617. package/dist/esm/components/toast/CToaster.js +13 -14
  618. package/dist/esm/components/toast/CToaster.js.map +1 -1
  619. package/dist/esm/components/tooltip/CTooltip.js +31 -31
  620. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  621. package/dist/esm/components/widgets/CWidgetStatsA.js +4 -5
  622. package/dist/esm/components/widgets/CWidgetStatsA.js.map +1 -1
  623. package/dist/esm/components/widgets/CWidgetStatsB.js +5 -5
  624. package/dist/esm/components/widgets/CWidgetStatsB.js.map +1 -1
  625. package/dist/esm/components/widgets/CWidgetStatsC.js +5 -5
  626. package/dist/esm/components/widgets/CWidgetStatsC.js.map +1 -1
  627. package/dist/esm/components/widgets/CWidgetStatsD.js +8 -9
  628. package/dist/esm/components/widgets/CWidgetStatsD.js.map +1 -1
  629. package/dist/esm/components/widgets/CWidgetStatsE.js +4 -4
  630. package/dist/esm/components/widgets/CWidgetStatsE.js.map +1 -1
  631. package/dist/esm/components/widgets/CWidgetStatsF.js +7 -7
  632. package/dist/esm/components/widgets/CWidgetStatsF.js.map +1 -1
  633. package/dist/esm/hooks/useClipboard.js +22 -34
  634. package/dist/esm/hooks/useClipboard.js.map +1 -1
  635. package/dist/esm/hooks/useColorModes.js +15 -20
  636. package/dist/esm/hooks/useColorModes.js.map +1 -1
  637. package/dist/esm/hooks/useForkedRef.js +6 -10
  638. package/dist/esm/hooks/useForkedRef.js.map +1 -1
  639. package/dist/esm/hooks/usePopper.js +11 -11
  640. package/dist/esm/hooks/usePopper.js.map +1 -1
  641. package/dist/esm/index.js +1 -0
  642. package/dist/esm/index.js.map +1 -1
  643. package/dist/esm/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -1
  644. package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  645. package/dist/esm/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -1
  646. package/dist/esm/node_modules/classnames/index.js.map +1 -1
  647. package/dist/esm/node_modules/dom-helpers/esm/removeClass.js.map +1 -1
  648. package/dist/esm/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  649. package/dist/esm/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  650. package/dist/esm/node_modules/tslib/tslib.es6.js +1 -50
  651. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
  652. package/dist/esm/props.js +6 -6
  653. package/dist/esm/props.js.map +1 -1
  654. package/dist/esm/utils/executeAfterTransition.js +8 -10
  655. package/dist/esm/utils/executeAfterTransition.js.map +1 -1
  656. package/dist/esm/utils/getNextActiveElement.js +3 -3
  657. package/dist/esm/utils/getNextActiveElement.js.map +1 -1
  658. package/dist/esm/utils/getRTLPlacement.js +1 -1
  659. package/dist/esm/utils/getRTLPlacement.js.map +1 -1
  660. package/dist/esm/utils/getTransitionDurationFromElement.js +4 -4
  661. package/dist/esm/utils/getTransitionDurationFromElement.js.map +1 -1
  662. package/dist/esm/utils/isInViewport.js +2 -2
  663. package/dist/esm/utils/isInViewport.js.map +1 -1
  664. package/dist/esm/utils/isRTL.js +1 -1
  665. package/dist/esm/utils/isRTL.js.map +1 -1
  666. package/package.json +13 -13
  667. package/src/components/accordion/CAccordion.tsx +1 -1
  668. package/src/components/accordion/CAccordionHeader.tsx +1 -1
  669. package/src/components/alert/CAlert.tsx +3 -3
  670. package/src/components/alert/CAlertHeading.tsx +1 -1
  671. package/src/components/alert/CAlertLink.tsx +1 -1
  672. package/src/components/alert/__tests__/CAlertHeading.spec.tsx +1 -1
  673. package/src/components/alert/__tests__/CAlertLink.spec.tsx +1 -1
  674. package/src/components/avatar/CAvatar.tsx +2 -2
  675. package/src/components/avatar/__tests__/CAvatar.spec.tsx +2 -2
  676. package/src/components/backdrop/CBackdrop.tsx +1 -1
  677. package/src/components/backdrop/__tests__/CBackdrop.spec.tsx +1 -1
  678. package/src/components/badge/CBadge.tsx +3 -3
  679. package/src/components/badge/__tests__/CBadge.spec.tsx +1 -1
  680. package/src/components/breadcrumb/CBreadcrumb.tsx +1 -1
  681. package/src/components/breadcrumb/CBreadcrumbItem.tsx +2 -2
  682. package/src/components/breadcrumb/__tests__/CBreadcrumb.spec.tsx +1 -1
  683. package/src/components/breadcrumb/__tests__/CBreadcrumbItem.spec.tsx +1 -1
  684. package/src/components/button/CButton.tsx +3 -2
  685. package/src/components/button/__tests__/CButton.spec.tsx +2 -2
  686. package/src/components/button-group/CButtonGroup.tsx +2 -2
  687. package/src/components/button-group/CButtonToolbar.tsx +1 -1
  688. package/src/components/button-group/__tests__/CButtonGroup.spec.tsx +2 -2
  689. package/src/components/button-group/__tests__/CButtonToolbar.spec.tsx +1 -1
  690. package/src/components/callout/CCallout.tsx +2 -2
  691. package/src/components/callout/__tests__/CCallout.spec.tsx +1 -1
  692. package/src/components/card/CCard.tsx +2 -2
  693. package/src/components/card/CCardBody.tsx +1 -1
  694. package/src/components/card/CCardFooter.tsx +1 -1
  695. package/src/components/card/CCardGroup.tsx +1 -1
  696. package/src/components/card/CCardImageOverlay.tsx +1 -1
  697. package/src/components/card/CCardLink.tsx +1 -1
  698. package/src/components/card/CCardSubtitle.tsx +1 -1
  699. package/src/components/card/__tests__/CCard.spec.tsx +1 -1
  700. package/src/components/card/__tests__/CCardGroup.spec.tsx +1 -1
  701. package/src/components/card/__tests__/CCardHeader.spec.tsx +1 -1
  702. package/src/components/card/__tests__/CCardLink.spec.tsx +1 -1
  703. package/src/components/card/__tests__/CCardSubtitle.spec.tsx +1 -1
  704. package/src/components/card/__tests__/CCardText.spec.tsx +1 -1
  705. package/src/components/card/__tests__/CCardTitle.spec.tsx +1 -1
  706. package/src/components/carousel/__tests__/CCarousel.spec.tsx +3 -3
  707. package/src/components/close-button/CCloseButton.tsx +2 -2
  708. package/src/components/collapse/CCollapse.tsx +1 -1
  709. package/src/components/dropdown/CDropdown.tsx +175 -107
  710. package/src/components/dropdown/CDropdownContext.ts +3 -3
  711. package/src/components/dropdown/CDropdownToggle.tsx +43 -31
  712. package/src/components/dropdown/__tests__/CDropdown.spec.tsx +3 -3
  713. package/src/components/dropdown/__tests__/CDropdownHeader.spec.tsx +1 -1
  714. package/src/components/dropdown/__tests__/CDropdownItem.spec.tsx +1 -1
  715. package/src/components/dropdown/__tests__/CDropdownItemPlain.spec.tsx +1 -1
  716. package/src/components/dropdown/__tests__/CDropdownMenu.spec.tsx +1 -1
  717. package/src/components/dropdown/__tests__/CDropdownToggle.spec.tsx +1 -1
  718. package/src/components/dropdown/utils.ts +2 -2
  719. package/src/components/focus-trap/CFocusTrap.tsx +254 -0
  720. package/src/components/focus-trap/__tests__/CFocusTrap.spec.tsx +232 -0
  721. package/src/components/focus-trap/__tests__/__snapshots__/CFocusTrap.spec.tsx.snap +21 -0
  722. package/src/components/focus-trap/index.ts +3 -0
  723. package/src/components/focus-trap/utils.ts +121 -0
  724. package/src/components/footer/CFooter.tsx +1 -1
  725. package/src/components/footer/__tests__/CFooter.spec.tsx +1 -1
  726. package/src/components/form/CForm.tsx +1 -1
  727. package/src/components/form/CFormCheck.tsx +5 -5
  728. package/src/components/form/CFormFeedback.tsx +2 -2
  729. package/src/components/form/CFormFloating.tsx +1 -1
  730. package/src/components/form/CFormInput.tsx +4 -4
  731. package/src/components/form/CFormLabel.tsx +1 -1
  732. package/src/components/form/CFormRange.tsx +1 -1
  733. package/src/components/form/CFormSelect.tsx +3 -3
  734. package/src/components/form/CFormSwitch.tsx +2 -2
  735. package/src/components/form/CFormTextarea.tsx +3 -3
  736. package/src/components/form/CInputGroup.tsx +2 -2
  737. package/src/components/form/CInputGroupText.tsx +1 -1
  738. package/src/components/form/__tests__/CForm.spec.tsx +2 -2
  739. package/src/components/form/__tests__/CFormCheck.spec.tsx +2 -2
  740. package/src/components/form/__tests__/CFormControl.spec.tsx +1 -1
  741. package/src/components/form/__tests__/CFormFeedback.spec.tsx +2 -2
  742. package/src/components/form/__tests__/CFormInput.spec.tsx +1 -1
  743. package/src/components/form/__tests__/CFormRange.spec.tsx +1 -1
  744. package/src/components/form/__tests__/CFormSelect.spec.tsx +1 -1
  745. package/src/components/form/__tests__/CFormSwitch.spec.tsx +1 -1
  746. package/src/components/form/__tests__/CFormText.spec.tsx +1 -1
  747. package/src/components/form/__tests__/CFormTextarea.spec.tsx +1 -1
  748. package/src/components/form/__tests__/CInputGroup.spec.tsx +1 -1
  749. package/src/components/form/__tests__/CInputGroupText.spec.tsx +1 -1
  750. package/src/components/grid/CCol.tsx +2 -2
  751. package/src/components/grid/CContainer.tsx +2 -2
  752. package/src/components/grid/CRow.tsx +1 -1
  753. package/src/components/grid/__tests__/CCol.spec.tsx +2 -2
  754. package/src/components/grid/__tests__/CContainer.spec.tsx +2 -2
  755. package/src/components/grid/__tests__/CRow.spec.tsx +5 -5
  756. package/src/components/header/CHeader.tsx +1 -1
  757. package/src/components/header/CHeaderDivider.tsx +1 -1
  758. package/src/components/header/CHeaderText.tsx +1 -1
  759. package/src/components/header/CHeaderToggler.tsx +1 -1
  760. package/src/components/header/__tests__/CHeader.spec.tsx +1 -1
  761. package/src/components/header/__tests__/CHeaderBrand.spec.tsx +1 -1
  762. package/src/components/header/__tests__/CHeaderNav.spec.tsx +1 -1
  763. package/src/components/image/CImage.tsx +2 -2
  764. package/src/components/image/__tests__/CImage.spec.tsx +1 -1
  765. package/src/components/index.ts +1 -0
  766. package/src/components/link/__tests__/CLink.spec.tsx +3 -3
  767. package/src/components/list-group/CListGroup.tsx +1 -1
  768. package/src/components/list-group/CListGroupItem.tsx +2 -2
  769. package/src/components/list-group/__tests__/CListGroup.spec.tsx +2 -2
  770. package/src/components/list-group/__tests__/CListGroupItem.spec.tsx +1 -1
  771. package/src/components/modal/CModal.tsx +5 -13
  772. package/src/components/modal/CModalBody.tsx +1 -1
  773. package/src/components/modal/CModalContent.tsx +1 -1
  774. package/src/components/modal/CModalDialog.tsx +2 -2
  775. package/src/components/modal/CModalFooter.tsx +1 -1
  776. package/src/components/modal/CModalHeader.tsx +1 -1
  777. package/src/components/modal/__tests__/CModal.spec.tsx +2 -2
  778. package/src/components/modal/__tests__/CModalDialog.spec.tsx +1 -1
  779. package/src/components/modal/__tests__/CModalTitle.spec.tsx +1 -1
  780. package/src/components/nav/CNavGroup.tsx +2 -2
  781. package/src/components/nav/CNavGroupItems.tsx +1 -1
  782. package/src/components/nav/__tests__/CNavGroup.spec.tsx +1 -1
  783. package/src/components/nav/__tests__/CNavItem.spec.tsx +1 -1
  784. package/src/components/nav/__tests__/CNavLink.spec.tsx +1 -1
  785. package/src/components/navbar/CNavbar.tsx +3 -3
  786. package/src/components/navbar/CNavbarText.tsx +1 -1
  787. package/src/components/navbar/CNavbarToggler.tsx +1 -1
  788. package/src/components/navbar/__tests__/CNavbar.spec.tsx +2 -2
  789. package/src/components/navbar/__tests__/CNavbarBrand.spec.tsx +1 -1
  790. package/src/components/navbar/__tests__/CNavbarNav.spec.tsx +1 -1
  791. package/src/components/offcanvas/COffcanvas.tsx +26 -24
  792. package/src/components/offcanvas/COffcanvasBody.tsx +1 -1
  793. package/src/components/offcanvas/COffcanvasHeader.tsx +1 -1
  794. package/src/components/offcanvas/COffcanvasTitle.tsx +1 -1
  795. package/src/components/offcanvas/__tests__/COffcanvasTitle.spec.tsx +1 -1
  796. package/src/components/pagination/CPagination.tsx +2 -2
  797. package/src/components/pagination/CPaginationItem.tsx +2 -2
  798. package/src/components/pagination/__tests__/CPagination.spec.tsx +2 -2
  799. package/src/components/pagination/__tests__/CPaginationItem.spec.tsx +1 -1
  800. package/src/components/placeholder/CPlaceholder.tsx +2 -2
  801. package/src/components/placeholder/__tests__/CPlaceholder.spec.tsx +1 -1
  802. package/src/components/progress/CProgress.tsx +3 -3
  803. package/src/components/progress/CProgressBar.tsx +2 -2
  804. package/src/components/progress/__tests__/CProgress.spec.tsx +1 -1
  805. package/src/components/progress/__tests__/CProgressBar.spec.tsx +1 -1
  806. package/src/components/sidebar/CSidebarFooter.tsx +1 -1
  807. package/src/components/sidebar/CSidebarHeader.tsx +1 -1
  808. package/src/components/sidebar/CSidebarToggler.tsx +1 -1
  809. package/src/components/sidebar/__tests__/CSidebar.spec.tsx +2 -2
  810. package/src/components/spinner/CSpinner.tsx +3 -3
  811. package/src/components/spinner/__tests__/CSpinner.spec.tsx +1 -1
  812. package/src/components/table/CTable.tsx +3 -3
  813. package/src/components/table/CTableBody.tsx +2 -2
  814. package/src/components/table/CTableDataCell.tsx +2 -2
  815. package/src/components/table/CTableFoot.tsx +2 -2
  816. package/src/components/table/CTableHead.tsx +2 -2
  817. package/src/components/table/CTableHeaderCell.tsx +2 -2
  818. package/src/components/table/CTableRow.tsx +2 -2
  819. package/src/components/table/__tests__/CTable.spec.tsx +2 -2
  820. package/src/components/table/__tests__/CTableBody.spec.tsx +1 -1
  821. package/src/components/table/__tests__/CTableDataCell.spec.tsx +2 -2
  822. package/src/components/table/__tests__/CTableFoot.spec.tsx +1 -1
  823. package/src/components/table/__tests__/CTableHead.spec.tsx +1 -1
  824. package/src/components/table/__tests__/CTableHeaderCell.spec.tsx +2 -2
  825. package/src/components/table/__tests__/CTableRow.spec.tsx +2 -2
  826. package/src/components/tabs/CTab.tsx +2 -2
  827. package/src/components/tabs/CTabContent.tsx +1 -1
  828. package/src/components/tabs/CTabPane.tsx +2 -2
  829. package/src/components/tabs/CTabPanel.tsx +2 -2
  830. package/src/components/toast/CToastBody.tsx +1 -1
  831. package/src/components/toast/CToastHeader.tsx +1 -1
  832. package/src/components/toast/__tests__/CToaster.spec.tsx +2 -2
  833. package/src/components/widgets/CWidgetStatsA.tsx +1 -1
  834. package/src/components/widgets/CWidgetStatsB.tsx +1 -1
  835. package/src/components/widgets/CWidgetStatsC.tsx +2 -2
  836. package/src/components/widgets/CWidgetStatsD.tsx +2 -2
  837. package/src/components/widgets/CWidgetStatsE.tsx +1 -1
  838. package/src/components/widgets/CWidgetStatsF.tsx +1 -1
  839. package/src/components/widgets/__tests__/CWidgetStatsA.spec.tsx +1 -1
  840. package/src/components/widgets/__tests__/CWidgetStatsB.spec.tsx +1 -1
  841. package/src/components/widgets/__tests__/CWidgetStatsC.spec.tsx +1 -1
  842. package/src/components/widgets/__tests__/CWidgetStatsD.spec.tsx +1 -1
  843. package/src/components/widgets/__tests__/CWidgetStatsE.spec.tsx +1 -1
  844. package/src/components/widgets/__tests__/CWidgetStatsF.spec.tsx +2 -2
  845. package/src/helpers/polymorphicComponent.ts +1 -1
  846. package/src/utils/executeAfterTransition.ts +1 -1
  847. package/src/utils/getNextActiveElement.ts +1 -1
  848. package/src/utils/mergeClassNames.ts +1 -1
@@ -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
+ }
@@ -0,0 +1,232 @@
1
+ import * as React from 'react'
2
+ import { render, screen } from '@testing-library/react'
3
+ import '@testing-library/jest-dom'
4
+ import { CFocusTrap } from '../CFocusTrap'
5
+
6
+ // Helper function to create a test component with focusable elements
7
+ interface TestComponentProps {
8
+ children?: React.ReactNode
9
+ [key: string]: any
10
+ }
11
+
12
+ const TestComponent = ({ children, ...props }: TestComponentProps) => (
13
+ <CFocusTrap {...props}>
14
+ <div data-testid="container">
15
+ <button data-testid="first-button">First</button>
16
+ <input data-testid="input" type="text" placeholder="Input field" />
17
+ <a href="#" data-testid="link">
18
+ Link
19
+ </a>
20
+ <button data-testid="last-button">Last</button>
21
+ {children}
22
+ </div>
23
+ </CFocusTrap>
24
+ )
25
+
26
+ describe('CFocusTrap', () => {
27
+ beforeEach(() => {
28
+ // Reset document focus before each test
29
+ document.body.focus()
30
+ })
31
+
32
+ test('loads and displays CFocusTrap component', () => {
33
+ const { container } = render(
34
+ <CFocusTrap>
35
+ <div data-testid="test-content">Test Content</div>
36
+ </CFocusTrap>
37
+ )
38
+ expect(container).toMatchSnapshot()
39
+ expect(screen.getByTestId('test-content')).toBeInTheDocument()
40
+ })
41
+
42
+ test('CFocusTrap with custom props', () => {
43
+ const onActivate = jest.fn()
44
+ const onDeactivate = jest.fn()
45
+
46
+ const { container } = render(
47
+ <CFocusTrap
48
+ active={true}
49
+ restoreFocus={false}
50
+ focusFirstElement={false}
51
+ onActivate={onActivate}
52
+ onDeactivate={onDeactivate}
53
+ >
54
+ <div data-testid="custom-container">Custom Content</div>
55
+ </CFocusTrap>
56
+ )
57
+
58
+ expect(container).toMatchSnapshot()
59
+ expect(onActivate).toHaveBeenCalledTimes(1)
60
+ })
61
+
62
+ test('focuses container when focusFirstElement is false (default)', () => {
63
+ const mockFocus = jest.fn()
64
+ const originalFocus = HTMLElement.prototype.focus
65
+ HTMLElement.prototype.focus = mockFocus
66
+
67
+ render(<TestComponent active={true} />)
68
+
69
+ const container = screen.getByTestId('container')
70
+ expect(container).toBeInTheDocument()
71
+ expect(mockFocus).toHaveBeenCalledWith({ preventScroll: true })
72
+
73
+ HTMLElement.prototype.focus = originalFocus
74
+ })
75
+
76
+ test('does not trap focus when active is false', () => {
77
+ render(<TestComponent active={false} />)
78
+
79
+ // Focus should not be moved to any element
80
+ expect(screen.getByTestId('container')).not.toHaveFocus()
81
+ expect(screen.getByTestId('first-button')).not.toHaveFocus()
82
+ })
83
+
84
+ test('handles container with no tabbable elements', () => {
85
+ const mockFocus = jest.fn()
86
+ const originalFocus = HTMLElement.prototype.focus
87
+ HTMLElement.prototype.focus = mockFocus
88
+
89
+ render(
90
+ <CFocusTrap active={true}>
91
+ <div data-testid="empty-container">No focusable elements</div>
92
+ </CFocusTrap>
93
+ )
94
+
95
+ const container = screen.getByTestId('empty-container')
96
+ expect(container).toBeInTheDocument()
97
+ expect(mockFocus).toHaveBeenCalledWith({ preventScroll: true })
98
+
99
+ HTMLElement.prototype.focus = originalFocus
100
+ })
101
+
102
+ test('calls onActivate callback when trap becomes active', () => {
103
+ const onActivate = jest.fn()
104
+
105
+ const { rerender } = render(<TestComponent active={false} onActivate={onActivate} />)
106
+ expect(onActivate).not.toHaveBeenCalled()
107
+
108
+ // Re-render with active=true
109
+ rerender(<TestComponent active={true} onActivate={onActivate} />)
110
+ expect(onActivate).toHaveBeenCalledTimes(1)
111
+ })
112
+
113
+ test('calls onDeactivate callback when trap becomes inactive', () => {
114
+ const onDeactivate = jest.fn()
115
+
116
+ const { rerender } = render(<TestComponent active={true} onDeactivate={onDeactivate} />)
117
+ expect(onDeactivate).not.toHaveBeenCalled()
118
+
119
+ // Deactivate the trap
120
+ rerender(<TestComponent active={false} onDeactivate={onDeactivate} />)
121
+ expect(onDeactivate).toHaveBeenCalledTimes(1)
122
+ })
123
+
124
+ test('cleans up event listeners on unmount', () => {
125
+ const removeEventListenerSpy = jest.spyOn(document, 'removeEventListener')
126
+
127
+ const { unmount } = render(<TestComponent active={true} />)
128
+
129
+ unmount()
130
+
131
+ expect(removeEventListenerSpy).toHaveBeenCalledWith('focusin', expect.any(Function), true)
132
+
133
+ removeEventListenerSpy.mockRestore()
134
+ })
135
+
136
+ test('focuses first element when focusFirstElement is true', () => {
137
+ const mockFocus = jest.fn()
138
+ const originalFocus = HTMLElement.prototype.focus
139
+ HTMLElement.prototype.focus = mockFocus
140
+
141
+ render(<TestComponent active={true} focusFirstElement={true} />)
142
+
143
+ const firstButton = screen.getByTestId('first-button')
144
+ expect(firstButton).toBeInTheDocument()
145
+ expect(mockFocus).toHaveBeenCalledWith({ preventScroll: true })
146
+
147
+ HTMLElement.prototype.focus = originalFocus
148
+ })
149
+
150
+ test('works with additionalContainer prop', () => {
151
+ const additionalRef = React.createRef<HTMLDivElement>()
152
+
153
+ render(
154
+ <div>
155
+ <CFocusTrap active={true} additionalContainer={additionalRef}>
156
+ <div data-testid="main-container">
157
+ <button data-testid="main-button">Main Button</button>
158
+ </div>
159
+ </CFocusTrap>
160
+ <div ref={additionalRef} data-testid="additional-container">
161
+ <button data-testid="additional-button">Additional Button</button>
162
+ </div>
163
+ </div>
164
+ )
165
+
166
+ const mainContainer = screen.getByTestId('main-container')
167
+ const additionalContainer = screen.getByTestId('additional-container')
168
+
169
+ expect(mainContainer).toBeInTheDocument()
170
+ expect(additionalContainer).toBeInTheDocument()
171
+ })
172
+
173
+ test('restores focus when restoreFocus is true', () => {
174
+ // Mock document.activeElement to simulate a focused element
175
+ const focusButton = document.createElement('button')
176
+ focusButton.dataset.testid = 'focus-button'
177
+ document.body.appendChild(focusButton)
178
+
179
+ const mockFocus = jest.fn()
180
+ focusButton.focus = mockFocus
181
+
182
+ // Mock document.activeElement
183
+ Object.defineProperty(document, 'activeElement', {
184
+ value: focusButton,
185
+ writable: true,
186
+ configurable: true,
187
+ })
188
+
189
+ const { rerender } = render(<TestComponent active={false} restoreFocus={true} />)
190
+
191
+ // Activate the trap (should store the previous focused element)
192
+ rerender(<TestComponent active={true} restoreFocus={true} />)
193
+
194
+ // Deactivate the trap (should restore focus)
195
+ rerender(<TestComponent active={false} restoreFocus={true} />)
196
+
197
+ // Verify focus restoration was attempted
198
+ expect(mockFocus).toHaveBeenCalledWith({ preventScroll: true })
199
+
200
+ focusButton.remove()
201
+ })
202
+
203
+ test('does not restore focus when restoreFocus is false', () => {
204
+ // Mock document.activeElement to simulate a focused element
205
+ const focusButton = document.createElement('button')
206
+ focusButton.dataset.testid = 'focus-button'
207
+ document.body.appendChild(focusButton)
208
+
209
+ const mockFocus = jest.fn()
210
+ focusButton.focus = mockFocus
211
+
212
+ // Mock document.activeElement
213
+ Object.defineProperty(document, 'activeElement', {
214
+ value: focusButton,
215
+ writable: true,
216
+ configurable: true,
217
+ })
218
+
219
+ const { rerender } = render(<TestComponent active={false} restoreFocus={false} />)
220
+
221
+ // Activate the trap (should store the previous focused element)
222
+ rerender(<TestComponent active={true} restoreFocus={false} />)
223
+
224
+ // Deactivate the trap (should NOT restore focus)
225
+ rerender(<TestComponent active={false} restoreFocus={false} />)
226
+
227
+ // Verify focus restoration was not attempted
228
+ expect(mockFocus).not.toHaveBeenCalledWith({ preventScroll: true })
229
+
230
+ focusButton.remove()
231
+ })
232
+ })
@@ -0,0 +1,21 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`CFocusTrap CFocusTrap with custom props 1`] = `
4
+ <div>
5
+ <div
6
+ data-testid="custom-container"
7
+ >
8
+ Custom Content
9
+ </div>
10
+ </div>
11
+ `;
12
+
13
+ exports[`CFocusTrap loads and displays CFocusTrap component 1`] = `
14
+ <div>
15
+ <div
16
+ data-testid="test-content"
17
+ >
18
+ Test Content
19
+ </div>
20
+ </div>
21
+ `;
@@ -0,0 +1,3 @@
1
+ import { CFocusTrap } from './CFocusTrap'
2
+
3
+ export { CFocusTrap }
@@ -0,0 +1,121 @@
1
+ import React from 'react'
2
+
3
+ /**
4
+ * Gets all focusable child elements within a container.
5
+ * Uses a comprehensive selector to find elements that can receive focus.
6
+ * @param element - The container element to search within
7
+ * @returns Array of focusable HTML elements
8
+ */
9
+ export const focusableChildren = (element: HTMLElement): HTMLElement[] => {
10
+ const focusableSelectors = [
11
+ 'a[href]',
12
+ 'button:not([disabled])',
13
+ 'input:not([disabled])',
14
+ 'textarea:not([disabled])',
15
+ 'select:not([disabled])',
16
+ 'details',
17
+ '[tabindex]:not([tabindex="-1"])',
18
+ '[contenteditable="true"]',
19
+ ].join(',')
20
+
21
+ const elements = [...element.querySelectorAll<HTMLElement>(focusableSelectors)] as HTMLElement[]
22
+
23
+ return elements.filter((el) => !isDisabled(el) && isVisible(el))
24
+ }
25
+
26
+ /**
27
+ * Checks if an element is disabled.
28
+ * Considers various ways an element can be disabled including CSS classes and attributes.
29
+ * @param element - The HTML element to check
30
+ * @returns True if the element is disabled, false otherwise
31
+ */
32
+ export const isDisabled = (element: HTMLElement): boolean => {
33
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
34
+ return true
35
+ }
36
+
37
+ if (element.classList.contains('disabled')) {
38
+ return true
39
+ }
40
+
41
+ if ('disabled' in element && typeof element.disabled === 'boolean') {
42
+ return element.disabled
43
+ }
44
+
45
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'
46
+ }
47
+
48
+ /**
49
+ * Type guard to check if an object is an Element.
50
+ * Handles edge cases including jQuery objects.
51
+ * @param object - The object to check
52
+ * @returns True if the object is an Element, false otherwise
53
+ */
54
+ export const isElement = (object: unknown): object is Element => {
55
+ if (!object || typeof object !== 'object') {
56
+ return false
57
+ }
58
+
59
+ // Handle jQuery objects
60
+ if ('jquery' in object && object.jquery !== undefined) {
61
+ const jQueryObject = object as { [key: number]: Element }
62
+ return isElement(jQueryObject[0])
63
+ }
64
+
65
+ return 'nodeType' in object && typeof object.nodeType === 'number'
66
+ }
67
+
68
+ /**
69
+ * Checks if an element is visible in the DOM.
70
+ * Considers client rects and computed visibility styles, handling edge cases like details elements.
71
+ * @param element - The HTML element to check for visibility
72
+ * @returns True if the element is visible, false otherwise
73
+ */
74
+ export const isVisible = (element: HTMLElement): boolean => {
75
+ if (!isElement(element) || element.getClientRects().length === 0) {
76
+ return false
77
+ }
78
+
79
+ const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'
80
+
81
+ // Handle `details` element as its content may falsely appear visible when it is closed
82
+ const closedDetails = element.closest('details:not([open])')
83
+
84
+ if (!closedDetails) {
85
+ return elementIsVisible
86
+ }
87
+
88
+ if (closedDetails !== element) {
89
+ const summary = element.closest('summary')
90
+
91
+ // Check if summary is a direct child of the closed details
92
+ if (summary?.parentNode !== closedDetails) {
93
+ return false
94
+ }
95
+ }
96
+
97
+ return elementIsVisible
98
+ }
99
+
100
+ /**
101
+ * Merges multiple React refs into a single ref callback.
102
+ * Handles both function refs and ref objects, gracefully ignoring failures.
103
+ * @param refs - Array of React refs to merge
104
+ * @returns A ref callback that applies to all provided refs
105
+ */
106
+ export const mergeRefs =
107
+ <T>(...refs: (React.Ref<T> | undefined)[]) =>
108
+ (node: T) => {
109
+ refs.forEach((ref) => {
110
+ if (!ref) return
111
+ if (typeof ref === 'function') {
112
+ ref(node)
113
+ } else {
114
+ try {
115
+ ;(ref as React.RefObject<T>).current = node
116
+ } catch {
117
+ // Ignore assignment failures for read-only refs
118
+ }
119
+ }
120
+ })
121
+ }
@@ -24,7 +24,7 @@ export const CFooter = forwardRef<HTMLDivElement, CFooterProps>(
24
24
  {children}
25
25
  </div>
26
26
  )
27
- },
27
+ }
28
28
  )
29
29
 
30
30
  CFooter.propTypes = {
@@ -12,7 +12,7 @@ test('CFooter customize', async () => {
12
12
  const { container } = render(
13
13
  <CFooter className="bazinga" position="fixed">
14
14
  Test
15
- </CFooter>,
15
+ </CFooter>
16
16
  )
17
17
  expect(container).toMatchSnapshot()
18
18
  expect(container.firstChild).toHaveClass('bazinga')
@@ -24,7 +24,7 @@ export const CForm = forwardRef<HTMLFormElement, CFormProps>(
24
24
  {children}
25
25
  </form>
26
26
  )
27
- },
27
+ }
28
28
  )
29
29
 
30
30
  CForm.propTypes = {
@@ -103,7 +103,7 @@ export const CFormCheck = forwardRef<HTMLInputElement, CFormCheckProps>(
103
103
  valid,
104
104
  ...rest
105
105
  },
106
- ref,
106
+ ref
107
107
  ) => {
108
108
  const inputRef = useRef<HTMLInputElement>(null)
109
109
  const forkedRef = useForkedRef(ref, inputRef)
@@ -151,9 +151,9 @@ export const CFormCheck = forwardRef<HTMLInputElement, CFormCheckProps>(
151
151
  {
152
152
  [`btn-${button.size}`]: button.size,
153
153
  },
154
- `${button.shape}`,
154
+ `${button.shape}`
155
155
  )
156
- : 'form-check-label',
156
+ : 'form-check-label'
157
157
  )}
158
158
  {...(id && { htmlFor: id })}
159
159
  >
@@ -194,7 +194,7 @@ export const CFormCheck = forwardRef<HTMLInputElement, CFormCheckProps>(
194
194
  'is-invalid': invalid,
195
195
  'is-valid': valid,
196
196
  },
197
- className,
197
+ className
198
198
  )}
199
199
  >
200
200
  <FormControl />
@@ -208,7 +208,7 @@ export const CFormCheck = forwardRef<HTMLInputElement, CFormCheckProps>(
208
208
  }
209
209
 
210
210
  return <FormCheck />
211
- },
211
+ }
212
212
  )
213
213
 
214
214
  CFormCheck.propTypes = {