@coreui/react-pro 5.13.0 → 5.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cjs/components/accordion/CAccordion.d.ts +0 -6
- package/dist/cjs/components/accordion/CAccordion.js +3 -4
- package/dist/cjs/components/accordion/CAccordion.js.map +1 -1
- package/dist/cjs/components/accordion/CAccordionBody.js +2 -2
- package/dist/cjs/components/accordion/CAccordionBody.js.map +1 -1
- package/dist/cjs/components/accordion/CAccordionButton.js +2 -2
- package/dist/cjs/components/accordion/CAccordionButton.js.map +1 -1
- package/dist/cjs/components/accordion/CAccordionContext.d.ts +6 -0
- package/dist/cjs/components/accordion/CAccordionContext.js +8 -0
- package/dist/cjs/components/accordion/CAccordionContext.js.map +1 -0
- package/dist/cjs/components/accordion/CAccordionItem.d.ts +0 -6
- package/dist/cjs/components/accordion/CAccordionItem.js +6 -6
- package/dist/cjs/components/accordion/CAccordionItem.js.map +1 -1
- package/dist/cjs/components/accordion/CAccordionItemContext.d.ts +6 -0
- package/dist/cjs/components/accordion/CAccordionItemContext.js +8 -0
- package/dist/cjs/components/accordion/CAccordionItemContext.js.map +1 -0
- package/dist/cjs/components/carousel/CCarousel.d.ts +0 -5
- package/dist/cjs/components/carousel/CCarousel.js +2 -3
- package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
- package/dist/cjs/components/carousel/CCarouselContext.d.ts +5 -0
- package/dist/cjs/components/carousel/CCarouselContext.js +8 -0
- package/dist/cjs/components/carousel/CCarouselContext.js.map +1 -0
- package/dist/cjs/components/carousel/CCarouselItem.js +3 -3
- package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdown.d.ts +1 -9
- package/dist/cjs/components/dropdown/CDropdown.js +26 -18
- package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownContext.d.ts +15 -0
- package/dist/cjs/components/dropdown/CDropdownContext.js +8 -0
- package/dist/cjs/components/dropdown/CDropdownContext.js.map +1 -0
- package/dist/cjs/components/dropdown/CDropdownMenu.js +2 -2
- package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownToggle.js +2 -2
- package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/cjs/components/index.d.ts +1 -0
- package/dist/cjs/components/modal/CModal.d.ts +0 -6
- package/dist/cjs/components/modal/CModal.js +2 -3
- package/dist/cjs/components/modal/CModal.js.map +1 -1
- package/dist/cjs/components/modal/CModalContext.d.ts +5 -0
- package/dist/cjs/components/modal/CModalContext.js +8 -0
- package/dist/cjs/components/modal/CModalContext.js.map +1 -0
- package/dist/cjs/components/modal/CModalHeader.js +2 -2
- package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
- package/dist/cjs/components/nav/CNavGroup.js +2 -2
- package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
- package/dist/cjs/components/nav/CNavLink.js +2 -2
- package/dist/cjs/components/nav/CNavLink.js.map +1 -1
- package/dist/cjs/components/password-input/CPasswordInput.js +14 -12
- package/dist/cjs/components/password-input/CPasswordInput.js.map +1 -1
- package/dist/cjs/components/progress/CProgress.js +2 -2
- package/dist/cjs/components/progress/CProgress.js.map +1 -1
- package/dist/cjs/components/progress/CProgressBar.js +2 -2
- package/dist/cjs/components/progress/CProgressBar.js.map +1 -1
- package/dist/cjs/components/progress/CProgressStacked.d.ts +0 -4
- package/dist/cjs/components/progress/CProgressStacked.js +2 -3
- package/dist/cjs/components/progress/CProgressStacked.js.map +1 -1
- package/dist/cjs/components/progress/CProgressStackedContext.d.ts +4 -0
- package/dist/cjs/components/progress/CProgressStackedContext.js +8 -0
- package/dist/cjs/components/progress/CProgressStackedContext.js.map +1 -0
- package/dist/cjs/components/sidebar/CSidebarNav.d.ts +1 -7
- package/dist/cjs/components/sidebar/CSidebarNav.js +15 -14
- package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/cjs/components/sidebar/CSidebarNavContext.d.ts +5 -0
- package/dist/cjs/components/sidebar/CSidebarNavContext.js +8 -0
- package/dist/cjs/components/sidebar/CSidebarNavContext.js.map +1 -0
- package/dist/cjs/components/stepper/CStepper.d.ts +84 -0
- package/dist/cjs/components/stepper/CStepper.js +201 -0
- package/dist/cjs/components/stepper/CStepper.js.map +1 -0
- package/dist/cjs/components/stepper/index.d.ts +2 -0
- package/dist/cjs/components/stepper/types.d.ts +17 -0
- package/dist/cjs/components/tabs/CTab.js +2 -2
- package/dist/cjs/components/tabs/CTab.js.map +1 -1
- package/dist/cjs/components/tabs/CTabPane.js +1 -1
- package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
- package/dist/cjs/components/tabs/CTabPanel.js +3 -3
- package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
- package/dist/cjs/components/tabs/CTabs.d.ts +29 -9
- package/dist/cjs/components/tabs/CTabs.js +14 -9
- package/dist/cjs/components/tabs/CTabs.js.map +1 -1
- package/dist/cjs/components/tabs/CTabsContext.d.ts +6 -0
- package/dist/cjs/components/tabs/CTabsContext.js +8 -0
- package/dist/cjs/components/tabs/CTabsContext.js.map +1 -0
- package/dist/cjs/components/toast/CToast.d.ts +0 -6
- package/dist/cjs/components/toast/CToast.js +5 -9
- package/dist/cjs/components/toast/CToast.js.map +1 -1
- package/dist/cjs/components/toast/CToastClose.js +2 -2
- package/dist/cjs/components/toast/CToastClose.js.map +1 -1
- package/dist/cjs/components/toast/CToastContext.d.ts +5 -0
- package/dist/cjs/components/toast/CToastContext.js +8 -0
- package/dist/cjs/components/toast/CToastContext.js.map +1 -0
- package/dist/cjs/components/toast/CToaster.d.ts +2 -1
- package/dist/cjs/components/toast/CToaster.js +4 -2
- package/dist/cjs/components/toast/CToaster.js.map +1 -1
- package/dist/cjs/hooks/useDropdownWithPopper.d.ts +2 -2
- package/dist/cjs/hooks/usePopper.js +2 -2
- package/dist/cjs/hooks/usePopper.js.map +1 -1
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +1 -2
- package/dist/esm/components/accordion/CAccordion.d.ts +0 -6
- package/dist/esm/components/accordion/CAccordion.js +4 -4
- package/dist/esm/components/accordion/CAccordion.js.map +1 -1
- package/dist/esm/components/accordion/CAccordionBody.js +1 -1
- package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
- package/dist/esm/components/accordion/CAccordionButton.js +1 -1
- package/dist/esm/components/accordion/CAccordionContext.d.ts +6 -0
- package/dist/esm/components/accordion/CAccordionContext.js +6 -0
- package/dist/esm/components/accordion/CAccordionContext.js.map +1 -0
- package/dist/esm/components/accordion/CAccordionItem.d.ts +0 -6
- package/dist/esm/components/accordion/CAccordionItem.js +6 -5
- package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
- package/dist/esm/components/accordion/CAccordionItemContext.d.ts +6 -0
- package/dist/esm/components/accordion/CAccordionItemContext.js +6 -0
- package/dist/esm/components/accordion/CAccordionItemContext.js.map +1 -0
- package/dist/esm/components/carousel/CCarousel.d.ts +0 -5
- package/dist/esm/components/carousel/CCarousel.js +3 -3
- package/dist/esm/components/carousel/CCarousel.js.map +1 -1
- package/dist/esm/components/carousel/CCarouselContext.d.ts +5 -0
- package/dist/esm/components/carousel/CCarouselContext.js +6 -0
- package/dist/esm/components/carousel/CCarouselContext.js.map +1 -0
- package/dist/esm/components/carousel/CCarouselItem.js +2 -2
- package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdown.d.ts +1 -9
- package/dist/esm/components/dropdown/CDropdown.js +27 -18
- package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownContext.d.ts +15 -0
- package/dist/esm/components/dropdown/CDropdownContext.js +6 -0
- package/dist/esm/components/dropdown/CDropdownContext.js.map +1 -0
- package/dist/esm/components/dropdown/CDropdownMenu.js +1 -1
- package/dist/esm/components/dropdown/CDropdownToggle.js +1 -1
- package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/components/modal/CModal.d.ts +0 -6
- package/dist/esm/components/modal/CModal.js +3 -3
- package/dist/esm/components/modal/CModal.js.map +1 -1
- package/dist/esm/components/modal/CModalContext.d.ts +5 -0
- package/dist/esm/components/modal/CModalContext.js +6 -0
- package/dist/esm/components/modal/CModalContext.js.map +1 -0
- package/dist/esm/components/modal/CModalHeader.js +1 -1
- package/dist/esm/components/nav/CNavGroup.js +2 -2
- package/dist/esm/components/nav/CNavGroup.js.map +1 -1
- package/dist/esm/components/nav/CNavLink.js +2 -2
- package/dist/esm/components/nav/CNavLink.js.map +1 -1
- package/dist/esm/components/password-input/CPasswordInput.js +14 -12
- package/dist/esm/components/password-input/CPasswordInput.js.map +1 -1
- package/dist/esm/components/progress/CProgress.js +1 -1
- package/dist/esm/components/progress/CProgressBar.js +1 -1
- package/dist/esm/components/progress/CProgressBar.js.map +1 -1
- package/dist/esm/components/progress/CProgressStacked.d.ts +0 -4
- package/dist/esm/components/progress/CProgressStacked.js +3 -3
- package/dist/esm/components/progress/CProgressStacked.js.map +1 -1
- package/dist/esm/components/progress/CProgressStackedContext.d.ts +4 -0
- package/dist/esm/components/progress/CProgressStackedContext.js +6 -0
- package/dist/esm/components/progress/CProgressStackedContext.js.map +1 -0
- package/dist/esm/components/sidebar/CSidebarNav.d.ts +1 -7
- package/dist/esm/components/sidebar/CSidebarNav.js +17 -15
- package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/esm/components/sidebar/CSidebarNavContext.d.ts +5 -0
- package/dist/esm/components/sidebar/CSidebarNavContext.js +6 -0
- package/dist/esm/components/sidebar/CSidebarNavContext.js.map +1 -0
- package/dist/esm/components/stepper/CStepper.d.ts +84 -0
- package/dist/esm/components/stepper/CStepper.js +199 -0
- package/dist/esm/components/stepper/CStepper.js.map +1 -0
- package/dist/esm/components/stepper/index.d.ts +2 -0
- package/dist/esm/components/stepper/types.d.ts +17 -0
- package/dist/esm/components/tabs/CTab.js +2 -2
- package/dist/esm/components/tabs/CTab.js.map +1 -1
- package/dist/esm/components/tabs/CTabPane.js +1 -1
- package/dist/esm/components/tabs/CTabPane.js.map +1 -1
- package/dist/esm/components/tabs/CTabPanel.js +3 -3
- package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
- package/dist/esm/components/tabs/CTabs.d.ts +29 -9
- package/dist/esm/components/tabs/CTabs.js +16 -10
- package/dist/esm/components/tabs/CTabs.js.map +1 -1
- package/dist/esm/components/tabs/CTabsContext.d.ts +6 -0
- package/dist/esm/components/tabs/CTabsContext.js +6 -0
- package/dist/esm/components/tabs/CTabsContext.js.map +1 -0
- package/dist/esm/components/toast/CToast.d.ts +0 -6
- package/dist/esm/components/toast/CToast.js +6 -9
- package/dist/esm/components/toast/CToast.js.map +1 -1
- package/dist/esm/components/toast/CToastClose.js +1 -1
- package/dist/esm/components/toast/CToastClose.js.map +1 -1
- package/dist/esm/components/toast/CToastContext.d.ts +5 -0
- package/dist/esm/components/toast/CToastContext.js +6 -0
- package/dist/esm/components/toast/CToastContext.js.map +1 -0
- package/dist/esm/components/toast/CToaster.d.ts +2 -1
- package/dist/esm/components/toast/CToaster.js +4 -2
- package/dist/esm/components/toast/CToaster.js.map +1 -1
- package/dist/esm/hooks/useDropdownWithPopper.d.ts +2 -2
- package/dist/esm/hooks/usePopper.js +2 -2
- package/dist/esm/hooks/usePopper.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -2
- package/package.json +5 -5
- package/src/components/accordion/CAccordion.tsx +4 -10
- package/src/components/accordion/CAccordionBody.tsx +1 -2
- package/src/components/accordion/CAccordionButton.tsx +2 -2
- package/src/components/accordion/CAccordionContext.ts +9 -0
- package/src/components/accordion/CAccordionItem.tsx +4 -11
- package/src/components/accordion/CAccordionItemContext.ts +9 -0
- package/src/components/accordion/__tests__/CAccordion.spec.tsx +1 -1
- package/src/components/accordion/__tests__/CAccordionBody.spec.tsx +1 -1
- package/src/components/accordion/__tests__/CAccordionButton.spec.tsx +1 -1
- package/src/components/accordion/__tests__/CAccordionCollapse.spec.tsx +1 -1
- package/src/components/accordion/__tests__/CAccordionHeader.spec.tsx +1 -1
- package/src/components/accordion/__tests__/CAccordionItem.spec.tsx +1 -1
- package/src/components/alert/__tests__/CAlert.spec.tsx +39 -18
- package/src/components/alert/__tests__/CAlertHeading.spec.tsx +1 -1
- package/src/components/alert/__tests__/CAlertLink.spec.tsx +1 -1
- package/src/components/avatar/__tests__/CAvatar.spec.tsx +1 -1
- package/src/components/backdrop/__tests__/CBackdrop.spec.tsx +1 -1
- package/src/components/badge/__tests__/CBadge.spec.tsx +1 -1
- package/src/components/breadcrumb/__tests__/CBreadcrumb.spec.tsx +1 -1
- package/src/components/breadcrumb/__tests__/CBreadcrumbItem.spec.tsx +1 -1
- package/src/components/button/__tests__/CButton.spec.tsx +1 -1
- package/src/components/button-group/__tests__/CButtonGroup.spec.tsx +2 -1
- package/src/components/button-group/__tests__/CButtonToolbar.spec.tsx +2 -1
- package/src/components/callout/__tests__/CCallout.spec.tsx +1 -1
- package/src/components/card/__tests__/CCard.spec.tsx +1 -1
- package/src/components/card/__tests__/CCardBody.spec.tsx +1 -1
- package/src/components/card/__tests__/CCardFooter.spec.tsx +1 -1
- package/src/components/card/__tests__/CCardGroup.spec.tsx +1 -1
- package/src/components/card/__tests__/CCardHeader.spec.tsx +1 -1
- package/src/components/card/__tests__/CCardImage.spec.tsx +1 -1
- package/src/components/card/__tests__/CCardImageOverlay.spec.tsx +1 -1
- package/src/components/card/__tests__/CCardLink.spec.tsx +1 -1
- package/src/components/card/__tests__/CCardSubtitle.spec.tsx +1 -1
- package/src/components/card/__tests__/CCardText.spec.tsx +1 -1
- package/src/components/card/__tests__/CCardTitle.spec.tsx +1 -1
- package/src/components/carousel/CCarousel.tsx +6 -12
- package/src/components/carousel/CCarouselCaption.tsx +1 -1
- package/src/components/carousel/CCarouselContext.ts +8 -0
- package/src/components/carousel/CCarouselItem.tsx +6 -4
- package/src/components/carousel/__tests__/CCarousel.spec.tsx +1 -1
- package/src/components/close-button/__tests__/CCloseButton.spec.tsx +1 -1
- package/src/components/collapse/__tests__/CCollapse.spec.tsx +26 -7
- package/src/components/dropdown/CDropdown.tsx +35 -36
- package/src/components/dropdown/CDropdownContext.ts +18 -0
- package/src/components/dropdown/CDropdownDivider.tsx +1 -1
- package/src/components/dropdown/CDropdownHeader.tsx +1 -1
- package/src/components/dropdown/CDropdownItemPlain.tsx +1 -1
- package/src/components/dropdown/CDropdownMenu.tsx +3 -3
- package/src/components/dropdown/CDropdownToggle.tsx +2 -3
- package/src/components/dropdown/__tests__/CDropdown.spec.tsx +1 -1
- package/src/components/dropdown/__tests__/CDropdownDivider.spec.tsx +1 -1
- package/src/components/dropdown/__tests__/CDropdownHeader.spec.tsx +1 -1
- package/src/components/dropdown/__tests__/CDropdownItem.spec.tsx +1 -1
- package/src/components/dropdown/__tests__/CDropdownItemPlain.spec.tsx +1 -1
- package/src/components/dropdown/__tests__/CDropdownMenu.spec.tsx +1 -1
- package/src/components/dropdown/__tests__/CDropdownToggle.spec.tsx +1 -1
- package/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.tsx.snap +0 -1
- package/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.tsx.snap +0 -2
- package/src/components/footer/__tests__/CFooter.spec.tsx +1 -1
- package/src/components/form/__tests__/CForm.spec.tsx +2 -1
- package/src/components/form/__tests__/CFormCheck.spec.tsx +1 -1
- package/src/components/form/__tests__/CFormControl.spec.tsx +1 -1
- package/src/components/form/__tests__/CFormFeedback.spec.tsx +1 -1
- package/src/components/form/__tests__/CFormFloating.spec.tsx +1 -1
- package/src/components/form/__tests__/CFormInput.spec.tsx +1 -1
- package/src/components/form/__tests__/CFormLabel.spec.tsx +1 -1
- package/src/components/form/__tests__/CFormRange.spec.tsx +1 -1
- package/src/components/form/__tests__/CFormSelect.spec.tsx +1 -1
- package/src/components/form/__tests__/CFormSwitch.spec.tsx +1 -1
- package/src/components/form/__tests__/CFormText.spec.tsx +1 -1
- package/src/components/form/__tests__/CFormTextarea.spec.tsx +1 -1
- package/src/components/form/__tests__/CInputGroup.spec.tsx +1 -1
- package/src/components/form/__tests__/CInputGroupText.spec.tsx +1 -1
- package/src/components/grid/__tests__/CCol.spec.tsx +1 -1
- package/src/components/grid/__tests__/CContainer.spec.tsx +1 -1
- package/src/components/grid/__tests__/CRow.spec.tsx +1 -1
- package/src/components/header/__tests__/CHeader.spec.tsx +1 -1
- package/src/components/header/__tests__/CHeaderBrand.spec.tsx +1 -1
- package/src/components/header/__tests__/CHeaderDivider.spec.tsx +1 -1
- package/src/components/header/__tests__/CHeaderNav.spec.tsx +1 -1
- package/src/components/header/__tests__/CHeaderText.spec.tsx +1 -1
- package/src/components/header/__tests__/CHeaderToggler.spec.tsx +1 -1
- package/src/components/image/__tests__/CImage.spec.tsx +1 -1
- package/src/components/index.ts +1 -0
- package/src/components/link/__tests__/CLink.spec.tsx +1 -1
- package/src/components/list-group/__tests__/CListGroup.spec.tsx +1 -1
- package/src/components/list-group/__tests__/CListGroupItem.spec.tsx +1 -1
- package/src/components/loading-button/__tests__/CLoadingButton.spec.tsx +1 -1
- package/src/components/modal/CModal.tsx +5 -12
- package/src/components/modal/CModalContext.ts +8 -0
- package/src/components/modal/CModalHeader.tsx +1 -1
- package/src/components/modal/__tests__/CModal.spec.tsx +1 -1
- package/src/components/modal/__tests__/CModalBody.spec.tsx +1 -1
- package/src/components/modal/__tests__/CModalContent.spec.tsx +1 -1
- package/src/components/modal/__tests__/CModalDialog.spec.tsx +1 -1
- package/src/components/modal/__tests__/CModalFooter.spec.tsx +1 -1
- package/src/components/modal/__tests__/CModalHeader.spec.tsx +1 -1
- package/src/components/modal/__tests__/CModalTitle.spec.tsx +1 -1
- package/src/components/multi-select/__tests__/CMultiSelect.spec.tsx +1 -1
- package/src/components/nav/CNavGroup.tsx +2 -2
- package/src/components/nav/CNavLink.tsx +2 -2
- package/src/components/nav/__tests__/CNav.spec.tsx +4 -11
- package/src/components/nav/__tests__/CNavGroup.spec.tsx +1 -1
- package/src/components/nav/__tests__/CNavGroupItems.spec.tsx +1 -1
- package/src/components/nav/__tests__/CNavItem.spec.tsx +1 -1
- package/src/components/nav/__tests__/CNavLink.spec.tsx +1 -1
- package/src/components/nav/__tests__/CNavTitle.spec.tsx +1 -1
- package/src/components/nav/__tests__/__snapshots__/CNav.spec.tsx.snap +0 -1
- package/src/components/navbar/__tests__/CNavbar.spec.tsx +1 -1
- package/src/components/navbar/__tests__/CNavbarBrand.spec.tsx +1 -1
- package/src/components/navbar/__tests__/CNavbarNav.spec.tsx +1 -1
- package/src/components/navbar/__tests__/CNavbarText.spec.tsx +1 -1
- package/src/components/navbar/__tests__/CNavbarToggler.spec.tsx +1 -1
- package/src/components/offcanvas/__tests__/COffcanvas.spec.tsx +44 -17
- package/src/components/offcanvas/__tests__/COffcanvasBody.spec.tsx +1 -1
- package/src/components/offcanvas/__tests__/COffcanvasHeader.spec.tsx +1 -1
- package/src/components/offcanvas/__tests__/COffcanvasTitle.spec.tsx +1 -1
- package/src/components/pagination/__tests__/CPagination.spec.tsx +1 -1
- package/src/components/pagination/__tests__/CPaginationItem.spec.tsx +1 -1
- package/src/components/password-input/CPasswordInput.tsx +38 -30
- package/src/components/placeholder/__tests__/CPlaceholder.spec.tsx +1 -1
- package/src/components/popover/__tests__/CPopover.spec.tsx +70 -62
- package/src/components/popover/__tests__/__snapshots__/CPopover.spec.tsx.snap +0 -32
- package/src/components/progress/CProgress.tsx +4 -4
- package/src/components/progress/CProgressBar.tsx +4 -3
- package/src/components/progress/CProgressStacked.tsx +4 -8
- package/src/components/progress/CProgressStackedContext.ts +7 -0
- package/src/components/progress/__tests__/CProgress.spec.tsx +1 -1
- package/src/components/progress/__tests__/CProgressBar.spec.tsx +1 -1
- package/src/components/sidebar/CSidebarNav.tsx +27 -27
- package/src/components/sidebar/CSidebarNavContext.ts +8 -0
- package/src/components/sidebar/__tests__/CSidebar.spec.tsx +1 -1
- package/src/components/sidebar/__tests__/CSidebarBrand.spec.tsx +1 -1
- package/src/components/sidebar/__tests__/CSidebarFooter.spec.tsx +1 -1
- package/src/components/sidebar/__tests__/CSidebarHeader.spec.tsx +1 -1
- package/src/components/sidebar/__tests__/CSidebarNav.spec.tsx +1 -1
- package/src/components/sidebar/__tests__/CSidebarToggler.spec.tsx +1 -1
- package/src/components/smart-table/__tests__/CSmartTable.spec.tsx +1 -1
- package/src/components/spinner/__tests__/CSpinner.spec.tsx +1 -1
- package/src/components/stepper/CStepper.tsx +432 -0
- package/src/components/stepper/__tests__/CStepper.spec.tsx +98 -0
- package/src/components/stepper/index.ts +3 -0
- package/src/components/stepper/types.ts +20 -0
- package/src/components/table/__tests__/CTable.spec.tsx +1 -1
- package/src/components/table/__tests__/CTableBody.spec.tsx +1 -1
- package/src/components/table/__tests__/CTableCaption.spec.tsx +1 -1
- package/src/components/table/__tests__/CTableDataCell.spec.tsx +1 -1
- package/src/components/table/__tests__/CTableFoot.spec.tsx +1 -1
- package/src/components/table/__tests__/CTableHead.spec.tsx +1 -1
- package/src/components/table/__tests__/CTableHeaderCell.spec.tsx +1 -1
- package/src/components/table/__tests__/CTableRow.spec.tsx +1 -1
- package/src/components/tabs/CTab.tsx +2 -2
- package/src/components/tabs/CTabPane.tsx +1 -1
- package/src/components/tabs/CTabPanel.tsx +3 -3
- package/src/components/tabs/CTabs.tsx +54 -21
- package/src/components/tabs/CTabsContext.ts +9 -0
- package/src/components/tabs/__tests__/CTabContent.spec.tsx +16 -8
- package/src/components/tabs/__tests__/CTabPane.spec.tsx +48 -29
- package/src/components/toast/CToast.tsx +9 -24
- package/src/components/toast/CToastClose.tsx +1 -2
- package/src/components/toast/CToastContext.ts +8 -0
- package/src/components/toast/CToaster.tsx +11 -7
- package/src/components/toast/__tests__/CToast.spec.tsx +32 -27
- package/src/components/toast/__tests__/CToastBody.spec.tsx +1 -1
- package/src/components/toast/__tests__/CToastHeader.spec.tsx +1 -1
- package/src/components/toast/__tests__/CToaster.spec.tsx +2 -1
- package/src/components/tooltip/__tests__/CTooltip.spec.tsx +54 -33
- package/src/components/tooltip/__tests__/__snapshots__/CTooltip.spec.tsx.snap +0 -10
- package/src/components/widgets/__tests__/CWidgetStatsA.spec.tsx +1 -1
- package/src/components/widgets/__tests__/CWidgetStatsB.spec.tsx +1 -1
- package/src/components/widgets/__tests__/CWidgetStatsC.spec.tsx +1 -1
- package/src/components/widgets/__tests__/CWidgetStatsD.spec.tsx +1 -1
- package/src/components/widgets/__tests__/CWidgetStatsE.spec.tsx +1 -1
- package/src/components/widgets/__tests__/CWidgetStatsF.spec.tsx +1 -1
- package/src/hooks/usePopper.ts +2 -2
- package/src/utils/index.ts +0 -2
- package/dist/cjs/utils/isEqual.d.ts +0 -2
- package/dist/esm/utils/isEqual.d.ts +0 -2
- package/src/components/button/__tests__/CButtonClose.spec.tsx +0 -23
- 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,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
|
+
}
|
|
@@ -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 '
|
|
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 '
|
|
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 '
|
|
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 '
|
|
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 '
|
|
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 '
|
|
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 '
|
|
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 {
|
|
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(
|
|
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 {
|
|
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(
|
|
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)
|