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,475 @@
|
|
|
1
|
+
import DXLink from './DXLink.vue';
|
|
2
|
+
import DXIcon from '../DXIcon/DXIcon.vue';
|
|
3
|
+
import { HomeIcon } from '@heroicons/vue/24/outline';
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
title: 'Atoms/DXLink',
|
|
7
|
+
component: DXLink,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
parameters: {
|
|
10
|
+
docs: {
|
|
11
|
+
description: {
|
|
12
|
+
component: `
|
|
13
|
+
# DXLink
|
|
14
|
+
|
|
15
|
+
Компонент ссылки с поддержкой обычных ссылок и Vue Router.
|
|
16
|
+
|
|
17
|
+
## Назначение
|
|
18
|
+
|
|
19
|
+
DXLink - атомарный компонент для создания ссылок с различными вариантами стилизации.
|
|
20
|
+
Поддерживает как обычные HTML ссылки, так и навигацию через Vue Router.
|
|
21
|
+
|
|
22
|
+
## Архитектура
|
|
23
|
+
|
|
24
|
+
### Использует
|
|
25
|
+
- \`useSize\` composable - для размеров текста (xs, sm, md, lg, xl)
|
|
26
|
+
- \`useVariantButton\` composable - для вариантов стилизации (primary, secondary, ghost, link)
|
|
27
|
+
- \`useClassComposition\` composable - для объединения классов
|
|
28
|
+
- \`DXIcon\` - для иконки внешних ссылок (ArrowTopRightOnSquareIcon)
|
|
29
|
+
|
|
30
|
+
### Используется в
|
|
31
|
+
- \`DXBreadcrumb\` - ссылки в хлебных крошках
|
|
32
|
+
- \`DXHeaderBar\` - навигационные ссылки в шапке
|
|
33
|
+
- Навигационные меню
|
|
34
|
+
- Footer ссылки
|
|
35
|
+
|
|
36
|
+
## Внутренняя логика
|
|
37
|
+
|
|
38
|
+
### Автоматическое определение типа ссылки
|
|
39
|
+
- Если указан \`to\` prop → использует \`router-link\`
|
|
40
|
+
- Если указан \`href\` prop → использует обычный \`<a>\` тег
|
|
41
|
+
- Если ничего не указано → использует \`<span>\` (fallback)
|
|
42
|
+
|
|
43
|
+
### Автоматическое определение внешних ссылок
|
|
44
|
+
Компонент автоматически определяет внешние ссылки по префиксам:
|
|
45
|
+
- \`http://\`
|
|
46
|
+
- \`https://\`
|
|
47
|
+
- \`//\` (protocol-relative)
|
|
48
|
+
|
|
49
|
+
### Безопасность
|
|
50
|
+
Для внешних ссылок с \`target="_blank"\` автоматически добавляется:
|
|
51
|
+
- \`rel="noopener noreferrer"\` - для защиты от tabnabbing атак
|
|
52
|
+
- Иконка внешней ссылки (если \`showExternalIcon={true}\`)
|
|
53
|
+
|
|
54
|
+
### Disabled состояние
|
|
55
|
+
- Блокирует клик через \`preventDefault\` и \`stopPropagation\`
|
|
56
|
+
- Применяет визуальные стили (opacity, cursor)
|
|
57
|
+
- Отключает pointer-events
|
|
58
|
+
|
|
59
|
+
## Особенности
|
|
60
|
+
|
|
61
|
+
### Vue Router интеграция
|
|
62
|
+
При использовании \`to\` prop требуется установленный Vue Router:
|
|
63
|
+
\`\`\`vue
|
|
64
|
+
<DXLink :to="{ name: 'home' }">Главная</DXLink>
|
|
65
|
+
<DXLink :to="/dashboard">Дашборд</DXLink>
|
|
66
|
+
\`\`\`
|
|
67
|
+
|
|
68
|
+
### Обычные ссылки
|
|
69
|
+
Для внешних или обычных ссылок используйте \`href\`:
|
|
70
|
+
\`\`\`vue
|
|
71
|
+
<DXLink href="https://example.com" target="_blank">Внешний сайт</DXLink>
|
|
72
|
+
<DXLink href="/about">О нас</DXLink>
|
|
73
|
+
\`\`\`
|
|
74
|
+
|
|
75
|
+
## Ограничения
|
|
76
|
+
|
|
77
|
+
- Не используйте одновременно \`href\` и \`to\` - приоритет у \`to\`
|
|
78
|
+
- Для Vue Router требуется установленный \`vue-router\`
|
|
79
|
+
- Disabled ссылки не кликабельны, но остаются в DOM
|
|
80
|
+
`,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
argTypes: {
|
|
85
|
+
variant: {
|
|
86
|
+
control: 'select',
|
|
87
|
+
options: ['primary', 'secondary', 'ghost', 'link'],
|
|
88
|
+
description: 'Вариант стилизации ссылки. Определяет цвет и стиль.',
|
|
89
|
+
table: {
|
|
90
|
+
type: { summary: 'string' },
|
|
91
|
+
defaultValue: { summary: 'link' },
|
|
92
|
+
category: 'Appearance',
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
size: {
|
|
96
|
+
control: 'select',
|
|
97
|
+
options: ['xs', 'sm', 'md', 'lg', 'xl'],
|
|
98
|
+
description: 'Размер ссылки. Влияет на размер текста.',
|
|
99
|
+
table: {
|
|
100
|
+
type: { summary: 'string' },
|
|
101
|
+
defaultValue: { summary: 'md' },
|
|
102
|
+
category: 'Appearance',
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
disabled: {
|
|
106
|
+
control: 'boolean',
|
|
107
|
+
description: 'Отключенное состояние. Блокирует клик и применяет визуальные стили.',
|
|
108
|
+
table: {
|
|
109
|
+
type: { summary: 'boolean' },
|
|
110
|
+
defaultValue: { summary: 'false' },
|
|
111
|
+
category: 'Behavior',
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
href: {
|
|
115
|
+
control: 'text',
|
|
116
|
+
description: 'URL для обычной HTML ссылки. Используется для внешних или обычных ссылок.',
|
|
117
|
+
table: {
|
|
118
|
+
type: { summary: 'string' },
|
|
119
|
+
defaultValue: { summary: 'null' },
|
|
120
|
+
category: 'Navigation',
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
to: {
|
|
124
|
+
control: 'text',
|
|
125
|
+
description: 'Путь для Vue Router. Может быть строкой или объектом с параметрами маршрута.',
|
|
126
|
+
table: {
|
|
127
|
+
type: { summary: 'string | object' },
|
|
128
|
+
defaultValue: { summary: 'null' },
|
|
129
|
+
category: 'Navigation',
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
target: {
|
|
133
|
+
control: 'select',
|
|
134
|
+
options: ['_blank', '_self', '_parent', '_top'],
|
|
135
|
+
description: 'Target атрибут для ссылки. Для внешних ссылок с _blank автоматически добавляется rel="noopener noreferrer".',
|
|
136
|
+
table: {
|
|
137
|
+
type: { summary: 'string' },
|
|
138
|
+
defaultValue: { summary: 'null' },
|
|
139
|
+
category: 'Navigation',
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
rel: {
|
|
143
|
+
control: 'text',
|
|
144
|
+
description: 'Rel атрибут для ссылки. Если не указан, для внешних ссылок с target="_blank" автоматически добавляется "noopener noreferrer".',
|
|
145
|
+
table: {
|
|
146
|
+
type: { summary: 'string' },
|
|
147
|
+
defaultValue: { summary: 'null' },
|
|
148
|
+
category: 'Navigation',
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
ariaLabel: {
|
|
152
|
+
control: 'text',
|
|
153
|
+
description: 'Кастомный aria-label для улучшения доступности.',
|
|
154
|
+
table: {
|
|
155
|
+
type: { summary: 'string' },
|
|
156
|
+
defaultValue: { summary: 'null' },
|
|
157
|
+
category: 'Accessibility',
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
showExternalIcon: {
|
|
161
|
+
control: 'boolean',
|
|
162
|
+
description: 'Показывать иконку для внешних ссылок. Автоматически определяется по префиксу URL.',
|
|
163
|
+
table: {
|
|
164
|
+
type: { summary: 'boolean' },
|
|
165
|
+
defaultValue: { summary: 'true' },
|
|
166
|
+
category: 'Accessibility',
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
export const Default = {
|
|
173
|
+
args: {
|
|
174
|
+
href: '/about',
|
|
175
|
+
variant: 'link',
|
|
176
|
+
},
|
|
177
|
+
parameters: {
|
|
178
|
+
docs: {
|
|
179
|
+
description: {
|
|
180
|
+
story: 'Базовая ссылка с вариантом "link". Это стандартный вариант для обычных текстовых ссылок.',
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
render: (args) => ({
|
|
185
|
+
components: { DXLink },
|
|
186
|
+
setup() { return { args }; },
|
|
187
|
+
template: '<DXLink v-bind="args">О нас</DXLink>',
|
|
188
|
+
}),
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
export const Variants = {
|
|
192
|
+
parameters: {
|
|
193
|
+
docs: {
|
|
194
|
+
description: {
|
|
195
|
+
story: 'Все доступные варианты стилизации ссылок. Вариант "link" - стандартный для текстовых ссылок, остальные варианты делают ссылку похожей на кнопку.',
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
render: () => ({
|
|
200
|
+
components: { DXLink },
|
|
201
|
+
template: `
|
|
202
|
+
<div class="flex flex-col items-start gap-6">
|
|
203
|
+
<div class="flex flex-col gap-4">
|
|
204
|
+
<h3 class="text-sm font-semibold text-slate-700">Варианты стилизации</h3>
|
|
205
|
+
<div class="flex items-center gap-4 flex-wrap">
|
|
206
|
+
<DXLink href="/link" variant="link">Link</DXLink>
|
|
207
|
+
<DXLink href="/primary" variant="primary">Primary</DXLink>
|
|
208
|
+
<DXLink href="/secondary" variant="secondary">Secondary</DXLink>
|
|
209
|
+
<DXLink href="/ghost" variant="ghost">Ghost</DXLink>
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
<div class="text-sm text-slate-600">
|
|
213
|
+
Все варианты: link | primary | secondary | ghost
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
`,
|
|
217
|
+
}),
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
export const Sizes = {
|
|
221
|
+
parameters: {
|
|
222
|
+
docs: {
|
|
223
|
+
description: {
|
|
224
|
+
story: 'Все доступные размеры ссылок. Размер влияет на размер текста и соответствующих элементов.',
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
render: () => ({
|
|
229
|
+
components: { DXLink },
|
|
230
|
+
template: `
|
|
231
|
+
<div class="flex flex-col items-start gap-4">
|
|
232
|
+
<div class="flex items-center gap-4 flex-wrap">
|
|
233
|
+
<DXLink href="/xs" size="xs">Extra Small</DXLink>
|
|
234
|
+
<DXLink href="/sm" size="sm">Small</DXLink>
|
|
235
|
+
<DXLink href="/md" size="md">Medium</DXLink>
|
|
236
|
+
<DXLink href="/lg" size="lg">Large</DXLink>
|
|
237
|
+
<DXLink href="/xl" size="xl">Extra Large</DXLink>
|
|
238
|
+
</div>
|
|
239
|
+
<div class="text-sm text-slate-600">
|
|
240
|
+
Все размеры: xs | sm | md | lg | xl
|
|
241
|
+
</div>
|
|
242
|
+
</div>
|
|
243
|
+
`,
|
|
244
|
+
}),
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
export const ExternalLinks = {
|
|
248
|
+
parameters: {
|
|
249
|
+
docs: {
|
|
250
|
+
description: {
|
|
251
|
+
story: 'Внешние ссылки автоматически определяются по префиксам http://, https:// или //. Для ссылок с target="_blank" автоматически добавляется rel="noopener noreferrer" для защиты от tabnabbing атак, а также иконка внешней ссылки.',
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
render: () => ({
|
|
256
|
+
components: { DXLink },
|
|
257
|
+
template: `
|
|
258
|
+
<div class="flex flex-col items-start gap-4">
|
|
259
|
+
<div class="flex flex-col gap-4">
|
|
260
|
+
<h3 class="text-sm font-semibold text-slate-700">Внешние ссылки</h3>
|
|
261
|
+
<div class="flex flex-col gap-2">
|
|
262
|
+
<DXLink
|
|
263
|
+
href="https://example.com"
|
|
264
|
+
target="_blank"
|
|
265
|
+
variant="link"
|
|
266
|
+
>
|
|
267
|
+
Внешний сайт
|
|
268
|
+
</DXLink>
|
|
269
|
+
<DXLink
|
|
270
|
+
href="https://vuejs.org"
|
|
271
|
+
target="_blank"
|
|
272
|
+
variant="primary"
|
|
273
|
+
>
|
|
274
|
+
Vue.js документация
|
|
275
|
+
</DXLink>
|
|
276
|
+
<DXLink
|
|
277
|
+
href="https://github.com"
|
|
278
|
+
target="_blank"
|
|
279
|
+
variant="ghost"
|
|
280
|
+
>
|
|
281
|
+
GitHub
|
|
282
|
+
</DXLink>
|
|
283
|
+
</div>
|
|
284
|
+
<div class="text-sm text-slate-600">
|
|
285
|
+
Внешние ссылки автоматически получают иконку и rel="noopener noreferrer" для безопасности
|
|
286
|
+
</div>
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
`,
|
|
290
|
+
}),
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
export const RouterLinks = {
|
|
294
|
+
parameters: {
|
|
295
|
+
docs: {
|
|
296
|
+
description: {
|
|
297
|
+
story: 'Интеграция с Vue Router. При использовании prop "to" компонент автоматически использует router-link вместо обычного тега <a>. Поддерживает как строковые пути, так и объекты с параметрами маршрута. Требуется установленный vue-router.',
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
},
|
|
301
|
+
render: () => ({
|
|
302
|
+
components: { DXLink },
|
|
303
|
+
setup() {
|
|
304
|
+
return {
|
|
305
|
+
userId: 123,
|
|
306
|
+
};
|
|
307
|
+
},
|
|
308
|
+
template: `
|
|
309
|
+
<div class="flex flex-col items-start gap-4">
|
|
310
|
+
<div class="flex flex-col gap-2">
|
|
311
|
+
<DXLink :to="{ name: 'home' }" variant="link">
|
|
312
|
+
Главная страница
|
|
313
|
+
</DXLink>
|
|
314
|
+
<DXLink :to="{ name: 'profile', params: { id: userId } }" variant="primary">
|
|
315
|
+
Профиль пользователя
|
|
316
|
+
</DXLink>
|
|
317
|
+
<DXLink to="/dashboard" variant="secondary">
|
|
318
|
+
Дашборд
|
|
319
|
+
</DXLink>
|
|
320
|
+
</div>
|
|
321
|
+
<div class="text-sm text-slate-600">
|
|
322
|
+
Используется router-link для навигации внутри приложения
|
|
323
|
+
</div>
|
|
324
|
+
</div>
|
|
325
|
+
`,
|
|
326
|
+
}),
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
export const Disabled = {
|
|
330
|
+
parameters: {
|
|
331
|
+
docs: {
|
|
332
|
+
description: {
|
|
333
|
+
story: 'Отключенное состояние ссылки. Блокирует клик через preventDefault и stopPropagation, применяет визуальные стили (opacity, cursor-not-allowed) и отключает pointer-events. Ссылка остается в DOM, но не интерактивна.',
|
|
334
|
+
},
|
|
335
|
+
},
|
|
336
|
+
},
|
|
337
|
+
render: () => ({
|
|
338
|
+
components: { DXLink },
|
|
339
|
+
template: `
|
|
340
|
+
<div class="flex flex-col items-start gap-4">
|
|
341
|
+
<div class="flex items-center gap-4 flex-wrap">
|
|
342
|
+
<DXLink href="/disabled" disabled variant="link">
|
|
343
|
+
Отключенная ссылка
|
|
344
|
+
</DXLink>
|
|
345
|
+
<DXLink href="/disabled" disabled variant="primary">
|
|
346
|
+
Отключенная Primary
|
|
347
|
+
</DXLink>
|
|
348
|
+
<DXLink href="/disabled" disabled variant="secondary">
|
|
349
|
+
Отключенная Secondary
|
|
350
|
+
</DXLink>
|
|
351
|
+
</div>
|
|
352
|
+
<div class="text-sm text-slate-600">
|
|
353
|
+
Отключенные ссылки не кликабельны и имеют визуальную индикацию
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
356
|
+
`,
|
|
357
|
+
}),
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
export const WithIcons = {
|
|
361
|
+
parameters: {
|
|
362
|
+
docs: {
|
|
363
|
+
description: {
|
|
364
|
+
story: 'Ссылки с иконками. Можно добавлять иконки через слот. Для внешних ссылок автоматически добавляется дополнительная иконка ArrowTopRightOnSquareIcon справа от текста.',
|
|
365
|
+
},
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
render: () => ({
|
|
369
|
+
components: { DXLink, DXIcon },
|
|
370
|
+
setup() {
|
|
371
|
+
return { HomeIcon };
|
|
372
|
+
},
|
|
373
|
+
template: `
|
|
374
|
+
<div class="flex flex-col items-start gap-4">
|
|
375
|
+
<div class="flex items-center gap-4 flex-wrap">
|
|
376
|
+
<DXLink href="/home" variant="link">
|
|
377
|
+
<DXIcon :icon="HomeIcon" size="sm" />
|
|
378
|
+
Главная
|
|
379
|
+
</DXLink>
|
|
380
|
+
<DXLink href="/about" variant="primary">
|
|
381
|
+
<DXIcon :icon="HomeIcon" size="sm" />
|
|
382
|
+
О нас
|
|
383
|
+
</DXLink>
|
|
384
|
+
<DXLink href="https://example.com" target="_blank" variant="ghost">
|
|
385
|
+
<DXIcon :icon="HomeIcon" size="sm" />
|
|
386
|
+
Внешняя ссылка
|
|
387
|
+
</DXLink>
|
|
388
|
+
</div>
|
|
389
|
+
<div class="text-sm text-slate-600">
|
|
390
|
+
Ссылки с иконками и автоматической иконкой для внешних ссылок
|
|
391
|
+
</div>
|
|
392
|
+
</div>
|
|
393
|
+
`,
|
|
394
|
+
}),
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
export const LinkAsButton = {
|
|
398
|
+
parameters: {
|
|
399
|
+
docs: {
|
|
400
|
+
description: {
|
|
401
|
+
story: 'Ссылки с вариантами кнопок (primary, secondary, ghost). Используются для действий, которые семантически должны быть ссылками (например, скачивание файла, переход на другую страницу), но визуально выглядят как кнопки.',
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
render: () => ({
|
|
406
|
+
components: { DXLink },
|
|
407
|
+
template: `
|
|
408
|
+
<div class="flex flex-col items-start gap-4">
|
|
409
|
+
<div class="flex flex-col gap-4">
|
|
410
|
+
<h3 class="text-sm font-semibold text-slate-700">Ссылки-кнопки</h3>
|
|
411
|
+
<div class="flex items-center gap-4 flex-wrap">
|
|
412
|
+
<DXLink href="/download" variant="primary" size="md">
|
|
413
|
+
Скачать файл
|
|
414
|
+
</DXLink>
|
|
415
|
+
<DXLink href="/action" variant="secondary" size="md">
|
|
416
|
+
Выполнить действие
|
|
417
|
+
</DXLink>
|
|
418
|
+
<DXLink href="/cancel" variant="ghost" size="md">
|
|
419
|
+
Отмена
|
|
420
|
+
</DXLink>
|
|
421
|
+
</div>
|
|
422
|
+
<div class="text-sm text-slate-600">
|
|
423
|
+
Ссылки с вариантами кнопок для действий, которые должны быть ссылками семантически
|
|
424
|
+
</div>
|
|
425
|
+
</div>
|
|
426
|
+
</div>
|
|
427
|
+
`,
|
|
428
|
+
}),
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
export const Accessibility = {
|
|
432
|
+
parameters: {
|
|
433
|
+
docs: {
|
|
434
|
+
description: {
|
|
435
|
+
story: 'Поддержка доступности через aria-label. Компонент автоматически добавляет rel="noopener noreferrer" для внешних ссылок с target="_blank" для защиты от tabnabbing атак. Иконка внешней ссылки имеет aria-hidden="true" для screen readers.',
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
},
|
|
439
|
+
render: () => ({
|
|
440
|
+
components: { DXLink },
|
|
441
|
+
template: `
|
|
442
|
+
<div class="flex flex-col items-start gap-4">
|
|
443
|
+
<div class="flex flex-col gap-4">
|
|
444
|
+
<h3 class="text-sm font-semibold text-slate-700">Доступность</h3>
|
|
445
|
+
<div class="flex flex-col gap-2">
|
|
446
|
+
<DXLink
|
|
447
|
+
href="/about"
|
|
448
|
+
aria-label="Перейти на страницу о нас"
|
|
449
|
+
>
|
|
450
|
+
О нас
|
|
451
|
+
</DXLink>
|
|
452
|
+
<DXLink
|
|
453
|
+
href="https://example.com"
|
|
454
|
+
target="_blank"
|
|
455
|
+
aria-label="Открыть внешний сайт в новой вкладке"
|
|
456
|
+
>
|
|
457
|
+
Внешний сайт
|
|
458
|
+
</DXLink>
|
|
459
|
+
<DXLink
|
|
460
|
+
href="/download"
|
|
461
|
+
variant="primary"
|
|
462
|
+
aria-label="Скачать файл"
|
|
463
|
+
>
|
|
464
|
+
Скачать
|
|
465
|
+
</DXLink>
|
|
466
|
+
</div>
|
|
467
|
+
<div class="text-sm text-slate-600">
|
|
468
|
+
Поддержка aria-label для улучшения доступности. Внешние ссылки автоматически получают rel="noopener noreferrer"
|
|
469
|
+
</div>
|
|
470
|
+
</div>
|
|
471
|
+
</div>
|
|
472
|
+
`,
|
|
473
|
+
}),
|
|
474
|
+
};
|
|
475
|
+
|