@coreui/react 5.7.1 → 5.9.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 (838) 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 +41 -10
  77. package/dist/cjs/components/dropdown/CDropdown.js +131 -77
  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 +14 -3
  93. package/dist/cjs/components/dropdown/CDropdownToggle.js +20 -14
  94. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  95. package/dist/cjs/components/dropdown/utils.d.ts +2 -0
  96. package/dist/cjs/components/dropdown/utils.js +20 -7
  97. package/dist/cjs/components/dropdown/utils.js.map +1 -1
  98. package/dist/cjs/components/focus-trap/CFocusTrap.d.ts +59 -0
  99. package/dist/cjs/components/focus-trap/CFocusTrap.js +162 -0
  100. package/dist/cjs/components/focus-trap/CFocusTrap.js.map +1 -0
  101. package/dist/cjs/components/focus-trap/index.d.ts +2 -0
  102. package/dist/cjs/components/focus-trap/utils.d.ts +36 -0
  103. package/dist/cjs/components/focus-trap/utils.js +108 -0
  104. package/dist/cjs/components/focus-trap/utils.js.map +1 -0
  105. package/dist/cjs/components/footer/CFooter.js +3 -4
  106. package/dist/cjs/components/footer/CFooter.js.map +1 -1
  107. package/dist/cjs/components/form/CForm.js +3 -3
  108. package/dist/cjs/components/form/CForm.js.map +1 -1
  109. package/dist/cjs/components/form/CFormCheck.js +16 -19
  110. package/dist/cjs/components/form/CFormCheck.js.map +1 -1
  111. package/dist/cjs/components/form/CFormControlValidation.js +2 -4
  112. package/dist/cjs/components/form/CFormControlValidation.js.map +1 -1
  113. package/dist/cjs/components/form/CFormControlWrapper.js +3 -5
  114. package/dist/cjs/components/form/CFormControlWrapper.js.map +1 -1
  115. package/dist/cjs/components/form/CFormFeedback.js +6 -7
  116. package/dist/cjs/components/form/CFormFeedback.js.map +1 -1
  117. package/dist/cjs/components/form/CFormFloating.js +3 -3
  118. package/dist/cjs/components/form/CFormFloating.js.map +1 -1
  119. package/dist/cjs/components/form/CFormInput.js +13 -14
  120. package/dist/cjs/components/form/CFormInput.js.map +1 -1
  121. package/dist/cjs/components/form/CFormLabel.js +3 -3
  122. package/dist/cjs/components/form/CFormLabel.js.map +1 -1
  123. package/dist/cjs/components/form/CFormRange.js +3 -3
  124. package/dist/cjs/components/form/CFormRange.js.map +1 -1
  125. package/dist/cjs/components/form/CFormSelect.js +10 -11
  126. package/dist/cjs/components/form/CFormSelect.js.map +1 -1
  127. package/dist/cjs/components/form/CFormSwitch.js +10 -12
  128. package/dist/cjs/components/form/CFormSwitch.js.map +1 -1
  129. package/dist/cjs/components/form/CFormText.js +3 -3
  130. package/dist/cjs/components/form/CFormText.js.map +1 -1
  131. package/dist/cjs/components/form/CFormTextarea.js +4 -4
  132. package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
  133. package/dist/cjs/components/form/CInputGroup.js +5 -6
  134. package/dist/cjs/components/form/CInputGroup.js.map +1 -1
  135. package/dist/cjs/components/form/CInputGroupText.js +3 -3
  136. package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
  137. package/dist/cjs/components/grid/CCol.js +16 -16
  138. package/dist/cjs/components/grid/CCol.js.map +1 -1
  139. package/dist/cjs/components/grid/CContainer.js +8 -8
  140. package/dist/cjs/components/grid/CContainer.js.map +1 -1
  141. package/dist/cjs/components/grid/CRow.js +13 -13
  142. package/dist/cjs/components/grid/CRow.js.map +1 -1
  143. package/dist/cjs/components/header/CHeader.js +3 -4
  144. package/dist/cjs/components/header/CHeader.js.map +1 -1
  145. package/dist/cjs/components/header/CHeaderBrand.js +3 -3
  146. package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
  147. package/dist/cjs/components/header/CHeaderDivider.js +3 -3
  148. package/dist/cjs/components/header/CHeaderDivider.js.map +1 -1
  149. package/dist/cjs/components/header/CHeaderNav.js +3 -3
  150. package/dist/cjs/components/header/CHeaderNav.js.map +1 -1
  151. package/dist/cjs/components/header/CHeaderText.js +3 -3
  152. package/dist/cjs/components/header/CHeaderText.js.map +1 -1
  153. package/dist/cjs/components/header/CHeaderToggler.js +3 -3
  154. package/dist/cjs/components/header/CHeaderToggler.js.map +1 -1
  155. package/dist/cjs/components/image/CImage.js +9 -10
  156. package/dist/cjs/components/image/CImage.js.map +1 -1
  157. package/dist/cjs/components/index.d.ts +1 -0
  158. package/dist/cjs/components/link/CLink.js +5 -5
  159. package/dist/cjs/components/link/CLink.js.map +1 -1
  160. package/dist/cjs/components/list-group/CListGroup.js +6 -8
  161. package/dist/cjs/components/list-group/CListGroup.js.map +1 -1
  162. package/dist/cjs/components/list-group/CListGroupItem.js +13 -14
  163. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  164. package/dist/cjs/components/modal/CModal.js +26 -34
  165. package/dist/cjs/components/modal/CModal.js.map +1 -1
  166. package/dist/cjs/components/modal/CModalBody.js +3 -3
  167. package/dist/cjs/components/modal/CModalBody.js.map +1 -1
  168. package/dist/cjs/components/modal/CModalContent.js +3 -3
  169. package/dist/cjs/components/modal/CModalContent.js.map +1 -1
  170. package/dist/cjs/components/modal/CModalContext.js +1 -1
  171. package/dist/cjs/components/modal/CModalContext.js.map +1 -1
  172. package/dist/cjs/components/modal/CModalDialog.js +9 -11
  173. package/dist/cjs/components/modal/CModalDialog.js.map +1 -1
  174. package/dist/cjs/components/modal/CModalFooter.js +3 -3
  175. package/dist/cjs/components/modal/CModalFooter.js.map +1 -1
  176. package/dist/cjs/components/modal/CModalHeader.js +5 -5
  177. package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
  178. package/dist/cjs/components/modal/CModalTitle.js +3 -3
  179. package/dist/cjs/components/modal/CModalTitle.js.map +1 -1
  180. package/dist/cjs/components/nav/CNav.js +7 -7
  181. package/dist/cjs/components/nav/CNav.js.map +1 -1
  182. package/dist/cjs/components/nav/CNavGroup.js +24 -24
  183. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  184. package/dist/cjs/components/nav/CNavGroupItems.js +3 -3
  185. package/dist/cjs/components/nav/CNavGroupItems.js.map +1 -1
  186. package/dist/cjs/components/nav/CNavItem.js +3 -3
  187. package/dist/cjs/components/nav/CNavItem.js.map +1 -1
  188. package/dist/cjs/components/nav/CNavLink.js +7 -7
  189. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  190. package/dist/cjs/components/nav/CNavTitle.js +3 -3
  191. package/dist/cjs/components/nav/CNavTitle.js.map +1 -1
  192. package/dist/cjs/components/navbar/CNavbar.js +6 -7
  193. package/dist/cjs/components/navbar/CNavbar.js.map +1 -1
  194. package/dist/cjs/components/navbar/CNavbarBrand.js +4 -4
  195. package/dist/cjs/components/navbar/CNavbarBrand.js.map +1 -1
  196. package/dist/cjs/components/navbar/CNavbarNav.js +3 -3
  197. package/dist/cjs/components/navbar/CNavbarNav.js.map +1 -1
  198. package/dist/cjs/components/navbar/CNavbarText.js +3 -3
  199. package/dist/cjs/components/navbar/CNavbarText.js.map +1 -1
  200. package/dist/cjs/components/navbar/CNavbarToggler.js +3 -3
  201. package/dist/cjs/components/navbar/CNavbarToggler.js.map +1 -1
  202. package/dist/cjs/components/offcanvas/COffcanvas.js +20 -21
  203. package/dist/cjs/components/offcanvas/COffcanvas.js.map +1 -1
  204. package/dist/cjs/components/offcanvas/COffcanvasBody.js +3 -3
  205. package/dist/cjs/components/offcanvas/COffcanvasBody.js.map +1 -1
  206. package/dist/cjs/components/offcanvas/COffcanvasHeader.js +3 -3
  207. package/dist/cjs/components/offcanvas/COffcanvasHeader.js.map +1 -1
  208. package/dist/cjs/components/offcanvas/COffcanvasTitle.js +3 -3
  209. package/dist/cjs/components/offcanvas/COffcanvasTitle.js.map +1 -1
  210. package/dist/cjs/components/pagination/CPagination.js +7 -8
  211. package/dist/cjs/components/pagination/CPagination.js.map +1 -1
  212. package/dist/cjs/components/pagination/CPaginationItem.js +5 -5
  213. package/dist/cjs/components/pagination/CPaginationItem.js.map +1 -1
  214. package/dist/cjs/components/placeholder/CPlaceholder.js +13 -14
  215. package/dist/cjs/components/placeholder/CPlaceholder.js.map +1 -1
  216. package/dist/cjs/components/popover/CPopover.js +29 -29
  217. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  218. package/dist/cjs/components/progress/CProgress.js +8 -8
  219. package/dist/cjs/components/progress/CProgress.js.map +1 -1
  220. package/dist/cjs/components/progress/CProgressBar.js +8 -9
  221. package/dist/cjs/components/progress/CProgressBar.js.map +1 -1
  222. package/dist/cjs/components/progress/CProgressStacked.js +3 -3
  223. package/dist/cjs/components/progress/CProgressStacked.js.map +1 -1
  224. package/dist/cjs/components/progress/CProgressStackedContext.js +1 -1
  225. package/dist/cjs/components/progress/CProgressStackedContext.js.map +1 -1
  226. package/dist/cjs/components/sidebar/CSidebar.js +34 -37
  227. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  228. package/dist/cjs/components/sidebar/CSidebarBrand.js +3 -3
  229. package/dist/cjs/components/sidebar/CSidebarBrand.js.map +1 -1
  230. package/dist/cjs/components/sidebar/CSidebarFooter.js +3 -3
  231. package/dist/cjs/components/sidebar/CSidebarFooter.js.map +1 -1
  232. package/dist/cjs/components/sidebar/CSidebarHeader.js +3 -3
  233. package/dist/cjs/components/sidebar/CSidebarHeader.js.map +1 -1
  234. package/dist/cjs/components/sidebar/CSidebarNav.js +14 -14
  235. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  236. package/dist/cjs/components/sidebar/CSidebarNavContext.js +1 -1
  237. package/dist/cjs/components/sidebar/CSidebarNavContext.js.map +1 -1
  238. package/dist/cjs/components/sidebar/CSidebarToggler.js +3 -3
  239. package/dist/cjs/components/sidebar/CSidebarToggler.js.map +1 -1
  240. package/dist/cjs/components/spinner/CSpinner.js +6 -7
  241. package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
  242. package/dist/cjs/components/table/CTable.js +25 -26
  243. package/dist/cjs/components/table/CTable.js.map +1 -1
  244. package/dist/cjs/components/table/CTableBody.js +5 -6
  245. package/dist/cjs/components/table/CTableBody.js.map +1 -1
  246. package/dist/cjs/components/table/CTableCaption.js +3 -3
  247. package/dist/cjs/components/table/CTableCaption.js.map +1 -1
  248. package/dist/cjs/components/table/CTableDataCell.js +8 -9
  249. package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
  250. package/dist/cjs/components/table/CTableFoot.js +5 -6
  251. package/dist/cjs/components/table/CTableFoot.js.map +1 -1
  252. package/dist/cjs/components/table/CTableHead.js +5 -6
  253. package/dist/cjs/components/table/CTableHead.js.map +1 -1
  254. package/dist/cjs/components/table/CTableHeaderCell.js +5 -6
  255. package/dist/cjs/components/table/CTableHeaderCell.js.map +1 -1
  256. package/dist/cjs/components/table/CTableResponsiveWrapper.js +3 -3
  257. package/dist/cjs/components/table/CTableResponsiveWrapper.js.map +1 -1
  258. package/dist/cjs/components/table/CTableRow.js +7 -8
  259. package/dist/cjs/components/table/CTableRow.js.map +1 -1
  260. package/dist/cjs/components/table/utils.js +9 -13
  261. package/dist/cjs/components/table/utils.js.map +1 -1
  262. package/dist/cjs/components/tabs/CTab.js +6 -6
  263. package/dist/cjs/components/tabs/CTab.js.map +1 -1
  264. package/dist/cjs/components/tabs/CTabContent.js +3 -3
  265. package/dist/cjs/components/tabs/CTabContent.js.map +1 -1
  266. package/dist/cjs/components/tabs/CTabList.js +13 -13
  267. package/dist/cjs/components/tabs/CTabList.js.map +1 -1
  268. package/dist/cjs/components/tabs/CTabPane.js +6 -6
  269. package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
  270. package/dist/cjs/components/tabs/CTabPanel.js +10 -10
  271. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
  272. package/dist/cjs/components/tabs/CTabs.js +7 -8
  273. package/dist/cjs/components/tabs/CTabs.js.map +1 -1
  274. package/dist/cjs/components/tabs/CTabsContext.js +1 -1
  275. package/dist/cjs/components/tabs/CTabsContext.js.map +1 -1
  276. package/dist/cjs/components/toast/CToast.js +21 -25
  277. package/dist/cjs/components/toast/CToast.js.map +1 -1
  278. package/dist/cjs/components/toast/CToastBody.js +3 -3
  279. package/dist/cjs/components/toast/CToastBody.js.map +1 -1
  280. package/dist/cjs/components/toast/CToastClose.js +5 -5
  281. package/dist/cjs/components/toast/CToastClose.js.map +1 -1
  282. package/dist/cjs/components/toast/CToastContext.js +1 -1
  283. package/dist/cjs/components/toast/CToastContext.js.map +1 -1
  284. package/dist/cjs/components/toast/CToastHeader.js +3 -3
  285. package/dist/cjs/components/toast/CToastHeader.js.map +1 -1
  286. package/dist/cjs/components/toast/CToaster.js +12 -13
  287. package/dist/cjs/components/toast/CToaster.js.map +1 -1
  288. package/dist/cjs/components/tooltip/CTooltip.js +30 -30
  289. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  290. package/dist/cjs/components/widgets/CWidgetStatsA.js +3 -4
  291. package/dist/cjs/components/widgets/CWidgetStatsA.js.map +1 -1
  292. package/dist/cjs/components/widgets/CWidgetStatsB.js +4 -4
  293. package/dist/cjs/components/widgets/CWidgetStatsB.js.map +1 -1
  294. package/dist/cjs/components/widgets/CWidgetStatsC.js +4 -4
  295. package/dist/cjs/components/widgets/CWidgetStatsC.js.map +1 -1
  296. package/dist/cjs/components/widgets/CWidgetStatsD.js +7 -8
  297. package/dist/cjs/components/widgets/CWidgetStatsD.js.map +1 -1
  298. package/dist/cjs/components/widgets/CWidgetStatsE.js +3 -3
  299. package/dist/cjs/components/widgets/CWidgetStatsE.js.map +1 -1
  300. package/dist/cjs/components/widgets/CWidgetStatsF.js +6 -6
  301. package/dist/cjs/components/widgets/CWidgetStatsF.js.map +1 -1
  302. package/dist/cjs/hooks/useClipboard.js +21 -33
  303. package/dist/cjs/hooks/useClipboard.js.map +1 -1
  304. package/dist/cjs/hooks/useColorModes.js +15 -20
  305. package/dist/cjs/hooks/useColorModes.js.map +1 -1
  306. package/dist/cjs/hooks/useForkedRef.js +6 -10
  307. package/dist/cjs/hooks/useForkedRef.js.map +1 -1
  308. package/dist/cjs/hooks/usePopper.js +11 -11
  309. package/dist/cjs/hooks/usePopper.js.map +1 -1
  310. package/dist/cjs/index.js +2 -0
  311. package/dist/cjs/index.js.map +1 -1
  312. package/dist/cjs/node_modules/tslib/tslib.es6.js +0 -51
  313. package/dist/cjs/node_modules/tslib/tslib.es6.js.map +1 -1
  314. package/dist/cjs/props.js +6 -6
  315. package/dist/cjs/props.js.map +1 -1
  316. package/dist/cjs/utils/executeAfterTransition.js +8 -10
  317. package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
  318. package/dist/cjs/utils/getNextActiveElement.js +3 -3
  319. package/dist/cjs/utils/getNextActiveElement.js.map +1 -1
  320. package/dist/cjs/utils/getRTLPlacement.js +1 -1
  321. package/dist/cjs/utils/getRTLPlacement.js.map +1 -1
  322. package/dist/cjs/utils/getTransitionDurationFromElement.js +4 -4
  323. package/dist/cjs/utils/getTransitionDurationFromElement.js.map +1 -1
  324. package/dist/cjs/utils/isInViewport.js +2 -2
  325. package/dist/cjs/utils/isInViewport.js.map +1 -1
  326. package/dist/cjs/utils/isRTL.js +1 -1
  327. package/dist/cjs/utils/isRTL.js.map +1 -1
  328. package/dist/esm/components/accordion/CAccordion.js +6 -6
  329. package/dist/esm/components/accordion/CAccordion.js.map +1 -1
  330. package/dist/esm/components/accordion/CAccordionBody.js +5 -5
  331. package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
  332. package/dist/esm/components/accordion/CAccordionButton.js +5 -5
  333. package/dist/esm/components/accordion/CAccordionButton.js.map +1 -1
  334. package/dist/esm/components/accordion/CAccordionContext.js +1 -1
  335. package/dist/esm/components/accordion/CAccordionContext.js.map +1 -1
  336. package/dist/esm/components/accordion/CAccordionHeader.js +4 -4
  337. package/dist/esm/components/accordion/CAccordionHeader.js.map +1 -1
  338. package/dist/esm/components/accordion/CAccordionItem.js +12 -12
  339. package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
  340. package/dist/esm/components/accordion/CAccordionItemContext.js +1 -1
  341. package/dist/esm/components/accordion/CAccordionItemContext.js.map +1 -1
  342. package/dist/esm/components/alert/CAlert.js +9 -9
  343. package/dist/esm/components/alert/CAlert.js.map +1 -1
  344. package/dist/esm/components/alert/CAlertHeading.js +4 -4
  345. package/dist/esm/components/alert/CAlertHeading.js.map +1 -1
  346. package/dist/esm/components/alert/CAlertLink.js +4 -4
  347. package/dist/esm/components/alert/CAlertLink.js.map +1 -1
  348. package/dist/esm/components/avatar/CAvatar.js +9 -10
  349. package/dist/esm/components/avatar/CAvatar.js.map +1 -1
  350. package/dist/esm/components/backdrop/CBackdrop.js +7 -7
  351. package/dist/esm/components/backdrop/CBackdrop.js.map +1 -1
  352. package/dist/esm/components/badge/CBadge.js +14 -15
  353. package/dist/esm/components/badge/CBadge.js.map +1 -1
  354. package/dist/esm/components/breadcrumb/CBreadcrumb.js +4 -4
  355. package/dist/esm/components/breadcrumb/CBreadcrumb.js.map +1 -1
  356. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js +4 -4
  357. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  358. package/dist/esm/components/button/CButton.js +9 -10
  359. package/dist/esm/components/button/CButton.js.map +1 -1
  360. package/dist/esm/components/button-group/CButtonGroup.js +4 -5
  361. package/dist/esm/components/button-group/CButtonGroup.js.map +1 -1
  362. package/dist/esm/components/button-group/CButtonToolbar.js +4 -4
  363. package/dist/esm/components/button-group/CButtonToolbar.js.map +1 -1
  364. package/dist/esm/components/callout/CCallout.js +6 -7
  365. package/dist/esm/components/callout/CCallout.js.map +1 -1
  366. package/dist/esm/components/card/CCard.js +8 -9
  367. package/dist/esm/components/card/CCard.js.map +1 -1
  368. package/dist/esm/components/card/CCardBody.js +4 -4
  369. package/dist/esm/components/card/CCardBody.js.map +1 -1
  370. package/dist/esm/components/card/CCardFooter.js +4 -4
  371. package/dist/esm/components/card/CCardFooter.js.map +1 -1
  372. package/dist/esm/components/card/CCardGroup.js +4 -4
  373. package/dist/esm/components/card/CCardGroup.js.map +1 -1
  374. package/dist/esm/components/card/CCardHeader.js +4 -4
  375. package/dist/esm/components/card/CCardHeader.js.map +1 -1
  376. package/dist/esm/components/card/CCardImage.js +4 -4
  377. package/dist/esm/components/card/CCardImage.js.map +1 -1
  378. package/dist/esm/components/card/CCardImageOverlay.js +4 -4
  379. package/dist/esm/components/card/CCardImageOverlay.js.map +1 -1
  380. package/dist/esm/components/card/CCardLink.js +4 -4
  381. package/dist/esm/components/card/CCardLink.js.map +1 -1
  382. package/dist/esm/components/card/CCardSubtitle.js +4 -4
  383. package/dist/esm/components/card/CCardSubtitle.js.map +1 -1
  384. package/dist/esm/components/card/CCardText.js +4 -4
  385. package/dist/esm/components/card/CCardText.js.map +1 -1
  386. package/dist/esm/components/card/CCardTitle.js +4 -4
  387. package/dist/esm/components/card/CCardTitle.js.map +1 -1
  388. package/dist/esm/components/carousel/CCarousel.js +42 -42
  389. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  390. package/dist/esm/components/carousel/CCarouselCaption.js +4 -4
  391. package/dist/esm/components/carousel/CCarouselCaption.js.map +1 -1
  392. package/dist/esm/components/carousel/CCarouselContext.js +1 -1
  393. package/dist/esm/components/carousel/CCarouselContext.js.map +1 -1
  394. package/dist/esm/components/carousel/CCarouselItem.js +22 -22
  395. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  396. package/dist/esm/components/close-button/CCloseButton.js +4 -4
  397. package/dist/esm/components/close-button/CCloseButton.js.map +1 -1
  398. package/dist/esm/components/collapse/CCollapse.js +17 -17
  399. package/dist/esm/components/collapse/CCollapse.js.map +1 -1
  400. package/dist/esm/components/conditional-portal/CConditionalPortal.js +4 -5
  401. package/dist/esm/components/conditional-portal/CConditionalPortal.js.map +1 -1
  402. package/dist/esm/components/dropdown/CDropdown.d.ts +41 -10
  403. package/dist/esm/components/dropdown/CDropdown.js +133 -79
  404. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  405. package/dist/esm/components/dropdown/CDropdownContext.d.ts +1 -1
  406. package/dist/esm/components/dropdown/CDropdownContext.js +1 -1
  407. package/dist/esm/components/dropdown/CDropdownContext.js.map +1 -1
  408. package/dist/esm/components/dropdown/CDropdownDivider.js +4 -4
  409. package/dist/esm/components/dropdown/CDropdownDivider.js.map +1 -1
  410. package/dist/esm/components/dropdown/CDropdownHeader.js +4 -4
  411. package/dist/esm/components/dropdown/CDropdownHeader.js.map +1 -1
  412. package/dist/esm/components/dropdown/CDropdownItem.js +4 -4
  413. package/dist/esm/components/dropdown/CDropdownItem.js.map +1 -1
  414. package/dist/esm/components/dropdown/CDropdownItemPlain.js +4 -4
  415. package/dist/esm/components/dropdown/CDropdownItemPlain.js.map +1 -1
  416. package/dist/esm/components/dropdown/CDropdownMenu.js +7 -7
  417. package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
  418. package/dist/esm/components/dropdown/CDropdownToggle.d.ts +14 -3
  419. package/dist/esm/components/dropdown/CDropdownToggle.js +21 -15
  420. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  421. package/dist/esm/components/dropdown/utils.d.ts +2 -0
  422. package/dist/esm/components/dropdown/utils.js +20 -8
  423. package/dist/esm/components/dropdown/utils.js.map +1 -1
  424. package/dist/esm/components/focus-trap/CFocusTrap.d.ts +59 -0
  425. package/dist/esm/components/focus-trap/CFocusTrap.js +160 -0
  426. package/dist/esm/components/focus-trap/CFocusTrap.js.map +1 -0
  427. package/dist/esm/components/focus-trap/index.d.ts +2 -0
  428. package/dist/esm/components/focus-trap/utils.d.ts +36 -0
  429. package/dist/esm/components/focus-trap/utils.js +102 -0
  430. package/dist/esm/components/focus-trap/utils.js.map +1 -0
  431. package/dist/esm/components/footer/CFooter.js +4 -5
  432. package/dist/esm/components/footer/CFooter.js.map +1 -1
  433. package/dist/esm/components/form/CForm.js +4 -4
  434. package/dist/esm/components/form/CForm.js.map +1 -1
  435. package/dist/esm/components/form/CFormCheck.js +17 -20
  436. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  437. package/dist/esm/components/form/CFormControlValidation.js +2 -4
  438. package/dist/esm/components/form/CFormControlValidation.js.map +1 -1
  439. package/dist/esm/components/form/CFormControlWrapper.js +3 -5
  440. package/dist/esm/components/form/CFormControlWrapper.js.map +1 -1
  441. package/dist/esm/components/form/CFormFeedback.js +7 -8
  442. package/dist/esm/components/form/CFormFeedback.js.map +1 -1
  443. package/dist/esm/components/form/CFormFloating.js +4 -4
  444. package/dist/esm/components/form/CFormFloating.js.map +1 -1
  445. package/dist/esm/components/form/CFormInput.js +14 -15
  446. package/dist/esm/components/form/CFormInput.js.map +1 -1
  447. package/dist/esm/components/form/CFormLabel.js +4 -4
  448. package/dist/esm/components/form/CFormLabel.js.map +1 -1
  449. package/dist/esm/components/form/CFormRange.js +4 -4
  450. package/dist/esm/components/form/CFormRange.js.map +1 -1
  451. package/dist/esm/components/form/CFormSelect.js +11 -12
  452. package/dist/esm/components/form/CFormSelect.js.map +1 -1
  453. package/dist/esm/components/form/CFormSwitch.js +11 -13
  454. package/dist/esm/components/form/CFormSwitch.js.map +1 -1
  455. package/dist/esm/components/form/CFormText.js +4 -4
  456. package/dist/esm/components/form/CFormText.js.map +1 -1
  457. package/dist/esm/components/form/CFormTextarea.js +5 -5
  458. package/dist/esm/components/form/CFormTextarea.js.map +1 -1
  459. package/dist/esm/components/form/CInputGroup.js +6 -7
  460. package/dist/esm/components/form/CInputGroup.js.map +1 -1
  461. package/dist/esm/components/form/CInputGroupText.js +4 -4
  462. package/dist/esm/components/form/CInputGroupText.js.map +1 -1
  463. package/dist/esm/components/grid/CCol.js +17 -17
  464. package/dist/esm/components/grid/CCol.js.map +1 -1
  465. package/dist/esm/components/grid/CContainer.js +9 -9
  466. package/dist/esm/components/grid/CContainer.js.map +1 -1
  467. package/dist/esm/components/grid/CRow.js +14 -14
  468. package/dist/esm/components/grid/CRow.js.map +1 -1
  469. package/dist/esm/components/header/CHeader.js +4 -5
  470. package/dist/esm/components/header/CHeader.js.map +1 -1
  471. package/dist/esm/components/header/CHeaderBrand.js +4 -4
  472. package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
  473. package/dist/esm/components/header/CHeaderDivider.js +4 -4
  474. package/dist/esm/components/header/CHeaderDivider.js.map +1 -1
  475. package/dist/esm/components/header/CHeaderNav.js +4 -4
  476. package/dist/esm/components/header/CHeaderNav.js.map +1 -1
  477. package/dist/esm/components/header/CHeaderText.js +4 -4
  478. package/dist/esm/components/header/CHeaderText.js.map +1 -1
  479. package/dist/esm/components/header/CHeaderToggler.js +4 -4
  480. package/dist/esm/components/header/CHeaderToggler.js.map +1 -1
  481. package/dist/esm/components/image/CImage.js +10 -11
  482. package/dist/esm/components/image/CImage.js.map +1 -1
  483. package/dist/esm/components/index.d.ts +1 -0
  484. package/dist/esm/components/link/CLink.js +6 -6
  485. package/dist/esm/components/link/CLink.js.map +1 -1
  486. package/dist/esm/components/list-group/CListGroup.js +7 -9
  487. package/dist/esm/components/list-group/CListGroup.js.map +1 -1
  488. package/dist/esm/components/list-group/CListGroupItem.js +14 -15
  489. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  490. package/dist/esm/components/modal/CModal.js +27 -35
  491. package/dist/esm/components/modal/CModal.js.map +1 -1
  492. package/dist/esm/components/modal/CModalBody.js +4 -4
  493. package/dist/esm/components/modal/CModalBody.js.map +1 -1
  494. package/dist/esm/components/modal/CModalContent.js +4 -4
  495. package/dist/esm/components/modal/CModalContent.js.map +1 -1
  496. package/dist/esm/components/modal/CModalContext.js +1 -1
  497. package/dist/esm/components/modal/CModalContext.js.map +1 -1
  498. package/dist/esm/components/modal/CModalDialog.js +10 -12
  499. package/dist/esm/components/modal/CModalDialog.js.map +1 -1
  500. package/dist/esm/components/modal/CModalFooter.js +4 -4
  501. package/dist/esm/components/modal/CModalFooter.js.map +1 -1
  502. package/dist/esm/components/modal/CModalHeader.js +6 -6
  503. package/dist/esm/components/modal/CModalHeader.js.map +1 -1
  504. package/dist/esm/components/modal/CModalTitle.js +4 -4
  505. package/dist/esm/components/modal/CModalTitle.js.map +1 -1
  506. package/dist/esm/components/nav/CNav.js +8 -8
  507. package/dist/esm/components/nav/CNav.js.map +1 -1
  508. package/dist/esm/components/nav/CNavGroup.js +25 -25
  509. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  510. package/dist/esm/components/nav/CNavGroupItems.js +4 -4
  511. package/dist/esm/components/nav/CNavGroupItems.js.map +1 -1
  512. package/dist/esm/components/nav/CNavItem.js +4 -4
  513. package/dist/esm/components/nav/CNavItem.js.map +1 -1
  514. package/dist/esm/components/nav/CNavLink.js +8 -8
  515. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  516. package/dist/esm/components/nav/CNavTitle.js +4 -4
  517. package/dist/esm/components/nav/CNavTitle.js.map +1 -1
  518. package/dist/esm/components/navbar/CNavbar.js +7 -8
  519. package/dist/esm/components/navbar/CNavbar.js.map +1 -1
  520. package/dist/esm/components/navbar/CNavbarBrand.js +5 -5
  521. package/dist/esm/components/navbar/CNavbarBrand.js.map +1 -1
  522. package/dist/esm/components/navbar/CNavbarNav.js +4 -4
  523. package/dist/esm/components/navbar/CNavbarNav.js.map +1 -1
  524. package/dist/esm/components/navbar/CNavbarText.js +4 -4
  525. package/dist/esm/components/navbar/CNavbarText.js.map +1 -1
  526. package/dist/esm/components/navbar/CNavbarToggler.js +4 -4
  527. package/dist/esm/components/navbar/CNavbarToggler.js.map +1 -1
  528. package/dist/esm/components/offcanvas/COffcanvas.js +21 -22
  529. package/dist/esm/components/offcanvas/COffcanvas.js.map +1 -1
  530. package/dist/esm/components/offcanvas/COffcanvasBody.js +4 -4
  531. package/dist/esm/components/offcanvas/COffcanvasBody.js.map +1 -1
  532. package/dist/esm/components/offcanvas/COffcanvasHeader.js +4 -4
  533. package/dist/esm/components/offcanvas/COffcanvasHeader.js.map +1 -1
  534. package/dist/esm/components/offcanvas/COffcanvasTitle.js +4 -4
  535. package/dist/esm/components/offcanvas/COffcanvasTitle.js.map +1 -1
  536. package/dist/esm/components/pagination/CPagination.js +8 -9
  537. package/dist/esm/components/pagination/CPagination.js.map +1 -1
  538. package/dist/esm/components/pagination/CPaginationItem.js +6 -6
  539. package/dist/esm/components/pagination/CPaginationItem.js.map +1 -1
  540. package/dist/esm/components/placeholder/CPlaceholder.js +14 -15
  541. package/dist/esm/components/placeholder/CPlaceholder.js.map +1 -1
  542. package/dist/esm/components/popover/CPopover.js +30 -30
  543. package/dist/esm/components/popover/CPopover.js.map +1 -1
  544. package/dist/esm/components/progress/CProgress.js +9 -9
  545. package/dist/esm/components/progress/CProgress.js.map +1 -1
  546. package/dist/esm/components/progress/CProgressBar.js +9 -10
  547. package/dist/esm/components/progress/CProgressBar.js.map +1 -1
  548. package/dist/esm/components/progress/CProgressStacked.js +4 -4
  549. package/dist/esm/components/progress/CProgressStacked.js.map +1 -1
  550. package/dist/esm/components/progress/CProgressStackedContext.js +1 -1
  551. package/dist/esm/components/progress/CProgressStackedContext.js.map +1 -1
  552. package/dist/esm/components/sidebar/CSidebar.js +35 -38
  553. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  554. package/dist/esm/components/sidebar/CSidebarBrand.js +4 -4
  555. package/dist/esm/components/sidebar/CSidebarBrand.js.map +1 -1
  556. package/dist/esm/components/sidebar/CSidebarFooter.js +4 -4
  557. package/dist/esm/components/sidebar/CSidebarFooter.js.map +1 -1
  558. package/dist/esm/components/sidebar/CSidebarHeader.js +4 -4
  559. package/dist/esm/components/sidebar/CSidebarHeader.js.map +1 -1
  560. package/dist/esm/components/sidebar/CSidebarNav.js +15 -15
  561. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  562. package/dist/esm/components/sidebar/CSidebarNavContext.js +1 -1
  563. package/dist/esm/components/sidebar/CSidebarNavContext.js.map +1 -1
  564. package/dist/esm/components/sidebar/CSidebarToggler.js +4 -4
  565. package/dist/esm/components/sidebar/CSidebarToggler.js.map +1 -1
  566. package/dist/esm/components/spinner/CSpinner.js +7 -8
  567. package/dist/esm/components/spinner/CSpinner.js.map +1 -1
  568. package/dist/esm/components/table/CTable.js +26 -27
  569. package/dist/esm/components/table/CTable.js.map +1 -1
  570. package/dist/esm/components/table/CTableBody.js +6 -7
  571. package/dist/esm/components/table/CTableBody.js.map +1 -1
  572. package/dist/esm/components/table/CTableCaption.js +4 -4
  573. package/dist/esm/components/table/CTableCaption.js.map +1 -1
  574. package/dist/esm/components/table/CTableDataCell.js +9 -10
  575. package/dist/esm/components/table/CTableDataCell.js.map +1 -1
  576. package/dist/esm/components/table/CTableFoot.js +6 -7
  577. package/dist/esm/components/table/CTableFoot.js.map +1 -1
  578. package/dist/esm/components/table/CTableHead.js +6 -7
  579. package/dist/esm/components/table/CTableHead.js.map +1 -1
  580. package/dist/esm/components/table/CTableHeaderCell.js +6 -7
  581. package/dist/esm/components/table/CTableHeaderCell.js.map +1 -1
  582. package/dist/esm/components/table/CTableResponsiveWrapper.js +4 -4
  583. package/dist/esm/components/table/CTableResponsiveWrapper.js.map +1 -1
  584. package/dist/esm/components/table/CTableRow.js +8 -9
  585. package/dist/esm/components/table/CTableRow.js.map +1 -1
  586. package/dist/esm/components/table/utils.js +9 -13
  587. package/dist/esm/components/table/utils.js.map +1 -1
  588. package/dist/esm/components/tabs/CTab.js +7 -7
  589. package/dist/esm/components/tabs/CTab.js.map +1 -1
  590. package/dist/esm/components/tabs/CTabContent.js +4 -4
  591. package/dist/esm/components/tabs/CTabContent.js.map +1 -1
  592. package/dist/esm/components/tabs/CTabList.js +14 -14
  593. package/dist/esm/components/tabs/CTabList.js.map +1 -1
  594. package/dist/esm/components/tabs/CTabPane.js +7 -7
  595. package/dist/esm/components/tabs/CTabPane.js.map +1 -1
  596. package/dist/esm/components/tabs/CTabPanel.js +11 -11
  597. package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
  598. package/dist/esm/components/tabs/CTabs.js +7 -8
  599. package/dist/esm/components/tabs/CTabs.js.map +1 -1
  600. package/dist/esm/components/tabs/CTabsContext.js +1 -1
  601. package/dist/esm/components/tabs/CTabsContext.js.map +1 -1
  602. package/dist/esm/components/toast/CToast.js +22 -26
  603. package/dist/esm/components/toast/CToast.js.map +1 -1
  604. package/dist/esm/components/toast/CToastBody.js +4 -4
  605. package/dist/esm/components/toast/CToastBody.js.map +1 -1
  606. package/dist/esm/components/toast/CToastClose.js +6 -6
  607. package/dist/esm/components/toast/CToastClose.js.map +1 -1
  608. package/dist/esm/components/toast/CToastContext.js +1 -1
  609. package/dist/esm/components/toast/CToastContext.js.map +1 -1
  610. package/dist/esm/components/toast/CToastHeader.js +4 -4
  611. package/dist/esm/components/toast/CToastHeader.js.map +1 -1
  612. package/dist/esm/components/toast/CToaster.js +13 -14
  613. package/dist/esm/components/toast/CToaster.js.map +1 -1
  614. package/dist/esm/components/tooltip/CTooltip.js +31 -31
  615. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  616. package/dist/esm/components/widgets/CWidgetStatsA.js +4 -5
  617. package/dist/esm/components/widgets/CWidgetStatsA.js.map +1 -1
  618. package/dist/esm/components/widgets/CWidgetStatsB.js +5 -5
  619. package/dist/esm/components/widgets/CWidgetStatsB.js.map +1 -1
  620. package/dist/esm/components/widgets/CWidgetStatsC.js +5 -5
  621. package/dist/esm/components/widgets/CWidgetStatsC.js.map +1 -1
  622. package/dist/esm/components/widgets/CWidgetStatsD.js +8 -9
  623. package/dist/esm/components/widgets/CWidgetStatsD.js.map +1 -1
  624. package/dist/esm/components/widgets/CWidgetStatsE.js +4 -4
  625. package/dist/esm/components/widgets/CWidgetStatsE.js.map +1 -1
  626. package/dist/esm/components/widgets/CWidgetStatsF.js +7 -7
  627. package/dist/esm/components/widgets/CWidgetStatsF.js.map +1 -1
  628. package/dist/esm/hooks/useClipboard.js +22 -34
  629. package/dist/esm/hooks/useClipboard.js.map +1 -1
  630. package/dist/esm/hooks/useColorModes.js +15 -20
  631. package/dist/esm/hooks/useColorModes.js.map +1 -1
  632. package/dist/esm/hooks/useForkedRef.js +6 -10
  633. package/dist/esm/hooks/useForkedRef.js.map +1 -1
  634. package/dist/esm/hooks/usePopper.js +11 -11
  635. package/dist/esm/hooks/usePopper.js.map +1 -1
  636. package/dist/esm/index.js +1 -0
  637. package/dist/esm/index.js.map +1 -1
  638. package/dist/esm/node_modules/tslib/tslib.es6.js +1 -50
  639. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
  640. package/dist/esm/props.js +6 -6
  641. package/dist/esm/props.js.map +1 -1
  642. package/dist/esm/utils/executeAfterTransition.js +8 -10
  643. package/dist/esm/utils/executeAfterTransition.js.map +1 -1
  644. package/dist/esm/utils/getNextActiveElement.js +3 -3
  645. package/dist/esm/utils/getNextActiveElement.js.map +1 -1
  646. package/dist/esm/utils/getRTLPlacement.js +1 -1
  647. package/dist/esm/utils/getRTLPlacement.js.map +1 -1
  648. package/dist/esm/utils/getTransitionDurationFromElement.js +4 -4
  649. package/dist/esm/utils/getTransitionDurationFromElement.js.map +1 -1
  650. package/dist/esm/utils/isInViewport.js +2 -2
  651. package/dist/esm/utils/isInViewport.js.map +1 -1
  652. package/dist/esm/utils/isRTL.js +1 -1
  653. package/dist/esm/utils/isRTL.js.map +1 -1
  654. package/package.json +10 -10
  655. package/src/components/accordion/CAccordion.tsx +1 -1
  656. package/src/components/accordion/CAccordionHeader.tsx +1 -1
  657. package/src/components/alert/CAlert.tsx +3 -3
  658. package/src/components/alert/CAlertHeading.tsx +1 -1
  659. package/src/components/alert/CAlertLink.tsx +1 -1
  660. package/src/components/alert/__tests__/CAlertHeading.spec.tsx +1 -1
  661. package/src/components/alert/__tests__/CAlertLink.spec.tsx +1 -1
  662. package/src/components/avatar/CAvatar.tsx +2 -2
  663. package/src/components/avatar/__tests__/CAvatar.spec.tsx +2 -2
  664. package/src/components/backdrop/CBackdrop.tsx +1 -1
  665. package/src/components/backdrop/__tests__/CBackdrop.spec.tsx +1 -1
  666. package/src/components/badge/CBadge.tsx +3 -3
  667. package/src/components/badge/__tests__/CBadge.spec.tsx +1 -1
  668. package/src/components/breadcrumb/CBreadcrumb.tsx +1 -1
  669. package/src/components/breadcrumb/CBreadcrumbItem.tsx +2 -2
  670. package/src/components/breadcrumb/__tests__/CBreadcrumb.spec.tsx +1 -1
  671. package/src/components/breadcrumb/__tests__/CBreadcrumbItem.spec.tsx +1 -1
  672. package/src/components/button/__tests__/CButton.spec.tsx +2 -2
  673. package/src/components/button-group/CButtonGroup.tsx +2 -2
  674. package/src/components/button-group/CButtonToolbar.tsx +1 -1
  675. package/src/components/button-group/__tests__/CButtonGroup.spec.tsx +2 -2
  676. package/src/components/button-group/__tests__/CButtonToolbar.spec.tsx +1 -1
  677. package/src/components/callout/CCallout.tsx +2 -2
  678. package/src/components/callout/__tests__/CCallout.spec.tsx +1 -1
  679. package/src/components/card/CCard.tsx +2 -2
  680. package/src/components/card/CCardBody.tsx +1 -1
  681. package/src/components/card/CCardFooter.tsx +1 -1
  682. package/src/components/card/CCardGroup.tsx +1 -1
  683. package/src/components/card/CCardImageOverlay.tsx +1 -1
  684. package/src/components/card/CCardLink.tsx +1 -1
  685. package/src/components/card/CCardSubtitle.tsx +1 -1
  686. package/src/components/card/__tests__/CCard.spec.tsx +1 -1
  687. package/src/components/card/__tests__/CCardGroup.spec.tsx +1 -1
  688. package/src/components/card/__tests__/CCardHeader.spec.tsx +1 -1
  689. package/src/components/card/__tests__/CCardLink.spec.tsx +1 -1
  690. package/src/components/card/__tests__/CCardSubtitle.spec.tsx +1 -1
  691. package/src/components/card/__tests__/CCardText.spec.tsx +1 -1
  692. package/src/components/card/__tests__/CCardTitle.spec.tsx +1 -1
  693. package/src/components/carousel/__tests__/CCarousel.spec.tsx +3 -3
  694. package/src/components/close-button/CCloseButton.tsx +2 -2
  695. package/src/components/collapse/CCollapse.tsx +1 -1
  696. package/src/components/dropdown/CDropdown.tsx +214 -106
  697. package/src/components/dropdown/CDropdownContext.ts +1 -1
  698. package/src/components/dropdown/CDropdownHeader.tsx +1 -0
  699. package/src/components/dropdown/CDropdownItemPlain.tsx +1 -0
  700. package/src/components/dropdown/CDropdownMenu.tsx +1 -0
  701. package/src/components/dropdown/CDropdownToggle.tsx +28 -4
  702. package/src/components/dropdown/__tests__/CDropdown.spec.tsx +3 -3
  703. package/src/components/dropdown/__tests__/CDropdownHeader.spec.tsx +1 -1
  704. package/src/components/dropdown/__tests__/CDropdownItem.spec.tsx +1 -1
  705. package/src/components/dropdown/__tests__/CDropdownItemPlain.spec.tsx +1 -1
  706. package/src/components/dropdown/__tests__/CDropdownMenu.spec.tsx +1 -1
  707. package/src/components/dropdown/__tests__/CDropdownToggle.spec.tsx +1 -1
  708. package/src/components/dropdown/utils.ts +23 -2
  709. package/src/components/focus-trap/CFocusTrap.tsx +254 -0
  710. package/src/components/focus-trap/__tests__/CFocusTrap.spec.tsx +232 -0
  711. package/src/components/focus-trap/__tests__/__snapshots__/CFocusTrap.spec.tsx.snap +21 -0
  712. package/src/components/focus-trap/index.ts +3 -0
  713. package/src/components/focus-trap/utils.ts +115 -0
  714. package/src/components/footer/CFooter.tsx +1 -1
  715. package/src/components/footer/__tests__/CFooter.spec.tsx +1 -1
  716. package/src/components/form/CForm.tsx +1 -1
  717. package/src/components/form/CFormCheck.tsx +5 -5
  718. package/src/components/form/CFormFeedback.tsx +2 -2
  719. package/src/components/form/CFormFloating.tsx +1 -1
  720. package/src/components/form/CFormInput.tsx +4 -4
  721. package/src/components/form/CFormLabel.tsx +1 -1
  722. package/src/components/form/CFormRange.tsx +1 -1
  723. package/src/components/form/CFormSelect.tsx +3 -3
  724. package/src/components/form/CFormSwitch.tsx +2 -2
  725. package/src/components/form/CFormTextarea.tsx +3 -3
  726. package/src/components/form/CInputGroup.tsx +2 -2
  727. package/src/components/form/CInputGroupText.tsx +1 -1
  728. package/src/components/form/__tests__/CForm.spec.tsx +2 -2
  729. package/src/components/form/__tests__/CFormCheck.spec.tsx +2 -2
  730. package/src/components/form/__tests__/CFormControl.spec.tsx +1 -1
  731. package/src/components/form/__tests__/CFormFeedback.spec.tsx +2 -2
  732. package/src/components/form/__tests__/CFormInput.spec.tsx +1 -1
  733. package/src/components/form/__tests__/CFormRange.spec.tsx +1 -1
  734. package/src/components/form/__tests__/CFormSelect.spec.tsx +1 -1
  735. package/src/components/form/__tests__/CFormSwitch.spec.tsx +1 -1
  736. package/src/components/form/__tests__/CFormText.spec.tsx +1 -1
  737. package/src/components/form/__tests__/CFormTextarea.spec.tsx +1 -1
  738. package/src/components/form/__tests__/CInputGroup.spec.tsx +1 -1
  739. package/src/components/form/__tests__/CInputGroupText.spec.tsx +1 -1
  740. package/src/components/grid/CCol.tsx +2 -2
  741. package/src/components/grid/CContainer.tsx +2 -2
  742. package/src/components/grid/CRow.tsx +1 -1
  743. package/src/components/grid/__tests__/CCol.spec.tsx +2 -2
  744. package/src/components/grid/__tests__/CContainer.spec.tsx +2 -2
  745. package/src/components/grid/__tests__/CRow.spec.tsx +5 -5
  746. package/src/components/header/CHeader.tsx +1 -1
  747. package/src/components/header/CHeaderDivider.tsx +1 -1
  748. package/src/components/header/CHeaderText.tsx +1 -1
  749. package/src/components/header/CHeaderToggler.tsx +1 -1
  750. package/src/components/header/__tests__/CHeader.spec.tsx +1 -1
  751. package/src/components/header/__tests__/CHeaderBrand.spec.tsx +1 -1
  752. package/src/components/header/__tests__/CHeaderNav.spec.tsx +1 -1
  753. package/src/components/image/CImage.tsx +2 -2
  754. package/src/components/image/__tests__/CImage.spec.tsx +1 -1
  755. package/src/components/index.ts +1 -0
  756. package/src/components/link/__tests__/CLink.spec.tsx +3 -3
  757. package/src/components/list-group/CListGroup.tsx +1 -1
  758. package/src/components/list-group/CListGroupItem.tsx +2 -2
  759. package/src/components/list-group/__tests__/CListGroup.spec.tsx +2 -2
  760. package/src/components/list-group/__tests__/CListGroupItem.spec.tsx +1 -1
  761. package/src/components/modal/CModal.tsx +5 -13
  762. package/src/components/modal/CModalBody.tsx +1 -1
  763. package/src/components/modal/CModalContent.tsx +1 -1
  764. package/src/components/modal/CModalDialog.tsx +2 -2
  765. package/src/components/modal/CModalFooter.tsx +1 -1
  766. package/src/components/modal/CModalHeader.tsx +1 -1
  767. package/src/components/modal/__tests__/CModal.spec.tsx +2 -2
  768. package/src/components/modal/__tests__/CModalDialog.spec.tsx +1 -1
  769. package/src/components/modal/__tests__/CModalTitle.spec.tsx +1 -1
  770. package/src/components/nav/CNavGroup.tsx +2 -2
  771. package/src/components/nav/CNavGroupItems.tsx +1 -1
  772. package/src/components/nav/__tests__/CNavGroup.spec.tsx +1 -1
  773. package/src/components/nav/__tests__/CNavItem.spec.tsx +1 -1
  774. package/src/components/nav/__tests__/CNavLink.spec.tsx +1 -1
  775. package/src/components/navbar/CNavbar.tsx +3 -3
  776. package/src/components/navbar/CNavbarText.tsx +1 -1
  777. package/src/components/navbar/CNavbarToggler.tsx +1 -1
  778. package/src/components/navbar/__tests__/CNavbar.spec.tsx +2 -2
  779. package/src/components/navbar/__tests__/CNavbarBrand.spec.tsx +1 -1
  780. package/src/components/navbar/__tests__/CNavbarNav.spec.tsx +1 -1
  781. package/src/components/offcanvas/COffcanvas.tsx +26 -24
  782. package/src/components/offcanvas/COffcanvasBody.tsx +1 -1
  783. package/src/components/offcanvas/COffcanvasHeader.tsx +1 -1
  784. package/src/components/offcanvas/COffcanvasTitle.tsx +1 -1
  785. package/src/components/offcanvas/__tests__/COffcanvasTitle.spec.tsx +1 -1
  786. package/src/components/pagination/CPagination.tsx +2 -2
  787. package/src/components/pagination/CPaginationItem.tsx +2 -2
  788. package/src/components/pagination/__tests__/CPagination.spec.tsx +2 -2
  789. package/src/components/pagination/__tests__/CPaginationItem.spec.tsx +1 -1
  790. package/src/components/placeholder/CPlaceholder.tsx +2 -2
  791. package/src/components/placeholder/__tests__/CPlaceholder.spec.tsx +1 -1
  792. package/src/components/progress/CProgress.tsx +3 -3
  793. package/src/components/progress/CProgressBar.tsx +2 -2
  794. package/src/components/progress/__tests__/CProgress.spec.tsx +1 -1
  795. package/src/components/progress/__tests__/CProgressBar.spec.tsx +1 -1
  796. package/src/components/sidebar/CSidebarFooter.tsx +1 -1
  797. package/src/components/sidebar/CSidebarHeader.tsx +1 -1
  798. package/src/components/sidebar/CSidebarToggler.tsx +1 -1
  799. package/src/components/sidebar/__tests__/CSidebar.spec.tsx +2 -2
  800. package/src/components/spinner/CSpinner.tsx +3 -3
  801. package/src/components/spinner/__tests__/CSpinner.spec.tsx +1 -1
  802. package/src/components/table/CTable.tsx +3 -3
  803. package/src/components/table/CTableBody.tsx +2 -2
  804. package/src/components/table/CTableDataCell.tsx +2 -2
  805. package/src/components/table/CTableFoot.tsx +2 -2
  806. package/src/components/table/CTableHead.tsx +2 -2
  807. package/src/components/table/CTableHeaderCell.tsx +2 -2
  808. package/src/components/table/CTableRow.tsx +2 -2
  809. package/src/components/table/__tests__/CTable.spec.tsx +2 -2
  810. package/src/components/table/__tests__/CTableBody.spec.tsx +1 -1
  811. package/src/components/table/__tests__/CTableDataCell.spec.tsx +2 -2
  812. package/src/components/table/__tests__/CTableFoot.spec.tsx +1 -1
  813. package/src/components/table/__tests__/CTableHead.spec.tsx +1 -1
  814. package/src/components/table/__tests__/CTableHeaderCell.spec.tsx +2 -2
  815. package/src/components/table/__tests__/CTableRow.spec.tsx +2 -2
  816. package/src/components/tabs/CTab.tsx +2 -2
  817. package/src/components/tabs/CTabContent.tsx +1 -1
  818. package/src/components/tabs/CTabPane.tsx +2 -2
  819. package/src/components/tabs/CTabPanel.tsx +2 -2
  820. package/src/components/toast/CToastBody.tsx +1 -1
  821. package/src/components/toast/CToastHeader.tsx +1 -1
  822. package/src/components/toast/__tests__/CToaster.spec.tsx +2 -2
  823. package/src/components/widgets/CWidgetStatsA.tsx +1 -1
  824. package/src/components/widgets/CWidgetStatsB.tsx +1 -1
  825. package/src/components/widgets/CWidgetStatsC.tsx +2 -2
  826. package/src/components/widgets/CWidgetStatsD.tsx +2 -2
  827. package/src/components/widgets/CWidgetStatsE.tsx +1 -1
  828. package/src/components/widgets/CWidgetStatsF.tsx +1 -1
  829. package/src/components/widgets/__tests__/CWidgetStatsA.spec.tsx +1 -1
  830. package/src/components/widgets/__tests__/CWidgetStatsB.spec.tsx +1 -1
  831. package/src/components/widgets/__tests__/CWidgetStatsC.spec.tsx +1 -1
  832. package/src/components/widgets/__tests__/CWidgetStatsD.spec.tsx +1 -1
  833. package/src/components/widgets/__tests__/CWidgetStatsE.spec.tsx +1 -1
  834. package/src/components/widgets/__tests__/CWidgetStatsF.spec.tsx +2 -2
  835. package/src/helpers/polymorphicComponent.ts +1 -1
  836. package/src/utils/executeAfterTransition.ts +1 -1
  837. package/src/utils/getNextActiveElement.ts +1 -1
  838. package/src/utils/mergeClassNames.ts +1 -1
@@ -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')
@@ -1,3 +1,4 @@
1
+ import React from 'react'
1
2
  import type { Placement } from '@popperjs/core'
2
3
  import type { Placements } from '../../types'
3
4
  import type { Alignments, Breakpoints } from './types'
@@ -7,7 +8,7 @@ export const getAlignmentClassNames = (alignment: Alignments) => {
7
8
  if (typeof alignment === 'object') {
8
9
  for (const key in alignment) {
9
10
  classNames.push(
10
- `dropdown-menu${key === 'xs' ? '' : `-${key}`}-${alignment[key as keyof Breakpoints]}`,
11
+ `dropdown-menu${key === 'xs' ? '' : `-${key}`}-${alignment[key as keyof Breakpoints]}`
11
12
  )
12
13
  }
13
14
  }
@@ -23,7 +24,7 @@ export const getPlacement = (
23
24
  placement: Placement,
24
25
  direction: string | undefined,
25
26
  alignment: Alignments | string | undefined,
26
- isRTL: boolean,
27
+ isRTL: boolean
27
28
  ): Placements => {
28
29
  let _placement = placement
29
30
 
@@ -49,3 +50,23 @@ export const getPlacement = (
49
50
 
50
51
  return _placement
51
52
  }
53
+
54
+ export const getReferenceElement = (
55
+ reference: 'parent' | 'toggle' | React.RefObject<HTMLElement | null> | HTMLElement,
56
+ dropdownToggleElement: HTMLElement | null,
57
+ dropdownRef: React.RefObject<HTMLElement | null>
58
+ ): HTMLElement | null => {
59
+ if (reference === 'parent') {
60
+ return dropdownRef.current
61
+ }
62
+
63
+ if (reference instanceof HTMLElement) {
64
+ return reference
65
+ }
66
+
67
+ if (reference instanceof Object && 'current' in reference) {
68
+ return reference.current
69
+ }
70
+
71
+ return dropdownToggleElement
72
+ }
@@ -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,115 @@
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
+ return 'nodeType' in object && typeof object.nodeType === 'number'
60
+ }
61
+
62
+ /**
63
+ * Checks if an element is visible in the DOM.
64
+ * Considers client rects and computed visibility styles, handling edge cases like details elements.
65
+ * @param element - The HTML element to check for visibility
66
+ * @returns True if the element is visible, false otherwise
67
+ */
68
+ export const isVisible = (element: HTMLElement): boolean => {
69
+ if (!isElement(element) || element.getClientRects().length === 0) {
70
+ return false
71
+ }
72
+
73
+ const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'
74
+
75
+ // Handle `details` element as its content may falsely appear visible when it is closed
76
+ const closedDetails = element.closest('details:not([open])')
77
+
78
+ if (!closedDetails) {
79
+ return elementIsVisible
80
+ }
81
+
82
+ if (closedDetails !== element) {
83
+ const summary = element.closest('summary')
84
+
85
+ // Check if summary is a direct child of the closed details
86
+ if (summary?.parentNode !== closedDetails) {
87
+ return false
88
+ }
89
+ }
90
+
91
+ return elementIsVisible
92
+ }
93
+
94
+ /**
95
+ * Merges multiple React refs into a single ref callback.
96
+ * Handles both function refs and ref objects, gracefully ignoring failures.
97
+ * @param refs - Array of React refs to merge
98
+ * @returns A ref callback that applies to all provided refs
99
+ */
100
+ export const mergeRefs =
101
+ <T>(...refs: (React.Ref<T> | undefined)[]) =>
102
+ (node: T) => {
103
+ refs.forEach((ref) => {
104
+ if (!ref) return
105
+ if (typeof ref === 'function') {
106
+ ref(node)
107
+ } else {
108
+ try {
109
+ ;(ref as React.RefObject<T>).current = node
110
+ } catch {
111
+ // Ignore assignment failures for read-only refs
112
+ }
113
+ }
114
+ })
115
+ }