@coreui/react-pro 5.13.0 → 5.14.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 (378) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/accordion/CAccordion.d.ts +0 -6
  3. package/dist/cjs/components/accordion/CAccordion.js +3 -4
  4. package/dist/cjs/components/accordion/CAccordion.js.map +1 -1
  5. package/dist/cjs/components/accordion/CAccordionBody.js +2 -2
  6. package/dist/cjs/components/accordion/CAccordionBody.js.map +1 -1
  7. package/dist/cjs/components/accordion/CAccordionButton.js +2 -2
  8. package/dist/cjs/components/accordion/CAccordionButton.js.map +1 -1
  9. package/dist/cjs/components/accordion/CAccordionContext.d.ts +6 -0
  10. package/dist/cjs/components/accordion/CAccordionContext.js +8 -0
  11. package/dist/cjs/components/accordion/CAccordionContext.js.map +1 -0
  12. package/dist/cjs/components/accordion/CAccordionItem.d.ts +0 -6
  13. package/dist/cjs/components/accordion/CAccordionItem.js +6 -6
  14. package/dist/cjs/components/accordion/CAccordionItem.js.map +1 -1
  15. package/dist/cjs/components/accordion/CAccordionItemContext.d.ts +6 -0
  16. package/dist/cjs/components/accordion/CAccordionItemContext.js +8 -0
  17. package/dist/cjs/components/accordion/CAccordionItemContext.js.map +1 -0
  18. package/dist/cjs/components/carousel/CCarousel.d.ts +0 -5
  19. package/dist/cjs/components/carousel/CCarousel.js +2 -3
  20. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  21. package/dist/cjs/components/carousel/CCarouselContext.d.ts +5 -0
  22. package/dist/cjs/components/carousel/CCarouselContext.js +8 -0
  23. package/dist/cjs/components/carousel/CCarouselContext.js.map +1 -0
  24. package/dist/cjs/components/carousel/CCarouselItem.js +3 -3
  25. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  26. package/dist/cjs/components/dropdown/CDropdown.d.ts +1 -9
  27. package/dist/cjs/components/dropdown/CDropdown.js +26 -18
  28. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  29. package/dist/cjs/components/dropdown/CDropdownContext.d.ts +15 -0
  30. package/dist/cjs/components/dropdown/CDropdownContext.js +8 -0
  31. package/dist/cjs/components/dropdown/CDropdownContext.js.map +1 -0
  32. package/dist/cjs/components/dropdown/CDropdownMenu.js +2 -2
  33. package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
  34. package/dist/cjs/components/dropdown/CDropdownToggle.js +2 -2
  35. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  36. package/dist/cjs/components/index.d.ts +1 -0
  37. package/dist/cjs/components/modal/CModal.d.ts +0 -6
  38. package/dist/cjs/components/modal/CModal.js +2 -3
  39. package/dist/cjs/components/modal/CModal.js.map +1 -1
  40. package/dist/cjs/components/modal/CModalContext.d.ts +5 -0
  41. package/dist/cjs/components/modal/CModalContext.js +8 -0
  42. package/dist/cjs/components/modal/CModalContext.js.map +1 -0
  43. package/dist/cjs/components/modal/CModalHeader.js +2 -2
  44. package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
  45. package/dist/cjs/components/nav/CNavGroup.js +2 -2
  46. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  47. package/dist/cjs/components/nav/CNavLink.js +2 -2
  48. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  49. package/dist/cjs/components/password-input/CPasswordInput.js +14 -12
  50. package/dist/cjs/components/password-input/CPasswordInput.js.map +1 -1
  51. package/dist/cjs/components/progress/CProgress.js +2 -2
  52. package/dist/cjs/components/progress/CProgress.js.map +1 -1
  53. package/dist/cjs/components/progress/CProgressBar.d.ts +1 -1
  54. package/dist/cjs/components/progress/CProgressBar.js +3 -3
  55. package/dist/cjs/components/progress/CProgressBar.js.map +1 -1
  56. package/dist/cjs/components/progress/CProgressStacked.d.ts +0 -4
  57. package/dist/cjs/components/progress/CProgressStacked.js +2 -3
  58. package/dist/cjs/components/progress/CProgressStacked.js.map +1 -1
  59. package/dist/cjs/components/progress/CProgressStackedContext.d.ts +4 -0
  60. package/dist/cjs/components/progress/CProgressStackedContext.js +8 -0
  61. package/dist/cjs/components/progress/CProgressStackedContext.js.map +1 -0
  62. package/dist/cjs/components/sidebar/CSidebarNav.d.ts +1 -7
  63. package/dist/cjs/components/sidebar/CSidebarNav.js +15 -14
  64. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  65. package/dist/cjs/components/sidebar/CSidebarNavContext.d.ts +5 -0
  66. package/dist/cjs/components/sidebar/CSidebarNavContext.js +8 -0
  67. package/dist/cjs/components/sidebar/CSidebarNavContext.js.map +1 -0
  68. package/dist/cjs/components/stepper/CStepper.d.ts +84 -0
  69. package/dist/cjs/components/stepper/CStepper.js +201 -0
  70. package/dist/cjs/components/stepper/CStepper.js.map +1 -0
  71. package/dist/cjs/components/stepper/index.d.ts +2 -0
  72. package/dist/cjs/components/stepper/types.d.ts +17 -0
  73. package/dist/cjs/components/tabs/CTab.js +2 -2
  74. package/dist/cjs/components/tabs/CTab.js.map +1 -1
  75. package/dist/cjs/components/tabs/CTabPane.js +1 -1
  76. package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
  77. package/dist/cjs/components/tabs/CTabPanel.js +3 -3
  78. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
  79. package/dist/cjs/components/tabs/CTabs.d.ts +29 -9
  80. package/dist/cjs/components/tabs/CTabs.js +14 -9
  81. package/dist/cjs/components/tabs/CTabs.js.map +1 -1
  82. package/dist/cjs/components/tabs/CTabsContext.d.ts +6 -0
  83. package/dist/cjs/components/tabs/CTabsContext.js +8 -0
  84. package/dist/cjs/components/tabs/CTabsContext.js.map +1 -0
  85. package/dist/cjs/components/toast/CToast.d.ts +0 -6
  86. package/dist/cjs/components/toast/CToast.js +5 -9
  87. package/dist/cjs/components/toast/CToast.js.map +1 -1
  88. package/dist/cjs/components/toast/CToastClose.js +2 -2
  89. package/dist/cjs/components/toast/CToastClose.js.map +1 -1
  90. package/dist/cjs/components/toast/CToastContext.d.ts +5 -0
  91. package/dist/cjs/components/toast/CToastContext.js +8 -0
  92. package/dist/cjs/components/toast/CToastContext.js.map +1 -0
  93. package/dist/cjs/components/toast/CToaster.d.ts +2 -1
  94. package/dist/cjs/components/toast/CToaster.js +4 -2
  95. package/dist/cjs/components/toast/CToaster.js.map +1 -1
  96. package/dist/cjs/hooks/useDropdownWithPopper.d.ts +2 -2
  97. package/dist/cjs/hooks/usePopper.js +2 -2
  98. package/dist/cjs/hooks/usePopper.js.map +1 -1
  99. package/dist/cjs/index.js +2 -0
  100. package/dist/cjs/index.js.map +1 -1
  101. package/dist/cjs/utils/index.d.ts +1 -2
  102. package/dist/esm/components/accordion/CAccordion.d.ts +0 -6
  103. package/dist/esm/components/accordion/CAccordion.js +4 -4
  104. package/dist/esm/components/accordion/CAccordion.js.map +1 -1
  105. package/dist/esm/components/accordion/CAccordionBody.js +1 -1
  106. package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
  107. package/dist/esm/components/accordion/CAccordionButton.js +1 -1
  108. package/dist/esm/components/accordion/CAccordionContext.d.ts +6 -0
  109. package/dist/esm/components/accordion/CAccordionContext.js +6 -0
  110. package/dist/esm/components/accordion/CAccordionContext.js.map +1 -0
  111. package/dist/esm/components/accordion/CAccordionItem.d.ts +0 -6
  112. package/dist/esm/components/accordion/CAccordionItem.js +6 -5
  113. package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
  114. package/dist/esm/components/accordion/CAccordionItemContext.d.ts +6 -0
  115. package/dist/esm/components/accordion/CAccordionItemContext.js +6 -0
  116. package/dist/esm/components/accordion/CAccordionItemContext.js.map +1 -0
  117. package/dist/esm/components/carousel/CCarousel.d.ts +0 -5
  118. package/dist/esm/components/carousel/CCarousel.js +3 -3
  119. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  120. package/dist/esm/components/carousel/CCarouselContext.d.ts +5 -0
  121. package/dist/esm/components/carousel/CCarouselContext.js +6 -0
  122. package/dist/esm/components/carousel/CCarouselContext.js.map +1 -0
  123. package/dist/esm/components/carousel/CCarouselItem.js +2 -2
  124. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  125. package/dist/esm/components/dropdown/CDropdown.d.ts +1 -9
  126. package/dist/esm/components/dropdown/CDropdown.js +27 -18
  127. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  128. package/dist/esm/components/dropdown/CDropdownContext.d.ts +15 -0
  129. package/dist/esm/components/dropdown/CDropdownContext.js +6 -0
  130. package/dist/esm/components/dropdown/CDropdownContext.js.map +1 -0
  131. package/dist/esm/components/dropdown/CDropdownMenu.js +1 -1
  132. package/dist/esm/components/dropdown/CDropdownToggle.js +1 -1
  133. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  134. package/dist/esm/components/index.d.ts +1 -0
  135. package/dist/esm/components/modal/CModal.d.ts +0 -6
  136. package/dist/esm/components/modal/CModal.js +3 -3
  137. package/dist/esm/components/modal/CModal.js.map +1 -1
  138. package/dist/esm/components/modal/CModalContext.d.ts +5 -0
  139. package/dist/esm/components/modal/CModalContext.js +6 -0
  140. package/dist/esm/components/modal/CModalContext.js.map +1 -0
  141. package/dist/esm/components/modal/CModalHeader.js +1 -1
  142. package/dist/esm/components/nav/CNavGroup.js +2 -2
  143. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  144. package/dist/esm/components/nav/CNavLink.js +2 -2
  145. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  146. package/dist/esm/components/password-input/CPasswordInput.js +14 -12
  147. package/dist/esm/components/password-input/CPasswordInput.js.map +1 -1
  148. package/dist/esm/components/progress/CProgress.js +1 -1
  149. package/dist/esm/components/progress/CProgressBar.d.ts +1 -1
  150. package/dist/esm/components/progress/CProgressBar.js +2 -2
  151. package/dist/esm/components/progress/CProgressBar.js.map +1 -1
  152. package/dist/esm/components/progress/CProgressStacked.d.ts +0 -4
  153. package/dist/esm/components/progress/CProgressStacked.js +3 -3
  154. package/dist/esm/components/progress/CProgressStacked.js.map +1 -1
  155. package/dist/esm/components/progress/CProgressStackedContext.d.ts +4 -0
  156. package/dist/esm/components/progress/CProgressStackedContext.js +6 -0
  157. package/dist/esm/components/progress/CProgressStackedContext.js.map +1 -0
  158. package/dist/esm/components/sidebar/CSidebarNav.d.ts +1 -7
  159. package/dist/esm/components/sidebar/CSidebarNav.js +17 -15
  160. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  161. package/dist/esm/components/sidebar/CSidebarNavContext.d.ts +5 -0
  162. package/dist/esm/components/sidebar/CSidebarNavContext.js +6 -0
  163. package/dist/esm/components/sidebar/CSidebarNavContext.js.map +1 -0
  164. package/dist/esm/components/stepper/CStepper.d.ts +84 -0
  165. package/dist/esm/components/stepper/CStepper.js +199 -0
  166. package/dist/esm/components/stepper/CStepper.js.map +1 -0
  167. package/dist/esm/components/stepper/index.d.ts +2 -0
  168. package/dist/esm/components/stepper/types.d.ts +17 -0
  169. package/dist/esm/components/tabs/CTab.js +2 -2
  170. package/dist/esm/components/tabs/CTab.js.map +1 -1
  171. package/dist/esm/components/tabs/CTabPane.js +1 -1
  172. package/dist/esm/components/tabs/CTabPane.js.map +1 -1
  173. package/dist/esm/components/tabs/CTabPanel.js +3 -3
  174. package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
  175. package/dist/esm/components/tabs/CTabs.d.ts +29 -9
  176. package/dist/esm/components/tabs/CTabs.js +16 -10
  177. package/dist/esm/components/tabs/CTabs.js.map +1 -1
  178. package/dist/esm/components/tabs/CTabsContext.d.ts +6 -0
  179. package/dist/esm/components/tabs/CTabsContext.js +6 -0
  180. package/dist/esm/components/tabs/CTabsContext.js.map +1 -0
  181. package/dist/esm/components/toast/CToast.d.ts +0 -6
  182. package/dist/esm/components/toast/CToast.js +6 -9
  183. package/dist/esm/components/toast/CToast.js.map +1 -1
  184. package/dist/esm/components/toast/CToastClose.js +1 -1
  185. package/dist/esm/components/toast/CToastClose.js.map +1 -1
  186. package/dist/esm/components/toast/CToastContext.d.ts +5 -0
  187. package/dist/esm/components/toast/CToastContext.js +6 -0
  188. package/dist/esm/components/toast/CToastContext.js.map +1 -0
  189. package/dist/esm/components/toast/CToaster.d.ts +2 -1
  190. package/dist/esm/components/toast/CToaster.js +4 -2
  191. package/dist/esm/components/toast/CToaster.js.map +1 -1
  192. package/dist/esm/hooks/useDropdownWithPopper.d.ts +2 -2
  193. package/dist/esm/hooks/usePopper.js +2 -2
  194. package/dist/esm/hooks/usePopper.js.map +1 -1
  195. package/dist/esm/index.js +1 -0
  196. package/dist/esm/index.js.map +1 -1
  197. package/dist/esm/utils/index.d.ts +1 -2
  198. package/package.json +5 -5
  199. package/src/components/accordion/CAccordion.tsx +4 -10
  200. package/src/components/accordion/CAccordionBody.tsx +1 -2
  201. package/src/components/accordion/CAccordionButton.tsx +2 -2
  202. package/src/components/accordion/CAccordionContext.ts +9 -0
  203. package/src/components/accordion/CAccordionItem.tsx +4 -11
  204. package/src/components/accordion/CAccordionItemContext.ts +9 -0
  205. package/src/components/accordion/__tests__/CAccordion.spec.tsx +1 -1
  206. package/src/components/accordion/__tests__/CAccordionBody.spec.tsx +1 -1
  207. package/src/components/accordion/__tests__/CAccordionButton.spec.tsx +1 -1
  208. package/src/components/accordion/__tests__/CAccordionCollapse.spec.tsx +1 -1
  209. package/src/components/accordion/__tests__/CAccordionHeader.spec.tsx +1 -1
  210. package/src/components/accordion/__tests__/CAccordionItem.spec.tsx +1 -1
  211. package/src/components/alert/__tests__/CAlert.spec.tsx +39 -18
  212. package/src/components/alert/__tests__/CAlertHeading.spec.tsx +1 -1
  213. package/src/components/alert/__tests__/CAlertLink.spec.tsx +1 -1
  214. package/src/components/avatar/__tests__/CAvatar.spec.tsx +1 -1
  215. package/src/components/backdrop/__tests__/CBackdrop.spec.tsx +1 -1
  216. package/src/components/badge/__tests__/CBadge.spec.tsx +1 -1
  217. package/src/components/breadcrumb/__tests__/CBreadcrumb.spec.tsx +1 -1
  218. package/src/components/breadcrumb/__tests__/CBreadcrumbItem.spec.tsx +1 -1
  219. package/src/components/button/__tests__/CButton.spec.tsx +1 -1
  220. package/src/components/button-group/__tests__/CButtonGroup.spec.tsx +2 -1
  221. package/src/components/button-group/__tests__/CButtonToolbar.spec.tsx +2 -1
  222. package/src/components/callout/__tests__/CCallout.spec.tsx +1 -1
  223. package/src/components/card/__tests__/CCard.spec.tsx +1 -1
  224. package/src/components/card/__tests__/CCardBody.spec.tsx +1 -1
  225. package/src/components/card/__tests__/CCardFooter.spec.tsx +1 -1
  226. package/src/components/card/__tests__/CCardGroup.spec.tsx +1 -1
  227. package/src/components/card/__tests__/CCardHeader.spec.tsx +1 -1
  228. package/src/components/card/__tests__/CCardImage.spec.tsx +1 -1
  229. package/src/components/card/__tests__/CCardImageOverlay.spec.tsx +1 -1
  230. package/src/components/card/__tests__/CCardLink.spec.tsx +1 -1
  231. package/src/components/card/__tests__/CCardSubtitle.spec.tsx +1 -1
  232. package/src/components/card/__tests__/CCardText.spec.tsx +1 -1
  233. package/src/components/card/__tests__/CCardTitle.spec.tsx +1 -1
  234. package/src/components/carousel/CCarousel.tsx +6 -12
  235. package/src/components/carousel/CCarouselCaption.tsx +1 -1
  236. package/src/components/carousel/CCarouselContext.ts +8 -0
  237. package/src/components/carousel/CCarouselItem.tsx +6 -4
  238. package/src/components/carousel/__tests__/CCarousel.spec.tsx +1 -1
  239. package/src/components/close-button/__tests__/CCloseButton.spec.tsx +1 -1
  240. package/src/components/collapse/__tests__/CCollapse.spec.tsx +26 -7
  241. package/src/components/dropdown/CDropdown.tsx +35 -36
  242. package/src/components/dropdown/CDropdownContext.ts +18 -0
  243. package/src/components/dropdown/CDropdownDivider.tsx +1 -1
  244. package/src/components/dropdown/CDropdownHeader.tsx +1 -1
  245. package/src/components/dropdown/CDropdownItemPlain.tsx +1 -1
  246. package/src/components/dropdown/CDropdownMenu.tsx +3 -3
  247. package/src/components/dropdown/CDropdownToggle.tsx +2 -3
  248. package/src/components/dropdown/__tests__/CDropdown.spec.tsx +1 -1
  249. package/src/components/dropdown/__tests__/CDropdownDivider.spec.tsx +1 -1
  250. package/src/components/dropdown/__tests__/CDropdownHeader.spec.tsx +1 -1
  251. package/src/components/dropdown/__tests__/CDropdownItem.spec.tsx +1 -1
  252. package/src/components/dropdown/__tests__/CDropdownItemPlain.spec.tsx +1 -1
  253. package/src/components/dropdown/__tests__/CDropdownMenu.spec.tsx +1 -1
  254. package/src/components/dropdown/__tests__/CDropdownToggle.spec.tsx +1 -1
  255. package/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.tsx.snap +0 -1
  256. package/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.tsx.snap +0 -2
  257. package/src/components/footer/__tests__/CFooter.spec.tsx +1 -1
  258. package/src/components/form/__tests__/CForm.spec.tsx +2 -1
  259. package/src/components/form/__tests__/CFormCheck.spec.tsx +1 -1
  260. package/src/components/form/__tests__/CFormControl.spec.tsx +1 -1
  261. package/src/components/form/__tests__/CFormFeedback.spec.tsx +1 -1
  262. package/src/components/form/__tests__/CFormFloating.spec.tsx +1 -1
  263. package/src/components/form/__tests__/CFormInput.spec.tsx +1 -1
  264. package/src/components/form/__tests__/CFormLabel.spec.tsx +1 -1
  265. package/src/components/form/__tests__/CFormRange.spec.tsx +1 -1
  266. package/src/components/form/__tests__/CFormSelect.spec.tsx +1 -1
  267. package/src/components/form/__tests__/CFormSwitch.spec.tsx +1 -1
  268. package/src/components/form/__tests__/CFormText.spec.tsx +1 -1
  269. package/src/components/form/__tests__/CFormTextarea.spec.tsx +1 -1
  270. package/src/components/form/__tests__/CInputGroup.spec.tsx +1 -1
  271. package/src/components/form/__tests__/CInputGroupText.spec.tsx +1 -1
  272. package/src/components/grid/__tests__/CCol.spec.tsx +1 -1
  273. package/src/components/grid/__tests__/CContainer.spec.tsx +1 -1
  274. package/src/components/grid/__tests__/CRow.spec.tsx +1 -1
  275. package/src/components/header/__tests__/CHeader.spec.tsx +1 -1
  276. package/src/components/header/__tests__/CHeaderBrand.spec.tsx +1 -1
  277. package/src/components/header/__tests__/CHeaderDivider.spec.tsx +1 -1
  278. package/src/components/header/__tests__/CHeaderNav.spec.tsx +1 -1
  279. package/src/components/header/__tests__/CHeaderText.spec.tsx +1 -1
  280. package/src/components/header/__tests__/CHeaderToggler.spec.tsx +1 -1
  281. package/src/components/image/__tests__/CImage.spec.tsx +1 -1
  282. package/src/components/index.ts +1 -0
  283. package/src/components/link/__tests__/CLink.spec.tsx +1 -1
  284. package/src/components/list-group/__tests__/CListGroup.spec.tsx +1 -1
  285. package/src/components/list-group/__tests__/CListGroupItem.spec.tsx +1 -1
  286. package/src/components/loading-button/__tests__/CLoadingButton.spec.tsx +1 -1
  287. package/src/components/modal/CModal.tsx +5 -12
  288. package/src/components/modal/CModalContext.ts +8 -0
  289. package/src/components/modal/CModalHeader.tsx +1 -1
  290. package/src/components/modal/__tests__/CModal.spec.tsx +1 -1
  291. package/src/components/modal/__tests__/CModalBody.spec.tsx +1 -1
  292. package/src/components/modal/__tests__/CModalContent.spec.tsx +1 -1
  293. package/src/components/modal/__tests__/CModalDialog.spec.tsx +1 -1
  294. package/src/components/modal/__tests__/CModalFooter.spec.tsx +1 -1
  295. package/src/components/modal/__tests__/CModalHeader.spec.tsx +1 -1
  296. package/src/components/modal/__tests__/CModalTitle.spec.tsx +1 -1
  297. package/src/components/multi-select/__tests__/CMultiSelect.spec.tsx +1 -1
  298. package/src/components/nav/CNavGroup.tsx +2 -2
  299. package/src/components/nav/CNavLink.tsx +2 -2
  300. package/src/components/nav/__tests__/CNav.spec.tsx +4 -11
  301. package/src/components/nav/__tests__/CNavGroup.spec.tsx +1 -1
  302. package/src/components/nav/__tests__/CNavGroupItems.spec.tsx +1 -1
  303. package/src/components/nav/__tests__/CNavItem.spec.tsx +1 -1
  304. package/src/components/nav/__tests__/CNavLink.spec.tsx +1 -1
  305. package/src/components/nav/__tests__/CNavTitle.spec.tsx +1 -1
  306. package/src/components/nav/__tests__/__snapshots__/CNav.spec.tsx.snap +0 -1
  307. package/src/components/navbar/__tests__/CNavbar.spec.tsx +1 -1
  308. package/src/components/navbar/__tests__/CNavbarBrand.spec.tsx +1 -1
  309. package/src/components/navbar/__tests__/CNavbarNav.spec.tsx +1 -1
  310. package/src/components/navbar/__tests__/CNavbarText.spec.tsx +1 -1
  311. package/src/components/navbar/__tests__/CNavbarToggler.spec.tsx +1 -1
  312. package/src/components/offcanvas/__tests__/COffcanvas.spec.tsx +44 -17
  313. package/src/components/offcanvas/__tests__/COffcanvasBody.spec.tsx +1 -1
  314. package/src/components/offcanvas/__tests__/COffcanvasHeader.spec.tsx +1 -1
  315. package/src/components/offcanvas/__tests__/COffcanvasTitle.spec.tsx +1 -1
  316. package/src/components/pagination/__tests__/CPagination.spec.tsx +1 -1
  317. package/src/components/pagination/__tests__/CPaginationItem.spec.tsx +1 -1
  318. package/src/components/password-input/CPasswordInput.tsx +38 -30
  319. package/src/components/placeholder/__tests__/CPlaceholder.spec.tsx +1 -1
  320. package/src/components/popover/__tests__/CPopover.spec.tsx +70 -62
  321. package/src/components/popover/__tests__/__snapshots__/CPopover.spec.tsx.snap +0 -32
  322. package/src/components/progress/CProgress.tsx +1 -1
  323. package/src/components/progress/CProgressBar.tsx +4 -3
  324. package/src/components/progress/CProgressStacked.tsx +4 -8
  325. package/src/components/progress/CProgressStackedContext.ts +7 -0
  326. package/src/components/progress/__tests__/CProgress.spec.tsx +1 -1
  327. package/src/components/progress/__tests__/CProgressBar.spec.tsx +1 -1
  328. package/src/components/sidebar/CSidebarNav.tsx +27 -27
  329. package/src/components/sidebar/CSidebarNavContext.ts +8 -0
  330. package/src/components/sidebar/__tests__/CSidebar.spec.tsx +1 -1
  331. package/src/components/sidebar/__tests__/CSidebarBrand.spec.tsx +1 -1
  332. package/src/components/sidebar/__tests__/CSidebarFooter.spec.tsx +1 -1
  333. package/src/components/sidebar/__tests__/CSidebarHeader.spec.tsx +1 -1
  334. package/src/components/sidebar/__tests__/CSidebarNav.spec.tsx +1 -1
  335. package/src/components/sidebar/__tests__/CSidebarToggler.spec.tsx +1 -1
  336. package/src/components/smart-table/__tests__/CSmartTable.spec.tsx +1 -1
  337. package/src/components/spinner/__tests__/CSpinner.spec.tsx +1 -1
  338. package/src/components/stepper/CStepper.tsx +432 -0
  339. package/src/components/stepper/__tests__/CStepper.spec.tsx +98 -0
  340. package/src/components/stepper/index.ts +3 -0
  341. package/src/components/stepper/types.ts +20 -0
  342. package/src/components/table/__tests__/CTable.spec.tsx +1 -1
  343. package/src/components/table/__tests__/CTableBody.spec.tsx +1 -1
  344. package/src/components/table/__tests__/CTableCaption.spec.tsx +1 -1
  345. package/src/components/table/__tests__/CTableDataCell.spec.tsx +1 -1
  346. package/src/components/table/__tests__/CTableFoot.spec.tsx +1 -1
  347. package/src/components/table/__tests__/CTableHead.spec.tsx +1 -1
  348. package/src/components/table/__tests__/CTableHeaderCell.spec.tsx +1 -1
  349. package/src/components/table/__tests__/CTableRow.spec.tsx +1 -1
  350. package/src/components/tabs/CTab.tsx +2 -2
  351. package/src/components/tabs/CTabPane.tsx +1 -1
  352. package/src/components/tabs/CTabPanel.tsx +3 -3
  353. package/src/components/tabs/CTabs.tsx +54 -21
  354. package/src/components/tabs/CTabsContext.ts +9 -0
  355. package/src/components/tabs/__tests__/CTabContent.spec.tsx +16 -8
  356. package/src/components/tabs/__tests__/CTabPane.spec.tsx +48 -29
  357. package/src/components/toast/CToast.tsx +9 -24
  358. package/src/components/toast/CToastClose.tsx +1 -2
  359. package/src/components/toast/CToastContext.ts +8 -0
  360. package/src/components/toast/CToaster.tsx +11 -7
  361. package/src/components/toast/__tests__/CToast.spec.tsx +32 -27
  362. package/src/components/toast/__tests__/CToastBody.spec.tsx +1 -1
  363. package/src/components/toast/__tests__/CToastHeader.spec.tsx +1 -1
  364. package/src/components/toast/__tests__/CToaster.spec.tsx +2 -1
  365. package/src/components/tooltip/__tests__/CTooltip.spec.tsx +54 -33
  366. package/src/components/tooltip/__tests__/__snapshots__/CTooltip.spec.tsx.snap +0 -10
  367. package/src/components/widgets/__tests__/CWidgetStatsA.spec.tsx +1 -1
  368. package/src/components/widgets/__tests__/CWidgetStatsB.spec.tsx +1 -1
  369. package/src/components/widgets/__tests__/CWidgetStatsC.spec.tsx +1 -1
  370. package/src/components/widgets/__tests__/CWidgetStatsD.spec.tsx +1 -1
  371. package/src/components/widgets/__tests__/CWidgetStatsE.spec.tsx +1 -1
  372. package/src/components/widgets/__tests__/CWidgetStatsF.spec.tsx +1 -1
  373. package/src/hooks/usePopper.ts +2 -2
  374. package/src/utils/index.ts +0 -2
  375. package/dist/cjs/utils/isEqual.d.ts +0 -2
  376. package/dist/esm/utils/isEqual.d.ts +0 -2
  377. package/src/components/button/__tests__/CButtonClose.spec.tsx +0 -23
  378. package/src/utils/isEqual.ts +0 -58
@@ -0,0 +1,432 @@
1
+ import React, {
2
+ useState,
3
+ useEffect,
4
+ useRef,
5
+ useImperativeHandle,
6
+ forwardRef,
7
+ HTMLAttributes,
8
+ KeyboardEvent,
9
+ useCallback,
10
+ useId,
11
+ } from 'react'
12
+ import PropTypes from 'prop-types'
13
+ import classNames from 'classnames'
14
+
15
+ import { CCollapse } from '../collapse'
16
+
17
+ import { getNextActiveElement } from '../../utils'
18
+ import type { StepperRef, StepperStepData, StepperStepValidationResult } from './types'
19
+
20
+ export interface CStepperProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onReset'> {
21
+ /**
22
+ * Controls the currently active step in the React Stepper component (Controlled mode).
23
+ *
24
+ * Use this prop when you want full control over the active step from the parent component.
25
+ */
26
+ activeStepIndex?: number
27
+
28
+ /**
29
+ * Custom CSS class name applied to the main React Stepper container.
30
+ */
31
+ className?: string
32
+
33
+ /**
34
+ * Sets the initial active step index for the Form Wizard when the React Stepper is used in Uncontrolled mode.
35
+ *
36
+ * Useful when you want the Stepper to manage its own state internally.
37
+ */
38
+ defaultActiveStepIndex?: number
39
+
40
+ /**
41
+ * Defines the overall layout orientation of the React Stepper component.
42
+ *
43
+ * - `'horizontal'`: Step indicators and content are placed horizontally (default).
44
+ * - `'vertical'`: Step indicators and content are stacked vertically.
45
+ *
46
+ * Choose `'vertical'` layout for mobile or narrow designs.
47
+ */
48
+ layout?: 'horizontal' | 'vertical'
49
+
50
+ /**
51
+ * Defines whether the Stepper enforces linear progression (cannot skip steps).
52
+ *
53
+ * - `true`: Users must complete steps sequentially.
54
+ * - `false`: Users can jump freely between steps.
55
+ */
56
+ linear?: boolean
57
+
58
+ /**
59
+ * Callback fired when the user completes the last step of the Form Wizard.
60
+ *
61
+ * Use this to trigger a submit action or redirect after the final step.
62
+ */
63
+ onFinish?: () => void
64
+
65
+ /**
66
+ * Callback fired when the user triggers the reset action on the React Stepper.
67
+ *
68
+ * Use this to reset the Stepper state or clear related form data.
69
+ */
70
+ onReset?: () => void
71
+
72
+ /**
73
+ * Callback fired when the active step changes in the React Stepper component.
74
+ */
75
+ onStepChange?: (stepNumber: number) => void
76
+
77
+ /**
78
+ * Callback fired after a validation check completes for a specific step in the Form Wizard.
79
+ *
80
+ * Receives an object with the step index and the validation result (`true` or `false`).
81
+ *
82
+ * Useful for custom validation handling across multi-step forms.
83
+ */
84
+ onStepValidationComplete?: ({ stepNumber, isValid }: StepperStepValidationResult) => void
85
+
86
+ /**
87
+ * Defines the steps for the React Sxtepper component.
88
+ *
89
+ * Each step is an object containing a label, optional content, and an optional `formRef` for validation.
90
+ */
91
+ steps: StepperStepData[]
92
+
93
+ /**
94
+ * Controls the internal layout of the step indicator (icon and label) inside each step when using a horizontal layout.
95
+ *
96
+ * - `'vertical'` – Places the label below the indicator icon.
97
+ * - `'horizontal'` – Places the label beside the indicator icon (default).
98
+ *
99
+ * This prop has no effect when `layout="vertical"` is used.
100
+ */
101
+ stepButtonLayout?: 'vertical' | 'horizontal'
102
+
103
+ /**
104
+ * Enables or disables built-in form validation inside the React Stepper.
105
+ *
106
+ * When enabled (`true`), each step's associated form must be valid before advancing to the next step.
107
+ *
108
+ * Requires each step to provide a `formRef`.
109
+ */
110
+ validation?: boolean
111
+ }
112
+
113
+ export const CStepper = forwardRef<StepperRef, CStepperProps>(
114
+ (
115
+ {
116
+ activeStepIndex: controlledActiveStepIndex,
117
+ className,
118
+ defaultActiveStepIndex = 0,
119
+ layout = 'horizontal',
120
+ linear = true,
121
+ onFinish,
122
+ onReset,
123
+ onStepChange,
124
+ onStepValidationComplete,
125
+ steps = [],
126
+ stepButtonLayout = 'horizontal',
127
+ validation = true,
128
+ ...rest
129
+ },
130
+ ref
131
+ ) => {
132
+ const stepperRef = useRef<HTMLDivElement>(null)
133
+ const stepsRef = useRef<HTMLOListElement>(null)
134
+ const stepButtonRefs = useRef<(HTMLButtonElement | null)[]>([])
135
+ const uniqueId = useId()
136
+
137
+ const isControlled = controlledActiveStepIndex !== undefined
138
+ const [internalActiveStepIndex, setInternalActiveStepIndex] = useState(
139
+ isControlled ? controlledActiveStepIndex : defaultActiveStepIndex
140
+ )
141
+ const [isFinished, setIsFinished] = useState(false)
142
+
143
+ const activeStepIndex = isControlled ? controlledActiveStepIndex : internalActiveStepIndex
144
+
145
+ // Sync state if controlled prop changes
146
+ useEffect(() => {
147
+ if (isControlled) {
148
+ setInternalActiveStepIndex(controlledActiveStepIndex)
149
+ }
150
+ }, [controlledActiveStepIndex, isControlled])
151
+
152
+ // Ensure stepButtonRefs array has the correct size
153
+ useEffect(() => {
154
+ stepButtonRefs.current = stepButtonRefs.current.slice(0, steps.length)
155
+ }, [steps.length])
156
+
157
+ const isStepValid = useCallback(
158
+ (index: number): boolean => {
159
+ if (!validation) {
160
+ return true
161
+ }
162
+
163
+ const currentStepData = steps[index]
164
+ const form = currentStepData?.formRef?.current
165
+
166
+ if (form) {
167
+ const isValid = form.checkValidity()
168
+ onStepValidationComplete?.({
169
+ stepNumber: index + 1,
170
+ isValid,
171
+ })
172
+
173
+ if (form && !isValid) {
174
+ form.reportValidity()
175
+ return false
176
+ }
177
+ }
178
+
179
+ return true
180
+ },
181
+ [steps, validation]
182
+ )
183
+
184
+ const setActiveStep = useCallback(
185
+ (index: number, bypassValidation = false) => {
186
+ if (index < 0 || index >= steps.length || index === activeStepIndex) {
187
+ return
188
+ }
189
+
190
+ // Validate current step before moving forward
191
+ if (!bypassValidation && index > activeStepIndex && !isStepValid(activeStepIndex)) {
192
+ return
193
+ }
194
+
195
+ if (!isControlled) {
196
+ setInternalActiveStepIndex(index)
197
+ }
198
+ onStepChange?.(index + 1)
199
+ },
200
+ [steps.length, activeStepIndex, isStepValid, isControlled, onStepChange]
201
+ )
202
+
203
+ const handleStepClick = (index: number) => {
204
+ if (linear) {
205
+ setActiveStep(index, index <= activeStepIndex)
206
+ return
207
+ }
208
+
209
+ setActiveStep(index, true)
210
+ }
211
+
212
+ const handleNext = () => {
213
+ if (activeStepIndex < steps.length - 1) {
214
+ setActiveStep(activeStepIndex + 1)
215
+ } else {
216
+ handleFinish() // Attempt finish if already on last step
217
+ }
218
+ }
219
+
220
+ const handlePrev = () => {
221
+ if (activeStepIndex > 0) {
222
+ setActiveStep(activeStepIndex - 1, true) // Bypass validation when going back
223
+ }
224
+ }
225
+
226
+ const handleFinish = () => {
227
+ if (activeStepIndex === steps.length - 1 && isStepValid(activeStepIndex)) {
228
+ setIsFinished(true)
229
+ onFinish?.()
230
+ }
231
+ }
232
+
233
+ const handleReset = () => {
234
+ if (validation) {
235
+ steps.forEach((step) => step.formRef?.current?.reset())
236
+ }
237
+
238
+ if (!isControlled) {
239
+ setInternalActiveStepIndex(defaultActiveStepIndex)
240
+ }
241
+
242
+ setIsFinished(false)
243
+ onStepChange?.(defaultActiveStepIndex)
244
+ onReset?.()
245
+ stepButtonRefs.current[defaultActiveStepIndex]?.focus()
246
+ }
247
+
248
+ const handleKeyDown = (event: KeyboardEvent<HTMLOListElement>) => {
249
+ const target = event.target as HTMLElement
250
+ const currentButton = target.closest('button.stepper-step-button') as HTMLButtonElement
251
+
252
+ if (!currentButton || !stepsRef.current) {
253
+ return
254
+ }
255
+
256
+ const buttons = [
257
+ ...stepsRef.current.querySelectorAll<HTMLButtonElement>('button.stepper-step-button'),
258
+ ]
259
+
260
+ let nextElement: HTMLElement | null = null
261
+
262
+ switch (event.key) {
263
+ case 'ArrowRight':
264
+ case 'ArrowDown': {
265
+ nextElement = getNextActiveElement(buttons, currentButton, true, false)
266
+ break
267
+ }
268
+ case 'ArrowLeft':
269
+ case 'ArrowUp': {
270
+ nextElement = getNextActiveElement(buttons, currentButton, false, false)
271
+ break
272
+ }
273
+ case 'Home': {
274
+ nextElement = buttons[0]
275
+ break
276
+ }
277
+ case 'End': {
278
+ nextElement = buttons.at(-1) as HTMLButtonElement
279
+ break
280
+ }
281
+ default: {
282
+ return
283
+ }
284
+ }
285
+
286
+ if (nextElement) {
287
+ event.preventDefault()
288
+ nextElement.focus()
289
+ }
290
+ }
291
+
292
+ // Expose methods via ref
293
+ useImperativeHandle(ref, () => ({
294
+ next: handleNext,
295
+ prev: handlePrev,
296
+ finish: handleFinish,
297
+ reset: handleReset,
298
+ }))
299
+
300
+ const isVertical = layout === 'vertical'
301
+
302
+ return (
303
+ <div
304
+ className={classNames(
305
+ 'stepper',
306
+ {
307
+ 'stepper-vertical': isVertical,
308
+ },
309
+ className
310
+ )}
311
+ ref={stepperRef}
312
+ {...rest}
313
+ >
314
+ <ol
315
+ className="stepper-steps"
316
+ aria-orientation={isVertical ? 'vertical' : 'horizontal'}
317
+ ref={stepsRef}
318
+ onKeyDown={handleKeyDown}
319
+ role="tablist"
320
+ >
321
+ {steps.map((step, index) => {
322
+ const isActive = !isFinished && index === activeStepIndex
323
+ const isComplete = isFinished || index < activeStepIndex
324
+ const isDisabled = isFinished || (linear && index > activeStepIndex + 1)
325
+ const stepId = `stepper-${rest.id || uniqueId}-step-${index}`
326
+ const panelId = `stepper-${rest.id || uniqueId}-panel-${index}`
327
+
328
+ return (
329
+ <li
330
+ key={index}
331
+ className={classNames('stepper-step', stepButtonLayout)}
332
+ role="presentation"
333
+ >
334
+ <button
335
+ type="button"
336
+ className={classNames('stepper-step-button', {
337
+ active: isActive,
338
+ complete: isComplete,
339
+ })}
340
+ disabled={isDisabled}
341
+ id={stepId}
342
+ role="tab"
343
+ onClick={() => handleStepClick(index)}
344
+ ref={(el) => (stepButtonRefs.current[index] = el)}
345
+ aria-selected={isActive}
346
+ {...(step.content && {
347
+ 'aria-controls': panelId,
348
+ })}
349
+ tabIndex={isActive ? 0 : -1}
350
+ >
351
+ <span className="stepper-step-indicator">
352
+ {isComplete ? (
353
+ <span className="stepper-step-indicator-icon" />
354
+ ) : (
355
+ <span className="stepper-step-indicator-text">
356
+ {step.indicator ?? index + 1}
357
+ </span>
358
+ )}
359
+ </span>
360
+ <span className="stepper-step-label">{step.label}</span>
361
+ </button>
362
+ {index < steps.length - 1 && <div className="stepper-step-connector" />}
363
+ {step.content && isVertical && (
364
+ <CCollapse
365
+ className="stepper-step-content"
366
+ id={panelId}
367
+ role="tabpanel"
368
+ visible={isActive}
369
+ aria-hidden={!isActive}
370
+ aria-labelledby={stepId}
371
+ aria-live="polite"
372
+ >
373
+ {step.content}
374
+ </CCollapse>
375
+ )}
376
+ </li>
377
+ )
378
+ })}
379
+ </ol>
380
+ {!isVertical &&
381
+ steps.some((step) => step.content !== undefined && step.content !== null) && (
382
+ <div className="stepper-content">
383
+ {steps.map((step, index) => {
384
+ const isActive = !isFinished && index === activeStepIndex
385
+ const stepId = `stepper-${rest.id || uniqueId}-step-${index}`
386
+ const panelId = `stepper-${rest.id || uniqueId}-panel-${index}`
387
+ return (
388
+ <div
389
+ key={index}
390
+ className={classNames('stepper-pane', {
391
+ show: isActive,
392
+ active: isActive,
393
+ })}
394
+ id={panelId}
395
+ role="tabpanel"
396
+ aria-hidden={!isActive}
397
+ aria-labelledby={stepId}
398
+ aria-live="polite"
399
+ >
400
+ {step.content}
401
+ </div>
402
+ )
403
+ })}
404
+ </div>
405
+ )}
406
+ </div>
407
+ )
408
+ }
409
+ )
410
+
411
+ CStepper.displayName = 'CStepper'
412
+
413
+ CStepper.propTypes = {
414
+ activeStepIndex: PropTypes.number,
415
+ className: PropTypes.string,
416
+ defaultActiveStepIndex: PropTypes.number,
417
+ layout: PropTypes.oneOf(['horizontal', 'vertical']),
418
+ linear: PropTypes.bool,
419
+ onFinish: PropTypes.func,
420
+ onReset: PropTypes.func,
421
+ onStepChange: PropTypes.func,
422
+ onStepValidationComplete: PropTypes.func,
423
+ steps: PropTypes.arrayOf(
424
+ PropTypes.shape({
425
+ label: PropTypes.node.isRequired,
426
+ content: PropTypes.node,
427
+ formRef: PropTypes.object, // Check for object shape might be better
428
+ }).isRequired
429
+ ).isRequired,
430
+ stepButtonLayout: PropTypes.oneOf(['horizontal', 'vertical']),
431
+ validation: PropTypes.bool,
432
+ }
@@ -0,0 +1,98 @@
1
+ import * as React from 'react'
2
+ import { render, screen, fireEvent, waitFor } from '@testing-library/react'
3
+ import '@testing-library/jest-dom'
4
+ import { CStepper } from '../index'
5
+
6
+ const stepsMock = [
7
+ { label: 'Step 1', content: <div>Content 1</div> },
8
+ { label: 'Step 2', content: <div>Content 2</div> },
9
+ { label: 'Step 3', content: <div>Content 3</div> },
10
+ ]
11
+
12
+ test('loads and displays CStepper component', async () => {
13
+ const { container } = render(<CStepper steps={stepsMock} />)
14
+ expect(container).toMatchSnapshot()
15
+ })
16
+
17
+ test('CStepper renders vertical layout', async () => {
18
+ const { container } = render(<CStepper steps={stepsMock} layout="vertical" />)
19
+ expect(container).toMatchSnapshot()
20
+ })
21
+
22
+ test('CStepper disables future steps in linear mode', async () => {
23
+ render(<CStepper steps={stepsMock} linear={true} />)
24
+
25
+ const buttons = screen.getAllByRole('tab')
26
+ expect(buttons[0]).toBeEnabled()
27
+ expect(buttons[1]).toBeDisabled()
28
+ expect(buttons[2]).toBeDisabled()
29
+ })
30
+
31
+ test('CStepper allows all steps in non-linear mode', async () => {
32
+ render(<CStepper steps={stepsMock} linear={false} />)
33
+
34
+ const buttons = screen.getAllByRole('tab')
35
+ expect(buttons[0]).toBeEnabled()
36
+ expect(buttons[1]).toBeEnabled()
37
+ expect(buttons[2]).toBeEnabled()
38
+ })
39
+
40
+ test('CStepper calls onStepChange when step is clicked', async () => {
41
+ const handleStepChange = jest.fn()
42
+ render(<CStepper steps={stepsMock} linear={false} onStepChange={handleStepChange} />)
43
+
44
+ const buttons = screen.getAllByRole('tab')
45
+ fireEvent.click(buttons[2])
46
+
47
+ expect(handleStepChange).toHaveBeenCalledWith(3) // stepNumber = index + 1
48
+ })
49
+
50
+ test('CStepper renders only active step content in horizontal layout', async () => {
51
+ render(<CStepper steps={stepsMock} layout="horizontal" />)
52
+
53
+ expect(screen.getByText('Content 1')).toBeVisible()
54
+ expect(screen.queryByText('Content 2')).not.toBeInTheDocument()
55
+ expect(screen.queryByText('Content 3')).not.toBeInTheDocument()
56
+ })
57
+
58
+ test('CStepper finish calls onFinish only after last step and valid', async () => {
59
+ const handleFinish = jest.fn()
60
+ render(<CStepper steps={stepsMock} onFinish={handleFinish} linear={false} />)
61
+
62
+ const buttons = screen.getAllByRole('tab')
63
+ fireEvent.click(buttons[2])
64
+
65
+ fireEvent.click(screen.getByText('Step 3'))
66
+ expect(handleFinish).toHaveBeenCalledTimes(1)
67
+ })
68
+
69
+ test('CStepper resets correctly and focuses first step', async () => {
70
+ const handleReset = jest.fn()
71
+ const stepperRef = React.createRef<any>()
72
+
73
+ render(<CStepper ref={stepperRef} steps={stepsMock} onReset={handleReset} />)
74
+
75
+ stepperRef.current?.next()
76
+ stepperRef.current?.reset()
77
+
78
+ expect(handleReset).toHaveBeenCalled()
79
+ expect(screen.getAllByRole('tab')[0]).toHaveFocus()
80
+ })
81
+
82
+ test('CStepper works in uncontrolled mode with defaultActiveStepIndex', async () => {
83
+ render(<CStepper steps={stepsMock} defaultActiveStepIndex={1} />)
84
+
85
+ expect(screen.getByText('Content 2')).toBeVisible()
86
+ expect(screen.queryByText('Content 1')).not.toBeInTheDocument()
87
+ })
88
+
89
+ test('CStepper works in controlled mode with activeStepIndex', async () => {
90
+ const { rerender } = render(<CStepper steps={stepsMock} activeStepIndex={0} />)
91
+
92
+ expect(screen.getByText('Content 1')).toBeVisible()
93
+
94
+ rerender(<CStepper steps={stepsMock} activeStepIndex={2} />)
95
+
96
+ expect(screen.getByText('Content 3')).toBeVisible()
97
+ expect(screen.queryByText('Content 1')).not.toBeInTheDocument()
98
+ })
@@ -0,0 +1,3 @@
1
+ import { CStepper } from './CStepper'
2
+
3
+ export { CStepper }
@@ -0,0 +1,20 @@
1
+ import { ReactNode } from 'react'
2
+
3
+ export interface StepperRef {
4
+ next: () => void
5
+ prev: () => void
6
+ finish: () => void
7
+ reset: () => void
8
+ }
9
+
10
+ export interface StepperStepData {
11
+ indicator?: ReactNode
12
+ label: ReactNode
13
+ content?: ReactNode
14
+ formRef?: React.RefObject<HTMLFormElement> // Optional ref for validation
15
+ }
16
+
17
+ export type StepperStepValidationResult = {
18
+ stepNumber: number
19
+ isValid: boolean
20
+ }
@@ -10,7 +10,7 @@ import {
10
10
  CTableBody,
11
11
  CTableDataCell,
12
12
  CTableFoot,
13
- } from '../../../index'
13
+ } from '../index'
14
14
 
15
15
  test('loads and displays CTable component', async () => {
16
16
  const { container } = render(<CTable />)
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react'
2
2
  import { render } from '@testing-library/react'
3
3
  import '@testing-library/jest-dom'
4
- import { CTableBody, CTableDataCell, CTableRow } from '../../../index'
4
+ import { CTableBody, CTableDataCell, CTableRow } from '../index'
5
5
 
6
6
  test('loads and displays CTableBody component', async () => {
7
7
  const table = document.createElement('table')
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react'
2
2
  import { render } from '@testing-library/react'
3
3
  import '@testing-library/jest-dom'
4
- import { CTableCaption } from '../../../index'
4
+ import { CTableCaption } from '../index'
5
5
 
6
6
  test('loads and displays CTableCaption component', async () => {
7
7
  const table = document.createElement('table')
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react'
2
2
  import { render } from '@testing-library/react'
3
3
  import '@testing-library/jest-dom'
4
- import { CTableDataCell } from '../../../index'
4
+ import { CTableDataCell } from '../index'
5
5
  import { CTableBody } from '../CTableBody'
6
6
  import { CTableRow } from '../CTableRow'
7
7
 
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react'
2
2
  import { render } from '@testing-library/react'
3
3
  import '@testing-library/jest-dom'
4
- import { CTableFoot, CTableHeaderCell, CTableRow } from '../../../index'
4
+ import { CTableFoot, CTableHeaderCell, CTableRow } from '../index'
5
5
 
6
6
  test('loads and displays CTableFoot component', async () => {
7
7
  const table = document.createElement('table')
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react'
2
2
  import { render } from '@testing-library/react'
3
3
  import '@testing-library/jest-dom'
4
- import { CTableHead, CTableHeaderCell, CTableRow } from '../../../index'
4
+ import { CTableHead, CTableHeaderCell, CTableRow } from '../index'
5
5
 
6
6
  test('loads and displays CTableHead component', async () => {
7
7
  const table = document.createElement('table')
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react'
2
2
  import { render } from '@testing-library/react'
3
3
  import '@testing-library/jest-dom'
4
- import { CTableHead, CTableHeaderCell, CTableRow } from '../../../index'
4
+ import { CTableHead, CTableHeaderCell, CTableRow } from '../index'
5
5
 
6
6
  test('loads and displays CTableHeaderCell component', async () => {
7
7
  const table = document.createElement('table')
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react'
2
2
  import { render } from '@testing-library/react'
3
3
  import '@testing-library/jest-dom'
4
- import { CTableBody, CTableHeaderCell, CTableRow } from '../../../index'
4
+ import { CTableBody, CTableHeaderCell, CTableRow } from '../index'
5
5
 
6
6
  test('loads and displays CTableRow component', async () => {
7
7
  const table = document.createElement('table')
@@ -2,7 +2,7 @@ import React, { forwardRef, HTMLAttributes, useContext } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import classNames from 'classnames'
4
4
 
5
- import { TabsContext } from './CTabs'
5
+ import { CTabsContext } from './CTabsContext'
6
6
 
7
7
  export interface CTabProps extends HTMLAttributes<HTMLButtonElement> {
8
8
  /**
@@ -21,7 +21,7 @@ export interface CTabProps extends HTMLAttributes<HTMLButtonElement> {
21
21
 
22
22
  export const CTab = forwardRef<HTMLButtonElement, CTabProps>(
23
23
  ({ children, className, itemKey, ...rest }, ref) => {
24
- const { _activeItemKey, setActiveItemKey, id } = useContext(TabsContext)
24
+ const { _activeItemKey, setActiveItemKey, id } = useContext(CTabsContext)
25
25
 
26
26
  const isActive = () => itemKey === _activeItemKey
27
27
 
@@ -32,7 +32,7 @@ export interface CTabPaneProps extends HTMLAttributes<HTMLDivElement> {
32
32
 
33
33
  export const CTabPane = forwardRef<HTMLDivElement, CTabPaneProps>(
34
34
  ({ children, className, onHide, onShow, transition = true, visible, ...rest }, ref) => {
35
- const tabPaneRef = useRef()
35
+ const tabPaneRef = useRef(null)
36
36
  const forkedRef = useForkedRef(ref, tabPaneRef)
37
37
 
38
38
  return (
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types'
3
3
  import classNames from 'classnames'
4
4
  import { Transition } from 'react-transition-group'
5
5
 
6
- import { TabsContext } from './CTabs'
6
+ import { CTabsContext } from './CTabsContext'
7
7
  import { useForkedRef } from '../../hooks'
8
8
  import { getTransitionDurationFromElement } from '../../utils'
9
9
 
@@ -36,9 +36,9 @@ export interface CTabPanelProps extends HTMLAttributes<HTMLDivElement> {
36
36
 
37
37
  export const CTabPanel = forwardRef<HTMLDivElement, CTabPanelProps>(
38
38
  ({ children, className, itemKey, onHide, onShow, transition = true, visible, ...rest }, ref) => {
39
- const { _activeItemKey, id } = useContext(TabsContext)
39
+ const { _activeItemKey, id } = useContext(CTabsContext)
40
40
 
41
- const tabPaneRef = useRef()
41
+ const tabPaneRef = useRef(null)
42
42
  const forkedRef = useForkedRef(ref, tabPaneRef)
43
43
 
44
44
  const [_visible, setVisible] = useState(visible || _activeItemKey === itemKey)