dxd-style-code 0.1.7 → 0.1.9
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/dist/dxd-style-code.js +11974 -3725
- package/dist/dxd-style-code.umd.cjs +10 -1
- package/dist/style.css +1 -1
- package/package.json +14 -6
- package/src/components/atoms/DXAvatar/DXAvatar.stories.js +319 -0
- package/src/components/atoms/DXAvatar/DXAvatar.vue +167 -0
- package/src/components/atoms/DXAvatar/index.js +2 -0
- package/src/components/atoms/DXBackdrop/DXBackdrop.stories.js +341 -0
- package/src/components/atoms/DXBackdrop/DXBackdrop.vue +102 -0
- package/src/components/atoms/DXBackdrop/index.js +2 -0
- package/src/components/atoms/DXBadge/DXBadge.stories.js +239 -0
- package/src/components/atoms/DXBadge/DXBadge.vue +45 -0
- package/src/components/atoms/DXBadge/index.js +2 -0
- package/src/components/atoms/DXButton/DXButton.stories.js +178 -0
- package/src/components/atoms/DXButton/DXButton.vue +84 -0
- package/src/components/atoms/DXButton/index.js +2 -0
- package/src/components/atoms/DXCard/DXCard.stories.js +133 -0
- package/src/components/atoms/DXCard/DXCard.vue +46 -0
- package/src/components/atoms/DXCard/index.js +2 -0
- package/src/components/atoms/DXCheckbox/DXCheckbox.stories.js +294 -0
- package/src/components/atoms/DXCheckbox/DXCheckbox.vue +191 -0
- package/src/components/atoms/DXCheckbox/index.js +2 -0
- package/src/components/atoms/DXDivider/DXDivider.stories.js +135 -0
- package/src/components/atoms/DXDivider/DXDivider.vue +74 -0
- package/src/components/atoms/DXDivider/index.js +2 -0
- package/src/components/atoms/DXDropdownItem/DXDropdownItem.vue +116 -0
- package/src/components/atoms/DXDropdownItem/index.js +2 -0
- package/src/components/atoms/DXFormLabel/DXFormLabel.stories.js +194 -0
- package/src/components/atoms/DXFormLabel/DXFormLabel.vue +94 -0
- package/src/components/atoms/DXFormLabel/index.js +2 -0
- package/src/components/atoms/DXIcon/DXIcon.stories.js +156 -0
- package/src/components/atoms/DXIcon/DXIcon.vue +102 -0
- package/src/components/atoms/DXIcon/index.js +3 -0
- package/src/components/atoms/DXIconWrapper/DXIconWrapper.stories.js +237 -0
- package/src/components/atoms/DXIconWrapper/DXIconWrapper.vue +79 -0
- package/src/components/atoms/DXIconWrapper/index.js +2 -0
- package/src/components/atoms/DXInputAddon/DXInputAddon.stories.js +230 -0
- package/src/components/atoms/DXInputAddon/DXInputAddon.vue +64 -0
- package/src/components/atoms/DXInputAddon/index.js +2 -0
- package/src/components/atoms/DXLink/DXLink.stories.js +475 -0
- package/src/components/atoms/DXLink/DXLink.vue +229 -0
- package/src/components/atoms/DXLink/index.js +2 -0
- package/src/components/atoms/DXLoader/DXLoader.stories.js +280 -0
- package/src/components/atoms/DXLoader/DXLoader.vue +78 -0
- package/src/components/atoms/DXLoader/index.js +2 -0
- package/src/components/atoms/DXProgress/DXProgress.stories.js +312 -0
- package/src/components/atoms/DXProgress/DXProgress.vue +85 -0
- package/src/components/atoms/DXProgress/index.js +2 -0
- package/src/components/atoms/DXQuote/DXQuote.stories.js +255 -0
- package/src/components/atoms/DXQuote/DXQuote.vue +97 -0
- package/src/components/atoms/DXQuote/index.js +2 -0
- package/src/components/atoms/DXRadio/DXRadio.stories.js +277 -0
- package/src/components/atoms/DXRadio/DXRadio.vue +144 -0
- package/src/components/atoms/DXRadio/index.js +2 -0
- package/src/components/atoms/DXSkeleton/DXSkeleton.stories.js +50 -0
- package/src/components/atoms/DXSkeleton/DXSkeleton.vue +19 -0
- package/src/components/atoms/DXSkeleton/index.js +2 -0
- package/src/components/atoms/DXSlider/DXSlider.stories.js +522 -0
- package/src/components/atoms/DXSlider/DXSlider.vue +338 -0
- package/src/components/atoms/DXSlider/index.js +2 -0
- package/src/components/atoms/DXTags/DXTags.stories.js +206 -0
- package/src/components/atoms/DXTags/DXTags.vue +111 -0
- package/src/components/atoms/DXTags/index.js +2 -0
- package/src/components/atoms/DXToast/DXToast.stories.js +40 -0
- package/src/components/atoms/DXToast/DXToast.vue +32 -0
- package/src/components/atoms/DXToast/index.js +2 -0
- package/src/components/atoms/DXToggle/DXToggle.stories.js +143 -0
- package/src/components/atoms/DXToggle/DXToggle.vue +142 -0
- package/src/components/atoms/DXToggle/index.js +2 -0
- package/src/components/atoms/DXToggleButton/DXToggleButton.stories.js +513 -0
- package/src/components/atoms/DXToggleButton/DXToggleButton.vue +140 -0
- package/src/components/atoms/DXToggleButton/index.js +2 -0
- package/src/components/atoms/DXTooltip/DXTooltip.stories.js +243 -0
- package/src/components/atoms/DXTooltip/DXTooltip.vue +151 -0
- package/src/components/atoms/DXTooltip/index.js +2 -0
- package/src/components/atoms/index.js +24 -0
- package/src/components/index.js +20 -0
- package/src/components/layout/DXBox/DXBox.stories.js +238 -0
- package/src/components/layout/DXBox/DXBox.vue +198 -0
- package/src/components/layout/DXBox/index.js +2 -0
- package/src/components/layout/DXContainer/DXContainer.stories.js +147 -0
- package/src/components/layout/DXContainer/DXContainer.vue +83 -0
- package/src/components/layout/DXContainer/index.js +2 -0
- package/src/components/layout/DXFlex/DXFlex.stories.js +210 -0
- package/src/components/layout/DXFlex/DXFlex.vue +149 -0
- package/src/components/layout/DXFlex/index.js +2 -0
- package/src/components/layout/DXGrid/DXGrid.stories.js +238 -0
- package/src/components/layout/DXGrid/DXGrid.vue +167 -0
- package/src/components/layout/DXGrid/index.js +2 -0
- package/src/components/layout/DXSpacer/DXSpacer.stories.js +187 -0
- package/src/components/layout/DXSpacer/DXSpacer.vue +102 -0
- package/src/components/layout/DXSpacer/index.js +2 -0
- package/src/components/layout/DXStack/DXStack.stories.js +199 -0
- package/src/components/layout/DXStack/DXStack.vue +140 -0
- package/src/components/layout/DXStack/index.js +2 -0
- package/src/components/layout/index.js +8 -0
- package/src/components/molecules/DXActionButtons/DXActionButtons.stories.js +288 -0
- package/src/components/molecules/DXActionButtons/DXActionButtons.vue +106 -0
- package/src/components/molecules/DXActionButtons/index.js +2 -0
- package/src/components/molecules/DXAlert/DXAlert.stories.js +70 -0
- package/src/components/molecules/DXAlert/DXAlert.vue +116 -0
- package/src/components/molecules/DXAlert/index.js +2 -0
- package/src/components/molecules/DXBaseTable/DXBaseTable.stories.js +433 -0
- package/src/components/molecules/DXBaseTable/DXBaseTable.vue +459 -0
- package/src/components/molecules/DXBaseTable/index.js +4 -0
- package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.stories.js +227 -0
- package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.vue +96 -0
- package/src/components/molecules/DXBreadcrumb/index.js +2 -0
- package/src/components/molecules/DXButtonGroup/DXButtonGroup.stories.js +26 -0
- package/src/components/molecules/DXButtonGroup/DXButtonGroup.vue +78 -0
- package/src/components/molecules/DXButtonGroup/index.js +2 -0
- package/src/components/molecules/DXCloseButton/DXCloseButton.stories.js +53 -0
- package/src/components/molecules/DXCloseButton/DXCloseButton.vue +62 -0
- package/src/components/molecules/DXCloseButton/index.js +3 -0
- package/src/components/molecules/DXComboBox/DXComboBox.stories.js +62 -0
- package/src/components/molecules/DXComboBox/DXComboBox.vue +167 -0
- package/src/components/molecules/DXComboBox/index.js +2 -0
- package/src/components/molecules/DXCopyField/DXCopyField.stories.js +231 -0
- package/src/components/molecules/DXCopyField/DXCopyField.vue +75 -0
- package/src/components/molecules/DXCopyField/index.js +2 -0
- package/src/components/molecules/DXDataFilter/DXDataFilter.stories.js +275 -0
- package/src/components/molecules/DXDataFilter/DXDataFilter.vue +385 -0
- package/src/components/molecules/DXDataFilter/index.js +2 -0
- package/src/components/molecules/DXDatePicker/DXDatePicker.stories.js +42 -0
- package/src/components/molecules/DXDatePicker/DXDatePicker.vue +121 -0
- package/src/components/molecules/DXDatePicker/index.js +2 -0
- package/src/components/molecules/DXDropdownDivider/DXDropdownDivider.vue +30 -0
- package/src/components/molecules/DXDropdownDivider/index.js +2 -0
- package/src/components/molecules/DXFileUpload/DXFileUpload.stories.js +53 -0
- package/src/components/molecules/DXFileUpload/DXFileUpload.vue +199 -0
- package/src/components/molecules/DXFileUpload/index.js +2 -0
- package/src/components/molecules/DXFilterGroup/DXFilterGroup.stories.js +43 -0
- package/src/components/molecules/DXFilterGroup/DXFilterGroup.vue +43 -0
- package/src/components/molecules/DXFilterGroup/index.js +2 -0
- package/src/components/molecules/DXFormControl/DXFormControl.stories.js +69 -0
- package/src/components/molecules/DXFormControl/DXFormControl.vue +72 -0
- package/src/components/molecules/DXFormControl/index.js +2 -0
- package/src/components/molecules/DXInput/DXInput.stories.js +291 -0
- package/src/components/molecules/DXInput/DXInput.vue +156 -0
- package/src/components/molecules/DXInput/index.js +3 -0
- package/src/components/molecules/DXInputGroup/DXInputGroup.stories.js +228 -0
- package/src/components/molecules/DXInputGroup/DXInputGroup.vue +64 -0
- package/src/components/molecules/DXInputGroup/index.js +2 -0
- package/src/components/molecules/DXInputMask/DXInputMask.stories.js +53 -0
- package/src/components/molecules/DXInputMask/DXInputMask.vue +89 -0
- package/src/components/molecules/DXInputMask/index.js +2 -0
- package/src/components/molecules/DXMenu/DXMenu.stories.js +379 -0
- package/src/components/molecules/DXMenu/DXMenu.vue +331 -0
- package/src/components/molecules/DXMenu/README.md +479 -0
- package/src/components/molecules/DXMenu/index.js +2 -0
- package/src/components/molecules/DXPagination/DXPagination.stories.js +62 -0
- package/src/components/molecules/DXPagination/DXPagination.vue +123 -0
- package/src/components/molecules/DXPagination/index.js +2 -0
- package/src/components/molecules/DXPasswordInput/DXPasswordInput.stories.js +42 -0
- package/src/components/molecules/DXPasswordInput/DXPasswordInput.vue +74 -0
- package/src/components/molecules/DXPasswordInput/index.js +2 -0
- package/src/components/molecules/DXRadioCard/DXRadioCard.stories.js +60 -0
- package/src/components/molecules/DXRadioCard/DXRadioCard.vue +71 -0
- package/src/components/molecules/DXRadioCard/index.js +2 -0
- package/src/components/molecules/DXRadioGroup/DXRadioGroup.stories.js +297 -0
- package/src/components/molecules/DXRadioGroup/DXRadioGroup.vue +73 -0
- package/src/components/molecules/DXRadioGroup/index.js +2 -0
- package/src/components/molecules/DXRating/DXRating.stories.js +322 -0
- package/src/components/molecules/DXRating/DXRating.vue +402 -0
- package/src/components/molecules/DXRating/index.js +2 -0
- package/src/components/molecules/DXSearchBar/DXSearchBar.stories.js +357 -0
- package/src/components/molecules/DXSearchBar/DXSearchBar.vue +525 -0
- package/src/components/molecules/DXSearchBar/index.js +2 -0
- package/src/components/molecules/DXSearchSelect/DXSearchSelect.stories.js +50 -0
- package/src/components/molecules/DXSearchSelect/DXSearchSelect.vue +207 -0
- package/src/components/molecules/DXSearchSelect/index.js +2 -0
- package/src/components/molecules/DXSegmentedControl/DXSegmentedControl.stories.js +326 -0
- package/src/components/molecules/DXSegmentedControl/DXSegmentedControl.vue +116 -0
- package/src/components/molecules/DXSegmentedControl/index.js +2 -0
- package/src/components/molecules/DXSelect/DXSelect.stories.js +259 -0
- package/src/components/molecules/DXSelect/DXSelect.vue +149 -0
- package/src/components/molecules/DXSelect/index.js +3 -0
- package/src/components/molecules/DXStatCard/DXStatCard.stories.js +335 -0
- package/src/components/molecules/DXStatCard/DXStatCard.vue +309 -0
- package/src/components/molecules/DXStatCard/index.js +2 -0
- package/src/components/molecules/DXTableFiltersPanel/DXTableFiltersPanel.vue +72 -0
- package/src/components/molecules/DXTableFiltersPanel/index.js +7 -0
- package/src/components/molecules/DXTablePagination/DXTablePagination.stories.js +236 -0
- package/src/components/molecules/DXTablePagination/DXTablePagination.vue +93 -0
- package/src/components/molecules/DXTablePagination/index.js +2 -0
- package/src/components/molecules/DXTableToolbar/DXTableToolbar.stories.js +271 -0
- package/src/components/molecules/DXTableToolbar/DXTableToolbar.vue +102 -0
- package/src/components/molecules/DXTableToolbar/index.js +2 -0
- package/src/components/molecules/DXTextarea/DXTextarea.stories.js +239 -0
- package/src/components/molecules/DXTextarea/DXTextarea.vue +158 -0
- package/src/components/molecules/DXTextarea/index.js +3 -0
- package/src/components/molecules/DXTimePicker/DXTimePicker.stories.js +282 -0
- package/src/components/molecules/DXTimePicker/DXTimePicker.vue +640 -0
- package/src/components/molecules/DXTimePicker/index.js +2 -0
- package/src/components/molecules/DXValidationIcon/DXValidationIcon.stories.js +60 -0
- package/src/components/molecules/DXValidationIcon/DXValidationIcon.vue +53 -0
- package/src/components/molecules/DXValidationIcon/index.js +3 -0
- package/src/components/molecules/index.js +34 -0
- package/src/components/organisms/DXAccordion/DXAccordion.stories.js +33 -0
- package/src/components/organisms/DXAccordion/DXAccordion.vue +104 -0
- package/src/components/organisms/DXAccordion/index.js +2 -0
- package/src/components/organisms/DXAppLayout/DXAppLayout.stories.js +689 -0
- package/src/components/organisms/DXAppLayout/DXAppLayout.vue +460 -0
- package/src/components/organisms/DXAppLayout/index.js +2 -0
- package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.stories.js +232 -0
- package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.vue +458 -0
- package/src/components/organisms/DXAuthenticationForm/index.js +2 -0
- package/src/components/organisms/DXChartContainer/DXChartContainer.stories.js +286 -0
- package/src/components/organisms/DXChartContainer/DXChartContainer.vue +273 -0
- package/src/components/organisms/DXChartContainer/index.js +2 -0
- package/src/components/organisms/DXChatInterface/DXChatInterface.stories.js +164 -0
- package/src/components/organisms/DXChatInterface/DXChatInterface.vue +583 -0
- package/src/components/organisms/DXChatInterface/index.js +2 -0
- package/src/components/organisms/DXCommentSection/DXCommentSection.stories.js +173 -0
- package/src/components/organisms/DXCommentSection/DXCommentSection.vue +487 -0
- package/src/components/organisms/DXCommentSection/index.js +2 -0
- package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.stories.js +331 -0
- package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.vue +309 -0
- package/src/components/organisms/DXDashboardGrid/index.js +2 -0
- package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.stories.js +271 -0
- package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.vue +260 -0
- package/src/components/organisms/DXDashboardWidget/index.js +2 -0
- package/src/components/organisms/DXDataTable/DXDataTable.stories.js +247 -0
- package/src/components/organisms/DXDataTable/DXDataTable.vue +496 -0
- package/src/components/organisms/DXDataTable/index.js +2 -0
- package/src/components/organisms/DXDropdown/DXDropdown.stories.js +795 -0
- package/src/components/organisms/DXDropdown/DXDropdown.vue +238 -0
- package/src/components/organisms/DXDropdown/index.js +2 -0
- package/src/components/organisms/DXEmptyState/DXEmptyState.stories.js +37 -0
- package/src/components/organisms/DXEmptyState/DXEmptyState.vue +41 -0
- package/src/components/organisms/DXEmptyState/index.js +2 -0
- package/src/components/organisms/DXFormWizard/DXFormWizard.stories.js +378 -0
- package/src/components/organisms/DXFormWizard/DXFormWizard.vue +578 -0
- package/src/components/organisms/DXFormWizard/index.js +2 -0
- package/src/components/organisms/DXHeaderBar/DXHeaderBar.stories.js +448 -0
- package/src/components/organisms/DXHeaderBar/DXHeaderBar.vue +190 -0
- package/src/components/organisms/DXHeaderBar/index.js +2 -0
- package/src/components/organisms/DXMediaGallery/DXMediaGallery.stories.js +347 -0
- package/src/components/organisms/DXMediaGallery/DXMediaGallery.vue +422 -0
- package/src/components/organisms/DXMediaGallery/index.js +2 -0
- package/src/components/organisms/DXModal/DXModal.stories.js +138 -0
- package/src/components/organisms/DXModal/DXModal.vue +213 -0
- package/src/components/organisms/DXModal/index.js +2 -0
- package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.stories.js +183 -0
- package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.vue +566 -0
- package/src/components/organisms/DXNotificationCenter/index.js +2 -0
- package/src/components/organisms/DXReportGenerator/DXReportGenerator.stories.js +199 -0
- package/src/components/organisms/DXReportGenerator/DXReportGenerator.vue +344 -0
- package/src/components/organisms/DXReportGenerator/index.js +2 -0
- package/src/components/organisms/DXSettingsPanel/DXSettingsPanel.stories.js +245 -0
- package/src/components/organisms/DXSettingsPanel/DXSettingsPanel.vue +454 -0
- package/src/components/organisms/DXSettingsPanel/index.js +2 -0
- package/src/components/organisms/DXSidebar/DXSidebar.stories.js +316 -0
- package/src/components/organisms/DXSidebar/DXSidebar.vue +212 -0
- package/src/components/organisms/DXSidebar/index.js +2 -0
- package/src/components/organisms/DXSidebarMenu/DATA_STRUCTURE.md +299 -0
- package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.stories.js +729 -0
- package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.vue +257 -0
- package/src/components/organisms/DXSidebarMenu/DXSidebarMenuItem.vue +249 -0
- package/src/components/organisms/DXSidebarMenu/README.md +333 -0
- package/src/components/organisms/DXSidebarMenu/index.js +3 -0
- package/src/components/organisms/DXTable/DXTable.stories.js +550 -0
- package/src/components/organisms/DXTable/DXTable.vue +324 -0
- package/src/components/organisms/DXTable/index.js +2 -0
- package/src/components/organisms/DXTabs/DXTabs.stories.js +407 -0
- package/src/components/organisms/DXTabs/DXTabs.vue +301 -0
- package/src/components/organisms/DXTabs/index.js +2 -0
- package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.stories.js +194 -0
- package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.vue +403 -0
- package/src/components/organisms/DXUserProfileCard/index.js +2 -0
- package/src/components/organisms/DXWizard/DXWizard.stories.js +212 -0
- package/src/components/organisms/DXWizard/DXWizard.vue +615 -0
- package/src/components/organisms/DXWizard/index.js +2 -0
- package/src/components/organisms/index.js +25 -0
- package/src/components/typography/DXBlockquote/DXBlockquote.stories.js +33 -0
- package/src/components/typography/DXBlockquote/DXBlockquote.vue +44 -0
- package/src/components/typography/DXBlockquote/index.js +2 -0
- package/src/components/typography/DXCode/DXCode.stories.js +29 -0
- package/src/components/typography/DXCode/DXCode.vue +46 -0
- package/src/components/typography/DXCode/index.js +2 -0
- package/src/components/typography/DXHeading/DXHeading.stories.js +54 -0
- package/src/components/typography/DXHeading/DXHeading.vue +68 -0
- package/src/components/typography/DXHeading/index.js +2 -0
- package/src/components/typography/DXLabel/DXLabel.stories.js +40 -0
- package/src/components/typography/DXLabel/DXLabel.vue +49 -0
- package/src/components/typography/DXLabel/index.js +2 -0
- package/src/components/typography/DXList/DXList.stories.js +50 -0
- package/src/components/typography/DXList/DXList.vue +55 -0
- package/src/components/typography/DXList/index.js +2 -0
- package/src/components/typography/DXText/DXText.stories.js +47 -0
- package/src/components/typography/DXText/DXText.vue +67 -0
- package/src/components/typography/DXText/index.js +2 -0
- package/src/components/typography/index.js +8 -0
- package/src/components/utilities/DXAnimatePresence/DXAnimatePresence.stories.js +335 -0
- package/src/components/utilities/DXAnimatePresence/DXAnimatePresence.vue +207 -0
- package/src/components/utilities/DXAnimatePresence/index.js +2 -0
- package/src/components/utilities/DXBreakpointProvider/DXBreakpointProvider.stories.js +321 -0
- package/src/components/utilities/DXBreakpointProvider/DXBreakpointProvider.vue +158 -0
- package/src/components/utilities/DXBreakpointProvider/index.js +2 -0
- package/src/components/utilities/DXObserver/DXObserver.stories.js +324 -0
- package/src/components/utilities/DXObserver/DXObserver.vue +182 -0
- package/src/components/utilities/DXObserver/index.js +2 -0
- package/src/components/utilities/DXPortal/DXPortal.stories.js +267 -0
- package/src/components/utilities/DXPortal/DXPortal.vue +69 -0
- package/src/components/utilities/DXPortal/index.js +2 -0
- package/src/components/utilities/DXStaggeredAnimation/DXStaggeredAnimation.stories.js +339 -0
- package/src/components/utilities/DXStaggeredAnimation/DXStaggeredAnimation.vue +155 -0
- package/src/components/utilities/DXStaggeredAnimation/index.js +2 -0
- package/src/components/utilities/DXThemeProvider/DXThemeProvider.stories.js +327 -0
- package/src/components/utilities/DXThemeProvider/DXThemeProvider.vue +227 -0
- package/src/components/utilities/DXThemeProvider/index.js +2 -0
- package/src/components/utilities/DXTransitionGroup/DXTransitionGroup.stories.js +368 -0
- package/src/components/utilities/DXTransitionGroup/DXTransitionGroup.vue +212 -0
- package/src/components/utilities/DXTransitionGroup/index.js +2 -0
- package/src/components/utilities/index.js +9 -0
- package/src/composables/useAnimation.js +264 -0
- package/src/composables/useClassComposition.js +35 -0
- package/src/composables/useDataAttributes.js +83 -0
- package/src/composables/useMenu.js +88 -0
- package/src/composables/useSize.js +135 -0
- package/src/composables/useSpacing.js +37 -0
- package/src/composables/useTableColumns.js +88 -0
- package/src/composables/useTableData.js +82 -0
- package/src/composables/useTableFilter.js +158 -0
- package/src/composables/useTablePagination.js +89 -0
- package/src/composables/useTableSelection.js +77 -0
- package/src/composables/useTableSort.js +75 -0
- package/src/composables/useTabsScroll.js +88 -0
- package/src/composables/useVariant.js +700 -0
- package/src/index.js +86 -0
- package/src/styles/animations.css +171 -0
- package/src/styles/index.css +99 -0
- package/src/styles/tokens.js +123 -0
- package/src/utils/propTypes.js +77 -0
- package/src/utils/toggleButtonPresets.js +115 -0
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div
|
|
3
|
+
:class="wizardClasses"
|
|
4
|
+
data-component="DXFormWizard"
|
|
5
|
+
:data-current-step="currentStep"
|
|
6
|
+
>
|
|
7
|
+
<!-- Индикатор прогресса -->
|
|
8
|
+
<div v-if="showProgress" :class="progressClasses">
|
|
9
|
+
<DXProgress
|
|
10
|
+
:value="progressValue"
|
|
11
|
+
:max="100"
|
|
12
|
+
:size="progressSize"
|
|
13
|
+
:show-label="false"
|
|
14
|
+
/>
|
|
15
|
+
<div class="mt-2 text-sm text-slate-600 text-center">
|
|
16
|
+
Шаг {{ currentStep + 1 }} из {{ steps.length }}
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<!-- Навигация по шагам (tabs) -->
|
|
21
|
+
<div v-if="navigationStyle === 'tabs'" :class="tabsClasses">
|
|
22
|
+
<button
|
|
23
|
+
v-for="(step, index) in steps"
|
|
24
|
+
:key="index"
|
|
25
|
+
type="button"
|
|
26
|
+
:class="tabClasses(index)"
|
|
27
|
+
:disabled="!canNavigateToStep(index)"
|
|
28
|
+
@click="goToStep(index)"
|
|
29
|
+
>
|
|
30
|
+
<span class="flex items-center gap-2">
|
|
31
|
+
<span
|
|
32
|
+
:class="tabNumberClasses(index)"
|
|
33
|
+
class="flex items-center justify-center rounded-full"
|
|
34
|
+
>
|
|
35
|
+
{{ index + 1 }}
|
|
36
|
+
</span>
|
|
37
|
+
<span>{{ step.title }}</span>
|
|
38
|
+
</span>
|
|
39
|
+
</button>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<!-- Навигация по шагам (steps) -->
|
|
43
|
+
<div v-if="navigationStyle === 'steps'" :class="stepsClasses">
|
|
44
|
+
<div
|
|
45
|
+
v-for="(step, index) in steps"
|
|
46
|
+
:key="index"
|
|
47
|
+
:class="stepItemClasses(index)"
|
|
48
|
+
>
|
|
49
|
+
<div
|
|
50
|
+
:class="stepCircleClasses(index)"
|
|
51
|
+
class="flex items-center justify-center rounded-full"
|
|
52
|
+
>
|
|
53
|
+
<DXIcon
|
|
54
|
+
v-if="isStepCompleted(index)"
|
|
55
|
+
:icon="CheckIcon"
|
|
56
|
+
size="sm"
|
|
57
|
+
class="text-white"
|
|
58
|
+
/>
|
|
59
|
+
<span v-else class="text-sm font-medium">{{ index + 1 }}</span>
|
|
60
|
+
</div>
|
|
61
|
+
<div class="flex-1 ml-4">
|
|
62
|
+
<div class="text-sm font-medium text-slate-900">{{ step.title }}</div>
|
|
63
|
+
<div v-if="step.description" class="text-xs text-slate-500">
|
|
64
|
+
{{ step.description }}
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
<div
|
|
68
|
+
v-if="index < steps.length - 1"
|
|
69
|
+
:class="stepConnectorClasses(index)"
|
|
70
|
+
class="absolute left-5 top-10 w-0.5 h-full"
|
|
71
|
+
/>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<!-- Контент шага -->
|
|
76
|
+
<div :class="contentClasses">
|
|
77
|
+
<Transition :name="transitionName" mode="out-in">
|
|
78
|
+
<div :key="currentStep" class="w-full">
|
|
79
|
+
<slot :name="`step-${currentStep + 1}`" :step="steps[currentStep]" :stepIndex="currentStep">
|
|
80
|
+
<div class="p-8 text-center text-slate-500">
|
|
81
|
+
<p>Шаг {{ currentStep + 1 }}: {{ steps[currentStep]?.title }}</p>
|
|
82
|
+
<p class="text-sm mt-2">Используйте slot step-{{ currentStep + 1 }} для контента</p>
|
|
83
|
+
</div>
|
|
84
|
+
</slot>
|
|
85
|
+
</div>
|
|
86
|
+
</Transition>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<!-- Навигация -->
|
|
90
|
+
<div :class="navigationClasses">
|
|
91
|
+
<slot
|
|
92
|
+
name="navigation"
|
|
93
|
+
:canGoNext="canGoNext"
|
|
94
|
+
:canGoPrev="canGoPrev"
|
|
95
|
+
:goNext="goNext"
|
|
96
|
+
:goPrev="goPrev"
|
|
97
|
+
:goToStep="goToStep"
|
|
98
|
+
:currentStep="currentStep"
|
|
99
|
+
:totalSteps="steps.length"
|
|
100
|
+
>
|
|
101
|
+
<div class="flex items-center justify-between">
|
|
102
|
+
<DXButton
|
|
103
|
+
v-if="canGoPrev"
|
|
104
|
+
variant="ghost"
|
|
105
|
+
@click="goPrev"
|
|
106
|
+
>
|
|
107
|
+
Назад
|
|
108
|
+
</DXButton>
|
|
109
|
+
<div v-else></div>
|
|
110
|
+
|
|
111
|
+
<div class="flex gap-2">
|
|
112
|
+
<DXButton
|
|
113
|
+
v-for="(step, index) in steps"
|
|
114
|
+
:key="index"
|
|
115
|
+
:variant="currentStep === index ? 'primary' : 'ghost'"
|
|
116
|
+
size="sm"
|
|
117
|
+
:disabled="!canNavigateToStep(index)"
|
|
118
|
+
@click="goToStep(index)"
|
|
119
|
+
>
|
|
120
|
+
{{ index + 1 }}
|
|
121
|
+
</DXButton>
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
<DXButton
|
|
125
|
+
v-if="canGoNext"
|
|
126
|
+
variant="primary"
|
|
127
|
+
@click="goNext"
|
|
128
|
+
>
|
|
129
|
+
Далее
|
|
130
|
+
</DXButton>
|
|
131
|
+
<DXButton
|
|
132
|
+
v-else
|
|
133
|
+
variant="primary"
|
|
134
|
+
@click="handleSubmit"
|
|
135
|
+
>
|
|
136
|
+
Завершить
|
|
137
|
+
</DXButton>
|
|
138
|
+
</div>
|
|
139
|
+
</slot>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
</template>
|
|
143
|
+
|
|
144
|
+
<script setup>
|
|
145
|
+
import { ref, computed, watch } from "vue";
|
|
146
|
+
import { useClassComposition } from "@/composables/useClassComposition";
|
|
147
|
+
import DXProgress from "../../atoms/DXProgress/DXProgress.vue";
|
|
148
|
+
import DXButton from "../../atoms/DXButton/DXButton.vue";
|
|
149
|
+
import DXIcon from "../../atoms/DXIcon/DXIcon.vue";
|
|
150
|
+
import { CheckIcon } from "@heroicons/vue/24/solid";
|
|
151
|
+
|
|
152
|
+
const props = defineProps({
|
|
153
|
+
/**
|
|
154
|
+
* Текущий шаг (v-model, 0-based)
|
|
155
|
+
* @default 0
|
|
156
|
+
*/
|
|
157
|
+
currentStep: { type: Number, default: 0 },
|
|
158
|
+
/**
|
|
159
|
+
* Массив шагов: [{ id, title, description? }]
|
|
160
|
+
*/
|
|
161
|
+
steps: {
|
|
162
|
+
type: Array,
|
|
163
|
+
required: true,
|
|
164
|
+
validator: (v) => v.length > 0,
|
|
165
|
+
},
|
|
166
|
+
/**
|
|
167
|
+
* Данные формы (для валидации)
|
|
168
|
+
*/
|
|
169
|
+
formData: { type: Object, default: () => ({}) },
|
|
170
|
+
/**
|
|
171
|
+
* Функция валидации для каждого шага
|
|
172
|
+
* Формат: (stepIndex, formData) => boolean
|
|
173
|
+
*/
|
|
174
|
+
validation: { type: Function, default: null },
|
|
175
|
+
/**
|
|
176
|
+
* Разрешить пропуск шагов
|
|
177
|
+
* @default false
|
|
178
|
+
*/
|
|
179
|
+
allowSkip: { type: Boolean, default: false },
|
|
180
|
+
/**
|
|
181
|
+
* Стиль навигации: tabs | steps | dots | none
|
|
182
|
+
* @default 'steps'
|
|
183
|
+
*/
|
|
184
|
+
navigationStyle: {
|
|
185
|
+
type: String,
|
|
186
|
+
default: "steps",
|
|
187
|
+
validator: (v) => ["tabs", "steps", "dots", "none"].includes(v),
|
|
188
|
+
},
|
|
189
|
+
/**
|
|
190
|
+
* Показывать индикатор прогресса
|
|
191
|
+
* @default true
|
|
192
|
+
*/
|
|
193
|
+
showProgress: { type: Boolean, default: true },
|
|
194
|
+
/**
|
|
195
|
+
* Размер индикатора прогресса: xs | sm | md | lg
|
|
196
|
+
* @default 'md'
|
|
197
|
+
*/
|
|
198
|
+
progressSize: {
|
|
199
|
+
type: String,
|
|
200
|
+
default: "md",
|
|
201
|
+
validator: (v) => ["xs", "sm", "md", "lg"].includes(v),
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
const emit = defineEmits([
|
|
206
|
+
"update:currentStep",
|
|
207
|
+
"step-change",
|
|
208
|
+
"submit",
|
|
209
|
+
"next",
|
|
210
|
+
"prev",
|
|
211
|
+
]);
|
|
212
|
+
|
|
213
|
+
const internalStep = ref(props.currentStep);
|
|
214
|
+
const completedSteps = ref([]);
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Текущий шаг (синхронизированный)
|
|
218
|
+
*
|
|
219
|
+
* @description
|
|
220
|
+
* Синхронизирует внутреннее состояние с prop currentStep.
|
|
221
|
+
*
|
|
222
|
+
* @returns {number} Текущий шаг (0-based)
|
|
223
|
+
*/
|
|
224
|
+
const currentStep = computed({
|
|
225
|
+
get: () => props.currentStep,
|
|
226
|
+
set: (value) => {
|
|
227
|
+
if (canNavigateToStep(value)) {
|
|
228
|
+
internalStep.value = value;
|
|
229
|
+
emit("update:currentStep", value);
|
|
230
|
+
emit("step-change", value);
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Значение прогресса в процентах
|
|
237
|
+
*
|
|
238
|
+
* @description
|
|
239
|
+
* Вычисляет процент завершения формы на основе текущего шага.
|
|
240
|
+
*
|
|
241
|
+
* @returns {number} Процент прогресса (0-100)
|
|
242
|
+
*/
|
|
243
|
+
const progressValue = computed(() => {
|
|
244
|
+
return ((currentStep.value + 1) / props.steps.length) * 100;
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Имя transition для анимации между шагами
|
|
249
|
+
*
|
|
250
|
+
* @description
|
|
251
|
+
* Используется для CSS классов анимации перехода между шагами.
|
|
252
|
+
*
|
|
253
|
+
* @returns {string} Имя transition
|
|
254
|
+
*/
|
|
255
|
+
const transitionName = computed(() => "wizard-fade");
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Классы для контейнера wizard
|
|
259
|
+
*
|
|
260
|
+
* @description
|
|
261
|
+
* Базовые классы для контейнера формы.
|
|
262
|
+
*
|
|
263
|
+
* @returns {Array} Массив классов
|
|
264
|
+
*/
|
|
265
|
+
const wizardClasses = computed(() =>
|
|
266
|
+
useClassComposition("w-full")
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Классы для индикатора прогресса
|
|
271
|
+
*
|
|
272
|
+
* @description
|
|
273
|
+
* Классы для секции с индикатором прогресса.
|
|
274
|
+
*
|
|
275
|
+
* @returns {Array} Массив классов
|
|
276
|
+
*/
|
|
277
|
+
const progressClasses = computed(() =>
|
|
278
|
+
useClassComposition("mb-6")
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Классы для навигации tabs
|
|
283
|
+
*
|
|
284
|
+
* @description
|
|
285
|
+
* Классы для навигации в стиле tabs.
|
|
286
|
+
*
|
|
287
|
+
* @returns {Array} Массив классов
|
|
288
|
+
*/
|
|
289
|
+
const tabsClasses = computed(() =>
|
|
290
|
+
useClassComposition(
|
|
291
|
+
"flex border-b border-slate-200 mb-6",
|
|
292
|
+
props.allowSkip ? "" : "gap-1"
|
|
293
|
+
)
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Классы для навигации steps
|
|
298
|
+
*
|
|
299
|
+
* @description
|
|
300
|
+
* Классы для навигации в стиле steps.
|
|
301
|
+
*
|
|
302
|
+
* @returns {Array} Массив классов
|
|
303
|
+
*/
|
|
304
|
+
const stepsClasses = computed(() =>
|
|
305
|
+
useClassComposition("relative mb-8 space-y-4")
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Классы для контента
|
|
310
|
+
*
|
|
311
|
+
* @description
|
|
312
|
+
* Классы для секции с контентом шага.
|
|
313
|
+
*
|
|
314
|
+
* @returns {Array} Массив классов
|
|
315
|
+
*/
|
|
316
|
+
const contentClasses = computed(() =>
|
|
317
|
+
useClassComposition("min-h-[300px] mb-6")
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Классы для навигации
|
|
322
|
+
*
|
|
323
|
+
* @description
|
|
324
|
+
* Классы для секции с кнопками навигации.
|
|
325
|
+
*
|
|
326
|
+
* @returns {Array} Массив классов
|
|
327
|
+
*/
|
|
328
|
+
const navigationClasses = computed(() =>
|
|
329
|
+
useClassComposition("flex items-center justify-between pt-6 border-t border-slate-200")
|
|
330
|
+
);
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Классы для tab
|
|
334
|
+
*
|
|
335
|
+
* @description
|
|
336
|
+
* Вычисляет классы для tab на основе состояния.
|
|
337
|
+
*
|
|
338
|
+
* @param {number} index - Индекс шага
|
|
339
|
+
* @returns {Array} Массив классов
|
|
340
|
+
*/
|
|
341
|
+
function tabClasses(index) {
|
|
342
|
+
const isActive = currentStep.value === index;
|
|
343
|
+
const isCompleted = completedSteps.value.includes(index);
|
|
344
|
+
const canNavigate = canNavigateToStep(index);
|
|
345
|
+
|
|
346
|
+
return useClassComposition(
|
|
347
|
+
"px-4 py-2 text-sm font-medium transition-colors border-b-2",
|
|
348
|
+
{
|
|
349
|
+
"border-blue-600 text-blue-600": isActive,
|
|
350
|
+
"border-transparent text-slate-600 hover:text-slate-900": !isActive,
|
|
351
|
+
"text-slate-400 cursor-not-allowed": !canNavigate && !isActive,
|
|
352
|
+
"text-green-600": isCompleted && !isActive,
|
|
353
|
+
}
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Классы для номера tab
|
|
359
|
+
*
|
|
360
|
+
* @description
|
|
361
|
+
* Вычисляет классы для номера в tab.
|
|
362
|
+
*
|
|
363
|
+
* @param {number} index - Индекс шага
|
|
364
|
+
* @returns {Array} Массив классов
|
|
365
|
+
*/
|
|
366
|
+
function tabNumberClasses(index) {
|
|
367
|
+
const isActive = currentStep.value === index;
|
|
368
|
+
const isCompleted = completedSteps.value.includes(index);
|
|
369
|
+
|
|
370
|
+
return useClassComposition(
|
|
371
|
+
"w-6 h-6 text-xs",
|
|
372
|
+
{
|
|
373
|
+
"bg-blue-600 text-white": isActive,
|
|
374
|
+
"bg-green-600 text-white": isCompleted && !isActive,
|
|
375
|
+
"bg-slate-200 text-slate-600": !isActive && !isCompleted,
|
|
376
|
+
}
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Классы для элемента step
|
|
382
|
+
*
|
|
383
|
+
* @description
|
|
384
|
+
* Вычисляет классы для элемента в навигации steps.
|
|
385
|
+
*
|
|
386
|
+
* @param {number} index - Индекс шага
|
|
387
|
+
* @returns {Array} Массив классов
|
|
388
|
+
*/
|
|
389
|
+
function stepItemClasses(index) {
|
|
390
|
+
return useClassComposition("relative flex items-start");
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Классы для круга step
|
|
395
|
+
*
|
|
396
|
+
* @description
|
|
397
|
+
* Вычисляет классы для круга в навигации steps.
|
|
398
|
+
*
|
|
399
|
+
* @param {number} index - Индекс шага
|
|
400
|
+
* @returns {Array} Массив классов
|
|
401
|
+
*/
|
|
402
|
+
function stepCircleClasses(index) {
|
|
403
|
+
const isActive = currentStep.value === index;
|
|
404
|
+
const isCompleted = completedSteps.value.includes(index);
|
|
405
|
+
|
|
406
|
+
return useClassComposition(
|
|
407
|
+
"w-10 h-10 flex-shrink-0 z-10",
|
|
408
|
+
{
|
|
409
|
+
"bg-blue-600 text-white": isActive,
|
|
410
|
+
"bg-green-600 text-white": isCompleted && !isActive,
|
|
411
|
+
"bg-slate-200 text-slate-600": !isActive && !isCompleted,
|
|
412
|
+
}
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Классы для соединителя step
|
|
418
|
+
*
|
|
419
|
+
* @description
|
|
420
|
+
* Вычисляет классы для соединительной линии между шагами.
|
|
421
|
+
*
|
|
422
|
+
* @param {number} index - Индекс шага
|
|
423
|
+
* @returns {Array} Массив классов
|
|
424
|
+
*/
|
|
425
|
+
function stepConnectorClasses(index) {
|
|
426
|
+
const isCompleted = completedSteps.value.includes(index + 1);
|
|
427
|
+
|
|
428
|
+
return useClassComposition(
|
|
429
|
+
{
|
|
430
|
+
"bg-green-600": isCompleted,
|
|
431
|
+
"bg-slate-200": !isCompleted,
|
|
432
|
+
}
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Можно ли перейти на следующий шаг
|
|
438
|
+
*
|
|
439
|
+
* @description
|
|
440
|
+
* Проверяет, можно ли перейти на следующий шаг.
|
|
441
|
+
*
|
|
442
|
+
* @returns {boolean} true если можно перейти дальше
|
|
443
|
+
*/
|
|
444
|
+
const canGoNext = computed(() => {
|
|
445
|
+
if (currentStep.value >= props.steps.length - 1) return false;
|
|
446
|
+
|
|
447
|
+
// Валидация текущего шага
|
|
448
|
+
if (props.validation) {
|
|
449
|
+
return props.validation(currentStep.value, props.formData);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
return true;
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Можно ли перейти на предыдущий шаг
|
|
457
|
+
*
|
|
458
|
+
* @description
|
|
459
|
+
* Проверяет, можно ли перейти на предыдущий шаг.
|
|
460
|
+
*
|
|
461
|
+
* @returns {boolean} true если можно вернуться назад
|
|
462
|
+
*/
|
|
463
|
+
const canGoPrev = computed(() => {
|
|
464
|
+
return currentStep.value > 0;
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Можно ли перейти на указанный шаг
|
|
469
|
+
*
|
|
470
|
+
* @description
|
|
471
|
+
* Проверяет, можно ли перейти на указанный шаг.
|
|
472
|
+
* Если allowSkip=false, можно переходить только на следующие шаги.
|
|
473
|
+
*
|
|
474
|
+
* @param {number} stepIndex - Индекс шага
|
|
475
|
+
* @returns {boolean} true если можно перейти
|
|
476
|
+
*/
|
|
477
|
+
function canNavigateToStep(stepIndex) {
|
|
478
|
+
if (props.allowSkip) return true;
|
|
479
|
+
|
|
480
|
+
// Можно перейти только на следующие шаги или уже пройденные
|
|
481
|
+
return stepIndex <= currentStep.value || completedSteps.value.includes(stepIndex);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Переход на следующий шаг
|
|
486
|
+
*
|
|
487
|
+
* @description
|
|
488
|
+
* Переходит на следующий шаг с валидацией.
|
|
489
|
+
*/
|
|
490
|
+
function goNext() {
|
|
491
|
+
if (!canGoNext.value) return;
|
|
492
|
+
|
|
493
|
+
// Отмечаем текущий шаг как завершенный
|
|
494
|
+
if (!completedSteps.value.includes(currentStep.value)) {
|
|
495
|
+
completedSteps.value.push(currentStep.value);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
const nextStep = currentStep.value + 1;
|
|
499
|
+
currentStep.value = nextStep;
|
|
500
|
+
emit("next", nextStep);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Переход на предыдущий шаг
|
|
505
|
+
*
|
|
506
|
+
* @description
|
|
507
|
+
* Переходит на предыдущий шаг.
|
|
508
|
+
*/
|
|
509
|
+
function goPrev() {
|
|
510
|
+
if (!canGoPrev.value) return;
|
|
511
|
+
|
|
512
|
+
const prevStep = currentStep.value - 1;
|
|
513
|
+
currentStep.value = prevStep;
|
|
514
|
+
emit("prev", prevStep);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/**
|
|
518
|
+
* Переход на указанный шаг
|
|
519
|
+
*
|
|
520
|
+
* @description
|
|
521
|
+
* Переходит на указанный шаг (если разрешено).
|
|
522
|
+
*
|
|
523
|
+
* @param {number} stepIndex - Индекс шага
|
|
524
|
+
*/
|
|
525
|
+
function goToStep(stepIndex) {
|
|
526
|
+
if (!canNavigateToStep(stepIndex)) return;
|
|
527
|
+
currentStep.value = stepIndex;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* Проверка завершения шага
|
|
532
|
+
*
|
|
533
|
+
* @description
|
|
534
|
+
* Проверяет, завершен ли указанный шаг.
|
|
535
|
+
*
|
|
536
|
+
* @param {number} index - Индекс шага
|
|
537
|
+
* @returns {boolean} true если шаг завершен
|
|
538
|
+
*/
|
|
539
|
+
function isStepCompleted(index) {
|
|
540
|
+
return completedSteps.value.includes(index);
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Обработчик отправки формы
|
|
545
|
+
*
|
|
546
|
+
* @description
|
|
547
|
+
* Вызывается при нажатии кнопки "Завершить" на последнем шаге.
|
|
548
|
+
*/
|
|
549
|
+
function handleSubmit() {
|
|
550
|
+
// Отмечаем последний шаг как завершенный
|
|
551
|
+
if (!completedSteps.value.includes(currentStep.value)) {
|
|
552
|
+
completedSteps.value.push(currentStep.value);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
emit("submit", props.formData);
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
// Синхронизация с prop currentStep
|
|
559
|
+
watch(
|
|
560
|
+
() => props.currentStep,
|
|
561
|
+
(newStep) => {
|
|
562
|
+
internalStep.value = newStep;
|
|
563
|
+
}
|
|
564
|
+
);
|
|
565
|
+
</script>
|
|
566
|
+
|
|
567
|
+
<style scoped>
|
|
568
|
+
.wizard-fade-enter-active,
|
|
569
|
+
.wizard-fade-leave-active {
|
|
570
|
+
transition: opacity 0.3s ease;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
.wizard-fade-enter-from,
|
|
574
|
+
.wizard-fade-leave-to {
|
|
575
|
+
opacity: 0;
|
|
576
|
+
}
|
|
577
|
+
</style>
|
|
578
|
+
|