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,583 @@
1
+ <template>
2
+ <div
3
+ :class="interfaceClasses"
4
+ data-component="DXChatInterface"
5
+ :data-auto-scroll="autoScroll"
6
+ >
7
+ <!-- Header -->
8
+ <div v-if="showHeader || $slots.header" :class="headerClasses">
9
+ <slot name="header">
10
+ <div class="flex items-center justify-between">
11
+ <div class="flex items-center gap-3">
12
+ <DXAvatar
13
+ v-if="chatInfo?.avatar"
14
+ :src="chatInfo.avatar"
15
+ :name="chatInfo.name"
16
+ size="md"
17
+ />
18
+ <div>
19
+ <h3 class="font-semibold text-slate-900">
20
+ {{ chatInfo?.name || "Чат" }}
21
+ </h3>
22
+ <p v-if="chatInfo?.status" class="text-xs text-slate-500">
23
+ {{ chatInfo.status }}
24
+ </p>
25
+ </div>
26
+ </div>
27
+ <slot name="header-actions" />
28
+ </div>
29
+ </slot>
30
+ </div>
31
+
32
+ <!-- Messages List -->
33
+ <div ref="messagesContainer" :class="messagesClasses" @scroll="handleScroll">
34
+ <div
35
+ v-for="(group, groupIndex) in messageGroups"
36
+ :key="groupIndex"
37
+ class="mb-4"
38
+ >
39
+ <!-- Date Separator -->
40
+ <div v-if="group.date" :class="dateSeparatorClasses">
41
+ {{ formatDate(group.date) }}
42
+ </div>
43
+
44
+ <!-- Messages in Group -->
45
+ <div :class="groupMessagesClasses">
46
+ <div
47
+ v-for="message in group.messages"
48
+ :key="message.id"
49
+ :class="messageClasses(message)"
50
+ >
51
+ <slot
52
+ name="message"
53
+ :message="message"
54
+ :is-own="isOwnMessage(message)"
55
+ >
56
+ <div class="flex gap-3" :class="isOwnMessage(message) ? 'flex-row-reverse' : ''">
57
+ <DXAvatar
58
+ v-if="!isOwnMessage(message)"
59
+ :src="message.user?.avatar"
60
+ :name="message.user?.name"
61
+ size="sm"
62
+ />
63
+ <div
64
+ :class="[
65
+ 'flex-1 max-w-[70%]',
66
+ isOwnMessage(message) ? 'items-end' : 'items-start',
67
+ ]"
68
+ >
69
+ <div
70
+ v-if="!isOwnMessage(message)"
71
+ class="text-xs text-slate-500 mb-1"
72
+ >
73
+ {{ message.user?.name }}
74
+ </div>
75
+ <div
76
+ :class="[
77
+ 'rounded-lg px-4 py-2',
78
+ isOwnMessage(message)
79
+ ? 'bg-blue-500 text-white'
80
+ : 'bg-slate-100 text-slate-900',
81
+ ]"
82
+ >
83
+ <p class="text-sm">{{ message.text }}</p>
84
+ <div
85
+ v-if="message.files && message.files.length > 0"
86
+ class="mt-2 space-y-2"
87
+ >
88
+ <div
89
+ v-for="file in message.files"
90
+ :key="file.id"
91
+ class="flex items-center gap-2"
92
+ >
93
+ <DXIcon :icon="DocumentIcon" size="sm" />
94
+ <span class="text-xs">{{ file.name }}</span>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ <div class="flex items-center gap-1 mt-1" :class="isOwnMessage(message) ? 'justify-end' : 'justify-start'">
99
+ <span class="text-xs text-slate-500">
100
+ {{ formatTime(message.date) }}
101
+ </span>
102
+ <DXIcon
103
+ v-if="isOwnMessage(message) && message.status"
104
+ :icon="getStatusIcon(message.status)"
105
+ size="xs"
106
+ :class="statusIconClasses(message.status)"
107
+ />
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </slot>
112
+ </div>
113
+ </div>
114
+ </div>
115
+ </div>
116
+
117
+ <!-- Input Area -->
118
+ <div :class="inputClasses">
119
+ <slot name="input">
120
+ <div class="flex items-end gap-2">
121
+ <DXButton
122
+ v-if="allowFileUpload"
123
+ variant="ghost"
124
+ size="sm"
125
+ @click="triggerFileUpload"
126
+ >
127
+ <template #icon>
128
+ <DXIcon :icon="PaperClipIcon" size="sm" />
129
+ </template>
130
+ </DXButton>
131
+ <input
132
+ ref="fileInput"
133
+ type="file"
134
+ class="hidden"
135
+ multiple
136
+ @change="handleFileSelect"
137
+ />
138
+ <DXTextarea
139
+ v-model="messageText"
140
+ :placeholder="inputPlaceholder"
141
+ :rows="inputRows"
142
+ @keydown.enter.exact.prevent="handleSend"
143
+ @keydown.enter.shift.exact="handleNewLine"
144
+ />
145
+ <DXButton variant="primary" @click="handleSend" :disabled="!canSend">
146
+ <template #icon>
147
+ <DXIcon :icon="PaperAirplaneIcon" size="sm" />
148
+ </template>
149
+ </DXButton>
150
+ </div>
151
+ </slot>
152
+ </div>
153
+ </div>
154
+ </template>
155
+
156
+ <script setup>
157
+ import { ref, computed, watch, nextTick, onMounted } from "vue";
158
+ import { useClassComposition } from "@/composables/useClassComposition";
159
+ import { useSpacing } from "@/composables/useSpacing";
160
+ import DXAvatar from "../../atoms/DXAvatar/DXAvatar.vue";
161
+ import DXButton from "../../atoms/DXButton/DXButton.vue";
162
+ import DXIcon from "../../atoms/DXIcon/DXIcon.vue";
163
+ import DXTextarea from "../../molecules/DXTextarea/DXTextarea.vue";
164
+ import {
165
+ PaperClipIcon,
166
+ PaperAirplaneIcon,
167
+ DocumentIcon,
168
+ CheckIcon,
169
+ CheckCircleIcon,
170
+ } from "@heroicons/vue/24/outline";
171
+
172
+ const props = defineProps({
173
+ /**
174
+ * Сообщения
175
+ * Формат: [{ id, text, user: { id, name, avatar }, date, status?, files? }]
176
+ */
177
+ messages: {
178
+ type: Array,
179
+ required: true,
180
+ default: () => [],
181
+ },
182
+ /**
183
+ * Текущий пользователь
184
+ * Формат: { id, name, avatar? }
185
+ */
186
+ currentUser: {
187
+ type: Object,
188
+ required: true,
189
+ },
190
+ /**
191
+ * Информация о чате
192
+ * Формат: { name, avatar?, status? }
193
+ */
194
+ chatInfo: {
195
+ type: Object,
196
+ default: () => ({}),
197
+ },
198
+ /**
199
+ * Автоматический скролл к новым сообщениям
200
+ * @default true
201
+ */
202
+ autoScroll: { type: Boolean, default: true },
203
+ /**
204
+ * Показывать header
205
+ * @default true
206
+ */
207
+ showHeader: { type: Boolean, default: true },
208
+ /**
209
+ * Placeholder для поля ввода
210
+ */
211
+ inputPlaceholder: {
212
+ type: String,
213
+ default: "Введите сообщение...",
214
+ },
215
+ /**
216
+ * Количество строк в поле ввода
217
+ * @default 2
218
+ */
219
+ inputRows: { type: Number, default: 2 },
220
+ /**
221
+ * Разрешить загрузку файлов
222
+ * @default true
223
+ */
224
+ allowFileUpload: { type: Boolean, default: true },
225
+ });
226
+
227
+ const emit = defineEmits(["send-message", "upload-file", "scroll"]);
228
+
229
+ const messageText = ref("");
230
+ const messagesContainer = ref(null);
231
+ const fileInput = ref(null);
232
+ const isScrolledToBottom = ref(true);
233
+
234
+ /**
235
+ * Сгруппированные сообщения
236
+ *
237
+ * @description
238
+ * Группирует сообщения по дате и времени для отображения.
239
+ *
240
+ * @returns {Array} Массив групп сообщений
241
+ */
242
+ const messageGroups = computed(() => {
243
+ const groups = [];
244
+ let currentGroup = null;
245
+
246
+ props.messages.forEach((message) => {
247
+ const messageDate = new Date(message.date);
248
+ const groupDate = currentGroup
249
+ ? new Date(currentGroup.date)
250
+ : null;
251
+
252
+ // Проверяем, нужно ли создать новую группу (новая дата или большой разрыв во времени)
253
+ if (
254
+ !currentGroup ||
255
+ !groupDate ||
256
+ messageDate.toDateString() !== groupDate.toDateString() ||
257
+ messageDate - groupDate > 3600000 // 1 час
258
+ ) {
259
+ currentGroup = {
260
+ date: messageDate,
261
+ messages: [],
262
+ };
263
+ groups.push(currentGroup);
264
+ }
265
+
266
+ currentGroup.messages.push(message);
267
+ });
268
+
269
+ return groups;
270
+ });
271
+
272
+ /**
273
+ * Классы для интерфейса
274
+ *
275
+ * @description
276
+ * Базовые классы для интерфейса чата.
277
+ *
278
+ * @returns {Array} Массив классов
279
+ */
280
+ const interfaceClasses = computed(() =>
281
+ useClassComposition("flex flex-col h-full bg-white")
282
+ );
283
+
284
+ /**
285
+ * Классы для header
286
+ *
287
+ * @description
288
+ * Классы для секции заголовка.
289
+ *
290
+ * @returns {Array} Массив классов
291
+ */
292
+ const headerClasses = computed(() =>
293
+ useClassComposition(
294
+ "flex-shrink-0 border-b border-slate-200",
295
+ useSpacing("md", "padding")
296
+ )
297
+ );
298
+
299
+ /**
300
+ * Классы для списка сообщений
301
+ *
302
+ * @description
303
+ * Классы для контейнера сообщений.
304
+ *
305
+ * @returns {Array} Массив классов
306
+ */
307
+ const messagesClasses = computed(() =>
308
+ useClassComposition(
309
+ "flex-1 overflow-y-auto",
310
+ useSpacing("md", "padding")
311
+ )
312
+ );
313
+
314
+ /**
315
+ * Классы для разделителя даты
316
+ *
317
+ * @description
318
+ * Классы для разделителя даты между группами сообщений.
319
+ *
320
+ * @returns {Array} Массив классов
321
+ */
322
+ const dateSeparatorClasses = computed(() =>
323
+ useClassComposition(
324
+ "text-center text-xs text-slate-500 mb-4"
325
+ )
326
+ );
327
+
328
+ /**
329
+ * Классы для сообщений в группе
330
+ *
331
+ * @description
332
+ * Классы для контейнера сообщений в группе.
333
+ *
334
+ * @returns {Array} Массив классов
335
+ */
336
+ const groupMessagesClasses = computed(() =>
337
+ useClassComposition("space-y-2")
338
+ );
339
+
340
+ /**
341
+ * Классы для сообщения
342
+ *
343
+ * @description
344
+ * Классы для отдельного сообщения.
345
+ *
346
+ * @param {Object} message - Объект сообщения
347
+ * @returns {Array} Массив классов
348
+ */
349
+ function messageClasses(message) {
350
+ return useClassComposition("mb-2");
351
+ }
352
+
353
+ /**
354
+ * Классы для иконки статуса
355
+ *
356
+ * @description
357
+ * Классы для иконки статуса сообщения.
358
+ *
359
+ * @param {string} status - Статус сообщения
360
+ * @returns {string} Tailwind CSS классы
361
+ */
362
+ function statusIconClasses(status) {
363
+ const classes = {
364
+ sent: "text-slate-400",
365
+ delivered: "text-slate-400",
366
+ read: "text-blue-500",
367
+ };
368
+ return classes[status] || classes.sent;
369
+ }
370
+
371
+ /**
372
+ * Классы для области ввода
373
+ *
374
+ * @description
375
+ * Классы для секции ввода сообщения.
376
+ *
377
+ * @returns {Array} Массив классов
378
+ */
379
+ const inputClasses = computed(() =>
380
+ useClassComposition(
381
+ "flex-shrink-0 border-t border-slate-200",
382
+ useSpacing("md", "padding")
383
+ )
384
+ );
385
+
386
+ /**
387
+ * Можно ли отправить сообщение
388
+ *
389
+ * @description
390
+ * Проверяет, можно ли отправить сообщение (не пустое).
391
+ *
392
+ * @returns {boolean} true, если можно отправить
393
+ */
394
+ const canSend = computed(() => {
395
+ return messageText.value.trim().length > 0;
396
+ });
397
+
398
+ /**
399
+ * Проверка, является ли сообщение собственным
400
+ *
401
+ * @description
402
+ * Проверяет, принадлежит ли сообщение текущему пользователю.
403
+ *
404
+ * @param {Object} message - Объект сообщения
405
+ * @returns {boolean} true, если сообщение собственное
406
+ */
407
+ function isOwnMessage(message) {
408
+ return message.userId === props.currentUser.id;
409
+ }
410
+
411
+ /**
412
+ * Получение иконки статуса
413
+ *
414
+ * @description
415
+ * Возвращает иконку в зависимости от статуса сообщения.
416
+ *
417
+ * @param {string} status - Статус сообщения
418
+ * @returns {Object} Компонент иконки
419
+ */
420
+ function getStatusIcon(status) {
421
+ const icons = {
422
+ sent: CheckIcon,
423
+ delivered: CheckIcon,
424
+ read: CheckCircleIcon,
425
+ };
426
+ return icons[status] || CheckIcon;
427
+ }
428
+
429
+ /**
430
+ * Форматирование даты
431
+ *
432
+ * @description
433
+ * Форматирует дату для разделителя групп.
434
+ *
435
+ * @param {Date} date - Дата
436
+ * @returns {string} Отформатированная дата
437
+ */
438
+ function formatDate(date) {
439
+ if (!date) return "";
440
+ const d = new Date(date);
441
+ const today = new Date();
442
+ const yesterday = new Date(today);
443
+ yesterday.setDate(yesterday.getDate() - 1);
444
+
445
+ if (d.toDateString() === today.toDateString()) {
446
+ return "Сегодня";
447
+ } else if (d.toDateString() === yesterday.toDateString()) {
448
+ return "Вчера";
449
+ } else {
450
+ return d.toLocaleDateString("ru-RU", {
451
+ year: "numeric",
452
+ month: "long",
453
+ day: "numeric",
454
+ });
455
+ }
456
+ }
457
+
458
+ /**
459
+ * Форматирование времени
460
+ *
461
+ * @description
462
+ * Форматирует время для отображения.
463
+ *
464
+ * @param {Date|string} date - Дата
465
+ * @returns {string} Отформатированное время
466
+ */
467
+ function formatTime(date) {
468
+ if (!date) return "";
469
+ const d = new Date(date);
470
+ return d.toLocaleTimeString("ru-RU", {
471
+ hour: "2-digit",
472
+ minute: "2-digit",
473
+ });
474
+ }
475
+
476
+ /**
477
+ * Скролл к низу
478
+ *
479
+ * @description
480
+ * Прокручивает контейнер сообщений к самому низу.
481
+ */
482
+ function scrollToBottom() {
483
+ if (messagesContainer.value && props.autoScroll) {
484
+ nextTick(() => {
485
+ messagesContainer.value.scrollTop =
486
+ messagesContainer.value.scrollHeight;
487
+ });
488
+ }
489
+ }
490
+
491
+ /**
492
+ * Обработчик скролла
493
+ *
494
+ * @description
495
+ * Отслеживает позицию скролла для определения, находится ли пользователь внизу.
496
+ *
497
+ * @param {Event} event - Событие скролла
498
+ */
499
+ function handleScroll(event) {
500
+ const container = event.target;
501
+ const isAtBottom =
502
+ container.scrollHeight - container.scrollTop <=
503
+ container.clientHeight + 100;
504
+ isScrolledToBottom.value = isAtBottom;
505
+ emit("scroll", { isAtBottom, scrollTop: container.scrollTop });
506
+ }
507
+
508
+ /**
509
+ * Обработчик отправки сообщения
510
+ *
511
+ * @description
512
+ * Эмитит событие отправки сообщения и очищает поле ввода.
513
+ */
514
+ function handleSend() {
515
+ if (!canSend.value) return;
516
+
517
+ emit("send-message", {
518
+ text: messageText.value,
519
+ userId: props.currentUser.id,
520
+ date: new Date(),
521
+ });
522
+
523
+ messageText.value = "";
524
+ scrollToBottom();
525
+ }
526
+
527
+ /**
528
+ * Обработчик новой строки
529
+ *
530
+ * @description
531
+ * Позволяет вводить новую строку при Shift+Enter.
532
+ */
533
+ function handleNewLine() {
534
+ // Позволяем вводить новую строку
535
+ }
536
+
537
+ /**
538
+ * Триггер загрузки файла
539
+ *
540
+ * @description
541
+ * Открывает диалог выбора файла.
542
+ */
543
+ function triggerFileUpload() {
544
+ if (fileInput.value) {
545
+ fileInput.value.click();
546
+ }
547
+ }
548
+
549
+ /**
550
+ * Обработчик выбора файла
551
+ *
552
+ * @description
553
+ * Обрабатывает выбор файлов и эмитит событие загрузки.
554
+ *
555
+ * @param {Event} event - Событие выбора файла
556
+ */
557
+ function handleFileSelect(event) {
558
+ const files = Array.from(event.target.files);
559
+ if (files.length > 0) {
560
+ emit("upload-file", files);
561
+ }
562
+ // Очищаем input
563
+ if (fileInput.value) {
564
+ fileInput.value.value = "";
565
+ }
566
+ }
567
+
568
+ // Автоматический скролл при новых сообщениях
569
+ watch(
570
+ () => props.messages.length,
571
+ () => {
572
+ if (isScrolledToBottom.value) {
573
+ scrollToBottom();
574
+ }
575
+ }
576
+ );
577
+
578
+ // Скролл при монтировании
579
+ onMounted(() => {
580
+ scrollToBottom();
581
+ });
582
+ </script>
583
+
@@ -0,0 +1,2 @@
1
+ export { default } from './DXChatInterface.vue';
2
+