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,229 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<component
|
|
3
|
+
:is="componentTag"
|
|
4
|
+
:href="componentTag === 'a' ? href : undefined"
|
|
5
|
+
:to="componentTag === 'router-link' ? to : undefined"
|
|
6
|
+
:target="target"
|
|
7
|
+
:rel="computedRel"
|
|
8
|
+
:aria-label="computedAriaLabel"
|
|
9
|
+
:class="allClasses"
|
|
10
|
+
:disabled="disabled"
|
|
11
|
+
data-component="DXLink"
|
|
12
|
+
:data-variant="variant"
|
|
13
|
+
:data-size="size"
|
|
14
|
+
:data-disabled="disabled"
|
|
15
|
+
:data-external="isExternal"
|
|
16
|
+
@click="handleClick"
|
|
17
|
+
>
|
|
18
|
+
<slot />
|
|
19
|
+
<DXIcon
|
|
20
|
+
v-if="showExternalIcon && isExternal && !disabled"
|
|
21
|
+
:icon="ArrowTopRightOnSquareIcon"
|
|
22
|
+
:size="iconSize"
|
|
23
|
+
class="ml-0.5"
|
|
24
|
+
aria-hidden="true"
|
|
25
|
+
/>
|
|
26
|
+
</component>
|
|
27
|
+
</template>
|
|
28
|
+
|
|
29
|
+
<script setup>
|
|
30
|
+
import { computed } from "vue";
|
|
31
|
+
import { useSize } from "@/composables/useSize";
|
|
32
|
+
import { useVariantButton } from "@/composables/useVariant";
|
|
33
|
+
import { useClassComposition } from "@/composables/useClassComposition";
|
|
34
|
+
import DXIcon from "../DXIcon/DXIcon.vue";
|
|
35
|
+
import { ArrowTopRightOnSquareIcon } from "@heroicons/vue/24/outline";
|
|
36
|
+
|
|
37
|
+
const props = defineProps({
|
|
38
|
+
/** URL для обычной ссылки */
|
|
39
|
+
href: { type: String, default: null },
|
|
40
|
+
/** Путь для Vue Router */
|
|
41
|
+
to: { type: [String, Object], default: null },
|
|
42
|
+
/** Target атрибут (например, "_blank") */
|
|
43
|
+
target: { type: String, default: null },
|
|
44
|
+
/** Rel атрибут (например, "noopener noreferrer") */
|
|
45
|
+
rel: { type: String, default: null },
|
|
46
|
+
/** Вариант стилизации: primary | secondary | ghost | link */
|
|
47
|
+
variant: { type: String, default: "link" },
|
|
48
|
+
/** Размер: xs | sm | md | lg | xl */
|
|
49
|
+
size: { type: String, default: "md" },
|
|
50
|
+
/** Отключенное состояние */
|
|
51
|
+
disabled: { type: Boolean, default: false },
|
|
52
|
+
/** Кастомный aria-label */
|
|
53
|
+
ariaLabel: { type: String, default: null },
|
|
54
|
+
/** Показывать иконку для внешних ссылок */
|
|
55
|
+
showExternalIcon: { type: Boolean, default: true },
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const BASE_CLASSES =
|
|
59
|
+
"inline-flex items-center gap-1.5 transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2";
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Определяет тег компонента на основе props
|
|
63
|
+
*
|
|
64
|
+
* @description
|
|
65
|
+
* Динамически выбирает тег компонента:
|
|
66
|
+
* - Если указан `to` prop → использует `router-link` (Vue Router)
|
|
67
|
+
* - Если указан `href` prop → использует обычный `<a>` тег
|
|
68
|
+
* - Если ничего не указано → использует `<span>` (fallback для disabled состояния)
|
|
69
|
+
*
|
|
70
|
+
* @returns {string} Название компонента для динамического рендеринга
|
|
71
|
+
*/
|
|
72
|
+
const componentTag = computed(() => {
|
|
73
|
+
if (props.to) return "router-link";
|
|
74
|
+
if (props.href) return "a";
|
|
75
|
+
return "span"; // Fallback если нет href и to
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Определяет, является ли ссылка внешней
|
|
80
|
+
*
|
|
81
|
+
* @description
|
|
82
|
+
* Автоматически определяет внешние ссылки по префиксам:
|
|
83
|
+
* - `http://` - внешняя ссылка
|
|
84
|
+
* - `https://` - внешняя ссылка
|
|
85
|
+
* - `//` - protocol-relative внешняя ссылка
|
|
86
|
+
*
|
|
87
|
+
* Используется для:
|
|
88
|
+
* - Автоматического добавления rel="noopener noreferrer" для безопасности
|
|
89
|
+
* - Показа иконки внешней ссылки
|
|
90
|
+
*
|
|
91
|
+
* @returns {boolean} true если ссылка внешняя, false если внутренняя или нет href
|
|
92
|
+
*/
|
|
93
|
+
const isExternal = computed(() => {
|
|
94
|
+
if (!props.href) return false;
|
|
95
|
+
return (
|
|
96
|
+
props.href.startsWith("http://") ||
|
|
97
|
+
props.href.startsWith("https://") ||
|
|
98
|
+
props.href.startsWith("//")
|
|
99
|
+
);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Вычисляет rel атрибут с учетом безопасности
|
|
104
|
+
*
|
|
105
|
+
* @description
|
|
106
|
+
* Автоматически добавляет rel="noopener noreferrer" для внешних ссылок с target="_blank"
|
|
107
|
+
* для защиты от tabnabbing атак (когда новая вкладка может получить доступ к window.opener).
|
|
108
|
+
*
|
|
109
|
+
* Приоритет:
|
|
110
|
+
* 1. Если rel указан явно через prop → использует его
|
|
111
|
+
* 2. Если внешняя ссылка с target="_blank" → автоматически добавляет "noopener noreferrer"
|
|
112
|
+
* 3. Иначе → возвращает null
|
|
113
|
+
*
|
|
114
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/Security/Referer_header|MDN: Referer header}
|
|
115
|
+
* @returns {string|null} Значение rel атрибута или null
|
|
116
|
+
*/
|
|
117
|
+
const computedRel = computed(() => {
|
|
118
|
+
// Если rel указан явно, используем его
|
|
119
|
+
if (props.rel) return props.rel;
|
|
120
|
+
|
|
121
|
+
// Если внешняя ссылка с target="_blank", добавляем noopener noreferrer для безопасности
|
|
122
|
+
// Это защищает от tabnabbing атак
|
|
123
|
+
if (isExternal.value && props.target === "_blank") {
|
|
124
|
+
return "noopener noreferrer";
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return null;
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Вычисляет aria-label с учетом внешних ссылок
|
|
132
|
+
*
|
|
133
|
+
* @description
|
|
134
|
+
* Управляет aria-label для улучшения доступности:
|
|
135
|
+
* - Если ariaLabel указан явно → использует его
|
|
136
|
+
* - Для внешних ссылок можно было бы добавить информацию о том, что ссылка внешняя,
|
|
137
|
+
* но для простоты возвращаем null, так как screen readers могут использовать
|
|
138
|
+
* содержимое ссылки и визуальную иконку
|
|
139
|
+
*
|
|
140
|
+
* @returns {string|null} Значение aria-label или null
|
|
141
|
+
*/
|
|
142
|
+
const computedAriaLabel = computed(() => {
|
|
143
|
+
// Если aria-label указан явно, используем его
|
|
144
|
+
if (props.ariaLabel) return props.ariaLabel;
|
|
145
|
+
|
|
146
|
+
// Для внешних ссылок добавляем информацию о том, что ссылка внешняя
|
|
147
|
+
if (isExternal.value && props.showExternalIcon) {
|
|
148
|
+
// Получаем текст из слота для базового aria-label
|
|
149
|
+
// В реальности это будет работать через provide/inject или другой механизм
|
|
150
|
+
// Для простоты возвращаем null, так как screen readers могут использовать содержимое
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return null;
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Классы размера текста
|
|
159
|
+
*/
|
|
160
|
+
const textSizeClass = computed(() => {
|
|
161
|
+
return useSize(props.size, "text");
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Классы варианта стилизации
|
|
166
|
+
*/
|
|
167
|
+
const variantClass = computed(() => {
|
|
168
|
+
if (props.variant === "link") {
|
|
169
|
+
// Кастомные классы для варианта link
|
|
170
|
+
return "text-blue-600 hover:text-blue-700 underline-offset-2 hover:underline";
|
|
171
|
+
}
|
|
172
|
+
// Для остальных вариантов используем useVariantButton
|
|
173
|
+
return useVariantButton(props.variant);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Размер иконки внешней ссылки
|
|
178
|
+
*
|
|
179
|
+
* @description
|
|
180
|
+
* Вычисляет размер иконки внешней ссылки на основе размера текста.
|
|
181
|
+
* Иконка всегда немного меньше текста для визуального баланса.
|
|
182
|
+
*
|
|
183
|
+
* @returns {string} Размер иконки: xs | sm | md
|
|
184
|
+
*/
|
|
185
|
+
const iconSize = computed(() => {
|
|
186
|
+
// Иконка немного меньше текста для визуального баланса
|
|
187
|
+
const sizeMap = {
|
|
188
|
+
xs: "xs",
|
|
189
|
+
sm: "xs",
|
|
190
|
+
md: "sm",
|
|
191
|
+
lg: "sm",
|
|
192
|
+
xl: "md",
|
|
193
|
+
};
|
|
194
|
+
return sizeMap[props.size] || "sm";
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Все классы для ссылки
|
|
199
|
+
*/
|
|
200
|
+
const allClasses = computed(() =>
|
|
201
|
+
useClassComposition(
|
|
202
|
+
BASE_CLASSES,
|
|
203
|
+
variantClass.value,
|
|
204
|
+
textSizeClass.value,
|
|
205
|
+
{
|
|
206
|
+
"opacity-60 cursor-not-allowed pointer-events-none": props.disabled,
|
|
207
|
+
"cursor-pointer": !props.disabled,
|
|
208
|
+
}
|
|
209
|
+
)
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Обработчик клика для disabled состояния
|
|
214
|
+
*
|
|
215
|
+
* @description
|
|
216
|
+
* Блокирует клик для отключенных ссылок:
|
|
217
|
+
* - preventDefault() - предотвращает переход по ссылке
|
|
218
|
+
* - stopPropagation() - останавливает всплытие события
|
|
219
|
+
*
|
|
220
|
+
* @param {Event} event - Событие клика
|
|
221
|
+
*/
|
|
222
|
+
const handleClick = (event) => {
|
|
223
|
+
if (props.disabled) {
|
|
224
|
+
event.preventDefault();
|
|
225
|
+
event.stopPropagation();
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
</script>
|
|
229
|
+
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import DXLoader from './DXLoader.vue';
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
title: 'Atoms/DXLoader',
|
|
5
|
+
component: DXLoader,
|
|
6
|
+
tags: ['autodocs'],
|
|
7
|
+
argTypes: {
|
|
8
|
+
size: {
|
|
9
|
+
control: 'select',
|
|
10
|
+
options: ['xs', 'sm', 'md', 'lg', 'xl'],
|
|
11
|
+
description: 'Размер лоадера',
|
|
12
|
+
},
|
|
13
|
+
variant: {
|
|
14
|
+
control: 'select',
|
|
15
|
+
options: ['default', 'primary', 'success', 'warning', 'danger', 'info', 'slate'],
|
|
16
|
+
description: 'Вариант цвета',
|
|
17
|
+
},
|
|
18
|
+
text: {
|
|
19
|
+
control: 'text',
|
|
20
|
+
description: 'Текст лоадера. Если не указан и нет слота, текст не отображается',
|
|
21
|
+
},
|
|
22
|
+
showText: {
|
|
23
|
+
control: 'boolean',
|
|
24
|
+
description: 'Показывать текст. Если false, текст не отображается. Если true - всегда показывать',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const Default = {
|
|
30
|
+
args: {
|
|
31
|
+
size: 'md',
|
|
32
|
+
variant: 'default',
|
|
33
|
+
},
|
|
34
|
+
render: (args) => ({
|
|
35
|
+
components: { DXLoader },
|
|
36
|
+
setup() { return { args }; },
|
|
37
|
+
template: '<DXLoader v-bind="args" />',
|
|
38
|
+
}),
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const Sizes = {
|
|
42
|
+
render: () => ({
|
|
43
|
+
components: { DXLoader },
|
|
44
|
+
template: `
|
|
45
|
+
<div class="flex flex-col items-start gap-6">
|
|
46
|
+
<div class="flex items-center gap-6">
|
|
47
|
+
<DXLoader size="xs" />
|
|
48
|
+
<span class="text-sm text-slate-600">xs (8×8px)</span>
|
|
49
|
+
</div>
|
|
50
|
+
<div class="flex items-center gap-6">
|
|
51
|
+
<DXLoader size="sm" />
|
|
52
|
+
<span class="text-sm text-slate-600">sm (12×12px)</span>
|
|
53
|
+
</div>
|
|
54
|
+
<div class="flex items-center gap-6">
|
|
55
|
+
<DXLoader size="md" />
|
|
56
|
+
<span class="text-sm text-slate-600">md (16×16px)</span>
|
|
57
|
+
</div>
|
|
58
|
+
<div class="flex items-center gap-6">
|
|
59
|
+
<DXLoader size="lg" />
|
|
60
|
+
<span class="text-sm text-slate-600">lg (20×20px)</span>
|
|
61
|
+
</div>
|
|
62
|
+
<div class="flex items-center gap-6">
|
|
63
|
+
<DXLoader size="xl" />
|
|
64
|
+
<span class="text-sm text-slate-600">xl (24×24px)</span>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="text-sm text-slate-500 mt-2">
|
|
67
|
+
Все размеры: xs | sm | md | lg | xl
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
`,
|
|
71
|
+
}),
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const Variants = {
|
|
75
|
+
render: () => ({
|
|
76
|
+
components: { DXLoader },
|
|
77
|
+
template: `
|
|
78
|
+
<div class="flex flex-col items-start gap-6">
|
|
79
|
+
<div class="flex flex-col gap-4">
|
|
80
|
+
<h3 class="text-sm font-semibold text-slate-700">Основные варианты</h3>
|
|
81
|
+
<div class="flex items-center gap-4 flex-wrap">
|
|
82
|
+
<div class="flex flex-col items-center gap-2">
|
|
83
|
+
<DXLoader variant="default" />
|
|
84
|
+
<span class="text-xs text-slate-600">Default</span>
|
|
85
|
+
</div>
|
|
86
|
+
<div class="flex flex-col items-center gap-2">
|
|
87
|
+
<DXLoader variant="primary" />
|
|
88
|
+
<span class="text-xs text-slate-600">Primary</span>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="flex flex-col items-center gap-2">
|
|
91
|
+
<DXLoader variant="slate" />
|
|
92
|
+
<span class="text-xs text-slate-600">Slate</span>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
<div class="flex flex-col gap-4">
|
|
97
|
+
<h3 class="text-sm font-semibold text-slate-700">Семантические варианты</h3>
|
|
98
|
+
<div class="flex items-center gap-4 flex-wrap">
|
|
99
|
+
<div class="flex flex-col items-center gap-2">
|
|
100
|
+
<DXLoader variant="success" />
|
|
101
|
+
<span class="text-xs text-slate-600">Success</span>
|
|
102
|
+
</div>
|
|
103
|
+
<div class="flex flex-col items-center gap-2">
|
|
104
|
+
<DXLoader variant="warning" />
|
|
105
|
+
<span class="text-xs text-slate-600">Warning</span>
|
|
106
|
+
</div>
|
|
107
|
+
<div class="flex flex-col items-center gap-2">
|
|
108
|
+
<DXLoader variant="danger" />
|
|
109
|
+
<span class="text-xs text-slate-600">Danger</span>
|
|
110
|
+
</div>
|
|
111
|
+
<div class="flex flex-col items-center gap-2">
|
|
112
|
+
<DXLoader variant="info" />
|
|
113
|
+
<span class="text-xs text-slate-600">Info</span>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
<div class="text-sm text-slate-500">
|
|
118
|
+
Все варианты: default | primary | success | warning | danger | info | slate
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
`,
|
|
122
|
+
}),
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export const SizesAndVariants = {
|
|
126
|
+
render: () => ({
|
|
127
|
+
components: { DXLoader },
|
|
128
|
+
template: `
|
|
129
|
+
<div class="flex flex-col gap-8">
|
|
130
|
+
<div>
|
|
131
|
+
<h3 class="text-sm font-semibold text-slate-700 mb-4">Размеры с вариантом default</h3>
|
|
132
|
+
<div class="flex items-center gap-6">
|
|
133
|
+
<DXLoader size="xs" variant="default" />
|
|
134
|
+
<DXLoader size="sm" variant="default" />
|
|
135
|
+
<DXLoader size="md" variant="default" />
|
|
136
|
+
<DXLoader size="lg" variant="default" />
|
|
137
|
+
<DXLoader size="xl" variant="default" />
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
<div>
|
|
141
|
+
<h3 class="text-sm font-semibold text-slate-700 mb-4">Размеры с вариантом success</h3>
|
|
142
|
+
<div class="flex items-center gap-6">
|
|
143
|
+
<DXLoader size="xs" variant="success" />
|
|
144
|
+
<DXLoader size="sm" variant="success" />
|
|
145
|
+
<DXLoader size="md" variant="success" />
|
|
146
|
+
<DXLoader size="lg" variant="success" />
|
|
147
|
+
<DXLoader size="xl" variant="success" />
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
<div>
|
|
151
|
+
<h3 class="text-sm font-semibold text-slate-700 mb-4">Размеры с вариантом danger</h3>
|
|
152
|
+
<div class="flex items-center gap-6">
|
|
153
|
+
<DXLoader size="xs" variant="danger" />
|
|
154
|
+
<DXLoader size="sm" variant="danger" />
|
|
155
|
+
<DXLoader size="md" variant="danger" />
|
|
156
|
+
<DXLoader size="lg" variant="danger" />
|
|
157
|
+
<DXLoader size="xl" variant="danger" />
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
`,
|
|
162
|
+
}),
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
export const WithText = {
|
|
166
|
+
render: () => ({
|
|
167
|
+
components: { DXLoader },
|
|
168
|
+
template: `
|
|
169
|
+
<div class="flex flex-col gap-6">
|
|
170
|
+
<div class="flex flex-col gap-4">
|
|
171
|
+
<h3 class="text-sm font-semibold text-slate-700">С текстом по умолчанию</h3>
|
|
172
|
+
<div class="flex items-center gap-2">
|
|
173
|
+
<DXLoader size="sm" variant="default" />
|
|
174
|
+
</div>
|
|
175
|
+
<div class="flex items-center gap-2">
|
|
176
|
+
<DXLoader size="md" variant="success" />
|
|
177
|
+
</div>
|
|
178
|
+
<div class="flex items-center gap-2">
|
|
179
|
+
<DXLoader size="lg" variant="info" />
|
|
180
|
+
</div>
|
|
181
|
+
</div>
|
|
182
|
+
<div class="flex flex-col gap-4">
|
|
183
|
+
<h3 class="text-sm font-semibold text-slate-700">С кастомным текстом</h3>
|
|
184
|
+
<div class="flex items-center gap-2">
|
|
185
|
+
<DXLoader size="sm" variant="default">Загрузка...</DXLoader>
|
|
186
|
+
</div>
|
|
187
|
+
<div class="flex items-center gap-2">
|
|
188
|
+
<DXLoader size="md" variant="success">Обработка...</DXLoader>
|
|
189
|
+
</div>
|
|
190
|
+
<div class="flex items-center gap-2">
|
|
191
|
+
<DXLoader size="lg" variant="warning">Пожалуйста, подождите...</DXLoader>
|
|
192
|
+
</div>
|
|
193
|
+
<div class="flex items-center gap-2">
|
|
194
|
+
<DXLoader size="md" variant="danger">Ошибка загрузки...</DXLoader>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
`,
|
|
199
|
+
}),
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
export const WithoutText = {
|
|
203
|
+
render: () => ({
|
|
204
|
+
components: { DXLoader },
|
|
205
|
+
template: `
|
|
206
|
+
<div class="flex flex-col gap-6">
|
|
207
|
+
<div class="flex flex-col gap-4">
|
|
208
|
+
<h3 class="text-sm font-semibold text-slate-700">Без текста (только спиннер)</h3>
|
|
209
|
+
<div class="flex items-center gap-6">
|
|
210
|
+
<DXLoader size="xs" :show-text="false" />
|
|
211
|
+
<DXLoader size="sm" :show-text="false" />
|
|
212
|
+
<DXLoader size="md" :show-text="false" />
|
|
213
|
+
<DXLoader size="lg" :show-text="false" />
|
|
214
|
+
<DXLoader size="xl" :show-text="false" />
|
|
215
|
+
</div>
|
|
216
|
+
</div>
|
|
217
|
+
<div class="flex flex-col gap-4">
|
|
218
|
+
<h3 class="text-sm font-semibold text-slate-700">Разные варианты без текста</h3>
|
|
219
|
+
<div class="flex items-center gap-6">
|
|
220
|
+
<DXLoader size="md" variant="default" :show-text="false" />
|
|
221
|
+
<DXLoader size="md" variant="primary" :show-text="false" />
|
|
222
|
+
<DXLoader size="md" variant="success" :show-text="false" />
|
|
223
|
+
<DXLoader size="md" variant="warning" :show-text="false" />
|
|
224
|
+
<DXLoader size="md" variant="danger" :show-text="false" />
|
|
225
|
+
<DXLoader size="md" variant="info" :show-text="false" />
|
|
226
|
+
</div>
|
|
227
|
+
</div>
|
|
228
|
+
<div class="flex flex-col gap-4">
|
|
229
|
+
<h3 class="text-sm font-semibold text-slate-700">Использование без текста</h3>
|
|
230
|
+
<div class="border border-slate-200 rounded-lg p-6">
|
|
231
|
+
<div class="flex flex-col items-center justify-center gap-4 py-8">
|
|
232
|
+
<DXLoader size="lg" variant="primary" :show-text="false" />
|
|
233
|
+
<p class="text-sm text-slate-600">Загрузка данных...</p>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
<div class="text-sm text-slate-500">
|
|
238
|
+
Используйте <code class="text-xs bg-slate-100 px-1 py-0.5 rounded">:show-text="false"</code> или не передавайте prop <code class="text-xs bg-slate-100 px-1 py-0.5 rounded">text</code> и слот для отображения только спиннера
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
`,
|
|
242
|
+
}),
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
export const UseCases = {
|
|
246
|
+
render: () => ({
|
|
247
|
+
components: { DXLoader },
|
|
248
|
+
template: `
|
|
249
|
+
<div class="flex flex-col gap-8">
|
|
250
|
+
<div>
|
|
251
|
+
<h3 class="text-sm font-semibold text-slate-700 mb-4">В карточке</h3>
|
|
252
|
+
<div class="border border-slate-200 rounded-lg p-6">
|
|
253
|
+
<div class="flex flex-col items-center justify-center gap-4 py-8">
|
|
254
|
+
<DXLoader size="lg" variant="primary" />
|
|
255
|
+
<p class="text-sm text-slate-600">Загрузка данных...</p>
|
|
256
|
+
</div>
|
|
257
|
+
</div>
|
|
258
|
+
</div>
|
|
259
|
+
<div>
|
|
260
|
+
<h3 class="text-sm font-semibold text-slate-700 mb-4">В списке</h3>
|
|
261
|
+
<div class="border border-slate-200 rounded-lg p-4">
|
|
262
|
+
<div class="flex items-center gap-3">
|
|
263
|
+
<DXLoader size="sm" variant="info" />
|
|
264
|
+
<span class="text-sm text-slate-700">Синхронизация с сервером</span>
|
|
265
|
+
</div>
|
|
266
|
+
</div>
|
|
267
|
+
</div>
|
|
268
|
+
<div>
|
|
269
|
+
<h3 class="text-sm font-semibold text-slate-700 mb-4">Инлайн загрузка</h3>
|
|
270
|
+
<div class="flex items-center gap-2">
|
|
271
|
+
<span class="text-sm text-slate-700">Статус:</span>
|
|
272
|
+
<DXLoader size="xs" variant="success" :show-text="false" />
|
|
273
|
+
<span class="text-sm text-emerald-700">Активен</span>
|
|
274
|
+
</div>
|
|
275
|
+
</div>
|
|
276
|
+
</div>
|
|
277
|
+
`,
|
|
278
|
+
}),
|
|
279
|
+
};
|
|
280
|
+
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div
|
|
3
|
+
:class="loaderClasses"
|
|
4
|
+
data-component="DXLoader"
|
|
5
|
+
:data-size="size"
|
|
6
|
+
:data-variant="variant"
|
|
7
|
+
>
|
|
8
|
+
<span :class="spinnerClasses"></span>
|
|
9
|
+
<slot v-if="hasText">
|
|
10
|
+
<template v-if="text">{{ text }}</template>
|
|
11
|
+
</slot>
|
|
12
|
+
</div>
|
|
13
|
+
</template>
|
|
14
|
+
|
|
15
|
+
<script setup>
|
|
16
|
+
import { computed, useSlots } from "vue";
|
|
17
|
+
import { useSize } from "@/composables/useSize";
|
|
18
|
+
import { useVariantLoader } from "@/composables/useVariant";
|
|
19
|
+
|
|
20
|
+
const props = defineProps({
|
|
21
|
+
/** Размер: xs | sm | md | lg | xl */
|
|
22
|
+
size: {
|
|
23
|
+
type: String,
|
|
24
|
+
default: "md",
|
|
25
|
+
validator: (value) => ['xs', 'sm', 'md', 'lg', 'xl'].includes(value)
|
|
26
|
+
},
|
|
27
|
+
/** Вариант цвета: default | primary | success | warning | danger | info | slate */
|
|
28
|
+
variant: {
|
|
29
|
+
type: String,
|
|
30
|
+
default: "default",
|
|
31
|
+
validator: (value) => ['default', 'primary', 'success', 'warning', 'danger', 'info', 'slate'].includes(value)
|
|
32
|
+
},
|
|
33
|
+
/** Текст лоадера. Если не указан и нет слота, текст не отображается */
|
|
34
|
+
text: {
|
|
35
|
+
type: String,
|
|
36
|
+
default: "",
|
|
37
|
+
},
|
|
38
|
+
/** Показывать текст. Если false, текст не отображается. Если true - всегда показывать */
|
|
39
|
+
showText: {
|
|
40
|
+
type: Boolean,
|
|
41
|
+
default: undefined,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const slots = useSlots();
|
|
46
|
+
const hasText = computed(() => {
|
|
47
|
+
// Если showText явно указан, используем его
|
|
48
|
+
if (props.showText !== undefined) {
|
|
49
|
+
return props.showText;
|
|
50
|
+
}
|
|
51
|
+
// Если есть слот, показываем его
|
|
52
|
+
if (slots.default) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
// Если есть текст в prop, показываем его
|
|
56
|
+
return !!(props.text && props.text.trim().length > 0);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const loaderConfig = computed(() => useVariantLoader(props.variant));
|
|
60
|
+
|
|
61
|
+
const BASE_CLASSES = "flex items-center justify-center";
|
|
62
|
+
const BASE_SPINNER_CLASSES = "border-2 rounded-full animate-spin";
|
|
63
|
+
|
|
64
|
+
const loaderClasses = computed(() => [
|
|
65
|
+
BASE_CLASSES,
|
|
66
|
+
hasText.value ? 'gap-2' : '',
|
|
67
|
+
hasText.value ? useSize(props.size, 'text') : '',
|
|
68
|
+
hasText.value ? loaderConfig.value.text : ''
|
|
69
|
+
].filter(Boolean));
|
|
70
|
+
|
|
71
|
+
const spinnerClasses = computed(() => [
|
|
72
|
+
BASE_SPINNER_CLASSES,
|
|
73
|
+
useSize(props.size, 'loader'),
|
|
74
|
+
loaderConfig.value.border,
|
|
75
|
+
loaderConfig.value.borderTop
|
|
76
|
+
]);
|
|
77
|
+
</script>
|
|
78
|
+
|