dxd-style-code 0.1.7 → 0.1.8
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 +13 -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/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,324 @@
|
|
|
1
|
+
import { ref } from 'vue';
|
|
2
|
+
import DXObserver from './DXObserver.vue';
|
|
3
|
+
import DXCard from '../../atoms/DXCard/DXCard.vue';
|
|
4
|
+
import DXButton from '../../atoms/DXButton/DXButton.vue';
|
|
5
|
+
|
|
6
|
+
export default {
|
|
7
|
+
title: 'Utilities/DXObserver',
|
|
8
|
+
component: DXObserver,
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
parameters: {
|
|
11
|
+
docs: {
|
|
12
|
+
description: {
|
|
13
|
+
component: `
|
|
14
|
+
# DXObserver
|
|
15
|
+
|
|
16
|
+
Компонент для отслеживания видимости элементов с использованием Intersection Observer API.
|
|
17
|
+
|
|
18
|
+
## Назначение
|
|
19
|
+
|
|
20
|
+
DXObserver позволяет отслеживать, когда элемент становится видимым в viewport или указанном контейнере.
|
|
21
|
+
Используется для оптимизации производительности через ленивую загрузку, бесконечную прокрутку и анимации.
|
|
22
|
+
|
|
23
|
+
## Архитектура
|
|
24
|
+
|
|
25
|
+
### Использует
|
|
26
|
+
- Intersection Observer API - нативный браузерный API
|
|
27
|
+
- \`useClassComposition\` composable - для стилей
|
|
28
|
+
|
|
29
|
+
### Используется в
|
|
30
|
+
- \`DXMediaGallery\` - для ленивой загрузки изображений
|
|
31
|
+
- \`DXTable\` - для бесконечной прокрутки
|
|
32
|
+
- Любые компоненты, требующие отслеживания видимости
|
|
33
|
+
|
|
34
|
+
## Внутренняя логика
|
|
35
|
+
|
|
36
|
+
### Intersection Observer
|
|
37
|
+
Компонент создает Intersection Observer при монтировании и отслеживает видимость корневого элемента.
|
|
38
|
+
При изменении видимости эмитит событие \`intersect\` с информацией о пересечении.
|
|
39
|
+
|
|
40
|
+
### Режим once
|
|
41
|
+
Если \`once={true}\`, observer срабатывает только один раз и автоматически отключается после первого пересечения.
|
|
42
|
+
|
|
43
|
+
### Реактивность
|
|
44
|
+
Observer автоматически пересоздается при изменении \`threshold\`, \`rootMargin\` или \`root\`.
|
|
45
|
+
|
|
46
|
+
## Особенности
|
|
47
|
+
|
|
48
|
+
### Производительность
|
|
49
|
+
Intersection Observer API оптимизирован браузером и работает асинхронно, не блокируя основной поток.
|
|
50
|
+
|
|
51
|
+
### Доступность
|
|
52
|
+
Компонент не влияет на доступность, так как является утилитой для отслеживания видимости.
|
|
53
|
+
|
|
54
|
+
### Fallback
|
|
55
|
+
Для браузеров без поддержки Intersection Observer можно добавить полифилл, но это не входит в компонент.
|
|
56
|
+
`,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
argTypes: {
|
|
61
|
+
threshold: {
|
|
62
|
+
control: 'number',
|
|
63
|
+
min: 0,
|
|
64
|
+
max: 1,
|
|
65
|
+
step: 0.1,
|
|
66
|
+
description: 'Порог видимости (0.0 - 1.0). Определяет, какая часть элемента должна быть видна.',
|
|
67
|
+
table: {
|
|
68
|
+
type: { summary: 'number | array' },
|
|
69
|
+
defaultValue: { summary: '0.1' },
|
|
70
|
+
category: 'Behavior',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
rootMargin: {
|
|
74
|
+
control: 'text',
|
|
75
|
+
description: 'Отступы от root элемента (формат CSS margin).',
|
|
76
|
+
table: {
|
|
77
|
+
type: { summary: 'string' },
|
|
78
|
+
defaultValue: { summary: '"0px"' },
|
|
79
|
+
category: 'Behavior',
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
once: {
|
|
83
|
+
control: 'boolean',
|
|
84
|
+
description: 'Срабатывать только один раз. После первого срабатывания observer отключается.',
|
|
85
|
+
table: {
|
|
86
|
+
type: { summary: 'boolean' },
|
|
87
|
+
defaultValue: { summary: 'false' },
|
|
88
|
+
category: 'Behavior',
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
disabled: {
|
|
92
|
+
control: 'boolean',
|
|
93
|
+
description: 'Отключить observer.',
|
|
94
|
+
table: {
|
|
95
|
+
type: { summary: 'boolean' },
|
|
96
|
+
defaultValue: { summary: 'false' },
|
|
97
|
+
category: 'Behavior',
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export const Default = {
|
|
104
|
+
args: {
|
|
105
|
+
threshold: 0.1,
|
|
106
|
+
},
|
|
107
|
+
parameters: {
|
|
108
|
+
docs: {
|
|
109
|
+
description: {
|
|
110
|
+
story: 'Базовое использование observer для отслеживания видимости элемента.',
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
render: (args) => ({
|
|
115
|
+
components: { DXObserver, DXCard },
|
|
116
|
+
setup() {
|
|
117
|
+
const isVisible = ref(false);
|
|
118
|
+
const handleIntersect = (intersecting) => {
|
|
119
|
+
isVisible.value = intersecting;
|
|
120
|
+
};
|
|
121
|
+
return { args, isVisible, handleIntersect };
|
|
122
|
+
},
|
|
123
|
+
template: `
|
|
124
|
+
<div class="space-y-4">
|
|
125
|
+
<p class="text-sm text-slate-600">
|
|
126
|
+
Статус: {{ isVisible ? 'Видим' : 'Не видим' }}
|
|
127
|
+
</p>
|
|
128
|
+
<div class="h-screen bg-slate-50 p-4">
|
|
129
|
+
<p class="mb-4">Прокрутите вниз, чтобы увидеть элемент</p>
|
|
130
|
+
</div>
|
|
131
|
+
<DXObserver v-bind="args" @intersect="handleIntersect">
|
|
132
|
+
<DXCard class="p-4">
|
|
133
|
+
<p>Этот элемент отслеживается observer</p>
|
|
134
|
+
<p v-if="isVisible" class="text-green-600 mt-2">Элемент видим!</p>
|
|
135
|
+
</DXCard>
|
|
136
|
+
</DXObserver>
|
|
137
|
+
</div>
|
|
138
|
+
`,
|
|
139
|
+
}),
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
export const LazyLoading = {
|
|
143
|
+
parameters: {
|
|
144
|
+
docs: {
|
|
145
|
+
description: {
|
|
146
|
+
story: 'Использование для ленивой загрузки изображений. Изображение загружается только когда становится видимым.',
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
render: () => ({
|
|
151
|
+
components: { DXObserver },
|
|
152
|
+
setup() {
|
|
153
|
+
const isVisible = ref(false);
|
|
154
|
+
const handleIntersect = (intersecting) => {
|
|
155
|
+
if (intersecting) {
|
|
156
|
+
isVisible.value = true;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
return { isVisible, handleIntersect };
|
|
160
|
+
},
|
|
161
|
+
template: `
|
|
162
|
+
<div class="space-y-4">
|
|
163
|
+
<div class="h-screen bg-slate-50 p-4">
|
|
164
|
+
<p>Прокрутите вниз для загрузки изображения</p>
|
|
165
|
+
</div>
|
|
166
|
+
<DXObserver threshold="0.1" @intersect="handleIntersect">
|
|
167
|
+
<div class="w-full">
|
|
168
|
+
<div v-if="!isVisible" class="h-64 bg-slate-200 flex items-center justify-center">
|
|
169
|
+
<p class="text-slate-500">Загрузка изображения...</p>
|
|
170
|
+
</div>
|
|
171
|
+
<img
|
|
172
|
+
v-else
|
|
173
|
+
src="https://via.placeholder.com/800x400"
|
|
174
|
+
alt="Lazy loaded"
|
|
175
|
+
class="w-full h-auto rounded-lg"
|
|
176
|
+
/>
|
|
177
|
+
</div>
|
|
178
|
+
</DXObserver>
|
|
179
|
+
</div>
|
|
180
|
+
`,
|
|
181
|
+
}),
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
export const InfiniteScroll = {
|
|
185
|
+
parameters: {
|
|
186
|
+
docs: {
|
|
187
|
+
description: {
|
|
188
|
+
story: 'Использование для бесконечной прокрутки. Новые элементы загружаются при достижении конца списка.',
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
render: () => ({
|
|
193
|
+
components: { DXObserver, DXCard },
|
|
194
|
+
setup() {
|
|
195
|
+
const items = ref([
|
|
196
|
+
{ id: 1, content: 'Элемент 1' },
|
|
197
|
+
{ id: 2, content: 'Элемент 2' },
|
|
198
|
+
{ id: 3, content: 'Элемент 3' },
|
|
199
|
+
]);
|
|
200
|
+
const isLoading = ref(false);
|
|
201
|
+
|
|
202
|
+
const loadMore = (intersecting) => {
|
|
203
|
+
if (intersecting && !isLoading.value) {
|
|
204
|
+
isLoading.value = true;
|
|
205
|
+
setTimeout(() => {
|
|
206
|
+
const newId = Math.max(...items.value.map(i => i.id)) + 1;
|
|
207
|
+
items.value.push({
|
|
208
|
+
id: newId,
|
|
209
|
+
content: `Элемент ${newId}`,
|
|
210
|
+
});
|
|
211
|
+
isLoading.value = false;
|
|
212
|
+
}, 1000);
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
return { items, isLoading, loadMore };
|
|
217
|
+
},
|
|
218
|
+
template: `
|
|
219
|
+
<div class="space-y-2">
|
|
220
|
+
<DXCard v-for="item in items" :key="item.id" class="p-4">
|
|
221
|
+
{{ item.content }}
|
|
222
|
+
</DXCard>
|
|
223
|
+
<DXObserver threshold="0.5" @intersect="loadMore">
|
|
224
|
+
<div v-if="isLoading" class="p-4 text-center text-slate-500">
|
|
225
|
+
Загрузка...
|
|
226
|
+
</div>
|
|
227
|
+
<div v-else class="p-4 text-center text-slate-400 text-sm">
|
|
228
|
+
Прокрутите для загрузки
|
|
229
|
+
</div>
|
|
230
|
+
</DXObserver>
|
|
231
|
+
</div>
|
|
232
|
+
`,
|
|
233
|
+
}),
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
export const OnceMode = {
|
|
237
|
+
args: {
|
|
238
|
+
threshold: 0.3,
|
|
239
|
+
once: true,
|
|
240
|
+
},
|
|
241
|
+
parameters: {
|
|
242
|
+
docs: {
|
|
243
|
+
description: {
|
|
244
|
+
story: 'Режим once - observer срабатывает только один раз. Полезно для анимаций появления.',
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
render: (args) => ({
|
|
249
|
+
components: { DXObserver, DXCard },
|
|
250
|
+
setup() {
|
|
251
|
+
const isAnimated = ref(false);
|
|
252
|
+
const handleIntersect = (intersecting) => {
|
|
253
|
+
if (intersecting) {
|
|
254
|
+
isAnimated.value = true;
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
return { args, isAnimated, handleIntersect };
|
|
258
|
+
},
|
|
259
|
+
template: `
|
|
260
|
+
<div class="space-y-4">
|
|
261
|
+
<div class="h-screen bg-slate-50 p-4">
|
|
262
|
+
<p>Прокрутите вниз</p>
|
|
263
|
+
</div>
|
|
264
|
+
<DXObserver v-bind="args" @intersect="handleIntersect">
|
|
265
|
+
<DXCard
|
|
266
|
+
class="p-4 transition-all duration-500"
|
|
267
|
+
:class="{
|
|
268
|
+
'opacity-100 translate-y-0': isAnimated,
|
|
269
|
+
'opacity-0 translate-y-8': !isAnimated,
|
|
270
|
+
}"
|
|
271
|
+
>
|
|
272
|
+
<p>Этот элемент анимируется только один раз</p>
|
|
273
|
+
<p v-if="isAnimated" class="text-green-600 mt-2">Анимация завершена!</p>
|
|
274
|
+
</DXCard>
|
|
275
|
+
</DXObserver>
|
|
276
|
+
</div>
|
|
277
|
+
`,
|
|
278
|
+
}),
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
export const WithThreshold = {
|
|
282
|
+
parameters: {
|
|
283
|
+
docs: {
|
|
284
|
+
description: {
|
|
285
|
+
story: 'Различные пороги видимости. Элемент считается видимым при достижении указанного процента.',
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
render: () => ({
|
|
290
|
+
components: { DXObserver, DXCard },
|
|
291
|
+
setup() {
|
|
292
|
+
const thresholds = [0.1, 0.5, 1.0];
|
|
293
|
+
const visibleStates = ref({});
|
|
294
|
+
|
|
295
|
+
const handleIntersect = (threshold) => (intersecting) => {
|
|
296
|
+
visibleStates.value[threshold] = intersecting;
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
return { thresholds, visibleStates, handleIntersect };
|
|
300
|
+
},
|
|
301
|
+
template: `
|
|
302
|
+
<div class="space-y-4">
|
|
303
|
+
<div class="h-screen bg-slate-50 p-4">
|
|
304
|
+
<p>Прокрутите вниз</p>
|
|
305
|
+
</div>
|
|
306
|
+
<div
|
|
307
|
+
v-for="threshold in thresholds"
|
|
308
|
+
:key="threshold"
|
|
309
|
+
class="space-y-2"
|
|
310
|
+
>
|
|
311
|
+
<DXObserver :threshold="threshold" @intersect="handleIntersect(threshold)">
|
|
312
|
+
<DXCard class="p-4">
|
|
313
|
+
<p>Порог: {{ threshold * 100 }}%</p>
|
|
314
|
+
<p :class="visibleStates[threshold] ? 'text-green-600' : 'text-slate-400'">
|
|
315
|
+
{{ visibleStates[threshold] ? 'Видим' : 'Не видим' }}
|
|
316
|
+
</p>
|
|
317
|
+
</DXCard>
|
|
318
|
+
</DXObserver>
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
321
|
+
`,
|
|
322
|
+
}),
|
|
323
|
+
};
|
|
324
|
+
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div
|
|
3
|
+
ref="rootElement"
|
|
4
|
+
:class="observerClasses"
|
|
5
|
+
data-component="DXObserver"
|
|
6
|
+
:data-threshold="threshold"
|
|
7
|
+
:data-once="once"
|
|
8
|
+
>
|
|
9
|
+
<slot />
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script setup>
|
|
14
|
+
import { ref, computed, onMounted, onBeforeUnmount, watch } from "vue";
|
|
15
|
+
import { useClassComposition } from "@/composables/useClassComposition";
|
|
16
|
+
|
|
17
|
+
const props = defineProps({
|
|
18
|
+
/**
|
|
19
|
+
* Порог видимости (0.0 - 1.0)
|
|
20
|
+
* Определяет, какая часть элемента должна быть видна для срабатывания
|
|
21
|
+
* @default 0.1
|
|
22
|
+
*/
|
|
23
|
+
threshold: {
|
|
24
|
+
type: [Number, Array],
|
|
25
|
+
default: 0.1,
|
|
26
|
+
validator: (value) => {
|
|
27
|
+
if (Array.isArray(value)) {
|
|
28
|
+
return value.every((v) => v >= 0 && v <= 1);
|
|
29
|
+
}
|
|
30
|
+
return value >= 0 && value <= 1;
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
/**
|
|
34
|
+
* Отступы от root элемента (аналогично CSS margin)
|
|
35
|
+
* Формат: "10px 20px 30px 40px" или "10px"
|
|
36
|
+
* @default "0px"
|
|
37
|
+
*/
|
|
38
|
+
rootMargin: { type: String, default: "0px" },
|
|
39
|
+
/**
|
|
40
|
+
* Срабатывать только один раз
|
|
41
|
+
* После первого срабатывания observer отключается
|
|
42
|
+
* @default false
|
|
43
|
+
*/
|
|
44
|
+
once: { type: Boolean, default: false },
|
|
45
|
+
/**
|
|
46
|
+
* Root элемент для наблюдения (по умолчанию viewport)
|
|
47
|
+
* Может быть селектором или HTMLElement
|
|
48
|
+
* @default null
|
|
49
|
+
*/
|
|
50
|
+
root: { type: [String, Object], default: null },
|
|
51
|
+
/**
|
|
52
|
+
* Отключить observer
|
|
53
|
+
* @default false
|
|
54
|
+
*/
|
|
55
|
+
disabled: { type: Boolean, default: false },
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const emit = defineEmits(["intersect"]);
|
|
59
|
+
|
|
60
|
+
const rootElement = ref(null);
|
|
61
|
+
const observer = ref(null);
|
|
62
|
+
const hasIntersected = ref(false);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Классы для контейнера observer
|
|
66
|
+
*
|
|
67
|
+
* @description
|
|
68
|
+
* Базовые классы для контейнера. Компонент не добавляет визуальных стилей,
|
|
69
|
+
* так как является утилитой для отслеживания видимости.
|
|
70
|
+
*
|
|
71
|
+
* @returns {Array} Массив классов
|
|
72
|
+
*/
|
|
73
|
+
const observerClasses = computed(() =>
|
|
74
|
+
useClassComposition("w-full")
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Инициализация Intersection Observer
|
|
79
|
+
*
|
|
80
|
+
* @description
|
|
81
|
+
* Создает Intersection Observer с настройками из props.
|
|
82
|
+
* Observer отслеживает видимость rootElement в viewport или указанном root элементе.
|
|
83
|
+
*
|
|
84
|
+
* @returns {IntersectionObserver|null} Экземпляр observer или null если disabled
|
|
85
|
+
*/
|
|
86
|
+
function initObserver() {
|
|
87
|
+
if (props.disabled || !rootElement.value) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Если once и уже сработал, не создаем observer
|
|
92
|
+
if (props.once && hasIntersected.value) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const options = {
|
|
97
|
+
threshold: props.threshold,
|
|
98
|
+
rootMargin: props.rootMargin,
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// Если указан root элемент, добавляем его в опции
|
|
102
|
+
if (props.root) {
|
|
103
|
+
if (typeof props.root === "string") {
|
|
104
|
+
const rootElement = document.querySelector(props.root);
|
|
105
|
+
if (rootElement) {
|
|
106
|
+
options.root = rootElement;
|
|
107
|
+
} else {
|
|
108
|
+
console.warn(`DXObserver: Root элемент "${props.root}" не найден`);
|
|
109
|
+
}
|
|
110
|
+
} else if (props.root instanceof HTMLElement) {
|
|
111
|
+
options.root = props.root;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const obs = new IntersectionObserver((entries) => {
|
|
116
|
+
entries.forEach((entry) => {
|
|
117
|
+
const isIntersecting = entry.isIntersecting;
|
|
118
|
+
|
|
119
|
+
// Эмитим событие с информацией о пересечении
|
|
120
|
+
emit("intersect", isIntersecting, entry);
|
|
121
|
+
|
|
122
|
+
// Если once и элемент стал видимым, отмечаем и отключаем observer
|
|
123
|
+
if (props.once && isIntersecting) {
|
|
124
|
+
hasIntersected.value = true;
|
|
125
|
+
disconnectObserver();
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}, options);
|
|
129
|
+
|
|
130
|
+
obs.observe(rootElement.value);
|
|
131
|
+
return obs;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Отключение observer
|
|
136
|
+
*
|
|
137
|
+
* @description
|
|
138
|
+
* Отключает и очищает Intersection Observer.
|
|
139
|
+
*/
|
|
140
|
+
function disconnectObserver() {
|
|
141
|
+
if (observer.value) {
|
|
142
|
+
observer.value.disconnect();
|
|
143
|
+
observer.value = null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Инициализация при монтировании
|
|
148
|
+
onMounted(() => {
|
|
149
|
+
if (!props.disabled) {
|
|
150
|
+
observer.value = initObserver();
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// Очистка при размонтировании
|
|
155
|
+
onBeforeUnmount(() => {
|
|
156
|
+
disconnectObserver();
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// Реакция на изменение disabled
|
|
160
|
+
watch(
|
|
161
|
+
() => props.disabled,
|
|
162
|
+
(disabled) => {
|
|
163
|
+
if (disabled) {
|
|
164
|
+
disconnectObserver();
|
|
165
|
+
} else {
|
|
166
|
+
observer.value = initObserver();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
// Реакция на изменение threshold или rootMargin
|
|
172
|
+
watch(
|
|
173
|
+
[() => props.threshold, () => props.rootMargin, () => props.root],
|
|
174
|
+
() => {
|
|
175
|
+
if (!props.disabled) {
|
|
176
|
+
disconnectObserver();
|
|
177
|
+
observer.value = initObserver();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
);
|
|
181
|
+
</script>
|
|
182
|
+
|