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