dxd-style-code 0.1.11 → 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 (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 +2 -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
@@ -0,0 +1,80 @@
1
+ <template>
2
+ <component
3
+ :is="componentTag"
4
+ :class="computedClass"
5
+ data-component="DX"
6
+ v-bind="componentAttrs"
7
+ >
8
+ <slot />
9
+ </component>
10
+ </template>
11
+
12
+ <script setup>
13
+ import { computed, useAttrs } from "vue";
14
+
15
+ const props = defineProps({
16
+ /** HTML тег элемента (div, span, button, a, nav, header, section, article и т.д.) */
17
+ as: {
18
+ type: String,
19
+ default: "div",
20
+ },
21
+ /** Дополнительные CSS классы */
22
+ class: {
23
+ type: [String, Array, Object],
24
+ default: null,
25
+ },
26
+ });
27
+
28
+ const attrs = useAttrs();
29
+
30
+ /**
31
+ * Атрибуты для передачи на компонент (исключая class, который обрабатывается отдельно)
32
+ *
33
+ * @description
34
+ * В Vue 3 с <script setup>, props определенные через defineProps автоматически
35
+ * не попадают в $attrs. Исключаем только class, так как он обрабатывается через computedClass.
36
+ */
37
+ const componentAttrs = computed(() => {
38
+ const { class: _, ...rest } = attrs;
39
+ return rest;
40
+ });
41
+
42
+ /**
43
+ * Определяет HTML тег для рендеринга
44
+ *
45
+ * @description
46
+ * Возвращает HTML тег из prop `as` или дефолтный `div`.
47
+ *
48
+ * @returns {string} HTML тег для рендеринга
49
+ */
50
+ const componentTag = computed(() => {
51
+ return props.as || "div";
52
+ });
53
+
54
+ /**
55
+ * Вычисляет классы для компонента
56
+ *
57
+ * @description
58
+ * Объединяет prop class с любыми классами из $attrs.
59
+ *
60
+ * @returns {string|Array|Object} Классы для применения к элементу
61
+ */
62
+ const computedClass = computed(() => {
63
+ const classes = [];
64
+
65
+ // Добавляем класс из prop class
66
+ if (props.class) {
67
+ classes.push(props.class);
68
+ }
69
+
70
+ // Добавляем класс из $attrs.class если есть
71
+ if (attrs.class) {
72
+ classes.push(attrs.class);
73
+ }
74
+
75
+ // Возвращаем массив если есть несколько классов, иначе одно значение
76
+ return classes.length > 1 ? classes : classes[0] || null;
77
+ });
78
+
79
+ </script>
80
+
@@ -0,0 +1,2 @@
1
+ export { default } from './DX.vue';
2
+
@@ -10,12 +10,11 @@ import {
10
10
  export default {
11
11
  title: 'Atoms/DXAvatar',
12
12
  component: DXAvatar,
13
- tags: ['autodocs'],
13
+ tags: ['autodocs', 'category:data-display'],
14
14
  parameters: {
15
15
  docs: {
16
16
  description: {
17
17
  component: `
18
- # DXAvatar
19
18
 
20
19
  Компонент аватара пользователя с поддержкой изображений, инициалов и иконок.
21
20
 
@@ -5,7 +5,83 @@ import { ref, computed } from 'vue';
5
5
  export default {
6
6
  title: 'Atoms/DXBackdrop',
7
7
  component: DXBackdrop,
8
- tags: ['autodocs'],
8
+ tags: ['autodocs', 'category:overlay'],
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component: `
13
+ # DXBackdrop
14
+
15
+ Компонент фона (backdrop) для модальных окон и overlay элементов с поддержкой размытия и блокировки скролла.
16
+
17
+ ## Назначение
18
+
19
+ DXBackdrop предоставляет стандартизированный фон для модальных окон, сайдбаров и других overlay элементов.
20
+ Компонент поддерживает различные уровни размытия, настраиваемый цвет фона, блокировку скролла
21
+ и возможность закрытия по клику.
22
+
23
+ ## Архитектура
24
+
25
+ ### Использует
26
+ - \`Teleport\` - для рендеринга в body
27
+ - \`Transition\` - для анимации появления/исчезновения
28
+
29
+ ### Используется в
30
+ - \`DXModal\` - фон для модальных окон
31
+ - \`DXSidebar\` - фон для боковых панелей (в overlay режиме)
32
+ - \`DXDropdown\` - фон для выпадающих меню
33
+ - Любые overlay компоненты
34
+
35
+ ## Внутренняя логика
36
+
37
+ ### Размытие
38
+ Поддерживает 5 уровней размытия:
39
+ - **none** - без размытия
40
+ - **sm** - слабое размытие (по умолчанию)
41
+ - **md** - среднее размытие
42
+ - **lg** - сильное размытие
43
+ - **xl** - очень сильное размытие
44
+
45
+ ### Цвет фона
46
+ Настраивается через \`backgroundColor\` prop:
47
+ - По умолчанию: \`bg-slate-900/40\` (темный полупрозрачный)
48
+ - Можно использовать любые Tailwind классы: \`bg-black/50\`, \`bg-slate-900/60\` и т.д.
49
+ - Можно использовать CSS значения: \`rgb(0, 0, 0, 0.5)\`
50
+
51
+ ### Z-index
52
+ Поддерживает настраиваемый z-index:
53
+ - **0, 10, 20, 30, 40, 50, auto**
54
+ - По умолчанию: \`50\` (для модальных окон)
55
+
56
+ ### Блокировка скролла
57
+ При \`lockScroll={true}\` (по умолчанию):
58
+ - Добавляет \`overflow-hidden\` к body при показе
59
+ - Убирает при скрытии
60
+ - Автоматически очищается при размонтировании компонента
61
+
62
+ ### Закрытие
63
+ При \`dismissible={true}\` (по умолчанию):
64
+ - Клик на backdrop эмитит событие \`close\`
65
+ - Курсор меняется на pointer для визуальной индикации
66
+
67
+ ## Особенности
68
+
69
+ ### Teleport
70
+ Компонент автоматически рендерится в \`body\` через Vue Teleport для правильного z-index стека.
71
+
72
+ ### Анимация
73
+ Использует fade transition для плавного появления/исчезновения.
74
+
75
+ ### События
76
+ - \`@click\` - эмитится при клике на backdrop
77
+ - \`@close\` - эмитится при закрытии (если \`dismissible={true}\`)
78
+
79
+ ### Слоты
80
+ Поддерживает default slot для размещения контента поверх backdrop (например, модальное окно).
81
+ `,
82
+ },
83
+ },
84
+ },
9
85
  argTypes: {
10
86
  blur: {
11
87
  control: 'select',
@@ -15,7 +15,89 @@ import {
15
15
  export default {
16
16
  title: 'Atoms/DXBadge',
17
17
  component: DXBadge,
18
- tags: ['autodocs'],
18
+ tags: ['autodocs', 'category:data-display'],
19
+ parameters: {
20
+ docs: {
21
+ description: {
22
+ component: `
23
+ # DXBadge
24
+
25
+ Компонент бейджа для отображения статусов, меток и индикаторов с поддержкой иконок.
26
+
27
+ ## Назначение
28
+
29
+ DXBadge предоставляет компактный способ отображения статусов, меток, счетчиков и других индикаторов.
30
+ Компонент поддерживает различные цветовые варианты, размеры и возможность добавления иконок слева и справа.
31
+
32
+ ## Архитектура
33
+
34
+ ### Использует
35
+ - \`DXIcon\` - для отображения иконок слева и справа
36
+ - \`useSize\` composable - для унификации размеров (sm, md)
37
+ - \`useVariantBadge\` composable - для вариантов оформления
38
+ - \`useClassComposition\` composable - для объединения CSS классов
39
+
40
+ ### Используется в
41
+ - Статусы элементов (активен, неактивен, в ожидании)
42
+ - Счетчики уведомлений
43
+ - Метки категорий и тегов
44
+ - Индикаторы состояния
45
+ - Бейджи в таблицах и списках
46
+ - Элементы меню с счетчиками
47
+
48
+ ## Внутренняя логика
49
+
50
+ ### Варианты оформления
51
+ - **slate** (по умолчанию): Нейтральный серый цвет
52
+ - **success**: Зеленый цвет для успешных состояний
53
+ - **warning**: Желтый цвет для предупреждений
54
+ - **danger**: Красный цвет для ошибок и критических состояний
55
+ - **info**: Синий цвет для информационных меток
56
+
57
+ ### Размеры
58
+ Поддерживает два размера:
59
+ - **sm** (по умолчанию) - маленький размер
60
+ - **md** - средний размер
61
+
62
+ ### Иконки
63
+ - **iconLeft** - иконка слева от текста (Heroicon компонент)
64
+ - **iconRight** - иконка справа от текста (Heroicon компонент)
65
+ - Размер иконок автоматически адаптируется к размеру бейджа (xs)
66
+
67
+ ## Особенности
68
+
69
+ ### Форма
70
+ Все бейджи имеют форму \`rounded-full\` (полностью скругленные углы) для единообразного внешнего вида.
71
+
72
+ ### Структура
73
+ Бейдж состоит из:
74
+ 1. Иконка слева (опционально)
75
+ 2. Текст (через default slot)
76
+ 3. Иконка справа (опционально)
77
+
78
+ ### Использование
79
+ Бейджи обычно используются для:
80
+ - Статусов: "Активен", "Неактивен", "В ожидании"
81
+ - Счетчиков: количество уведомлений, элементов
82
+ - Меток: категории, теги, типы
83
+ - Индикаторов: "Новое", "Горячее", "Популярное"
84
+
85
+ ### Комбинации
86
+ Можно комбинировать:
87
+ - Только текст
88
+ - Текст + иконка слева
89
+ - Текст + иконка справа
90
+ - Текст + обе иконки
91
+ - Только иконки (без текста)
92
+
93
+ ### Стилизация
94
+ - Все варианты имеют рамку (\`border\`)
95
+ - Фон и текст автоматически подбираются для каждого варианта
96
+ - Шрифт: \`font-semibold\` для лучшей читаемости
97
+ `,
98
+ },
99
+ },
100
+ },
19
101
  argTypes: {
20
102
  variant: {
21
103
  control: 'select',
@@ -3,7 +3,73 @@ import DXBlockquote from './DXBlockquote.vue';
3
3
  export default {
4
4
  title: 'Atoms/DXBlockquote',
5
5
  component: DXBlockquote,
6
- tags: ['autodocs'],
6
+ tags: ['autodocs', 'category:typography'],
7
+ parameters: {
8
+ docs: {
9
+ description: {
10
+ component: `
11
+ # DXBlockquote
12
+
13
+ Компонент для отображения блочных цитат с поддержкой различных вариантов оформления и источника.
14
+
15
+ ## Назначение
16
+
17
+ DXBlockquote предоставляет стандартизированный способ отображения блочных цитат в статьях,
18
+ блогах и документации. Компонент поддерживает различные варианты визуального оформления
19
+ и возможность указания источника цитаты.
20
+
21
+ ## Архитектура
22
+
23
+ ### Использует
24
+ - Семантический HTML тег \`<blockquote>\` - для блочных цитат
25
+ - Семантический HTML тег \`<cite>\` - для источника цитаты
26
+
27
+ ### Используется в
28
+ - Статьи и блоги
29
+ - Документация
30
+ - Отзывы и рекомендации
31
+ - Любые места, требующие отображения цитат
32
+
33
+ ## Внутренняя логика
34
+
35
+ ### Варианты оформления
36
+ - **default**: Обычная цитата без рамки, только курсив
37
+ - **bordered** (по умолчанию): Цитата с левой рамкой
38
+ - **highlighted**: Цитата с фоном и рамкой для выделения
39
+
40
+ ### Размеры
41
+ Поддерживает 3 размера текста:
42
+ - **sm** - маленький текст
43
+ - **md** - средний текст (по умолчанию)
44
+ - **lg** - большой текст
45
+
46
+ ### Источник цитаты
47
+ Можно указать источник через:
48
+ - \`cite\` prop - текст источника
49
+ - Слот \`cite\` - кастомный источник
50
+
51
+ Источник отображается в footer с дефисом и курсивом.
52
+
53
+ ## Особенности
54
+
55
+ ### Семантика
56
+ Использует семантически правильные HTML теги:
57
+ - \`<blockquote>\` для цитаты
58
+ - \`<cite>\` для источника
59
+
60
+ Это важно для:
61
+ - SEO (поисковые системы понимают цитаты)
62
+ - Доступности (скринридеры правильно обрабатывают цитаты)
63
+ - Семантической правильности HTML
64
+
65
+ ### Визуальное оформление
66
+ - **default**: Только курсив, без дополнительного оформления
67
+ - **bordered**: Левая рамка 4px, padding слева, курсив
68
+ - **highlighted**: Фон (bg-slate-50), левая рамка, padding, скругление справа
69
+ `,
70
+ },
71
+ },
72
+ },
7
73
  argTypes: {
8
74
  variant: { control: { type: 'select' }, options: ['default', 'bordered', 'highlighted'] },
9
75
  },
@@ -3,7 +3,7 @@ import DXBox from './DXBox.vue';
3
3
  export default {
4
4
  title: 'Atoms/DXBox',
5
5
  component: DXBox,
6
- tags: ['autodocs'],
6
+ tags: ['autodocs', 'category:layout'],
7
7
  parameters: {
8
8
  docs: {
9
9
  description: {
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <component :is="tag" :class="boxClasses" data-component="DXBox">
2
+ <component :is="tag" :class="boxClasses" data-component="DXBox" :data-position="position" :data-z-index="zIndex">
3
3
  <slot />
4
4
  </component>
5
5
  </template>
@@ -32,6 +32,12 @@ const props = defineProps({
32
32
  shadow: { type: String, default: "" },
33
33
  /** Рамка */
34
34
  border: { type: Boolean, default: false },
35
+ /** Позиционирование: static | relative | absolute | fixed | sticky */
36
+ position: { type: String, default: null },
37
+ /** z-index: 0 | 10 | 20 | 30 | 40 | 50 | auto */
38
+ zIndex: { type: String, default: null },
39
+ /** Inset (top-0 right-0 bottom-0 left-0) */
40
+ inset: { type: Boolean, default: false },
35
41
  });
36
42
 
37
43
  /**
@@ -173,11 +179,69 @@ const shadowClass = computed(() => {
173
179
  return shadowClasses[props.shadow] || `shadow-${props.shadow}`;
174
180
  });
175
181
 
182
+ /**
183
+ * Классы позиционирования
184
+ *
185
+ * @description
186
+ * Определяет CSS position для box компонента.
187
+ *
188
+ * @returns {string|null} Tailwind CSS класс для позиционирования или null
189
+ */
190
+ const positionClass = computed(() => {
191
+ if (!props.position) return null;
192
+
193
+ const positionClasses = {
194
+ static: "static",
195
+ relative: "relative",
196
+ absolute: "absolute",
197
+ fixed: "fixed",
198
+ sticky: "sticky",
199
+ };
200
+
201
+ return positionClasses[props.position] || null;
202
+ });
203
+
204
+ /**
205
+ * Классы z-index
206
+ *
207
+ * @description
208
+ * Определяет z-index для box компонента.
209
+ *
210
+ * @returns {string|null} Tailwind CSS класс для z-index или null
211
+ */
212
+ const zIndexClass = computed(() => {
213
+ if (!props.zIndex) return null;
214
+
215
+ const zIndexClasses = {
216
+ "0": "z-0",
217
+ "10": "z-10",
218
+ "20": "z-20",
219
+ "30": "z-30",
220
+ "40": "z-40",
221
+ "50": "z-50",
222
+ auto: "z-auto",
223
+ };
224
+
225
+ return zIndexClasses[props.zIndex] || null;
226
+ });
227
+
228
+ /**
229
+ * Класс inset
230
+ *
231
+ * @description
232
+ * Применяет inset-0 (top-0 right-0 bottom-0 left-0) для абсолютного/фиксированного позиционирования.
233
+ *
234
+ * @returns {string|null} Tailwind CSS класс для inset или null
235
+ */
236
+ const insetClass = computed(() => {
237
+ return props.inset ? "inset-0" : null;
238
+ });
239
+
176
240
  /**
177
241
  * Все классы для box компонента
178
242
  *
179
243
  * @description
180
- * Объединяет все классы стилизации (padding, margin, rounded, bg, shadow, border)
244
+ * Объединяет все классы стилизации (padding, margin, rounded, bg, shadow, border, position, zIndex, inset)
181
245
  * с использованием useClassComposition для единообразного подхода.
182
246
  *
183
247
  * @returns {Array} Массив классов для применения к элементу
@@ -189,6 +253,9 @@ const boxClasses = computed(() =>
189
253
  roundedClass.value,
190
254
  bgClass.value,
191
255
  shadowClass.value,
256
+ positionClass.value,
257
+ zIndexClass.value,
258
+ insetClass.value,
192
259
  {
193
260
  "border border-slate-200": props.border,
194
261
  }
@@ -5,7 +5,100 @@ import { PlusIcon, TrashIcon, PencilIcon, HeartIcon } from '@heroicons/vue/24/ou
5
5
  export default {
6
6
  title: 'Atoms/DXButton',
7
7
  component: DXButton,
8
- tags: ['autodocs'],
8
+ tags: ['autodocs', 'category:form'],
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component: `
13
+ # DXButton
14
+
15
+ Универсальный компонент кнопки с поддержкой различных вариантов оформления, размеров и режимов использования.
16
+
17
+ ## Назначение
18
+
19
+ DXButton предоставляет стандартизированный способ создания кнопок в приложении. Компонент поддерживает
20
+ множество вариантов оформления, размеров, может работать как обычная кнопка, ссылка или router-link,
21
+ а также автоматически адаптируется при использовании внутри DXButtonGroup.
22
+
23
+ ## Архитектура
24
+
25
+ ### Использует
26
+ - \`useSize\` composable - для унификации размеров (xs, sm, md, lg, xl)
27
+ - \`useVariantButton\` composable - для вариантов оформления
28
+ - \`useClassComposition\` composable - для объединения CSS классов
29
+ - \`provide/inject\` - для интеграции с DXButtonGroup
30
+
31
+ ### Используется в
32
+ - \`DXButtonGroup\` - группы кнопок для выбора значений
33
+ - \`DXPagination\` - кнопки навигации по страницам
34
+ - \`DXModal\` - кнопки действий в модальных окнах
35
+ - \`DXAlert\` - кнопки действий в уведомлениях
36
+ - \`DXFormControl\` - кнопки в формах
37
+ - Любые места, где требуется интерактивная кнопка
38
+
39
+ ## Внутренняя логика
40
+
41
+ ### Динамический рендеринг
42
+ Компонент использует \`<component :is="componentTag">\` для выбора HTML тега:
43
+ - Если указан \`to\` prop → рендерится как \`router-link\` (Vue Router)
44
+ - Если указан \`href\` prop → рендерится как \`<a>\` (обычная ссылка)
45
+ - По умолчанию → рендерится как \`<button>\`
46
+
47
+ ### Интеграция с DXButtonGroup
48
+ При использовании внутри \`DXButtonGroup\`:
49
+ - Кнопка автоматически регистрируется в группе через \`provide/inject\`
50
+ - Размер синхронизируется с размером группы (sm → sm, md → md, lg → lg)
51
+ - Состояние \`disabled\` наследуется от группы
52
+ - Border-radius адаптируется в зависимости от позиции (первая/последняя/средняя)
53
+ - Визуальное состояние (selected/not selected) управляется группой
54
+ - При клике с \`value\` prop, выбор обрабатывается через группу
55
+
56
+ ### Варианты оформления
57
+ - **primary** - основная кнопка (темный фон)
58
+ - **secondary** - вторичная кнопка (светлый фон)
59
+ - **ghost** - прозрачная кнопка (без фона)
60
+ - **outline** - кнопка с рамкой
61
+ - **soft** - мягкая кнопка (светлый фон)
62
+ - **link** - стиль ссылки
63
+ - **success**, **warning**, **danger**, **info** - семантические варианты
64
+
65
+ ### Размеры
66
+ Поддерживает 5 размеров:
67
+ - **xs** - 28px высота
68
+ - **sm** - 32px высота
69
+ - **md** - 40px высота (по умолчанию)
70
+ - **lg** - 48px высота
71
+ - **xl** - 56px высота
72
+
73
+ ## Особенности
74
+
75
+ ### Режим iconOnly
76
+ При \`iconOnly={true}\` кнопка становится квадратной (одинаковая ширина и высота),
77
+ padding убирается, используется только размер иконки.
78
+
79
+ ### Режим block
80
+ При \`block={true}\` кнопка растягивается на всю ширину контейнера (\`w-full\`).
81
+
82
+ ### Поддержка Vue Router
83
+ При указании \`to\` prop, кнопка автоматически становится \`router-link\` и поддерживает
84
+ все возможности Vue Router (навигация, активные состояния и т.д.).
85
+
86
+ ### Обычные ссылки
87
+ При указании \`href\` prop, кнопка становится обычной ссылкой с поддержкой
88
+ \`target\` и \`rel\` атрибутов для внешних ссылок.
89
+
90
+ ### Состояния
91
+ - **disabled** - отключает кнопку (opacity-60, cursor-not-allowed)
92
+ - **selected** (в группе) - визуально выделяет выбранную кнопку темным фоном
93
+
94
+ ### Обработка кликов
95
+ - В группе с \`value\`: клик обрабатывается через группу, стандартное поведение предотвращается
96
+ - Router-link/ссылка: стандартное поведение навигации
97
+ - Обычная кнопка: стандартное поведение кнопки
98
+ `,
99
+ },
100
+ },
101
+ },
9
102
  argTypes: {
10
103
  variant: {
11
104
  control: 'select',