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.
- package/dist/dxd-style-code.js +7470 -6336
- package/dist/dxd-style-code.umd.cjs +3 -3
- package/dist/style.css +1 -1
- package/package.json +2 -2
- package/src/components/atoms/DX/DX.stories.js +265 -0
- package/src/components/atoms/DX/DX.vue +80 -0
- package/src/components/atoms/DX/index.js +2 -0
- package/src/components/atoms/DXAvatar/DXAvatar.stories.js +1 -2
- package/src/components/atoms/DXBackdrop/DXBackdrop.stories.js +77 -1
- package/src/components/atoms/DXBadge/DXBadge.stories.js +83 -1
- package/src/components/atoms/DXBlockquote/DXBlockquote.stories.js +67 -1
- package/src/components/atoms/DXBox/DXBox.stories.js +1 -1
- package/src/components/atoms/DXBox/DXBox.vue +69 -2
- package/src/components/atoms/DXButton/DXButton.stories.js +94 -1
- package/src/components/atoms/DXButton/DXButton.vue +145 -11
- package/src/components/atoms/DXCard/DXCard.stories.js +72 -14
- package/src/components/atoms/DXCard/DXCard.vue +3 -4
- package/src/components/atoms/DXCheckbox/DXCheckbox.stories.js +85 -1
- package/src/components/atoms/DXCode/DXCode.stories.js +67 -1
- package/src/components/atoms/DXContainer/DXContainer.stories.js +1 -1
- package/src/components/atoms/DXContainer/DXContainer.vue +28 -1
- package/src/components/atoms/DXDivider/DXDivider.stories.js +84 -1
- package/src/components/atoms/DXFlex/DXFlex.stories.js +1 -1
- package/src/components/atoms/DXFlex/DXFlex.vue +57 -3
- package/src/components/atoms/DXFormLabel/DXFormLabel.stories.js +70 -1
- package/src/components/atoms/DXGrid/DXGrid.stories.js +1 -1
- package/src/components/atoms/DXHeading/DXHeading.stories.js +90 -1
- package/src/components/atoms/DXIcon/DXIcon.stories.js +74 -0
- package/src/components/atoms/DXIconWrapper/DXIconWrapper.stories.js +69 -0
- package/src/components/atoms/DXImage/DXImage.stories.js +483 -0
- package/src/components/atoms/DXImage/DXImage.vue +294 -0
- package/src/components/atoms/DXImage/index.js +2 -0
- package/src/components/atoms/DXInputAddon/DXInputAddon.stories.js +86 -1
- package/src/components/atoms/DXLabel/DXLabel.stories.js +62 -1
- package/src/components/atoms/DXLink/DXLink.stories.js +75 -10
- package/src/components/atoms/DXLink/DXLink.vue +59 -3
- package/src/components/atoms/DXList/DXList.stories.js +76 -1
- package/src/components/atoms/DXLoader/DXLoader.stories.js +75 -1
- package/src/components/atoms/DXNav/DXNav.stories.js +236 -0
- package/src/components/atoms/DXNav/DXNav.vue +114 -0
- package/src/components/atoms/DXNav/index.js +2 -0
- package/src/components/atoms/DXProgress/DXProgress.stories.js +76 -1
- package/src/components/atoms/DXRadio/DXRadio.stories.js +85 -1
- package/src/components/atoms/DXSkeleton/DXSkeleton.stories.js +59 -1
- package/src/components/atoms/DXSlider/DXSlider.stories.js +89 -0
- package/src/components/atoms/DXSpacer/DXSpacer.stories.js +1 -1
- package/src/components/atoms/DXStack/DXStack.stories.js +1 -1
- package/src/components/atoms/DXStack/DXStack.vue +5 -2
- package/src/components/atoms/DXTags/DXTags.stories.js +77 -0
- package/src/components/atoms/DXText/DXText.stories.js +83 -1
- package/src/components/atoms/DXToast/DXToast.stories.js +64 -1
- package/src/components/atoms/DXToggle/DXToggle.stories.js +84 -1
- package/src/components/atoms/DXToggleButton/DXToggleButton.stories.js +78 -1
- package/src/components/atoms/DXTooltip/DXTooltip.stories.js +98 -1
- package/src/components/atoms/index.js +3 -0
- package/src/components/molecules/DXActionButtons/DXActionButtons.stories.js +280 -77
- package/src/components/molecules/DXActionButtons/DXActionButtons.vue +31 -31
- package/src/components/molecules/DXAlert/DXAlert.stories.js +199 -1
- package/src/components/molecules/DXAlert/DXAlert.vue +35 -13
- package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.stories.js +125 -1
- package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.vue +22 -18
- package/src/components/molecules/DXButtonGroup/DXButtonGroup.stories.js +193 -6
- package/src/components/molecules/DXButtonGroup/DXButtonGroup.vue +39 -3
- package/src/components/molecules/DXCloseButton/DXCloseButton.stories.js +64 -1
- package/src/components/molecules/DXComboBox/DXComboBox.stories.js +66 -0
- package/src/components/molecules/DXCopyField/DXCopyField.stories.js +128 -1
- package/src/components/molecules/DXCopyField/DXCopyField.vue +60 -7
- package/src/components/molecules/DXDataFilter/DXDataFilter.vue +8 -6
- package/src/components/molecules/DXDatePicker/DXDatePicker.stories.js +58 -0
- package/src/components/molecules/DXFileUpload/DXFileUpload.stories.js +66 -0
- package/src/components/molecules/DXFilterGroup/DXFilterGroup.stories.js +61 -0
- package/src/components/molecules/DXFormControl/DXFormControl.stories.js +76 -0
- package/src/components/molecules/DXFormControl/DXFormControl.vue +9 -8
- package/src/components/molecules/DXInput/DXInput.stories.js +100 -1
- package/src/components/molecules/DXInputGroup/DXInputGroup.stories.js +89 -1
- package/src/components/molecules/DXInputMask/DXInputMask.stories.js +67 -0
- package/src/components/molecules/DXMenu/DXMenu.stories.js +111 -4
- package/src/components/molecules/DXMenu/DXMenu.vue +18 -5
- package/src/components/molecules/DXMenu/README.md +1 -1
- package/src/components/molecules/DXPagination/DXPagination.stories.js +105 -2
- package/src/components/molecules/DXPagination/DXPagination.vue +18 -33
- package/src/components/molecules/DXPasswordInput/DXPasswordInput.stories.js +67 -1
- package/src/components/molecules/DXRadioCard/DXRadioCard.stories.js +64 -0
- package/src/components/molecules/DXRadioGroup/DXRadioGroup.stories.js +84 -0
- package/src/components/molecules/DXRating/DXRating.stories.js +3 -2
- package/src/components/molecules/DXSearchBar/DXSearchBar.stories.js +1 -1
- package/src/components/molecules/DXSearchBar/DXSearchBar.vue +16 -12
- package/src/components/molecules/DXSearchSelect/DXSearchSelect.stories.js +71 -0
- package/src/components/molecules/DXSegmentedControl/DXSegmentedControl.stories.js +74 -0
- package/src/components/molecules/DXSelect/DXSelect.stories.js +92 -1
- package/src/components/molecules/DXStatCard/DXStatCard.stories.js +1 -1
- package/src/components/molecules/DXStatCard/DXStatCard.vue +30 -26
- package/src/components/molecules/DXTableFiltersPanel/index.js +2 -0
- package/src/components/molecules/DXTablePagination/DXTablePagination.stories.js +67 -0
- package/src/components/molecules/DXTableToolbar/DXTableToolbar.stories.js +71 -0
- package/src/components/molecules/DXTextarea/DXTextarea.stories.js +87 -1
- package/src/components/molecules/DXTimePicker/DXTimePicker.stories.js +1 -1
- package/src/components/molecules/DXValidationIcon/DXValidationIcon.stories.js +59 -1
- package/src/components/molecules/index.js +0 -1
- package/src/components/organisms/DXAccordion/DXAccordion.stories.js +75 -0
- package/src/components/organisms/DXAppLayout/DXAppLayout.stories.js +27 -25
- package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.stories.js +0 -2
- package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.vue +5 -8
- package/src/components/{molecules → organisms}/DXBaseTable/DXBaseTable.stories.js +78 -1
- package/src/components/{molecules → organisms}/DXBaseTable/DXBaseTable.vue +2 -2
- package/src/components/organisms/DXChartContainer/DXChartContainer.stories.js +1 -1
- package/src/components/organisms/DXChartContainer/DXChartContainer.vue +10 -6
- package/src/components/organisms/DXChatInterface/DXChatInterface.stories.js +1 -1
- package/src/components/organisms/DXChatInterface/DXChatInterface.vue +6 -4
- package/src/components/organisms/DXCommentSection/DXCommentSection.stories.js +1 -1
- package/src/components/organisms/DXCommentSection/DXCommentSection.vue +7 -6
- package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.stories.js +1 -1
- package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.vue +4 -2
- package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.stories.js +1 -1
- package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.vue +3 -2
- package/src/components/organisms/DXDataTable/DXDataTable.stories.js +1 -1
- package/src/components/organisms/DXDropdown/DXDropdown.stories.js +84 -1
- package/src/components/organisms/DXEmptyState/DXEmptyState.stories.js +64 -0
- package/src/components/organisms/DXEmptyState/DXEmptyState.vue +4 -2
- package/src/components/organisms/DXHeaderBar/DXHeaderBar.stories.js +409 -3
- package/src/components/organisms/DXHeaderBar/DXHeaderBar.vue +261 -52
- package/src/components/organisms/DXMediaGallery/DXMediaGallery.stories.js +1 -1
- package/src/components/organisms/DXMediaGallery/DXMediaGallery.vue +6 -4
- package/src/components/organisms/DXModal/DXModal.stories.js +93 -1
- package/src/components/organisms/DXModal/DXModal.vue +3 -2
- package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.stories.js +1 -1
- package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.vue +2 -1
- package/src/components/organisms/DXReportGenerator/DXReportGenerator.vue +4 -3
- package/src/components/organisms/DXSettingsPanel/DXSettingsPanel.vue +11 -8
- package/src/components/organisms/DXSidebar/DXSidebar.stories.js +1 -1
- package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.stories.js +104 -1
- package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.vue +14 -4
- package/src/components/organisms/DXSidebarMenu/README.md +3 -3
- package/src/components/organisms/DXTable/DXTable.stories.js +138 -11
- package/src/components/organisms/DXTable/DXTable.vue +1 -1
- package/src/components/organisms/DXTabs/DXTabs.stories.js +91 -1
- package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.stories.js +1 -1
- package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.vue +20 -18
- package/src/components/organisms/index.js +1 -0
- package/src/components/utilities/DXAnimatePresence/DXAnimatePresence.stories.js +1 -1
- package/src/components/utilities/DXBreakpointProvider/DXBreakpointProvider.stories.js +1 -1
- package/src/components/utilities/DXObserver/DXObserver.stories.js +1 -1
- package/src/components/utilities/DXPortal/DXPortal.stories.js +1 -1
- package/src/components/utilities/DXStaggeredAnimation/DXStaggeredAnimation.stories.js +2 -2
- package/src/components/utilities/DXThemeProvider/DXThemeProvider.stories.js +1 -1
- package/src/components/utilities/DXTransitionGroup/DXTransitionGroup.stories.js +1 -1
- package/src/composables/useSize.js +8 -1
- /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
|
+
|
|
@@ -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
|
},
|
|
@@ -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',
|