dxd-style-code 0.1.10 → 0.1.12

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 (178) hide show
  1. package/dist/dxd-style-code.js +9785 -8652
  2. package/dist/dxd-style-code.umd.cjs +3 -3
  3. package/dist/style.css +1 -1
  4. package/package.json +2 -2
  5. package/src/components/atoms/DX/DX.stories.js +265 -0
  6. package/src/components/atoms/DX/DX.vue +80 -0
  7. package/src/components/atoms/DX/index.js +2 -0
  8. package/src/components/atoms/DXAvatar/DXAvatar.stories.js +1 -2
  9. package/src/components/atoms/DXBackdrop/DXBackdrop.stories.js +77 -1
  10. package/src/components/atoms/DXBadge/DXBadge.stories.js +83 -1
  11. package/src/components/atoms/DXBlockquote/DXBlockquote.stories.js +99 -0
  12. package/src/components/{layout → atoms}/DXBox/DXBox.stories.js +2 -2
  13. package/src/components/{layout → atoms}/DXBox/DXBox.vue +69 -2
  14. package/src/components/atoms/DXButton/DXButton.stories.js +94 -1
  15. package/src/components/atoms/DXButton/DXButton.vue +145 -11
  16. package/src/components/atoms/DXCard/DXCard.stories.js +72 -14
  17. package/src/components/atoms/DXCard/DXCard.vue +3 -4
  18. package/src/components/atoms/DXCheckbox/DXCheckbox.stories.js +85 -1
  19. package/src/components/atoms/DXCode/DXCode.stories.js +95 -0
  20. package/src/components/{layout → atoms}/DXContainer/DXContainer.stories.js +2 -2
  21. package/src/components/{layout → atoms}/DXContainer/DXContainer.vue +28 -1
  22. package/src/components/atoms/DXDivider/DXDivider.stories.js +84 -1
  23. package/src/components/{layout → atoms}/DXFlex/DXFlex.stories.js +2 -2
  24. package/src/components/{layout → atoms}/DXFlex/DXFlex.vue +57 -3
  25. package/src/components/atoms/DXFormLabel/DXFormLabel.stories.js +70 -1
  26. package/src/components/{layout → atoms}/DXGrid/DXGrid.stories.js +2 -2
  27. package/src/components/atoms/DXHeading/DXHeading.stories.js +143 -0
  28. package/src/components/atoms/DXIcon/DXIcon.stories.js +74 -0
  29. package/src/components/atoms/DXIconWrapper/DXIconWrapper.stories.js +69 -0
  30. package/src/components/atoms/DXImage/DXImage.stories.js +483 -0
  31. package/src/components/atoms/DXImage/DXImage.vue +294 -0
  32. package/src/components/atoms/DXImage/index.js +2 -0
  33. package/src/components/atoms/DXInputAddon/DXInputAddon.stories.js +86 -1
  34. package/src/components/atoms/DXLabel/DXLabel.stories.js +101 -0
  35. package/src/components/atoms/DXLink/DXLink.stories.js +75 -10
  36. package/src/components/atoms/DXLink/DXLink.vue +59 -3
  37. package/src/components/atoms/DXList/DXList.stories.js +125 -0
  38. package/src/components/atoms/DXLoader/DXLoader.stories.js +75 -1
  39. package/src/components/atoms/DXNav/DXNav.stories.js +236 -0
  40. package/src/components/atoms/DXNav/DXNav.vue +114 -0
  41. package/src/components/atoms/DXNav/index.js +2 -0
  42. package/src/components/atoms/DXProgress/DXProgress.stories.js +76 -1
  43. package/src/components/atoms/DXRadio/DXRadio.stories.js +85 -1
  44. package/src/components/atoms/DXSkeleton/DXSkeleton.stories.js +59 -1
  45. package/src/components/atoms/DXSlider/DXSlider.stories.js +89 -0
  46. package/src/components/{layout → atoms}/DXSpacer/DXSpacer.stories.js +2 -2
  47. package/src/components/{layout → atoms}/DXStack/DXStack.stories.js +2 -2
  48. package/src/components/{layout → atoms}/DXStack/DXStack.vue +5 -2
  49. package/src/components/atoms/DXTags/DXTags.stories.js +77 -0
  50. package/src/components/atoms/DXText/DXText.stories.js +129 -0
  51. package/src/components/atoms/DXToast/DXToast.stories.js +64 -1
  52. package/src/components/atoms/DXToggle/DXToggle.stories.js +84 -1
  53. package/src/components/atoms/DXToggleButton/DXToggleButton.stories.js +78 -1
  54. package/src/components/atoms/DXTooltip/DXTooltip.stories.js +98 -1
  55. package/src/components/atoms/index.js +16 -1
  56. package/src/components/index.js +1 -7
  57. package/src/components/molecules/DXActionButtons/DXActionButtons.stories.js +280 -77
  58. package/src/components/molecules/DXActionButtons/DXActionButtons.vue +31 -31
  59. package/src/components/molecules/DXAlert/DXAlert.stories.js +199 -1
  60. package/src/components/molecules/DXAlert/DXAlert.vue +35 -13
  61. package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.stories.js +125 -1
  62. package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.vue +22 -18
  63. package/src/components/molecules/DXButtonGroup/DXButtonGroup.stories.js +193 -6
  64. package/src/components/molecules/DXButtonGroup/DXButtonGroup.vue +39 -3
  65. package/src/components/molecules/DXCloseButton/DXCloseButton.stories.js +64 -1
  66. package/src/components/molecules/DXComboBox/DXComboBox.stories.js +66 -0
  67. package/src/components/molecules/DXCopyField/DXCopyField.stories.js +128 -1
  68. package/src/components/molecules/DXCopyField/DXCopyField.vue +60 -7
  69. package/src/components/molecules/DXDataFilter/DXDataFilter.vue +8 -6
  70. package/src/components/molecules/DXDatePicker/DXDatePicker.stories.js +58 -0
  71. package/src/components/molecules/DXFileUpload/DXFileUpload.stories.js +66 -0
  72. package/src/components/molecules/DXFilterGroup/DXFilterGroup.stories.js +61 -0
  73. package/src/components/molecules/DXFormControl/DXFormControl.stories.js +76 -0
  74. package/src/components/molecules/DXFormControl/DXFormControl.vue +9 -8
  75. package/src/components/molecules/DXInput/DXInput.stories.js +100 -1
  76. package/src/components/molecules/DXInputGroup/DXInputGroup.stories.js +89 -1
  77. package/src/components/molecules/DXInputMask/DXInputMask.stories.js +67 -0
  78. package/src/components/molecules/DXMenu/DXMenu.stories.js +111 -4
  79. package/src/components/molecules/DXMenu/DXMenu.vue +18 -5
  80. package/src/components/molecules/DXMenu/README.md +1 -1
  81. package/src/components/molecules/DXPagination/DXPagination.stories.js +105 -2
  82. package/src/components/molecules/DXPagination/DXPagination.vue +18 -33
  83. package/src/components/molecules/DXPasswordInput/DXPasswordInput.stories.js +67 -1
  84. package/src/components/molecules/DXRadioCard/DXRadioCard.stories.js +64 -0
  85. package/src/components/molecules/DXRadioGroup/DXRadioGroup.stories.js +84 -0
  86. package/src/components/molecules/DXRating/DXRating.stories.js +3 -2
  87. package/src/components/molecules/DXSearchBar/DXSearchBar.stories.js +1 -1
  88. package/src/components/molecules/DXSearchBar/DXSearchBar.vue +16 -12
  89. package/src/components/molecules/DXSearchSelect/DXSearchSelect.stories.js +71 -0
  90. package/src/components/molecules/DXSegmentedControl/DXSegmentedControl.stories.js +74 -0
  91. package/src/components/molecules/DXSelect/DXSelect.stories.js +92 -1
  92. package/src/components/molecules/DXStatCard/DXStatCard.stories.js +1 -1
  93. package/src/components/molecules/DXStatCard/DXStatCard.vue +30 -26
  94. package/src/components/molecules/DXTableFiltersPanel/index.js +2 -0
  95. package/src/components/molecules/DXTablePagination/DXTablePagination.stories.js +67 -0
  96. package/src/components/molecules/DXTableToolbar/DXTableToolbar.stories.js +71 -0
  97. package/src/components/molecules/DXTextarea/DXTextarea.stories.js +87 -1
  98. package/src/components/molecules/DXTimePicker/DXTimePicker.stories.js +1 -1
  99. package/src/components/molecules/DXValidationIcon/DXValidationIcon.stories.js +59 -1
  100. package/src/components/molecules/index.js +0 -1
  101. package/src/components/organisms/DXAccordion/DXAccordion.stories.js +75 -0
  102. package/src/components/organisms/DXAppLayout/DXAppLayout.stories.js +28 -26
  103. package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.stories.js +0 -2
  104. package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.vue +5 -8
  105. package/src/components/{molecules → organisms}/DXBaseTable/DXBaseTable.stories.js +78 -1
  106. package/src/components/{molecules → organisms}/DXBaseTable/DXBaseTable.vue +2 -2
  107. package/src/components/organisms/DXChartContainer/DXChartContainer.stories.js +1 -1
  108. package/src/components/organisms/DXChartContainer/DXChartContainer.vue +10 -6
  109. package/src/components/organisms/DXChatInterface/DXChatInterface.stories.js +1 -1
  110. package/src/components/organisms/DXChatInterface/DXChatInterface.vue +6 -4
  111. package/src/components/organisms/DXCommentSection/DXCommentSection.stories.js +1 -1
  112. package/src/components/organisms/DXCommentSection/DXCommentSection.vue +7 -6
  113. package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.stories.js +1 -1
  114. package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.vue +4 -2
  115. package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.stories.js +1 -1
  116. package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.vue +3 -2
  117. package/src/components/organisms/DXDataTable/DXDataTable.stories.js +1 -1
  118. package/src/components/organisms/DXDropdown/DXDropdown.stories.js +84 -1
  119. package/src/components/organisms/DXEmptyState/DXEmptyState.stories.js +64 -0
  120. package/src/components/organisms/DXEmptyState/DXEmptyState.vue +4 -2
  121. package/src/components/organisms/DXHeaderBar/DXHeaderBar.stories.js +409 -3
  122. package/src/components/organisms/DXHeaderBar/DXHeaderBar.vue +262 -53
  123. package/src/components/organisms/DXMediaGallery/DXMediaGallery.stories.js +1 -1
  124. package/src/components/organisms/DXMediaGallery/DXMediaGallery.vue +7 -5
  125. package/src/components/organisms/DXModal/DXModal.stories.js +93 -1
  126. package/src/components/organisms/DXModal/DXModal.vue +3 -2
  127. package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.stories.js +1 -1
  128. package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.vue +2 -1
  129. package/src/components/organisms/DXReportGenerator/DXReportGenerator.vue +4 -3
  130. package/src/components/organisms/DXSettingsPanel/DXSettingsPanel.vue +11 -8
  131. package/src/components/organisms/DXSidebar/DXSidebar.stories.js +1 -1
  132. package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.stories.js +104 -1
  133. package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.vue +14 -4
  134. package/src/components/organisms/DXSidebarMenu/README.md +3 -3
  135. package/src/components/organisms/DXTable/DXTable.stories.js +138 -11
  136. package/src/components/organisms/DXTable/DXTable.vue +1 -1
  137. package/src/components/organisms/DXTabs/DXTabs.stories.js +91 -1
  138. package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.stories.js +1 -1
  139. package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.vue +20 -18
  140. package/src/components/organisms/index.js +1 -0
  141. package/src/components/utilities/DXAnimatePresence/DXAnimatePresence.stories.js +1 -1
  142. package/src/components/utilities/DXBreakpointProvider/DXBreakpointProvider.stories.js +2 -2
  143. package/src/components/utilities/DXObserver/DXObserver.stories.js +1 -1
  144. package/src/components/utilities/DXPortal/DXPortal.stories.js +1 -1
  145. package/src/components/utilities/DXStaggeredAnimation/DXStaggeredAnimation.stories.js +2 -2
  146. package/src/components/utilities/DXThemeProvider/DXThemeProvider.stories.js +1 -1
  147. package/src/components/utilities/DXTransitionGroup/DXTransitionGroup.stories.js +1 -1
  148. package/src/composables/useSize.js +8 -1
  149. package/src/index.js +1 -7
  150. package/src/components/layout/index.js +0 -8
  151. package/src/components/typography/DXBlockquote/DXBlockquote.stories.js +0 -33
  152. package/src/components/typography/DXCode/DXCode.stories.js +0 -29
  153. package/src/components/typography/DXHeading/DXHeading.stories.js +0 -54
  154. package/src/components/typography/DXLabel/DXLabel.stories.js +0 -40
  155. package/src/components/typography/DXList/DXList.stories.js +0 -50
  156. package/src/components/typography/DXText/DXText.stories.js +0 -47
  157. package/src/components/typography/index.js +0 -8
  158. /package/src/components/{typography → atoms}/DXBlockquote/DXBlockquote.vue +0 -0
  159. /package/src/components/{typography → atoms}/DXBlockquote/index.js +0 -0
  160. /package/src/components/{layout → atoms}/DXBox/index.js +0 -0
  161. /package/src/components/{typography → atoms}/DXCode/DXCode.vue +0 -0
  162. /package/src/components/{typography → atoms}/DXCode/index.js +0 -0
  163. /package/src/components/{layout → atoms}/DXContainer/index.js +0 -0
  164. /package/src/components/{layout → atoms}/DXFlex/index.js +0 -0
  165. /package/src/components/{layout → atoms}/DXGrid/DXGrid.vue +0 -0
  166. /package/src/components/{layout → atoms}/DXGrid/index.js +0 -0
  167. /package/src/components/{typography → atoms}/DXHeading/DXHeading.vue +0 -0
  168. /package/src/components/{typography → atoms}/DXHeading/index.js +0 -0
  169. /package/src/components/{typography → atoms}/DXLabel/DXLabel.vue +0 -0
  170. /package/src/components/{typography → atoms}/DXLabel/index.js +0 -0
  171. /package/src/components/{typography → atoms}/DXList/DXList.vue +0 -0
  172. /package/src/components/{typography → atoms}/DXList/index.js +0 -0
  173. /package/src/components/{layout → atoms}/DXSpacer/DXSpacer.vue +0 -0
  174. /package/src/components/{layout → atoms}/DXSpacer/index.js +0 -0
  175. /package/src/components/{layout → atoms}/DXStack/index.js +0 -0
  176. /package/src/components/{typography → atoms}/DXText/DXText.vue +0 -0
  177. /package/src/components/{typography → atoms}/DXText/index.js +0 -0
  178. /package/src/components/{molecules → organisms}/DXBaseTable/index.js +0 -0
@@ -30,9 +30,9 @@
30
30
  :key="group.id || group.title"
31
31
  class="space-y-4"
32
32
  >
33
- <h4 v-if="group.title" class="text-sm font-semibold text-slate-700">
33
+ <DXHeading v-if="group.title" level="4" size="sm" weight="semibold" color="default">
34
34
  {{ group.title }}
35
- </h4>
35
+ </DXHeading>
36
36
  <div class="space-y-3">
37
37
  <slot
38
38
  :name="`setting-${group.id || group.title}`"
@@ -48,9 +48,9 @@
48
48
  <label class="text-sm font-medium text-slate-900">
49
49
  {{ setting.label }}
50
50
  </label>
51
- <p v-if="setting.description" class="text-xs text-slate-500 mt-1">
51
+ <DXText v-if="setting.description" tag="p" size="xs" color="muted" class="mt-1">
52
52
  {{ setting.description }}
53
- </p>
53
+ </DXText>
54
54
  </div>
55
55
  <div class="ml-4">
56
56
  <component
@@ -73,7 +73,7 @@
73
73
  <div v-else-if="layout === 'sidebar'" class="flex gap-6">
74
74
  <!-- Sidebar -->
75
75
  <div :class="sidebarClasses">
76
- <nav class="space-y-1">
76
+ <DXNav type="menu" class="space-y-1">
77
77
  <button
78
78
  v-for="category in categories"
79
79
  :key="category.id"
@@ -82,7 +82,7 @@
82
82
  >
83
83
  {{ category.label }}
84
84
  </button>
85
- </nav>
85
+ </DXNav>
86
86
  </div>
87
87
 
88
88
  <!-- Content -->
@@ -99,9 +99,9 @@
99
99
  :key="group.id || group.title"
100
100
  class="space-y-4"
101
101
  >
102
- <h4 v-if="group.title" class="text-sm font-semibold text-slate-700">
102
+ <DXHeading v-if="group.title" level="4" size="sm" weight="semibold" color="default">
103
103
  {{ group.title }}
104
- </h4>
104
+ </DXHeading>
105
105
  <div class="space-y-3">
106
106
  <div
107
107
  v-for="setting in group.settings"
@@ -152,6 +152,9 @@ import DXSelect from "../../molecules/DXSelect/DXSelect.vue";
152
152
  import DXToggle from "../../atoms/DXToggle/DXToggle.vue";
153
153
  import DXTabs from "../DXTabs/DXTabs.vue";
154
154
  import DXButton from "../../atoms/DXButton/DXButton.vue";
155
+ import DXHeading from "../../atoms/DXHeading/DXHeading.vue";
156
+ import DXText from "../../atoms/DXText/DXText.vue";
157
+ import DXNav from "../../atoms/DXNav/DXNav.vue";
155
158
  import { MagnifyingGlassIcon } from "@heroicons/vue/24/outline";
156
159
 
157
160
  const props = defineProps({
@@ -8,7 +8,7 @@ import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/vue/24/outline';
8
8
  export default {
9
9
  title: 'Organisms/DXSidebar',
10
10
  component: DXSidebar,
11
- tags: ['autodocs'],
11
+ tags: ['autodocs', 'category:navigation'],
12
12
  parameters: {
13
13
  docs: {
14
14
  description: {
@@ -21,7 +21,110 @@ import {
21
21
  export default {
22
22
  title: 'Organisms/DXSidebarMenu',
23
23
  component: DXSidebarMenu,
24
- tags: ['autodocs'],
24
+ tags: ['autodocs', 'category:navigation'],
25
+ parameters: {
26
+ docs: {
27
+ description: {
28
+ component: `
29
+ # DXSidebarMenu
30
+
31
+ Компонент меню боковой панели с поддержкой секций, вложенных элементов, поиска и compact режима.
32
+
33
+ ## Назначение
34
+
35
+ DXSidebarMenu предоставляет полнофункциональное меню для боковой панели с поддержкой
36
+ секций, вложенных элементов (children), иконок, badges, поиска и компактного режима.
37
+ Компонент автоматически управляет активным элементом и поддерживает роутинг.
38
+
39
+ ## Архитектура
40
+
41
+ ### Использует
42
+ - \`DXNav\` - для обертки навигации
43
+ - \`DXSidebarMenuItem\` - для элементов меню
44
+ - \`DXInput\` - для поиска
45
+ - \`DXIcon\` - для иконок
46
+ - \`DXDivider\` - для разделителей
47
+ - \`DXHeading\` - для заголовка
48
+ - \`useMenu\` composable - для логики меню
49
+
50
+ ### Используется в
51
+ - \`DXSidebar\` - для боковой панели
52
+ - \`DXAppLayout\` - для навигации приложения
53
+ - Самостоятельные боковые меню
54
+
55
+ ## Внутренняя логика
56
+
57
+ ### Структура данных
58
+ Меню состоит из секций, каждая секция содержит массив элементов:
59
+ \`\`\`
60
+ [{
61
+ title?: 'Section Title',
62
+ items: [{
63
+ id: 'item-id',
64
+ label: 'Item Label',
65
+ icon?: Icon,
66
+ to?: '/path',
67
+ badge?: '5',
68
+ badgeVariant?: 'danger',
69
+ children?: [...]
70
+ }]
71
+ }]
72
+ \`\`\`
73
+
74
+ ### Поиск
75
+ При \`searchable={true}\` и \`!compact\`:
76
+ - Отображается поисковая строка
77
+ - Фильтруются элементы меню по \`label\`
78
+ - Поиск нечувствителен к регистру
79
+
80
+ ### Compact режим
81
+ При \`compact={true}\`:
82
+ - Скрывается текст, показываются только иконки
83
+ - Скрываются заголовки секций (показываются разделители)
84
+ - Скрывается поиск
85
+ - Скрывается футер
86
+ - Меню становится компактным
87
+
88
+ ### Collapsible
89
+ При \`collapsible={true}\`:
90
+ - Отображается кнопка для переключения compact режима
91
+ - Кнопка автоматически позиционируется
92
+
93
+ ### Активный элемент
94
+ Активный элемент определяется через:
95
+ - \`activeItem\` prop (приоритет)
96
+ - \`$route.path\` (если используется Vue Router)
97
+ - Сравнение \`to\` с текущим маршрутом
98
+
99
+ ### Вложенные элементы
100
+ Элементы могут иметь \`children\` для создания вложенной структуры:
101
+ - Вложенные элементы отображаются при клике на родительский
102
+ - Поддерживается многоуровневая вложенность
103
+
104
+ ## Особенности
105
+
106
+ ### Слоты
107
+ - **header** - кастомный заголовок
108
+ - **footer** - кастомный футер (скрывается в compact режиме)
109
+
110
+ ### Ширина
111
+ Поддерживает 4 варианта ширины:
112
+ - **sm** - маленькая
113
+ - **md** - средняя (по умолчанию)
114
+ - **lg** - большая
115
+ - **full** - на всю ширину
116
+
117
+ ### Badges
118
+ Элементы могут иметь badges для отображения счетчиков:
119
+ - \`badge\` - текст badge
120
+ - \`badgeVariant\` - вариант badge (danger, info, success и т.д.)
121
+
122
+ ### Роутинг
123
+ Поддерживает интеграцию с Vue Router через \`to\` prop в элементах меню.
124
+ `,
125
+ },
126
+ },
127
+ },
25
128
  argTypes: {
26
129
  showHeader: {
27
130
  control: { type: 'boolean' },
@@ -7,7 +7,7 @@
7
7
  <!-- Заголовок -->
8
8
  <div v-if="shouldShowHeader" :class="headerClasses">
9
9
  <slot v-if="!compact" name="header">
10
- <h2 v-if="title" :class="headerTitleClasses">{{ title }}</h2>
10
+ <DXHeading v-if="title" level="2" :size="headerSizeMap" weight="bold" color="default" :class="headerTitleClasses">{{ title }}</DXHeading>
11
11
  </slot>
12
12
 
13
13
  <!-- Кнопка переключения compact режима -->
@@ -42,7 +42,7 @@
42
42
  </div>
43
43
 
44
44
  <!-- Меню -->
45
- <nav :class="menuClasses">
45
+ <DXNav type="menu" :class="menuClasses">
46
46
  <div
47
47
  v-for="(section, sectionIndex) in filteredSections"
48
48
  :key="sectionIndex"
@@ -70,7 +70,7 @@
70
70
  @child-click="handleItemClick"
71
71
  />
72
72
  </div>
73
- </nav>
73
+ </DXNav>
74
74
 
75
75
  <!-- Футер -->
76
76
  <div v-if="$slots.footer && !compact" :class="footerClasses">
@@ -91,6 +91,8 @@ import DXSidebarMenuItem from './DXSidebarMenuItem.vue';
91
91
  import DXInput from '../../molecules/DXInput/DXInput.vue';
92
92
  import DXIcon from '../../atoms/DXIcon/DXIcon.vue';
93
93
  import DXDivider from '../../atoms/DXDivider/DXDivider.vue';
94
+ import DXHeading from '../../atoms/DXHeading/DXHeading.vue';
95
+ import DXNav from '../../atoms/DXNav/DXNav.vue';
94
96
 
95
97
  const $slots = useSlots();
96
98
 
@@ -220,10 +222,18 @@ const headerClasses = computed(() => [
220
222
  ]);
221
223
 
222
224
  const headerTitleClasses = computed(() => [
223
- 'font-bold text-slate-900',
224
225
  HEADER_SIZE_CLASSES[props.headerSize].title
225
226
  ]);
226
227
 
228
+ const headerSizeMap = computed(() => {
229
+ const sizeMap = {
230
+ sm: 'base',
231
+ md: 'lg',
232
+ lg: 'xl',
233
+ };
234
+ return sizeMap[props.headerSize] || sizeMap.md;
235
+ });
236
+
227
237
  const menuClasses = computed(() => [
228
238
  'flex-1 overflow-y-auto py-4 px-3 space-y-6',
229
239
  internalCompact.value && 'px-2'
@@ -165,8 +165,8 @@ const currentPage = ref('/home');
165
165
  A
166
166
  </div>
167
167
  <div>
168
- <h2 class="text-sm font-bold">Admin Panel</h2>
169
- <p class="text-xs text-slate-500">v2.0.0</p>
168
+ <DXHeading level="2" size="sm" weight="bold">Admin Panel</DXHeading>
169
+ <DXText tag="p" size="xs" color="muted">v2.0.0</DXText>
170
170
  </div>
171
171
  </div>
172
172
  </template>
@@ -257,7 +257,7 @@ const sections = [
257
257
  <span class="text-white font-bold">S</span>
258
258
  </div>
259
259
  <div>
260
- <h2 class="text-sm font-bold">Shop Admin</h2>
260
+ <DXHeading level="2" size="sm" weight="bold">Shop Admin</DXHeading>
261
261
  </div>
262
262
  </div>
263
263
  </template>
@@ -2,11 +2,138 @@ import { ref } from 'vue';
2
2
  import DXTable from './DXTable.vue';
3
3
  import DXButton from '../../atoms/DXButton/DXButton.vue';
4
4
  import DXBadge from '../../atoms/DXBadge/DXBadge.vue';
5
+ import DXHeading from '../../atoms/DXHeading/DXHeading.vue';
6
+ import DXText from '../../atoms/DXText/DXText.vue';
5
7
 
6
8
  export default {
7
9
  title: 'Organisms/DXTable',
8
10
  component: DXTable,
9
- tags: ['autodocs'],
11
+ tags: ['autodocs', 'category:data-display'],
12
+ parameters: {
13
+ docs: {
14
+ description: {
15
+ component: `
16
+ # DXTable
17
+
18
+ Полнофункциональная таблица данных с поддержкой сортировки, фильтрации, поиска, пагинации и выбора строк.
19
+
20
+ ## Назначение
21
+
22
+ DXTable предоставляет комплексное решение для отображения и управления табличными данными. Компонент поддерживает
23
+ локальную и API-режимы работы, сортировку, фильтрацию, поиск, пагинацию, выбор строк, группировку и множество
24
+ настроек визуального оформления.
25
+
26
+ ## Архитектура
27
+
28
+ ### Использует
29
+ - \`DXBaseTable\` - базовая таблица для отображения данных
30
+ - \`DXTableToolbar\` - панель инструментов с поиском и переключением колонок
31
+ - \`DXTablePagination\` - пагинация с выбором размера страницы
32
+ - \`DXTableFiltersPanel\` - панель активных фильтров
33
+ - Composables:
34
+ - \`useTableData\` - управление данными (локальные/API)
35
+ - \`useTableSort\` - сортировка данных
36
+ - \`useTableFilter\` - фильтрация и поиск
37
+ - \`useTablePagination\` - пагинация
38
+ - \`useTableSelection\` - выбор строк
39
+ - \`useTableColumns\` - управление видимостью колонок
40
+
41
+ ### Используется в
42
+ - Списки пользователей
43
+ - Таблицы заказов
44
+ - Административные панели
45
+ - Отчеты и аналитика
46
+ - Любые места, требующие отображения структурированных данных
47
+
48
+ ## Внутренняя логика
49
+
50
+ ### Режимы работы с данными
51
+ - **local** (по умолчанию): Данные обрабатываются локально, все операции (сортировка, фильтрация, пагинация) выполняются на клиенте
52
+ - **api**: Данные загружаются с сервера, операции выполняются на сервере через API запросы
53
+
54
+ ### Структура колонок
55
+ Каждая колонка может иметь:
56
+ - \`key\` - ключ поля в данных
57
+ - \`label\` - заголовок колонки
58
+ - \`sortable\` - можно ли сортировать
59
+ - \`filterable\` - можно ли фильтровать
60
+ - \`filterOptions\` - опции фильтра (если не указаны, собираются автоматически из данных)
61
+ - \`width\` - ширина колонки
62
+ - \`align\` - выравнивание (left, center, right)
63
+ - \`format\` - функция форматирования значения
64
+
65
+ ### Сортировка
66
+ - Поддерживает сортировку по любой колонке с \`sortable={true}\`
67
+ - Три состояния: нет сортировки → asc → desc → нет сортировки
68
+ - Можно задать начальную сортировку через \`defaultSort\`
69
+ - Событие \`sort\` при изменении сортировки
70
+
71
+ ### Фильтрация
72
+ - Поддерживает фильтрацию по любой колонке с \`filterable={true}\`
73
+ - Опции фильтра могут быть заданы явно через \`filterOptions\` или собираются автоматически
74
+ - Панель активных фильтров показывает примененные фильтры
75
+ - Событие \`filter\` при изменении фильтров
76
+
77
+ ### Поиск
78
+ - Глобальный поиск по всем колонкам (если \`searchable={true}\`)
79
+ - Поиск выполняется в реальном времени
80
+ - Отображается в тулбаре
81
+
82
+ ### Пагинация
83
+ - Поддерживает пагинацию (если \`paginated={true}\`)
84
+ - Настраиваемый размер страницы (по умолчанию 10)
85
+ - Опции размера страницы: [10, 25, 50, 100] (настраивается)
86
+ - События: \`page-change\`, \`page-size-change\`
87
+
88
+ ### Выбор строк
89
+ - Поддерживает выбор строк (если \`selectable={true}\`)
90
+ - Чекбокс в заголовке для выбора всех
91
+ - События: \`row-select\`, \`select-all\`, \`selection-clear\`
92
+
93
+ ### Группировка
94
+ - Поддерживает группировку по колонке (через \`groupBy\` prop)
95
+ - Группы отображаются с заголовками
96
+
97
+ ## Особенности
98
+
99
+ ### Размеры
100
+ Поддерживает три размера: \`sm\`, \`md\` (по умолчанию), \`lg\`.
101
+
102
+ ### Визуальные опции
103
+ - **stickyHeader** - фиксированный заголовок при прокрутке (по умолчанию true)
104
+ - **striped** - чередующиеся цвета строк
105
+ - **bordered** - границы вокруг ячеек
106
+ - **hoverable** - эффект при наведении на строку (по умолчанию true)
107
+ - **dense** - компактный режим
108
+
109
+ ### Тулбар
110
+ - Поиск (если \`searchable={true}\`)
111
+ - Переключение видимости колонок (если \`columnToggle={true}\`)
112
+ - Слот \`toolbar-actions\` для кастомных действий
113
+ - Счетчик выбранных строк
114
+
115
+ ### Слоты
116
+ - \`toolbar-actions\` - действия в тулбаре
117
+ - Слоты для кастомизации ячеек: \`cell-[columnKey]\`
118
+ - Слоты для кастомизации заголовков: \`header-[columnKey]\`
119
+ - Слоты для действий строк: \`actions\`
120
+
121
+ ### События
122
+ - \`row-click\` - клик по строке
123
+ - \`row-select\` - выбор строки
124
+ - \`select-all\` - выбор всех строк
125
+ - \`sort\` - изменение сортировки
126
+ - \`filter\` - изменение фильтров
127
+ - \`page-change\` - изменение страницы
128
+ - \`page-size-change\` - изменение размера страницы
129
+ - \`edit\` - редактирование строки
130
+ - \`delete\` - удаление строки
131
+ - \`data-loaded\` - данные загружены (для API режима)
132
+ - \`error\` - ошибка загрузки данных
133
+ `,
134
+ },
135
+ },
136
+ },
10
137
  };
11
138
 
12
139
  // Sample data
@@ -161,11 +288,11 @@ export const WithFilters = {
161
288
  },
162
289
  template: `
163
290
  <div class="p-4">
164
- <h3 class="text-lg font-semibold mb-4">Фильтры в заголовках столбцов</h3>
165
- <p class="text-sm text-slate-600 mb-4">
291
+ <DXHeading level="3" size="lg" weight="semibold" class="mb-4">Фильтры в заголовках столбцов</DXHeading>
292
+ <DXText tag="p" size="sm" color="muted" class="mb-4">
166
293
  Кликните на иконку воронки в заголовке столбца, чтобы открыть фильтр.
167
294
  Активные фильтры отображаются в панели над таблицей.
168
- </p>
295
+ </DXText>
169
296
  <DXTable
170
297
  :columns="columns"
171
298
  :data="data"
@@ -187,10 +314,10 @@ export const WithFilterOptions = {
187
314
  },
188
315
  template: `
189
316
  <div class="p-4">
190
- <h3 class="text-lg font-semibold mb-4">Фильтры с предопределенными опциями</h3>
191
- <p class="text-sm text-slate-600 mb-4">
317
+ <DXHeading level="3" size="lg" weight="semibold" class="mb-4">Фильтры с предопределенными опциями</DXHeading>
318
+ <DXText tag="p" size="sm" color="muted" class="mb-4">
192
319
  Некоторые столбцы имеют предопределенные опции фильтрации.
193
- </p>
320
+ </DXText>
194
321
  <DXTable
195
322
  :columns="columns"
196
323
  :data="data"
@@ -213,11 +340,11 @@ export const WithMultipleFilters = {
213
340
  },
214
341
  template: `
215
342
  <div class="p-4">
216
- <h3 class="text-lg font-semibold mb-4">Множественные активные фильтры</h3>
217
- <p class="text-sm text-slate-600 mb-4">
343
+ <DXHeading level="3" size="lg" weight="semibold" class="mb-4">Множественные активные фильтры</DXHeading>
344
+ <DXText tag="p" size="sm" color="muted" class="mb-4">
218
345
  Примените несколько фильтров одновременно. Все активные фильтры
219
346
  отображаются в панели над таблицей с возможностью удаления.
220
- </p>
347
+ </DXText>
221
348
  <DXTable
222
349
  :columns="columns"
223
350
  :data="data"
@@ -421,7 +548,7 @@ export const CustomCells = {
421
548
  </template>
422
549
 
423
550
  <template #cell-role="{ value }">
424
- <span class="font-semibold text-blue-600">{{ value }}</span>
551
+ <DXText tag="span" weight="semibold" color="primary">{{ value }}</DXText>
425
552
  </template>
426
553
 
427
554
  <template #actions="{ row }">
@@ -80,7 +80,7 @@ import { computed, useSlots } from 'vue';
80
80
  const slots = useSlots();
81
81
 
82
82
  // Components
83
- import DXBaseTable from '../../molecules/DXBaseTable/DXBaseTable.vue';
83
+ import DXBaseTable from '../DXBaseTable/DXBaseTable.vue';
84
84
  import DXTableToolbar from '../../molecules/DXTableToolbar/DXTableToolbar.vue';
85
85
  import DXTablePagination from '../../molecules/DXTablePagination/DXTablePagination.vue';
86
86
  import DXTableFiltersPanel from '../../molecules/DXTableFiltersPanel/DXTableFiltersPanel.vue';
@@ -16,7 +16,97 @@ import {
16
16
  export default {
17
17
  title: 'Organisms/DXTabs',
18
18
  component: DXTabs,
19
- tags: ['autodocs'],
19
+ tags: ['autodocs', 'category:navigation'],
20
+ parameters: {
21
+ docs: {
22
+ description: {
23
+ component: `
24
+ # DXTabs
25
+
26
+ Компонент вкладок с поддержкой иконок, счетчиков, различных вариантов оформления и компактного режима.
27
+
28
+ ## Назначение
29
+
30
+ DXTabs предоставляет способ организации контента в виде вкладок. Компонент поддерживает различные варианты
31
+ визуального оформления, иконки, счетчики, анимации и компактный режим для адаптации под различные размеры экранов.
32
+
33
+ ## Архитектура
34
+
35
+ ### Использует
36
+ - \`DXIcon\` - для отображения иконок во вкладках
37
+ - Анимации иконок - для интерактивности
38
+
39
+ ### Используется в
40
+ - Навигация по разделам
41
+ - Переключение режимов отображения
42
+ - Фильтрация контента
43
+ - Настройки с категориями
44
+ - Любые места, требующие организации контента по вкладкам
45
+
46
+ ## Внутренняя логика
47
+
48
+ ### Варианты оформления
49
+ - **buttons** (по умолчанию): Вкладки выглядят как кнопки с фоном
50
+ - **tabs-top**: Классические вкладки с подчеркиванием сверху
51
+ - **tabs-bottom**: Вкладки с подчеркиванием снизу
52
+
53
+ ### Выравнивание
54
+ Поддерживает три варианта выравнивания:
55
+ - **left** (по умолчанию) - выравнивание по левому краю
56
+ - **center** - выравнивание по центру
57
+ - **right** - выравнивание по правому краю
58
+
59
+ ### Структура табов
60
+ Каждый таб может содержать:
61
+ - \`value\` - уникальное значение таба (обязательно)
62
+ - \`label\` - текст таба (обязательно)
63
+ - \`icon\` - иконка (Heroicon компонент, опционально)
64
+ - \`count\` - счетчик (число, опционально)
65
+ - \`iconAnimation\` - анимация иконки для конкретного таба (опционально)
66
+
67
+ ### Компактный режим
68
+ При \`compact={true}\`:
69
+ - В неактивных табах скрывается текст, показываются только иконки
70
+ - В активном табе или при наведении текст показывается
71
+ - Режим \`icon-badge\` показывает иконку и счетчик
72
+ - Режим \`icon\` показывает только иконку
73
+
74
+ ### Прокрутка
75
+ При \`scrollable={true}\` (по умолчанию):
76
+ - Если табы не помещаются в контейнер, появляется горизонтальная прокрутка
77
+ - Прокрутка автоматически центрирует активный таб
78
+
79
+ ### Анимации иконок
80
+ - Глобальная анимация через \`iconAnimation\` prop
81
+ - Индивидуальная анимация через \`iconAnimation\` в объекте таба
82
+ - Поддерживаемые анимации: \`none\`, \`wiggle\`, \`scale\`, \`rotate\`
83
+
84
+ ## Особенности
85
+
86
+ ### v-model
87
+ Полностью поддерживает двустороннее связывание через \`v-model\` для значения активного таба.
88
+
89
+ ### Счетчики
90
+ - Счетчики отображаются как бейджи справа от текста/иконки
91
+ - В активном табе счетчик имеет темный фон
92
+ - В неактивных табах счетчик имеет светлый фон
93
+
94
+ ### Состояния
95
+ - **active** - активный таб (визуально выделен)
96
+ - **hover** - таб при наведении
97
+ - **disabled** - отключенный таб (если поддерживается)
98
+
99
+ ### Доступность
100
+ - Использует \`role="tab"\` для семантики
101
+ - \`aria-selected\` для указания активного таба
102
+ - Поддержка клавиатурной навигации
103
+
104
+ ### Интеграция с контентом
105
+ DXTabs управляет только самими вкладками. Контент вкладок должен управляться отдельно через условный рендеринг на основе \`v-model\` значения.
106
+ `,
107
+ },
108
+ },
109
+ },
20
110
  argTypes: {
21
111
  variant: {
22
112
  control: 'select',
@@ -4,7 +4,7 @@ import DXUserProfileCard from './DXUserProfileCard.vue';
4
4
  export default {
5
5
  title: 'Organisms/DXUserProfileCard',
6
6
  component: DXUserProfileCard,
7
- tags: ['autodocs'],
7
+ tags: ['autodocs', 'category:data-display'],
8
8
  parameters: {
9
9
  docs: {
10
10
  description: {
@@ -22,15 +22,15 @@
22
22
  <!-- Info -->
23
23
  <div :class="infoClasses">
24
24
  <slot name="info">
25
- <h3 v-if="user?.name" :class="nameClasses">
25
+ <DXHeading v-if="user?.name" :level="3" :size="nameSize" weight="semibold" color="default">
26
26
  {{ user.name }}
27
- </h3>
28
- <p v-if="user?.role" :class="roleClasses">
27
+ </DXHeading>
28
+ <DXText v-if="user?.role" tag="p" :size="roleSize" color="muted" class="mt-1">
29
29
  {{ user.role }}
30
- </p>
31
- <p v-if="user?.bio" :class="bioClasses">
30
+ </DXText>
31
+ <DXText v-if="user?.bio" tag="p" :size="bioSize" color="muted" class="mt-2">
32
32
  {{ user.bio }}
33
- </p>
33
+ </DXText>
34
34
  </slot>
35
35
  </div>
36
36
 
@@ -98,6 +98,8 @@ import DXCard from "../../atoms/DXCard/DXCard.vue";
98
98
  import DXAvatar from "../../atoms/DXAvatar/DXAvatar.vue";
99
99
  import DXButton from "../../atoms/DXButton/DXButton.vue";
100
100
  import DXBadge from "../../atoms/DXBadge/DXBadge.vue";
101
+ import DXHeading from "../../atoms/DXHeading/DXHeading.vue";
102
+ import DXText from "../../atoms/DXText/DXText.vue";
101
103
 
102
104
  const props = defineProps({
103
105
  /**
@@ -235,11 +237,11 @@ const infoClasses = computed(() =>
235
237
  *
236
238
  * @returns {string} Tailwind CSS классы
237
239
  */
238
- const nameClasses = computed(() => {
240
+ const nameSize = computed(() => {
239
241
  const sizeMap = {
240
- sm: "text-lg font-semibold text-slate-900",
241
- md: "text-xl font-semibold text-slate-900",
242
- lg: "text-2xl font-semibold text-slate-900",
242
+ sm: "lg",
243
+ md: "xl",
244
+ lg: "2xl",
243
245
  };
244
246
  return sizeMap[props.size] || sizeMap.md;
245
247
  });
@@ -252,11 +254,11 @@ const nameClasses = computed(() => {
252
254
  *
253
255
  * @returns {string} Tailwind CSS классы
254
256
  */
255
- const roleClasses = computed(() => {
257
+ const roleSize = computed(() => {
256
258
  const sizeMap = {
257
- sm: "text-sm text-slate-600 mt-1",
258
- md: "text-base text-slate-600 mt-1",
259
- lg: "text-lg text-slate-600 mt-1",
259
+ sm: "sm",
260
+ md: "md",
261
+ lg: "lg",
260
262
  };
261
263
  return sizeMap[props.size] || sizeMap.md;
262
264
  });
@@ -269,11 +271,11 @@ const roleClasses = computed(() => {
269
271
  *
270
272
  * @returns {string} Tailwind CSS классы
271
273
  */
272
- const bioClasses = computed(() => {
274
+ const bioSize = computed(() => {
273
275
  const sizeMap = {
274
- sm: "text-xs text-slate-500 mt-2",
275
- md: "text-sm text-slate-500 mt-2",
276
- lg: "text-base text-slate-500 mt-2",
276
+ sm: "xs",
277
+ md: "sm",
278
+ lg: "md",
277
279
  };
278
280
  return sizeMap[props.size] || sizeMap.md;
279
281
  });
@@ -5,6 +5,7 @@ export { default as DXAuthenticationForm } from './DXAuthenticationForm';
5
5
  export { default as DXChartContainer } from './DXChartContainer';
6
6
  export { default as DXChatInterface } from './DXChatInterface';
7
7
  export { default as DXCommentSection } from './DXCommentSection';
8
+ export { default as DXBaseTable } from './DXBaseTable';
8
9
  export { default as DXDataTable } from './DXDataTable';
9
10
  export { default as DXDropdown } from './DXDropdown';
10
11
  export { default as DXEmptyState } from './DXEmptyState';