dxd-style-code 0.1.11 → 0.1.13

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 (148) hide show
  1. package/dist/dxd-style-code.js +7470 -6336
  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 +67 -1
  12. package/src/components/atoms/DXBox/DXBox.stories.js +1 -1
  13. package/src/components/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 +67 -1
  20. package/src/components/atoms/DXContainer/DXContainer.stories.js +1 -1
  21. package/src/components/atoms/DXContainer/DXContainer.vue +28 -1
  22. package/src/components/atoms/DXDivider/DXDivider.stories.js +84 -1
  23. package/src/components/atoms/DXFlex/DXFlex.stories.js +1 -1
  24. package/src/components/atoms/DXFlex/DXFlex.vue +57 -3
  25. package/src/components/atoms/DXFormLabel/DXFormLabel.stories.js +70 -1
  26. package/src/components/atoms/DXGrid/DXGrid.stories.js +1 -1
  27. package/src/components/atoms/DXHeading/DXHeading.stories.js +90 -1
  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 +62 -1
  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 +76 -1
  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/atoms/DXSpacer/DXSpacer.stories.js +1 -1
  47. package/src/components/atoms/DXStack/DXStack.stories.js +1 -1
  48. package/src/components/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 +83 -1
  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 +3 -0
  56. package/src/components/molecules/DXActionButtons/DXActionButtons.stories.js +280 -77
  57. package/src/components/molecules/DXActionButtons/DXActionButtons.vue +31 -31
  58. package/src/components/molecules/DXAlert/DXAlert.stories.js +199 -1
  59. package/src/components/molecules/DXAlert/DXAlert.vue +35 -13
  60. package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.stories.js +125 -1
  61. package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.vue +22 -18
  62. package/src/components/molecules/DXButtonGroup/DXButtonGroup.stories.js +193 -6
  63. package/src/components/molecules/DXButtonGroup/DXButtonGroup.vue +39 -3
  64. package/src/components/molecules/DXCloseButton/DXCloseButton.stories.js +64 -1
  65. package/src/components/molecules/DXComboBox/DXComboBox.stories.js +66 -0
  66. package/src/components/molecules/DXCopyField/DXCopyField.stories.js +128 -1
  67. package/src/components/molecules/DXCopyField/DXCopyField.vue +60 -7
  68. package/src/components/molecules/DXDataFilter/DXDataFilter.vue +8 -6
  69. package/src/components/molecules/DXDatePicker/DXDatePicker.stories.js +58 -0
  70. package/src/components/molecules/DXFileUpload/DXFileUpload.stories.js +66 -0
  71. package/src/components/molecules/DXFilterGroup/DXFilterGroup.stories.js +61 -0
  72. package/src/components/molecules/DXFormControl/DXFormControl.stories.js +76 -0
  73. package/src/components/molecules/DXFormControl/DXFormControl.vue +9 -8
  74. package/src/components/molecules/DXInput/DXInput.stories.js +100 -1
  75. package/src/components/molecules/DXInputGroup/DXInputGroup.stories.js +89 -1
  76. package/src/components/molecules/DXInputMask/DXInputMask.stories.js +67 -0
  77. package/src/components/molecules/DXMenu/DXMenu.stories.js +111 -4
  78. package/src/components/molecules/DXMenu/DXMenu.vue +18 -5
  79. package/src/components/molecules/DXMenu/README.md +1 -1
  80. package/src/components/molecules/DXPagination/DXPagination.stories.js +105 -2
  81. package/src/components/molecules/DXPagination/DXPagination.vue +18 -33
  82. package/src/components/molecules/DXPasswordInput/DXPasswordInput.stories.js +67 -1
  83. package/src/components/molecules/DXRadioCard/DXRadioCard.stories.js +64 -0
  84. package/src/components/molecules/DXRadioGroup/DXRadioGroup.stories.js +84 -0
  85. package/src/components/molecules/DXRating/DXRating.stories.js +3 -2
  86. package/src/components/molecules/DXSearchBar/DXSearchBar.stories.js +1 -1
  87. package/src/components/molecules/DXSearchBar/DXSearchBar.vue +16 -12
  88. package/src/components/molecules/DXSearchSelect/DXSearchSelect.stories.js +71 -0
  89. package/src/components/molecules/DXSegmentedControl/DXSegmentedControl.stories.js +74 -0
  90. package/src/components/molecules/DXSelect/DXSelect.stories.js +92 -1
  91. package/src/components/molecules/DXStatCard/DXStatCard.stories.js +1 -1
  92. package/src/components/molecules/DXStatCard/DXStatCard.vue +30 -26
  93. package/src/components/molecules/DXTableFiltersPanel/index.js +3 -0
  94. package/src/components/molecules/DXTablePagination/DXTablePagination.stories.js +67 -0
  95. package/src/components/molecules/DXTableToolbar/DXTableToolbar.stories.js +71 -0
  96. package/src/components/molecules/DXTextarea/DXTextarea.stories.js +87 -1
  97. package/src/components/molecules/DXTimePicker/DXTimePicker.stories.js +1 -1
  98. package/src/components/molecules/DXValidationIcon/DXValidationIcon.stories.js +59 -1
  99. package/src/components/molecules/index.js +0 -1
  100. package/src/components/organisms/DXAccordion/DXAccordion.stories.js +75 -0
  101. package/src/components/organisms/DXAppLayout/DXAppLayout.stories.js +27 -25
  102. package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.stories.js +0 -2
  103. package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.vue +5 -8
  104. package/src/components/{molecules → organisms}/DXBaseTable/DXBaseTable.stories.js +78 -1
  105. package/src/components/{molecules → organisms}/DXBaseTable/DXBaseTable.vue +2 -2
  106. package/src/components/organisms/DXChartContainer/DXChartContainer.stories.js +1 -1
  107. package/src/components/organisms/DXChartContainer/DXChartContainer.vue +10 -6
  108. package/src/components/organisms/DXChatInterface/DXChatInterface.stories.js +1 -1
  109. package/src/components/organisms/DXChatInterface/DXChatInterface.vue +6 -4
  110. package/src/components/organisms/DXCommentSection/DXCommentSection.stories.js +1 -1
  111. package/src/components/organisms/DXCommentSection/DXCommentSection.vue +7 -6
  112. package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.stories.js +1 -1
  113. package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.vue +4 -2
  114. package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.stories.js +1 -1
  115. package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.vue +3 -2
  116. package/src/components/organisms/DXDataTable/DXDataTable.stories.js +1 -1
  117. package/src/components/organisms/DXDropdown/DXDropdown.stories.js +84 -1
  118. package/src/components/organisms/DXEmptyState/DXEmptyState.stories.js +64 -0
  119. package/src/components/organisms/DXEmptyState/DXEmptyState.vue +4 -2
  120. package/src/components/organisms/DXHeaderBar/DXHeaderBar.stories.js +409 -3
  121. package/src/components/organisms/DXHeaderBar/DXHeaderBar.vue +261 -52
  122. package/src/components/organisms/DXMediaGallery/DXMediaGallery.stories.js +1 -1
  123. package/src/components/organisms/DXMediaGallery/DXMediaGallery.vue +6 -4
  124. package/src/components/organisms/DXModal/DXModal.stories.js +93 -1
  125. package/src/components/organisms/DXModal/DXModal.vue +3 -2
  126. package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.stories.js +1 -1
  127. package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.vue +2 -1
  128. package/src/components/organisms/DXReportGenerator/DXReportGenerator.vue +4 -3
  129. package/src/components/organisms/DXSettingsPanel/DXSettingsPanel.vue +11 -8
  130. package/src/components/organisms/DXSidebar/DXSidebar.stories.js +1 -1
  131. package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.stories.js +104 -1
  132. package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.vue +14 -4
  133. package/src/components/organisms/DXSidebarMenu/README.md +3 -3
  134. package/src/components/organisms/DXTable/DXTable.stories.js +138 -11
  135. package/src/components/organisms/DXTable/DXTable.vue +1 -1
  136. package/src/components/organisms/DXTabs/DXTabs.stories.js +91 -1
  137. package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.stories.js +1 -1
  138. package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.vue +20 -18
  139. package/src/components/organisms/index.js +1 -0
  140. package/src/components/utilities/DXAnimatePresence/DXAnimatePresence.stories.js +1 -1
  141. package/src/components/utilities/DXBreakpointProvider/DXBreakpointProvider.stories.js +1 -1
  142. package/src/components/utilities/DXObserver/DXObserver.stories.js +1 -1
  143. package/src/components/utilities/DXPortal/DXPortal.stories.js +1 -1
  144. package/src/components/utilities/DXStaggeredAnimation/DXStaggeredAnimation.stories.js +2 -2
  145. package/src/components/utilities/DXThemeProvider/DXThemeProvider.stories.js +1 -1
  146. package/src/components/utilities/DXTransitionGroup/DXTransitionGroup.stories.js +1 -1
  147. package/src/composables/useSize.js +8 -1
  148. /package/src/components/{molecules → organisms}/DXBaseTable/index.js +0 -0
@@ -5,6 +5,70 @@ export default {
5
5
  title: 'Molecules/DXRadioCard',
6
6
  component: DXRadioCard,
7
7
  tags: ['autodocs'],
8
+ parameters: {
9
+ docs: {
10
+ description: {
11
+ component: `
12
+ # DXRadioCard
13
+
14
+ Компонент карточки с радиокнопкой для выбора одного варианта из группы с визуальным выделением.
15
+
16
+ ## Назначение
17
+
18
+ DXRadioCard предоставляет способ выбора одного варианта из группы через карточки вместо
19
+ обычных радиокнопок. Компонент идеально подходит для выбора планов, тарифов и других
20
+ вариантов, требующих визуального выделения.
21
+
22
+ ## Архитектура
23
+
24
+ ### Использует
25
+ - Нативный input type="radio" - для семантики и доступности
26
+ - Динамический рендеринг иконки - для опциональной иконки
27
+
28
+ ### Используется в
29
+ - Выбор планов подписки
30
+ - Выбор тарифов
31
+ - Выбор вариантов доставки
32
+ - Любые места, требующие визуальный выбор варианта
33
+
34
+ ## Внутренняя логика
35
+
36
+ ### Визуальное состояние
37
+ - **selected**: Темная рамка (\`border-slate-900\`), светлый фон (\`bg-slate-50\`), галочка справа
38
+ - **unselected**: Светлая рамка (\`border-slate-200\`), белый фон, hover эффект
39
+
40
+ ### Иконка
41
+ Опциональная иконка слева от контента:
42
+ - В выбранном состоянии: темный цвет (\`text-slate-900\`)
43
+ - В невыбранном состоянии: серый цвет (\`text-slate-400\`)
44
+
45
+ ### Галочка
46
+ При выборе карточки:
47
+ - Отображается круглая галочка справа вверху
48
+ - Темный фон с белой галочкой
49
+
50
+ ## Особенности
51
+
52
+ ### v-model
53
+ Полностью поддерживает двустороннее связывание через \`v-model\` для String, Number или Boolean значений.
54
+
55
+ ### Структура
56
+ Карточка состоит из:
57
+ - Иконка (опционально)
58
+ - Заголовок (\`title\`)
59
+ - Описание (\`description\`)
60
+ - Дополнительный контент (через default slot)
61
+
62
+ ### Состояния
63
+ - **disabled** - отключает карточку (opacity, cursor-not-allowed)
64
+ - **selected** - визуально выделяет выбранную карточку
65
+
66
+ ### Слоты
67
+ - **default** - дополнительный контент внутри карточки
68
+ `,
69
+ },
70
+ },
71
+ },
8
72
  };
9
73
 
10
74
  export const Default = {
@@ -5,6 +5,90 @@ export default {
5
5
  title: 'Molecules/DXRadioGroup',
6
6
  component: DXRadioGroup,
7
7
  tags: ['autodocs'],
8
+ parameters: {
9
+ docs: {
10
+ description: {
11
+ component: `
12
+ # DXRadioGroup
13
+
14
+ Компонент группы радиокнопок для выбора одного значения из списка опций.
15
+
16
+ ## Назначение
17
+
18
+ DXRadioGroup предоставляет способ группировки радиокнопок для выбора одного значения.
19
+ Компонент автоматически управляет состоянием выбора, синхронизирует стили и поддерживает
20
+ вертикальное и горизонтальное расположение.
21
+
22
+ ## Архитектура
23
+
24
+ ### Использует
25
+ - \`DXRadio\` - отдельные радиокнопки в группе
26
+
27
+ ### Используется в
28
+ - Формы с выбором одного варианта
29
+ - Настройки и конфигурация
30
+ - Фильтры с одним выбором
31
+ - Любые места, требующие выбор одного значения из группы
32
+
33
+ ## Внутренняя логика
34
+
35
+ ### Структура опций
36
+ Опции передаются через массив объектов:
37
+ \`\`\`
38
+ [{ value: 'value1', label: 'Label 1' }, { value: 'value2', label: 'Label 2' }]
39
+ \`\`\`
40
+
41
+ Каждая опция может содержать:
42
+ - \`value\` - значение опции (обязательно)
43
+ - \`label\` - текст опции (обязательно)
44
+ - \`disabled\` - отключить конкретную опцию
45
+ - \`color\` - цвет для custom variant (переопределяет глобальный цвет)
46
+
47
+ ### Расположение
48
+ - **vertical** (по умолчанию): Вертикальное расположение (\`flex-col\`)
49
+ - **horizontal**: Горизонтальное расположение (\`flex flex-wrap\`)
50
+
51
+ ### Варианты
52
+ - **default**: Нативные радиокнопки с кастомной стилизацией
53
+ - **custom**: Кастомные радиокнопки с точкой и настраиваемыми цветами
54
+
55
+ ### Размеры
56
+ Поддерживает 3 размера:
57
+ - **sm** - маленький
58
+ - **md** - средний (по умолчанию)
59
+ - **lg** - большой
60
+
61
+ ### Цвета (для custom variant)
62
+ Поддерживает 6 цветовых вариантов:
63
+ - **slate** - нейтральный серый
64
+ - **primary** - основной цвет (по умолчанию)
65
+ - **success** - зеленый цвет
66
+ - **danger** - красный цвет
67
+ - **warning** - желтый цвет
68
+ - **info** - синий цвет
69
+
70
+ ## Особенности
71
+
72
+ ### v-model
73
+ Полностью поддерживает двустороннее связывание через \`v-model\` для String, Number или Boolean значений.
74
+
75
+ ### Лейбл и вспомогательный текст
76
+ - \`label\` - отображается над группой
77
+ - \`helper\` - вспомогательный текст под группой
78
+
79
+ ### Состояния
80
+ - **disabled** - отключает всю группу
81
+ - Можно отключить отдельные опции через \`disabled\` в объекте опции
82
+
83
+ ### Синхронизация
84
+ Все радиокнопки в группе автоматически синхронизируются:
85
+ - Размер применяется ко всем кнопкам
86
+ - Вариант применяется ко всем кнопкам
87
+ - Цвет применяется ко всем кнопкам (если не переопределен в опции)
88
+ `,
89
+ },
90
+ },
91
+ },
8
92
  argTypes: {
9
93
  variant: {
10
94
  control: 'select',
@@ -1,11 +1,12 @@
1
1
  import { ref } from 'vue';
2
2
  import DXRating from './DXRating.vue';
3
3
  import DXFormControl from '../DXFormControl/DXFormControl.vue';
4
+ import DXText from '../../atoms/DXText/DXText.vue';
4
5
 
5
6
  export default {
6
7
  title: 'Molecules/DXRating',
7
8
  component: DXRating,
8
- tags: ['autodocs'],
9
+ tags: ['autodocs', 'category:data-display'],
9
10
  parameters: {
10
11
  docs: {
11
12
  description: {
@@ -264,7 +265,7 @@ export const HeartSymbol = {
264
265
  symbol="heart"
265
266
  color="red"
266
267
  />
267
- <p class="text-sm text-slate-600">Выбрано: {{ heartRating }}</p>
268
+ <DXText tag="p" size="sm" color="muted">Выбрано: {{ heartRating }}</DXText>
268
269
  </div>
269
270
  `,
270
271
  }),
@@ -4,7 +4,7 @@ import DXSearchBar from './DXSearchBar.vue';
4
4
  export default {
5
5
  title: 'Molecules/DXSearchBar',
6
6
  component: DXSearchBar,
7
- tags: ['autodocs'],
7
+ tags: ['autodocs', 'category:feedback'],
8
8
  parameters: {
9
9
  docs: {
10
10
  description: {
@@ -34,12 +34,15 @@
34
34
  class="cursor-pointer text-slate-400 hover:text-slate-600"
35
35
  @click="handleClear"
36
36
  />
37
- <span
37
+ <DXText
38
38
  v-if="hotkey && !modelValue"
39
- class="text-xs text-slate-400 border border-slate-200 rounded px-1.5 py-0.5"
39
+ tag="span"
40
+ size="xs"
41
+ color="muted"
42
+ class="border border-slate-200 rounded px-1.5 py-0.5"
40
43
  >
41
44
  {{ hotkeyLabel }}
42
- </span>
45
+ </DXText>
43
46
  </div>
44
47
  </template>
45
48
  </DXInput>
@@ -53,9 +56,9 @@
53
56
  >
54
57
  <!-- История поиска -->
55
58
  <div v-if="showHistory && historyItems.length > 0 && !modelValue" class="p-2">
56
- <div class="px-2 py-1 text-xs font-semibold text-slate-500 uppercase">
59
+ <DXText tag="div" size="xs" weight="semibold" color="muted" class="px-2 py-1 uppercase">
57
60
  История поиска
58
- </div>
61
+ </DXText>
59
62
  <div
60
63
  v-for="(item, index) in historyItems"
61
64
  :key="index"
@@ -64,7 +67,7 @@
64
67
  @click="selectHistoryItem(item)"
65
68
  @mouseenter="selectedHistoryIndex = index"
66
69
  >
67
- <span>{{ item }}</span>
70
+ <DXText tag="span">{{ item }}</DXText>
68
71
  <DXIcon
69
72
  :icon="ClockIcon"
70
73
  size="xs"
@@ -83,24 +86,24 @@
83
86
  @click="selectSuggestion(suggestion)"
84
87
  @mouseenter="selectedSuggestionIndex = index"
85
88
  >
86
- <div class="font-medium">{{ suggestion.title }}</div>
87
- <div v-if="suggestion.category" class="text-xs text-slate-500 mt-0.5">
89
+ <DXText tag="div" weight="medium">{{ suggestion.title }}</DXText>
90
+ <DXText v-if="suggestion.category" tag="div" size="xs" color="muted" class="mt-0.5">
88
91
  {{ suggestion.category }}
89
- </div>
92
+ </DXText>
90
93
  </div>
91
94
  </div>
92
95
 
93
96
  <!-- Фильтры -->
94
97
  <div v-if="filters && filters.length > 0" class="p-2 border-t border-slate-200">
95
- <div class="px-2 py-1 text-xs font-semibold text-slate-500 uppercase mb-2">
98
+ <DXText tag="div" size="xs" weight="semibold" color="muted" class="px-2 py-1 uppercase mb-2">
96
99
  Фильтры
97
- </div>
100
+ </DXText>
98
101
  <div
99
102
  v-for="filter in filters"
100
103
  :key="filter.id"
101
104
  class="mb-2"
102
105
  >
103
- <label class="block text-xs text-slate-600 mb-1">{{ filter.label }}</label>
106
+ <DXText tag="label" size="xs" color="muted" class="block mb-1">{{ filter.label }}</DXText>
104
107
  <select
105
108
  v-model="selectedFilters[filter.id]"
106
109
  class="w-full text-sm border border-slate-200 rounded-lg px-2 py-1 focus:outline-none focus:ring-2 focus:ring-slate-900/10"
@@ -128,6 +131,7 @@ import { useClassComposition } from "../../../composables/useClassComposition";
128
131
  import DXInput from "../DXInput/DXInput.vue";
129
132
  import DXIcon from "../../atoms/DXIcon/DXIcon.vue";
130
133
  import DXLoader from "../../atoms/DXLoader/DXLoader.vue";
134
+ import DXText from "../../atoms/DXText/DXText.vue";
131
135
  import {
132
136
  MagnifyingGlassIcon,
133
137
  XMarkIcon,
@@ -5,6 +5,77 @@ export default {
5
5
  title: 'Molecules/DXSearchSelect',
6
6
  component: DXSearchSelect,
7
7
  tags: ['autodocs'],
8
+ parameters: {
9
+ docs: {
10
+ description: {
11
+ component: `
12
+ # DXSearchSelect
13
+
14
+ Компонент выбора с поиском, поддерживающий одиночный и множественный выбор.
15
+
16
+ ## Назначение
17
+
18
+ DXSearchSelect предоставляет расширенный select с встроенным поиском, поддержкой
19
+ множественного выбора и возможностью создания новых опций. Компонент идеально подходит
20
+ для больших списков опций.
21
+
22
+ ## Архитектура
23
+
24
+ ### Использует
25
+ - Динамический dropdown - для отображения опций
26
+ - Поисковая строка - для фильтрации опций
27
+
28
+ ### Используется в
29
+ - Выбор пользователей
30
+ - Выбор тегов и категорий
31
+ - Множественный выбор из больших списков
32
+ - Любые места, требующие выбор с поиском
33
+
34
+ ## Внутренняя логика
35
+
36
+ ### Режимы выбора
37
+ - **single** (по умолчанию): Выбор одного значения
38
+ - **multiple**: Выбор нескольких значений
39
+
40
+ ### Поиск
41
+ - Фильтрация опций происходит в реальном времени
42
+ - Поиск нечувствителен к регистру
43
+ - При отсутствии результатов показывается "Не найдено"
44
+
45
+ ### Множественный выбор
46
+ При \`multiple={true}\`:
47
+ - Выбранные опции отображаются как теги над полем
48
+ - Каждый тег можно удалить отдельно
49
+ - Отображается количество выбранных элементов
50
+
51
+ ### Создание новых опций
52
+ При \`creatable={true}\`:
53
+ - Можно создать новую опцию из поискового запроса
54
+ - Отображается кнопка "Создать ..." при отсутствии результатов
55
+
56
+ ## Особенности
57
+
58
+ ### v-model
59
+ Полностью поддерживает двустороннее связывание через \`v-model\`:
60
+ - Для single: String или Number
61
+ - Для multiple: Array значений
62
+
63
+ ### Структура опций
64
+ Опции передаются через массив объектов:
65
+ \`\`\`
66
+ [{ value: 'value', label: 'Label', icon?: Icon }]
67
+ \`\`\`
68
+
69
+ ### Иконки
70
+ Каждая опция может иметь иконку через \`icon\` свойство.
71
+
72
+ ### Клавиатурная навигация
73
+ - **Escape** - закрытие dropdown
74
+ - Поисковая строка не закрывает dropdown при вводе
75
+ `,
76
+ },
77
+ },
78
+ },
8
79
  };
9
80
 
10
81
  const users = [
@@ -24,6 +24,80 @@ export default {
24
24
  title: 'Molecules/DXSegmentedControl',
25
25
  component: DXSegmentedControl,
26
26
  tags: ['autodocs'],
27
+ parameters: {
28
+ docs: {
29
+ description: {
30
+ component: `
31
+ # DXSegmentedControl
32
+
33
+ Компонент сегментированного контрола для выбора одного значения из группы с плавающим индикатором.
34
+
35
+ ## Назначение
36
+
37
+ DXSegmentedControl предоставляет способ выбора одного значения из группы опций с визуальным
38
+ индикатором выбранного сегмента. Компонент поддерживает иконки, счетчики, анимации и
39
+ автоматически адаптирует размер индикатора под выбранный сегмент.
40
+
41
+ ## Архитектура
42
+
43
+ ### Использует
44
+ - \`DXIcon\` - для иконок в опциях
45
+ - Динамическое позиционирование - для плавающего индикатора
46
+
47
+ ### Используется в
48
+ - Переключение режимов отображения
49
+ - Фильтры и сортировка
50
+ - Настройки и опции
51
+ - Любые места, требующие выбора одного значения из группы
52
+
53
+ ## Внутренняя логика
54
+
55
+ ### Плавающий индикатор
56
+ Компонент использует абсолютно позиционированный индикатор, который автоматически
57
+ перемещается к выбранному сегменту:
58
+ - Размер индикатора соответствует размеру выбранной кнопки
59
+ - Позиция вычисляется динамически на основе offset выбранной кнопки
60
+ - Плавная анимация перемещения через CSS transitions
61
+
62
+ ### Структура опций
63
+ Каждая опция может содержать:
64
+ - \`value\` - значение опции (обязательно)
65
+ - \`label\` - текст опции
66
+ - \`icon\` - иконка (Heroicon компонент)
67
+ - \`count\` - счетчик (число)
68
+
69
+ ### Анимации иконок
70
+ - Глобальная анимация через \`iconAnimation\` prop
71
+ - При \`animateActiveOnly={true}\` (по умолчанию) - анимируется только активная иконка
72
+ - При \`animateActiveOnly={false}\` - анимируются все иконки
73
+
74
+ ### Счетчики
75
+ Счетчики отображаются как бейджи справа от текста/иконки:
76
+ - В активном сегменте: темный фон (\`bg-slate-800 text-white\`)
77
+ - В неактивных сегментах: светлый фон (\`bg-slate-200 text-slate-700\`)
78
+
79
+ ## Особенности
80
+
81
+ ### v-model
82
+ Полностью поддерживает двустороннее связывание через \`v-model\` для String, Number или Boolean значений.
83
+
84
+ ### Визуальное оформление
85
+ - Фон группы: \`bg-slate-100\`
86
+ - Скругление: \`rounded-xl\`
87
+ - Индикатор: белый фон с тенью (\`bg-white shadow-sm\`)
88
+ - Активный сегмент: темный текст (\`text-slate-900\`)
89
+ - Неактивные сегменты: серый текст (\`text-slate-600\`)
90
+
91
+ ### Состояния
92
+ - **disabled** - отключает весь контрол
93
+ - **selected** - визуально выделяет выбранный сегмент
94
+
95
+ ### Лейбл
96
+ Поддерживает опциональный \`label\` prop для отображения лейбла над контролом.
97
+ `,
98
+ },
99
+ },
100
+ },
27
101
  argTypes: {
28
102
  iconAnimation: {
29
103
  control: 'select',
@@ -12,7 +12,98 @@ import {
12
12
  export default {
13
13
  title: 'Molecules/DXSelect',
14
14
  component: DXSelect,
15
- tags: ['autodocs'],
15
+ tags: ['autodocs', 'category:form'],
16
+ parameters: {
17
+ docs: {
18
+ description: {
19
+ component: `
20
+ # DXSelect
21
+
22
+ Компонент выпадающего списка с поддержкой иконок, валидации и интеграции с группами полей.
23
+
24
+ ## Назначение
25
+
26
+ DXSelect предоставляет стандартизированный выпадающий список для выбора одного значения из списка опций.
27
+ Компонент поддерживает иконки, валидацию, состояния ошибок и автоматическую адаптацию при использовании внутри DXInputGroup.
28
+
29
+ ## Архитектура
30
+
31
+ ### Использует
32
+ - \`DXFormLabel\` - для отображения лейбла, ошибок и вспомогательного текста
33
+ - \`DXIconWrapper\` - для отображения иконки слева
34
+ - \`DXIcon\` - для иконки chevron справа
35
+ - \`useSize\` composable - для унификации размеров (sm, md, lg)
36
+ - \`useClassComposition\` composable - для объединения CSS классов
37
+ - \`provide/inject\` - для интеграции с DXInputGroup
38
+
39
+ ### Используется в
40
+ - \`DXInputGroup\` - группы полей с аддонами
41
+ - Формы выбора значений
42
+ - Фильтры и сортировка
43
+ - Любые места, требующие выбора из списка опций
44
+
45
+ ## Внутренняя логика
46
+
47
+ ### Интеграция с DXInputGroup
48
+ При использовании внутри \`DXInputGroup\`:
49
+ - Поле автоматически регистрируется в группе через \`provide/inject\`
50
+ - Размер синхронизируется с размером группы
51
+ - Состояние \`disabled\` наследуется от группы
52
+ - Состояние \`error\` синхронизируется с группой
53
+ - Border-radius адаптируется в зависимости от наличия аддонов слева/справа
54
+
55
+ ### Структура опций
56
+ Опции передаются через массив объектов:
57
+ \`\`\`
58
+ [{ value: 'value1', label: 'Label 1' }, { value: 'value2', label: 'Label 2' }]
59
+ \`\`\`
60
+ - \`value\` - значение опции (String или Number)
61
+ - \`label\` - отображаемый текст
62
+
63
+ ### Иконки
64
+ - **prefixIcon**: Иконка слева от селекта (Heroicon компонент)
65
+ - **chevron**: Иконка справа (ChevronDownIcon, всегда отображается)
66
+ - Размер иконки автоматически адаптируется к размеру поля
67
+
68
+ ### Валидация
69
+ - При наличии \`error\` prop, поле получает красную рамку (\`border-rose-300\`)
70
+ - Текст ошибки отображается через \`DXFormLabel\`
71
+ - Состояние ошибки синхронизируется с \`DXInputGroup\`
72
+
73
+ ### Размеры
74
+ Поддерживает три размера:
75
+ - **sm** - компактный размер
76
+ - **md** - средний размер (по умолчанию)
77
+ - **lg** - крупный размер
78
+
79
+ ## Особенности
80
+
81
+ ### v-model
82
+ Полностью поддерживает двустороннее связывание через \`v-model\` для String или Number значений.
83
+
84
+ ### Placeholder
85
+ - Поддерживает \`placeholder\` prop для отображения подсказки
86
+ - Placeholder отображается как disabled опция в начале списка
87
+
88
+ ### Состояния
89
+ - **disabled** - отключает поле (opacity-60, cursor-not-allowed, bg-slate-50)
90
+ - **error** - визуально выделяет ошибку (красная рамка)
91
+ - **required** - отмечает поле как обязательное (через DXFormLabel)
92
+
93
+ ### Лейбл и вспомогательный текст
94
+ - \`label\` - отображается над полем
95
+ - \`helper\` - вспомогательный текст под полем
96
+ - \`error\` - текст ошибки (заменяет helper при наличии)
97
+
98
+ ### Нативный select
99
+ Компонент использует нативный HTML \`<select>\` элемент, что обеспечивает:
100
+ - Нативную доступность
101
+ - Работу с клавиатурой
102
+ - Поддержку мобильных устройств
103
+ `,
104
+ },
105
+ },
106
+ },
16
107
  };
17
108
 
18
109
  const options = [
@@ -15,7 +15,7 @@ const ArrowTrendingUpIconComponent = ArrowTrendingUpIcon;
15
15
  export default {
16
16
  title: 'Molecules/DXStatCard',
17
17
  component: DXStatCard,
18
- tags: ['autodocs'],
18
+ tags: ['autodocs', 'category:data-display'],
19
19
  parameters: {
20
20
  docs: {
21
21
  description: {
@@ -12,38 +12,41 @@
12
12
  <div class="flex items-start justify-between">
13
13
  <div class="flex-1">
14
14
  <!-- Заголовок -->
15
- <div v-if="title" class="text-sm font-medium text-slate-600 mb-1">
15
+ <DXText v-if="title" tag="div" size="sm" weight="medium" color="muted" class="mb-1">
16
16
  {{ title }}
17
- </div>
17
+ </DXText>
18
18
 
19
19
  <!-- Значение -->
20
20
  <div class="flex items-baseline gap-2">
21
- <span :class="valueClasses">
21
+ <DXText tag="span" :size="valueSize" weight="bold" color="default">
22
22
  {{ formattedValue }}
23
- </span>
23
+ </DXText>
24
24
  <!-- Тренд -->
25
- <div
25
+ <DXText
26
26
  v-if="trend"
27
- :class="trendClasses"
28
- class="flex items-center gap-0.5 text-xs font-medium"
27
+ tag="div"
28
+ size="xs"
29
+ weight="medium"
30
+ :color="trendColor"
31
+ class="flex items-center gap-0.5"
29
32
  >
30
33
  <DXIcon
31
34
  :icon="trend.direction === 'up' ? ArrowUpIcon : ArrowDownIcon"
32
35
  size="xs"
33
36
  />
34
- <span>{{ Math.abs(trend.value) }}%</span>
35
- </div>
37
+ <DXText tag="span" size="xs" weight="medium">{{ Math.abs(trend.value) }}%</DXText>
38
+ </DXText>
36
39
  </div>
37
40
 
38
41
  <!-- Описание -->
39
- <div v-if="description" class="text-xs text-slate-500 mt-1">
42
+ <DXText v-if="description" tag="div" size="xs" color="muted" class="mt-1">
40
43
  {{ description }}
41
- </div>
44
+ </DXText>
42
45
 
43
46
  <!-- Сравнение -->
44
- <div v-if="comparison" class="text-xs text-slate-500 mt-1">
47
+ <DXText v-if="comparison" tag="div" size="xs" color="muted" class="mt-1">
45
48
  {{ comparison }}
46
- </div>
49
+ </DXText>
47
50
  </div>
48
51
 
49
52
  <!-- Иконка -->
@@ -62,6 +65,7 @@ import { useClassComposition } from "../../../composables/useClassComposition";
62
65
  import { useVariantButton } from "../../../composables/useVariant";
63
66
  import DXCard from "../../atoms/DXCard/DXCard.vue";
64
67
  import DXIcon from "../../atoms/DXIcon/DXIcon.vue";
68
+ import DXText from "../../atoms/DXText/DXText.vue";
65
69
  import { ArrowUpIcon, ArrowDownIcon } from "@heroicons/vue/24/outline";
66
70
 
67
71
  const props = defineProps({
@@ -203,32 +207,32 @@ const formattedValue = computed(() => {
203
207
  *
204
208
  * @returns {Array} Массив классов
205
209
  */
206
- const valueClasses = computed(() => {
210
+ const valueSize = computed(() => {
207
211
  const sizeMap = {
208
- sm: "text-2xl font-bold text-slate-900",
209
- md: "text-3xl font-bold text-slate-900",
210
- lg: "text-4xl font-bold text-slate-900",
212
+ sm: "2xl",
213
+ md: "3xl",
214
+ lg: "4xl",
211
215
  };
212
216
  return sizeMap[props.size] || sizeMap.md;
213
217
  });
214
218
 
215
219
  /**
216
- * Классы для тренда
220
+ * Цвет тренда
217
221
  *
218
222
  * @description
219
- * Вычисляет классы для отображения тренда на основе направления.
223
+ * Вычисляет цвет для отображения тренда на основе направления.
220
224
  *
221
- * @returns {Array} Массив классов
225
+ * @returns {string} Цвет для DXText
222
226
  */
223
- const trendClasses = computed(() => {
224
- if (!props.trend) return [];
227
+ const trendColor = computed(() => {
228
+ if (!props.trend) return 'default';
225
229
 
226
- const directionClasses = {
227
- up: "text-green-600",
228
- down: "text-rose-600",
230
+ const directionColors = {
231
+ up: "success",
232
+ down: "danger",
229
233
  };
230
234
 
231
- return directionClasses[props.trend.direction] || "";
235
+ return directionColors[props.trend.direction] || "default";
232
236
  });
233
237
 
234
238
  /**
@@ -5,3 +5,6 @@ export { default } from './DXTableFiltersPanel.vue';
5
5
 
6
6
 
7
7
 
8
+
9
+
10
+