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,689 @@
1
+ import { ref } from 'vue';
2
+ import DXAppLayout from './DXAppLayout.vue';
3
+ import DXHeaderBar from '../DXHeaderBar/DXHeaderBar.vue';
4
+ import DXSidebarMenu from '../DXSidebarMenu/DXSidebarMenu.vue';
5
+ import DXContainer from '../../layout/DXContainer/DXContainer.vue';
6
+ import DXLink from '../../atoms/DXLink/DXLink.vue';
7
+ import DXButton from '../../atoms/DXButton/DXButton.vue';
8
+ import DXAvatar from '../../atoms/DXAvatar/DXAvatar.vue';
9
+ import DXDropdown from '../DXDropdown/DXDropdown.vue';
10
+ import DXInput from '../../molecules/DXInput/DXInput.vue';
11
+ import DXIcon from '../../atoms/DXIcon/DXIcon.vue';
12
+ import DXTabs from '../DXTabs/DXTabs.vue';
13
+ import { MagnifyingGlassIcon, BellIcon, Bars3Icon } from '@heroicons/vue/24/outline';
14
+
15
+ export default {
16
+ title: 'Organisms/DXAppLayout',
17
+ component: DXAppLayout,
18
+ tags: ['autodocs'],
19
+ parameters: {
20
+ layout: 'fullscreen',
21
+ docs: {
22
+ inlineStories: false,
23
+ iframeHeight: 800,
24
+ description: {
25
+ component: `
26
+ # DXAppLayout
27
+
28
+ Основной макет приложения, объединяющий header, sidebar, content и footer с поддержкой различных вариантов для разных задач.
29
+
30
+ ## Назначение
31
+
32
+ DXAppLayout предоставляет стандартизированную структуру для приложений с:
33
+ - Верхней панелью (header)
34
+ - Боковой навигацией (sidebar)
35
+ - Основным контентом (content)
36
+ - Нижним колонтитулом (footer)
37
+
38
+ ## Варианты Layout
39
+
40
+ ### Dashboard (по умолчанию)
41
+ Для дашбордов с множеством виджетов. Полнофункциональный header и sidebar, grid-based контентная область.
42
+
43
+ ### Content-Focused
44
+ Для блогов, статей, документации. Минималистичный header, широкий контент без sidebar (или скрываемый), фокус на читаемости.
45
+
46
+ ### Minimal
47
+ Для простых приложений. Только header и content, без sidebar и footer. Максимальная простота.
48
+
49
+ ### Split
50
+ Для приложений с двумя панелями (редакторы, сравнение). Два контентных слота (content-left, content-right) с разделителем.
51
+
52
+ ### Tabbed
53
+ Для приложений с вкладками. Header с табами (используется DXTabs), контент переключается через табы.
54
+
55
+ ## Архитектура
56
+
57
+ ### Использует
58
+ - \`useClassComposition\` - для композиции классов
59
+ - \`useSpacing\` - для управления отступами
60
+ - \`useCustomDataAttributes\` - для data-атрибутов
61
+ - \`DXHeaderBar\` - для верхней панели
62
+ - \`DXSidebarMenu\` - для боковой навигации
63
+ - \`DXContainer\` - для контентной области
64
+ - \`DXBackdrop\` - для overlay режима сайдбара
65
+
66
+ ### Используется в
67
+ - Основной макет всех страниц приложения
68
+ - Админ-панели и дашборды
69
+ - Приложения с боковой навигацией
70
+ - Блоги и документация
71
+ - Редакторы и инструменты разработки
72
+
73
+ ## Внутренняя логика
74
+
75
+ ### Режимы сайдбара
76
+ - **overlay**: Сайдбар накладывается поверх контента с backdrop
77
+ - **push**: Сайдбар сдвигает контент вправо
78
+ - **static**: Сайдбар в обычном потоке документа
79
+
80
+ ### Адаптивность
81
+ - На мобильных устройствах сайдбар скрывается (кроме overlay режима)
82
+ - В overlay режиме сайдбар открывается поверх контента
83
+ - Использует \`useSpacing\` для адаптивных отступов
84
+
85
+ ### Управление состоянием
86
+ - \`sidebarCollapsed\` - управляет свернутым состоянием
87
+ - \`sidebarMode\` - определяет режим отображения
88
+ - \`variant\` - определяет вариант layout
89
+ - События \`sidebar-toggle\` и \`sidebar-collapse\` для синхронизации состояния
90
+
91
+ ## Особенности
92
+
93
+ ### Slots
94
+ - \`header\` - верхняя панель (обычно DXHeaderBar)
95
+ - \`sidebar\` - боковая панель (обычно DXSidebarMenu)
96
+ - \`content\` - основной контент страницы (для всех вариантов кроме split)
97
+ - \`content-left\` - левая панель (только для split варианта)
98
+ - \`content-right\` - правая панель (только для split варианта)
99
+ - \`footer\` - нижний колонтитул (скрыт для minimal варианта)
100
+
101
+ ### Семантическая структура
102
+ Использует семантические HTML теги: \`<header>\`, \`<aside>\`, \`<main>\`, \`<footer>\`.
103
+
104
+ ### Spacing Props
105
+ Все отступы управляются через props (\`headerPadding\`, \`contentPadding\`, \`sidebarPadding\`, \`footerPadding\`) с использованием \`useSpacing\` composable.
106
+ `,
107
+ },
108
+ },
109
+ },
110
+ argTypes: {
111
+ variant: {
112
+ control: 'select',
113
+ options: ['dashboard', 'content', 'minimal', 'split', 'tabbed'],
114
+ description: 'Вариант layout для разных задач приложения.',
115
+ table: {
116
+ type: { summary: 'string' },
117
+ defaultValue: { summary: 'dashboard' },
118
+ category: 'Layout',
119
+ },
120
+ },
121
+ sidebarMode: {
122
+ control: 'select',
123
+ options: ['overlay', 'push', 'static'],
124
+ description: 'Режим отображения сайдбара: overlay (поверх контента), push (сдвигает контент), static (в потоке).',
125
+ table: {
126
+ type: { summary: 'string' },
127
+ defaultValue: { summary: 'static' },
128
+ category: 'Sidebar',
129
+ },
130
+ },
131
+ sidebarCollapsed: {
132
+ control: 'boolean',
133
+ description: 'Свернут ли сайдбар.',
134
+ table: {
135
+ type: { summary: 'boolean' },
136
+ defaultValue: { summary: 'false' },
137
+ category: 'Sidebar',
138
+ },
139
+ },
140
+ sidebarWidth: {
141
+ control: 'number',
142
+ description: 'Ширина сайдбара в пикселях (когда развернут).',
143
+ table: {
144
+ type: { summary: 'number' },
145
+ defaultValue: { summary: '256' },
146
+ category: 'Sidebar',
147
+ },
148
+ },
149
+ sidebarCollapsedWidth: {
150
+ control: 'number',
151
+ description: 'Ширина сайдбара в пикселях (когда свернут).',
152
+ table: {
153
+ type: { summary: 'number' },
154
+ defaultValue: { summary: '64' },
155
+ category: 'Sidebar',
156
+ },
157
+ },
158
+ showSidebarOnMobile: {
159
+ control: 'boolean',
160
+ description: 'Показывать сайдбар на мобильных устройствах.',
161
+ table: {
162
+ type: { summary: 'boolean' },
163
+ defaultValue: { summary: 'false' },
164
+ category: 'Sidebar',
165
+ },
166
+ },
167
+ backdropBlur: {
168
+ control: 'select',
169
+ options: ['none', 'sm', 'md', 'lg', 'xl'],
170
+ description: 'Уровень размытия backdrop для overlay режима.',
171
+ table: {
172
+ type: { summary: 'string' },
173
+ defaultValue: { summary: 'sm' },
174
+ category: 'Sidebar',
175
+ },
176
+ },
177
+ headerPadding: {
178
+ control: 'select',
179
+ options: ['', 'none', 'xs', 'sm', 'md', 'lg', 'xl'],
180
+ description: 'Отступы header секции.',
181
+ table: {
182
+ type: { summary: 'string' },
183
+ defaultValue: { summary: '' },
184
+ category: 'Spacing',
185
+ },
186
+ },
187
+ contentPadding: {
188
+ control: 'select',
189
+ options: ['', 'none', 'xs', 'sm', 'md', 'lg', 'xl'],
190
+ description: 'Отступы контентной области.',
191
+ table: {
192
+ type: { summary: 'string' },
193
+ defaultValue: { summary: '' },
194
+ category: 'Spacing',
195
+ },
196
+ },
197
+ sidebarPadding: {
198
+ control: 'select',
199
+ options: ['', 'none', 'xs', 'sm', 'md', 'lg', 'xl'],
200
+ description: 'Отступы sidebar секции.',
201
+ table: {
202
+ type: { summary: 'string' },
203
+ defaultValue: { summary: '' },
204
+ category: 'Spacing',
205
+ },
206
+ },
207
+ footerPadding: {
208
+ control: 'select',
209
+ options: ['', 'none', 'xs', 'sm', 'md', 'lg', 'xl'],
210
+ description: 'Отступы footer секции.',
211
+ table: {
212
+ type: { summary: 'string' },
213
+ defaultValue: { summary: '' },
214
+ category: 'Spacing',
215
+ },
216
+ },
217
+ },
218
+ };
219
+
220
+ const menuSections = [
221
+ {
222
+ title: 'Основное',
223
+ items: [
224
+ { id: 1, label: 'Главная', href: '/', icon: 'HomeIcon' },
225
+ { id: 2, label: 'Проекты', href: '/projects', icon: 'FolderIcon' },
226
+ { id: 3, label: 'Задачи', href: '/tasks', icon: 'CheckIcon' },
227
+ ],
228
+ },
229
+ {
230
+ title: 'Настройки',
231
+ items: [
232
+ { id: 4, label: 'Профиль', href: '/profile', icon: 'UserIcon' },
233
+ { id: 5, label: 'Настройки', href: '/settings', icon: 'CogIcon' },
234
+ ],
235
+ },
236
+ ];
237
+
238
+ export const Default = {
239
+ args: {
240
+ variant: 'dashboard',
241
+ sidebarMode: 'static',
242
+ sidebarCollapsed: false,
243
+ },
244
+ parameters: {
245
+ docs: {
246
+ inlineStories: false,
247
+ iframeHeight: 800,
248
+ description: {
249
+ story: 'Базовый layout с header, sidebar и content в static режиме.',
250
+ },
251
+ },
252
+ },
253
+ render: (args) => ({
254
+ components: { DXAppLayout, DXHeaderBar, DXSidebarMenu, DXContainer },
255
+ setup() {
256
+ return { args, menuSections };
257
+ },
258
+ template: `
259
+ <DXAppLayout v-bind="args">
260
+ <template #header>
261
+ <DXHeaderBar app-name="My Application" />
262
+ </template>
263
+ <template #sidebar>
264
+ <DXSidebarMenu :sections="menuSections" />
265
+ </template>
266
+ <template #content>
267
+ <DXContainer>
268
+ <h1 class="text-2xl font-bold mb-4">Добро пожаловать</h1>
269
+ <p class="text-slate-600">Это основной контент страницы.</p>
270
+ </DXContainer>
271
+ </template>
272
+ </DXAppLayout>
273
+ `,
274
+ }),
275
+ };
276
+
277
+ export const WithFullHeader = {
278
+ args: {
279
+ sidebarMode: 'static',
280
+ sidebarCollapsed: false,
281
+ },
282
+ parameters: {
283
+ docs: {
284
+ description: {
285
+ story: 'Layout с полнофункциональным header (навигация, поиск, действия).',
286
+ },
287
+ },
288
+ },
289
+ render: (args) => ({
290
+ components: { DXAppLayout, DXHeaderBar, DXSidebarMenu, DXContainer, DXLink, DXInput, DXButton, DXAvatar, DXDropdown, DXIcon },
291
+ setup() {
292
+ const searchQuery = ref('');
293
+ return { args, menuSections, searchQuery, MagnifyingGlassIcon, BellIcon };
294
+ },
295
+ template: `
296
+ <DXAppLayout v-bind="args">
297
+ <template #header>
298
+ <DXHeaderBar app-name="My Application">
299
+ <template #navigation>
300
+ <DXLink href="/dashboard" variant="ghost">Дашборд</DXLink>
301
+ <DXLink href="/projects" variant="ghost">Проекты</DXLink>
302
+ </template>
303
+ <template #search>
304
+ <DXInput
305
+ v-model="searchQuery"
306
+ placeholder="Поиск..."
307
+ size="sm"
308
+ >
309
+ <template #prefix>
310
+ <DXIcon :icon="MagnifyingGlassIcon" size="sm" class="text-slate-400" />
311
+ </template>
312
+ </DXInput>
313
+ </template>
314
+ <template #actions>
315
+ <DXButton variant="ghost" size="sm">
316
+ <template #icon>
317
+ <DXIcon :icon="BellIcon" size="md" />
318
+ </template>
319
+ </DXButton>
320
+ <DXDropdown>
321
+ <template #trigger>
322
+ <DXAvatar src="https://via.placeholder.com/40x40" size="sm" />
323
+ </template>
324
+ <div class="p-2">
325
+ <div class="px-3 py-2 text-sm text-slate-700">Профиль</div>
326
+ <div class="px-3 py-2 text-sm text-slate-700">Настройки</div>
327
+ <div class="px-3 py-2 text-sm text-slate-700">Выйти</div>
328
+ </div>
329
+ </DXDropdown>
330
+ </template>
331
+ </DXHeaderBar>
332
+ </template>
333
+ <template #sidebar>
334
+ <DXSidebarMenu :sections="menuSections" />
335
+ </template>
336
+ <template #content>
337
+ <DXContainer>
338
+ <h1 class="text-2xl font-bold mb-4">Дашборд</h1>
339
+ <p class="text-slate-600">Основной контент страницы.</p>
340
+ </DXContainer>
341
+ </template>
342
+ </DXAppLayout>
343
+ `,
344
+ }),
345
+ };
346
+
347
+ export const OverlayMode = {
348
+ args: {
349
+ sidebarMode: 'overlay',
350
+ sidebarCollapsed: false,
351
+ },
352
+ parameters: {
353
+ docs: {
354
+ inlineStories: false,
355
+ iframeHeight: 800,
356
+ description: {
357
+ story: 'Layout с overlay режимом сайдбара. Сайдбар накладывается поверх контента с backdrop.',
358
+ },
359
+ },
360
+ },
361
+ render: (args) => ({
362
+ components: { DXAppLayout, DXHeaderBar, DXSidebarMenu, DXContainer },
363
+ setup() {
364
+ return { args, menuSections };
365
+ },
366
+ template: `
367
+ <DXAppLayout v-bind="args">
368
+ <template #header>
369
+ <DXHeaderBar app-name="My Application" />
370
+ </template>
371
+ <template #sidebar>
372
+ <DXSidebarMenu :sections="menuSections" />
373
+ </template>
374
+ <template #content>
375
+ <DXContainer>
376
+ <h1 class="text-2xl font-bold mb-4">Overlay Mode</h1>
377
+ <p class="text-slate-600">Сайдбар накладывается поверх контента.</p>
378
+ </DXContainer>
379
+ </template>
380
+ </DXAppLayout>
381
+ `,
382
+ }),
383
+ };
384
+
385
+ export const PushMode = {
386
+ args: {
387
+ sidebarMode: 'push',
388
+ sidebarCollapsed: false,
389
+ },
390
+ parameters: {
391
+ docs: {
392
+ description: {
393
+ story: 'Layout с push режимом сайдбара. Сайдбар сдвигает контент вправо.',
394
+ },
395
+ },
396
+ },
397
+ render: (args) => ({
398
+ components: { DXAppLayout, DXHeaderBar, DXSidebarMenu, DXContainer },
399
+ setup() {
400
+ return { args, menuSections };
401
+ },
402
+ template: `
403
+ <DXAppLayout v-bind="args">
404
+ <template #header>
405
+ <DXHeaderBar app-name="My Application" />
406
+ </template>
407
+ <template #sidebar>
408
+ <DXSidebarMenu :sections="menuSections" />
409
+ </template>
410
+ <template #content>
411
+ <DXContainer>
412
+ <h1 class="text-2xl font-bold mb-4">Push Mode</h1>
413
+ <p class="text-slate-600">Сайдбар сдвигает контент вправо.</p>
414
+ </DXContainer>
415
+ </template>
416
+ </DXAppLayout>
417
+ `,
418
+ }),
419
+ };
420
+
421
+ export const WithFooter = {
422
+ args: {
423
+ sidebarMode: 'static',
424
+ sidebarCollapsed: false,
425
+ },
426
+ parameters: {
427
+ docs: {
428
+ description: {
429
+ story: 'Layout с footer секцией.',
430
+ },
431
+ },
432
+ },
433
+ render: (args) => ({
434
+ components: { DXAppLayout, DXHeaderBar, DXSidebarMenu, DXContainer },
435
+ setup() {
436
+ return { args, menuSections };
437
+ },
438
+ template: `
439
+ <DXAppLayout v-bind="args">
440
+ <template #header>
441
+ <DXHeaderBar app-name="My Application" />
442
+ </template>
443
+ <template #sidebar>
444
+ <DXSidebarMenu :sections="menuSections" />
445
+ </template>
446
+ <template #content>
447
+ <DXContainer>
448
+ <h1 class="text-2xl font-bold mb-4">Контент</h1>
449
+ <p class="text-slate-600">Основной контент страницы.</p>
450
+ </DXContainer>
451
+ </template>
452
+ <template #footer>
453
+ <footer class="bg-white border-t border-slate-200 py-4">
454
+ <DXContainer>
455
+ <p class="text-sm text-slate-500 text-center">© 2024 My Application. Все права защищены.</p>
456
+ </DXContainer>
457
+ </footer>
458
+ </template>
459
+ </DXAppLayout>
460
+ `,
461
+ }),
462
+ };
463
+
464
+ export const CollapsibleSidebar = {
465
+ args: {
466
+ sidebarMode: 'static',
467
+ sidebarCollapsed: false,
468
+ },
469
+ parameters: {
470
+ docs: {
471
+ description: {
472
+ story: 'Layout с коллапсируемым сайдбаром. Используйте контролы для переключения состояния.',
473
+ },
474
+ },
475
+ },
476
+ render: (args) => ({
477
+ components: { DXAppLayout, DXHeaderBar, DXSidebarMenu, DXContainer, DXButton },
478
+ setup() {
479
+ const collapsed = ref(false);
480
+ return { args, menuSections, collapsed };
481
+ },
482
+ template: `
483
+ <DXAppLayout v-bind="args" :sidebar-collapsed="collapsed">
484
+ <template #header>
485
+ <DXHeaderBar app-name="My Application">
486
+ <template #actions>
487
+ <DXButton @click="collapsed = !collapsed" variant="ghost" size="sm">
488
+ {{ collapsed ? 'Развернуть' : 'Свернуть' }}
489
+ </DXButton>
490
+ </template>
491
+ </DXHeaderBar>
492
+ </template>
493
+ <template #sidebar>
494
+ <DXSidebarMenu :sections="menuSections" :compact="collapsed" />
495
+ </template>
496
+ <template #content>
497
+ <DXContainer>
498
+ <h1 class="text-2xl font-bold mb-4">Коллапсируемый сайдбар</h1>
499
+ <p class="text-slate-600">Используйте кнопку в header для переключения состояния сайдбара.</p>
500
+ </DXContainer>
501
+ </template>
502
+ </DXAppLayout>
503
+ `,
504
+ }),
505
+ };
506
+
507
+ export const ContentFocused = {
508
+ args: {
509
+ variant: 'content',
510
+ sidebarMode: 'overlay',
511
+ sidebarCollapsed: true,
512
+ contentPadding: 'lg',
513
+ },
514
+ parameters: {
515
+ docs: {
516
+ inlineStories: false,
517
+ iframeHeight: 800,
518
+ description: {
519
+ story: 'Content-focused вариант для блогов, статей и документации. Минималистичный header, широкий контент, sidebar скрыт по умолчанию.',
520
+ },
521
+ },
522
+ },
523
+ render: (args) => ({
524
+ components: { DXAppLayout, DXHeaderBar, DXSidebarMenu, DXContainer },
525
+ setup() {
526
+ return { args, menuSections };
527
+ },
528
+ template: `
529
+ <DXAppLayout v-bind="args">
530
+ <template #header>
531
+ <DXHeaderBar app-name="My Blog" />
532
+ </template>
533
+ <template #sidebar>
534
+ <DXSidebarMenu :sections="menuSections" />
535
+ </template>
536
+ <template #content>
537
+ <DXContainer size="lg">
538
+ <article class="prose prose-slate max-w-none">
539
+ <h1>Заголовок статьи</h1>
540
+ <p>Это пример content-focused layout для блогов и документации. Контент имеет максимальную ширину для лучшей читаемости.</p>
541
+ <p>Sidebar скрыт по умолчанию и может быть открыт через overlay режим.</p>
542
+ </article>
543
+ </DXContainer>
544
+ </template>
545
+ </DXAppLayout>
546
+ `,
547
+ }),
548
+ };
549
+
550
+ export const Minimal = {
551
+ args: {
552
+ variant: 'minimal',
553
+ contentPadding: 'md',
554
+ },
555
+ parameters: {
556
+ docs: {
557
+ inlineStories: false,
558
+ iframeHeight: 800,
559
+ description: {
560
+ story: 'Minimal вариант для простых приложений. Только header и content, без sidebar и footer.',
561
+ },
562
+ },
563
+ },
564
+ render: (args) => ({
565
+ components: { DXAppLayout, DXHeaderBar, DXContainer },
566
+ setup() {
567
+ return { args };
568
+ },
569
+ template: `
570
+ <DXAppLayout v-bind="args">
571
+ <template #header>
572
+ <DXHeaderBar app-name="Simple App" />
573
+ </template>
574
+ <template #content>
575
+ <DXContainer>
576
+ <h1 class="text-2xl font-bold mb-4">Простое приложение</h1>
577
+ <p class="text-slate-600">Это минималистичный layout без sidebar и footer.</p>
578
+ </DXContainer>
579
+ </template>
580
+ </DXAppLayout>
581
+ `,
582
+ }),
583
+ };
584
+
585
+ export const Split = {
586
+ args: {
587
+ variant: 'split',
588
+ sidebarMode: 'static',
589
+ sidebarCollapsed: false,
590
+ contentPadding: 'md',
591
+ },
592
+ parameters: {
593
+ docs: {
594
+ inlineStories: false,
595
+ iframeHeight: 800,
596
+ description: {
597
+ story: 'Split вариант для приложений с двумя панелями (редакторы, сравнение). Использует слоты content-left и content-right.',
598
+ },
599
+ },
600
+ },
601
+ render: (args) => ({
602
+ components: { DXAppLayout, DXHeaderBar, DXSidebarMenu, DXContainer },
603
+ setup() {
604
+ return { args, menuSections };
605
+ },
606
+ template: `
607
+ <DXAppLayout v-bind="args">
608
+ <template #header>
609
+ <DXHeaderBar app-name="Code Editor" />
610
+ </template>
611
+ <template #sidebar>
612
+ <DXSidebarMenu :sections="menuSections" />
613
+ </template>
614
+ <template #content-left>
615
+ <div class="h-full bg-slate-50 p-4">
616
+ <h2 class="text-lg font-semibold mb-2">Левая панель</h2>
617
+ <p class="text-sm text-slate-600">Здесь может быть редактор кода или файловый менеджер.</p>
618
+ </div>
619
+ </template>
620
+ <template #content-right>
621
+ <div class="h-full bg-white p-4">
622
+ <h2 class="text-lg font-semibold mb-2">Правая панель</h2>
623
+ <p class="text-sm text-slate-600">Здесь может быть предпросмотр или результат.</p>
624
+ </div>
625
+ </template>
626
+ </DXAppLayout>
627
+ `,
628
+ }),
629
+ };
630
+
631
+ export const Tabbed = {
632
+ args: {
633
+ variant: 'tabbed',
634
+ sidebarMode: 'static',
635
+ sidebarCollapsed: false,
636
+ },
637
+ parameters: {
638
+ docs: {
639
+ inlineStories: false,
640
+ iframeHeight: 800,
641
+ description: {
642
+ story: 'Tabbed вариант для приложений с вкладками. Header содержит табы (используется DXTabs), контент переключается через табы.',
643
+ },
644
+ },
645
+ },
646
+ render: (args) => ({
647
+ components: { DXAppLayout, DXHeaderBar, DXSidebarMenu, DXContainer, DXTabs },
648
+ setup() {
649
+ const activeTab = ref('dashboard');
650
+ const tabs = [
651
+ { value: 'dashboard', label: 'Дашборд' },
652
+ { value: 'analytics', label: 'Аналитика' },
653
+ { value: 'settings', label: 'Настройки' },
654
+ ];
655
+ return { args, menuSections, activeTab, tabs };
656
+ },
657
+ template: `
658
+ <DXAppLayout v-bind="args">
659
+ <template #header>
660
+ <DXHeaderBar app-name="Dashboard">
661
+ <template #navigation>
662
+ <DXTabs v-model="activeTab" :tabs="tabs" variant="tabs-top" />
663
+ </template>
664
+ </DXHeaderBar>
665
+ </template>
666
+ <template #sidebar>
667
+ <DXSidebarMenu :sections="menuSections" />
668
+ </template>
669
+ <template #content>
670
+ <DXContainer>
671
+ <div v-if="activeTab === 'dashboard'">
672
+ <h1 class="text-2xl font-bold mb-4">Дашборд</h1>
673
+ <p class="text-slate-600">Контент дашборда.</p>
674
+ </div>
675
+ <div v-else-if="activeTab === 'analytics'">
676
+ <h1 class="text-2xl font-bold mb-4">Аналитика</h1>
677
+ <p class="text-slate-600">Контент аналитики.</p>
678
+ </div>
679
+ <div v-else-if="activeTab === 'settings'">
680
+ <h1 class="text-2xl font-bold mb-4">Настройки</h1>
681
+ <p class="text-slate-600">Контент настроек.</p>
682
+ </div>
683
+ </DXContainer>
684
+ </template>
685
+ </DXAppLayout>
686
+ `,
687
+ }),
688
+ };
689
+