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.
Files changed (335) hide show
  1. package/dist/dxd-style-code.js +11974 -3725
  2. package/dist/dxd-style-code.umd.cjs +10 -1
  3. package/dist/style.css +1 -1
  4. package/package.json +14 -6
  5. package/src/components/atoms/DXAvatar/DXAvatar.stories.js +319 -0
  6. package/src/components/atoms/DXAvatar/DXAvatar.vue +167 -0
  7. package/src/components/atoms/DXAvatar/index.js +2 -0
  8. package/src/components/atoms/DXBackdrop/DXBackdrop.stories.js +341 -0
  9. package/src/components/atoms/DXBackdrop/DXBackdrop.vue +102 -0
  10. package/src/components/atoms/DXBackdrop/index.js +2 -0
  11. package/src/components/atoms/DXBadge/DXBadge.stories.js +239 -0
  12. package/src/components/atoms/DXBadge/DXBadge.vue +45 -0
  13. package/src/components/atoms/DXBadge/index.js +2 -0
  14. package/src/components/atoms/DXButton/DXButton.stories.js +178 -0
  15. package/src/components/atoms/DXButton/DXButton.vue +84 -0
  16. package/src/components/atoms/DXButton/index.js +2 -0
  17. package/src/components/atoms/DXCard/DXCard.stories.js +133 -0
  18. package/src/components/atoms/DXCard/DXCard.vue +46 -0
  19. package/src/components/atoms/DXCard/index.js +2 -0
  20. package/src/components/atoms/DXCheckbox/DXCheckbox.stories.js +294 -0
  21. package/src/components/atoms/DXCheckbox/DXCheckbox.vue +191 -0
  22. package/src/components/atoms/DXCheckbox/index.js +2 -0
  23. package/src/components/atoms/DXDivider/DXDivider.stories.js +135 -0
  24. package/src/components/atoms/DXDivider/DXDivider.vue +74 -0
  25. package/src/components/atoms/DXDivider/index.js +2 -0
  26. package/src/components/atoms/DXDropdownItem/DXDropdownItem.vue +116 -0
  27. package/src/components/atoms/DXDropdownItem/index.js +2 -0
  28. package/src/components/atoms/DXFormLabel/DXFormLabel.stories.js +194 -0
  29. package/src/components/atoms/DXFormLabel/DXFormLabel.vue +94 -0
  30. package/src/components/atoms/DXFormLabel/index.js +2 -0
  31. package/src/components/atoms/DXIcon/DXIcon.stories.js +156 -0
  32. package/src/components/atoms/DXIcon/DXIcon.vue +102 -0
  33. package/src/components/atoms/DXIcon/index.js +3 -0
  34. package/src/components/atoms/DXIconWrapper/DXIconWrapper.stories.js +237 -0
  35. package/src/components/atoms/DXIconWrapper/DXIconWrapper.vue +79 -0
  36. package/src/components/atoms/DXIconWrapper/index.js +2 -0
  37. package/src/components/atoms/DXInputAddon/DXInputAddon.stories.js +230 -0
  38. package/src/components/atoms/DXInputAddon/DXInputAddon.vue +64 -0
  39. package/src/components/atoms/DXInputAddon/index.js +2 -0
  40. package/src/components/atoms/DXLink/DXLink.stories.js +475 -0
  41. package/src/components/atoms/DXLink/DXLink.vue +229 -0
  42. package/src/components/atoms/DXLink/index.js +2 -0
  43. package/src/components/atoms/DXLoader/DXLoader.stories.js +280 -0
  44. package/src/components/atoms/DXLoader/DXLoader.vue +78 -0
  45. package/src/components/atoms/DXLoader/index.js +2 -0
  46. package/src/components/atoms/DXProgress/DXProgress.stories.js +312 -0
  47. package/src/components/atoms/DXProgress/DXProgress.vue +85 -0
  48. package/src/components/atoms/DXProgress/index.js +2 -0
  49. package/src/components/atoms/DXQuote/DXQuote.stories.js +255 -0
  50. package/src/components/atoms/DXQuote/DXQuote.vue +97 -0
  51. package/src/components/atoms/DXQuote/index.js +2 -0
  52. package/src/components/atoms/DXRadio/DXRadio.stories.js +277 -0
  53. package/src/components/atoms/DXRadio/DXRadio.vue +144 -0
  54. package/src/components/atoms/DXRadio/index.js +2 -0
  55. package/src/components/atoms/DXSkeleton/DXSkeleton.stories.js +50 -0
  56. package/src/components/atoms/DXSkeleton/DXSkeleton.vue +19 -0
  57. package/src/components/atoms/DXSkeleton/index.js +2 -0
  58. package/src/components/atoms/DXSlider/DXSlider.stories.js +522 -0
  59. package/src/components/atoms/DXSlider/DXSlider.vue +338 -0
  60. package/src/components/atoms/DXSlider/index.js +2 -0
  61. package/src/components/atoms/DXTags/DXTags.stories.js +206 -0
  62. package/src/components/atoms/DXTags/DXTags.vue +111 -0
  63. package/src/components/atoms/DXTags/index.js +2 -0
  64. package/src/components/atoms/DXToast/DXToast.stories.js +40 -0
  65. package/src/components/atoms/DXToast/DXToast.vue +32 -0
  66. package/src/components/atoms/DXToast/index.js +2 -0
  67. package/src/components/atoms/DXToggle/DXToggle.stories.js +143 -0
  68. package/src/components/atoms/DXToggle/DXToggle.vue +142 -0
  69. package/src/components/atoms/DXToggle/index.js +2 -0
  70. package/src/components/atoms/DXToggleButton/DXToggleButton.stories.js +513 -0
  71. package/src/components/atoms/DXToggleButton/DXToggleButton.vue +140 -0
  72. package/src/components/atoms/DXToggleButton/index.js +2 -0
  73. package/src/components/atoms/DXTooltip/DXTooltip.stories.js +243 -0
  74. package/src/components/atoms/DXTooltip/DXTooltip.vue +151 -0
  75. package/src/components/atoms/DXTooltip/index.js +2 -0
  76. package/src/components/atoms/index.js +24 -0
  77. package/src/components/index.js +20 -0
  78. package/src/components/layout/DXBox/DXBox.stories.js +238 -0
  79. package/src/components/layout/DXBox/DXBox.vue +198 -0
  80. package/src/components/layout/DXBox/index.js +2 -0
  81. package/src/components/layout/DXContainer/DXContainer.stories.js +147 -0
  82. package/src/components/layout/DXContainer/DXContainer.vue +83 -0
  83. package/src/components/layout/DXContainer/index.js +2 -0
  84. package/src/components/layout/DXFlex/DXFlex.stories.js +210 -0
  85. package/src/components/layout/DXFlex/DXFlex.vue +149 -0
  86. package/src/components/layout/DXFlex/index.js +2 -0
  87. package/src/components/layout/DXGrid/DXGrid.stories.js +238 -0
  88. package/src/components/layout/DXGrid/DXGrid.vue +167 -0
  89. package/src/components/layout/DXGrid/index.js +2 -0
  90. package/src/components/layout/DXSpacer/DXSpacer.stories.js +187 -0
  91. package/src/components/layout/DXSpacer/DXSpacer.vue +102 -0
  92. package/src/components/layout/DXSpacer/index.js +2 -0
  93. package/src/components/layout/DXStack/DXStack.stories.js +199 -0
  94. package/src/components/layout/DXStack/DXStack.vue +140 -0
  95. package/src/components/layout/DXStack/index.js +2 -0
  96. package/src/components/layout/index.js +8 -0
  97. package/src/components/molecules/DXActionButtons/DXActionButtons.stories.js +288 -0
  98. package/src/components/molecules/DXActionButtons/DXActionButtons.vue +106 -0
  99. package/src/components/molecules/DXActionButtons/index.js +2 -0
  100. package/src/components/molecules/DXAlert/DXAlert.stories.js +70 -0
  101. package/src/components/molecules/DXAlert/DXAlert.vue +116 -0
  102. package/src/components/molecules/DXAlert/index.js +2 -0
  103. package/src/components/molecules/DXBaseTable/DXBaseTable.stories.js +433 -0
  104. package/src/components/molecules/DXBaseTable/DXBaseTable.vue +459 -0
  105. package/src/components/molecules/DXBaseTable/index.js +4 -0
  106. package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.stories.js +227 -0
  107. package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.vue +96 -0
  108. package/src/components/molecules/DXBreadcrumb/index.js +2 -0
  109. package/src/components/molecules/DXButtonGroup/DXButtonGroup.stories.js +26 -0
  110. package/src/components/molecules/DXButtonGroup/DXButtonGroup.vue +78 -0
  111. package/src/components/molecules/DXButtonGroup/index.js +2 -0
  112. package/src/components/molecules/DXCloseButton/DXCloseButton.stories.js +53 -0
  113. package/src/components/molecules/DXCloseButton/DXCloseButton.vue +62 -0
  114. package/src/components/molecules/DXCloseButton/index.js +3 -0
  115. package/src/components/molecules/DXComboBox/DXComboBox.stories.js +62 -0
  116. package/src/components/molecules/DXComboBox/DXComboBox.vue +167 -0
  117. package/src/components/molecules/DXComboBox/index.js +2 -0
  118. package/src/components/molecules/DXCopyField/DXCopyField.stories.js +231 -0
  119. package/src/components/molecules/DXCopyField/DXCopyField.vue +75 -0
  120. package/src/components/molecules/DXCopyField/index.js +2 -0
  121. package/src/components/molecules/DXDataFilter/DXDataFilter.stories.js +275 -0
  122. package/src/components/molecules/DXDataFilter/DXDataFilter.vue +385 -0
  123. package/src/components/molecules/DXDataFilter/index.js +2 -0
  124. package/src/components/molecules/DXDatePicker/DXDatePicker.stories.js +42 -0
  125. package/src/components/molecules/DXDatePicker/DXDatePicker.vue +121 -0
  126. package/src/components/molecules/DXDatePicker/index.js +2 -0
  127. package/src/components/molecules/DXDropdownDivider/DXDropdownDivider.vue +30 -0
  128. package/src/components/molecules/DXDropdownDivider/index.js +2 -0
  129. package/src/components/molecules/DXFileUpload/DXFileUpload.stories.js +53 -0
  130. package/src/components/molecules/DXFileUpload/DXFileUpload.vue +199 -0
  131. package/src/components/molecules/DXFileUpload/index.js +2 -0
  132. package/src/components/molecules/DXFilterGroup/DXFilterGroup.stories.js +43 -0
  133. package/src/components/molecules/DXFilterGroup/DXFilterGroup.vue +43 -0
  134. package/src/components/molecules/DXFilterGroup/index.js +2 -0
  135. package/src/components/molecules/DXFormControl/DXFormControl.stories.js +69 -0
  136. package/src/components/molecules/DXFormControl/DXFormControl.vue +72 -0
  137. package/src/components/molecules/DXFormControl/index.js +2 -0
  138. package/src/components/molecules/DXInput/DXInput.stories.js +291 -0
  139. package/src/components/molecules/DXInput/DXInput.vue +156 -0
  140. package/src/components/molecules/DXInput/index.js +3 -0
  141. package/src/components/molecules/DXInputGroup/DXInputGroup.stories.js +228 -0
  142. package/src/components/molecules/DXInputGroup/DXInputGroup.vue +64 -0
  143. package/src/components/molecules/DXInputGroup/index.js +2 -0
  144. package/src/components/molecules/DXInputMask/DXInputMask.stories.js +53 -0
  145. package/src/components/molecules/DXInputMask/DXInputMask.vue +89 -0
  146. package/src/components/molecules/DXInputMask/index.js +2 -0
  147. package/src/components/molecules/DXMenu/DXMenu.stories.js +379 -0
  148. package/src/components/molecules/DXMenu/DXMenu.vue +331 -0
  149. package/src/components/molecules/DXMenu/README.md +479 -0
  150. package/src/components/molecules/DXMenu/index.js +2 -0
  151. package/src/components/molecules/DXPagination/DXPagination.stories.js +62 -0
  152. package/src/components/molecules/DXPagination/DXPagination.vue +123 -0
  153. package/src/components/molecules/DXPagination/index.js +2 -0
  154. package/src/components/molecules/DXPasswordInput/DXPasswordInput.stories.js +42 -0
  155. package/src/components/molecules/DXPasswordInput/DXPasswordInput.vue +74 -0
  156. package/src/components/molecules/DXPasswordInput/index.js +2 -0
  157. package/src/components/molecules/DXRadioCard/DXRadioCard.stories.js +60 -0
  158. package/src/components/molecules/DXRadioCard/DXRadioCard.vue +71 -0
  159. package/src/components/molecules/DXRadioCard/index.js +2 -0
  160. package/src/components/molecules/DXRadioGroup/DXRadioGroup.stories.js +297 -0
  161. package/src/components/molecules/DXRadioGroup/DXRadioGroup.vue +73 -0
  162. package/src/components/molecules/DXRadioGroup/index.js +2 -0
  163. package/src/components/molecules/DXRating/DXRating.stories.js +322 -0
  164. package/src/components/molecules/DXRating/DXRating.vue +402 -0
  165. package/src/components/molecules/DXRating/index.js +2 -0
  166. package/src/components/molecules/DXSearchBar/DXSearchBar.stories.js +357 -0
  167. package/src/components/molecules/DXSearchBar/DXSearchBar.vue +525 -0
  168. package/src/components/molecules/DXSearchBar/index.js +2 -0
  169. package/src/components/molecules/DXSearchSelect/DXSearchSelect.stories.js +50 -0
  170. package/src/components/molecules/DXSearchSelect/DXSearchSelect.vue +207 -0
  171. package/src/components/molecules/DXSearchSelect/index.js +2 -0
  172. package/src/components/molecules/DXSegmentedControl/DXSegmentedControl.stories.js +326 -0
  173. package/src/components/molecules/DXSegmentedControl/DXSegmentedControl.vue +116 -0
  174. package/src/components/molecules/DXSegmentedControl/index.js +2 -0
  175. package/src/components/molecules/DXSelect/DXSelect.stories.js +259 -0
  176. package/src/components/molecules/DXSelect/DXSelect.vue +149 -0
  177. package/src/components/molecules/DXSelect/index.js +3 -0
  178. package/src/components/molecules/DXStatCard/DXStatCard.stories.js +335 -0
  179. package/src/components/molecules/DXStatCard/DXStatCard.vue +309 -0
  180. package/src/components/molecules/DXStatCard/index.js +2 -0
  181. package/src/components/molecules/DXTableFiltersPanel/DXTableFiltersPanel.vue +72 -0
  182. package/src/components/molecules/DXTableFiltersPanel/index.js +7 -0
  183. package/src/components/molecules/DXTablePagination/DXTablePagination.stories.js +236 -0
  184. package/src/components/molecules/DXTablePagination/DXTablePagination.vue +93 -0
  185. package/src/components/molecules/DXTablePagination/index.js +2 -0
  186. package/src/components/molecules/DXTableToolbar/DXTableToolbar.stories.js +271 -0
  187. package/src/components/molecules/DXTableToolbar/DXTableToolbar.vue +102 -0
  188. package/src/components/molecules/DXTableToolbar/index.js +2 -0
  189. package/src/components/molecules/DXTextarea/DXTextarea.stories.js +239 -0
  190. package/src/components/molecules/DXTextarea/DXTextarea.vue +158 -0
  191. package/src/components/molecules/DXTextarea/index.js +3 -0
  192. package/src/components/molecules/DXTimePicker/DXTimePicker.stories.js +282 -0
  193. package/src/components/molecules/DXTimePicker/DXTimePicker.vue +640 -0
  194. package/src/components/molecules/DXTimePicker/index.js +2 -0
  195. package/src/components/molecules/DXValidationIcon/DXValidationIcon.stories.js +60 -0
  196. package/src/components/molecules/DXValidationIcon/DXValidationIcon.vue +53 -0
  197. package/src/components/molecules/DXValidationIcon/index.js +3 -0
  198. package/src/components/molecules/index.js +34 -0
  199. package/src/components/organisms/DXAccordion/DXAccordion.stories.js +33 -0
  200. package/src/components/organisms/DXAccordion/DXAccordion.vue +104 -0
  201. package/src/components/organisms/DXAccordion/index.js +2 -0
  202. package/src/components/organisms/DXAppLayout/DXAppLayout.stories.js +689 -0
  203. package/src/components/organisms/DXAppLayout/DXAppLayout.vue +460 -0
  204. package/src/components/organisms/DXAppLayout/index.js +2 -0
  205. package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.stories.js +232 -0
  206. package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.vue +458 -0
  207. package/src/components/organisms/DXAuthenticationForm/index.js +2 -0
  208. package/src/components/organisms/DXChartContainer/DXChartContainer.stories.js +286 -0
  209. package/src/components/organisms/DXChartContainer/DXChartContainer.vue +273 -0
  210. package/src/components/organisms/DXChartContainer/index.js +2 -0
  211. package/src/components/organisms/DXChatInterface/DXChatInterface.stories.js +164 -0
  212. package/src/components/organisms/DXChatInterface/DXChatInterface.vue +583 -0
  213. package/src/components/organisms/DXChatInterface/index.js +2 -0
  214. package/src/components/organisms/DXCommentSection/DXCommentSection.stories.js +173 -0
  215. package/src/components/organisms/DXCommentSection/DXCommentSection.vue +487 -0
  216. package/src/components/organisms/DXCommentSection/index.js +2 -0
  217. package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.stories.js +331 -0
  218. package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.vue +309 -0
  219. package/src/components/organisms/DXDashboardGrid/index.js +2 -0
  220. package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.stories.js +271 -0
  221. package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.vue +260 -0
  222. package/src/components/organisms/DXDashboardWidget/index.js +2 -0
  223. package/src/components/organisms/DXDataTable/DXDataTable.stories.js +247 -0
  224. package/src/components/organisms/DXDataTable/DXDataTable.vue +496 -0
  225. package/src/components/organisms/DXDataTable/index.js +2 -0
  226. package/src/components/organisms/DXDropdown/DXDropdown.stories.js +795 -0
  227. package/src/components/organisms/DXDropdown/DXDropdown.vue +238 -0
  228. package/src/components/organisms/DXDropdown/index.js +2 -0
  229. package/src/components/organisms/DXEmptyState/DXEmptyState.stories.js +37 -0
  230. package/src/components/organisms/DXEmptyState/DXEmptyState.vue +41 -0
  231. package/src/components/organisms/DXEmptyState/index.js +2 -0
  232. package/src/components/organisms/DXFormWizard/DXFormWizard.stories.js +378 -0
  233. package/src/components/organisms/DXFormWizard/DXFormWizard.vue +578 -0
  234. package/src/components/organisms/DXFormWizard/index.js +2 -0
  235. package/src/components/organisms/DXHeaderBar/DXHeaderBar.stories.js +448 -0
  236. package/src/components/organisms/DXHeaderBar/DXHeaderBar.vue +190 -0
  237. package/src/components/organisms/DXHeaderBar/index.js +2 -0
  238. package/src/components/organisms/DXMediaGallery/DXMediaGallery.stories.js +347 -0
  239. package/src/components/organisms/DXMediaGallery/DXMediaGallery.vue +422 -0
  240. package/src/components/organisms/DXMediaGallery/index.js +2 -0
  241. package/src/components/organisms/DXModal/DXModal.stories.js +138 -0
  242. package/src/components/organisms/DXModal/DXModal.vue +213 -0
  243. package/src/components/organisms/DXModal/index.js +2 -0
  244. package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.stories.js +183 -0
  245. package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.vue +566 -0
  246. package/src/components/organisms/DXNotificationCenter/index.js +2 -0
  247. package/src/components/organisms/DXReportGenerator/DXReportGenerator.stories.js +199 -0
  248. package/src/components/organisms/DXReportGenerator/DXReportGenerator.vue +344 -0
  249. package/src/components/organisms/DXReportGenerator/index.js +2 -0
  250. package/src/components/organisms/DXSettingsPanel/DXSettingsPanel.stories.js +245 -0
  251. package/src/components/organisms/DXSettingsPanel/DXSettingsPanel.vue +454 -0
  252. package/src/components/organisms/DXSettingsPanel/index.js +2 -0
  253. package/src/components/organisms/DXSidebar/DXSidebar.stories.js +316 -0
  254. package/src/components/organisms/DXSidebar/DXSidebar.vue +212 -0
  255. package/src/components/organisms/DXSidebar/index.js +2 -0
  256. package/src/components/organisms/DXSidebarMenu/DATA_STRUCTURE.md +299 -0
  257. package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.stories.js +729 -0
  258. package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.vue +257 -0
  259. package/src/components/organisms/DXSidebarMenu/DXSidebarMenuItem.vue +249 -0
  260. package/src/components/organisms/DXSidebarMenu/README.md +333 -0
  261. package/src/components/organisms/DXSidebarMenu/index.js +3 -0
  262. package/src/components/organisms/DXTable/DXTable.stories.js +550 -0
  263. package/src/components/organisms/DXTable/DXTable.vue +324 -0
  264. package/src/components/organisms/DXTable/index.js +2 -0
  265. package/src/components/organisms/DXTabs/DXTabs.stories.js +407 -0
  266. package/src/components/organisms/DXTabs/DXTabs.vue +301 -0
  267. package/src/components/organisms/DXTabs/index.js +2 -0
  268. package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.stories.js +194 -0
  269. package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.vue +403 -0
  270. package/src/components/organisms/DXUserProfileCard/index.js +2 -0
  271. package/src/components/organisms/DXWizard/DXWizard.stories.js +212 -0
  272. package/src/components/organisms/DXWizard/DXWizard.vue +615 -0
  273. package/src/components/organisms/DXWizard/index.js +2 -0
  274. package/src/components/organisms/index.js +25 -0
  275. package/src/components/typography/DXBlockquote/DXBlockquote.stories.js +33 -0
  276. package/src/components/typography/DXBlockquote/DXBlockquote.vue +44 -0
  277. package/src/components/typography/DXBlockquote/index.js +2 -0
  278. package/src/components/typography/DXCode/DXCode.stories.js +29 -0
  279. package/src/components/typography/DXCode/DXCode.vue +46 -0
  280. package/src/components/typography/DXCode/index.js +2 -0
  281. package/src/components/typography/DXHeading/DXHeading.stories.js +54 -0
  282. package/src/components/typography/DXHeading/DXHeading.vue +68 -0
  283. package/src/components/typography/DXHeading/index.js +2 -0
  284. package/src/components/typography/DXLabel/DXLabel.stories.js +40 -0
  285. package/src/components/typography/DXLabel/DXLabel.vue +49 -0
  286. package/src/components/typography/DXLabel/index.js +2 -0
  287. package/src/components/typography/DXList/DXList.stories.js +50 -0
  288. package/src/components/typography/DXList/DXList.vue +55 -0
  289. package/src/components/typography/DXList/index.js +2 -0
  290. package/src/components/typography/DXText/DXText.stories.js +47 -0
  291. package/src/components/typography/DXText/DXText.vue +67 -0
  292. package/src/components/typography/DXText/index.js +2 -0
  293. package/src/components/typography/index.js +8 -0
  294. package/src/components/utilities/DXAnimatePresence/DXAnimatePresence.stories.js +335 -0
  295. package/src/components/utilities/DXAnimatePresence/DXAnimatePresence.vue +207 -0
  296. package/src/components/utilities/DXAnimatePresence/index.js +2 -0
  297. package/src/components/utilities/DXBreakpointProvider/DXBreakpointProvider.stories.js +321 -0
  298. package/src/components/utilities/DXBreakpointProvider/DXBreakpointProvider.vue +158 -0
  299. package/src/components/utilities/DXBreakpointProvider/index.js +2 -0
  300. package/src/components/utilities/DXObserver/DXObserver.stories.js +324 -0
  301. package/src/components/utilities/DXObserver/DXObserver.vue +182 -0
  302. package/src/components/utilities/DXObserver/index.js +2 -0
  303. package/src/components/utilities/DXPortal/DXPortal.stories.js +267 -0
  304. package/src/components/utilities/DXPortal/DXPortal.vue +69 -0
  305. package/src/components/utilities/DXPortal/index.js +2 -0
  306. package/src/components/utilities/DXStaggeredAnimation/DXStaggeredAnimation.stories.js +339 -0
  307. package/src/components/utilities/DXStaggeredAnimation/DXStaggeredAnimation.vue +155 -0
  308. package/src/components/utilities/DXStaggeredAnimation/index.js +2 -0
  309. package/src/components/utilities/DXThemeProvider/DXThemeProvider.stories.js +327 -0
  310. package/src/components/utilities/DXThemeProvider/DXThemeProvider.vue +227 -0
  311. package/src/components/utilities/DXThemeProvider/index.js +2 -0
  312. package/src/components/utilities/DXTransitionGroup/DXTransitionGroup.stories.js +368 -0
  313. package/src/components/utilities/DXTransitionGroup/DXTransitionGroup.vue +212 -0
  314. package/src/components/utilities/DXTransitionGroup/index.js +2 -0
  315. package/src/components/utilities/index.js +9 -0
  316. package/src/composables/useAnimation.js +264 -0
  317. package/src/composables/useClassComposition.js +35 -0
  318. package/src/composables/useDataAttributes.js +83 -0
  319. package/src/composables/useMenu.js +88 -0
  320. package/src/composables/useSize.js +135 -0
  321. package/src/composables/useSpacing.js +37 -0
  322. package/src/composables/useTableColumns.js +88 -0
  323. package/src/composables/useTableData.js +82 -0
  324. package/src/composables/useTableFilter.js +158 -0
  325. package/src/composables/useTablePagination.js +89 -0
  326. package/src/composables/useTableSelection.js +77 -0
  327. package/src/composables/useTableSort.js +75 -0
  328. package/src/composables/useTabsScroll.js +88 -0
  329. package/src/composables/useVariant.js +700 -0
  330. package/src/index.js +86 -0
  331. package/src/styles/animations.css +171 -0
  332. package/src/styles/index.css +99 -0
  333. package/src/styles/tokens.js +123 -0
  334. package/src/utils/propTypes.js +77 -0
  335. 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,2 @@
1
+ export { default } from './DXLink.vue';
2
+
@@ -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
+
@@ -0,0 +1,2 @@
1
+ export { default } from './DXLoader.vue';
2
+