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
|
@@ -5,6 +5,70 @@ export default {
|
|
|
5
5
|
title: 'Molecules/DXRadioCard',
|
|
6
6
|
component: DXRadioCard,
|
|
7
7
|
tags: ['autodocs'],
|
|
8
|
+
parameters: {
|
|
9
|
+
docs: {
|
|
10
|
+
description: {
|
|
11
|
+
component: `
|
|
12
|
+
# DXRadioCard
|
|
13
|
+
|
|
14
|
+
Компонент карточки с радиокнопкой для выбора одного варианта из группы с визуальным выделением.
|
|
15
|
+
|
|
16
|
+
## Назначение
|
|
17
|
+
|
|
18
|
+
DXRadioCard предоставляет способ выбора одного варианта из группы через карточки вместо
|
|
19
|
+
обычных радиокнопок. Компонент идеально подходит для выбора планов, тарифов и других
|
|
20
|
+
вариантов, требующих визуального выделения.
|
|
21
|
+
|
|
22
|
+
## Архитектура
|
|
23
|
+
|
|
24
|
+
### Использует
|
|
25
|
+
- Нативный input type="radio" - для семантики и доступности
|
|
26
|
+
- Динамический рендеринг иконки - для опциональной иконки
|
|
27
|
+
|
|
28
|
+
### Используется в
|
|
29
|
+
- Выбор планов подписки
|
|
30
|
+
- Выбор тарифов
|
|
31
|
+
- Выбор вариантов доставки
|
|
32
|
+
- Любые места, требующие визуальный выбор варианта
|
|
33
|
+
|
|
34
|
+
## Внутренняя логика
|
|
35
|
+
|
|
36
|
+
### Визуальное состояние
|
|
37
|
+
- **selected**: Темная рамка (\`border-slate-900\`), светлый фон (\`bg-slate-50\`), галочка справа
|
|
38
|
+
- **unselected**: Светлая рамка (\`border-slate-200\`), белый фон, hover эффект
|
|
39
|
+
|
|
40
|
+
### Иконка
|
|
41
|
+
Опциональная иконка слева от контента:
|
|
42
|
+
- В выбранном состоянии: темный цвет (\`text-slate-900\`)
|
|
43
|
+
- В невыбранном состоянии: серый цвет (\`text-slate-400\`)
|
|
44
|
+
|
|
45
|
+
### Галочка
|
|
46
|
+
При выборе карточки:
|
|
47
|
+
- Отображается круглая галочка справа вверху
|
|
48
|
+
- Темный фон с белой галочкой
|
|
49
|
+
|
|
50
|
+
## Особенности
|
|
51
|
+
|
|
52
|
+
### v-model
|
|
53
|
+
Полностью поддерживает двустороннее связывание через \`v-model\` для String, Number или Boolean значений.
|
|
54
|
+
|
|
55
|
+
### Структура
|
|
56
|
+
Карточка состоит из:
|
|
57
|
+
- Иконка (опционально)
|
|
58
|
+
- Заголовок (\`title\`)
|
|
59
|
+
- Описание (\`description\`)
|
|
60
|
+
- Дополнительный контент (через default slot)
|
|
61
|
+
|
|
62
|
+
### Состояния
|
|
63
|
+
- **disabled** - отключает карточку (opacity, cursor-not-allowed)
|
|
64
|
+
- **selected** - визуально выделяет выбранную карточку
|
|
65
|
+
|
|
66
|
+
### Слоты
|
|
67
|
+
- **default** - дополнительный контент внутри карточки
|
|
68
|
+
`,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
8
72
|
};
|
|
9
73
|
|
|
10
74
|
export const Default = {
|
|
@@ -5,6 +5,90 @@ export default {
|
|
|
5
5
|
title: 'Molecules/DXRadioGroup',
|
|
6
6
|
component: DXRadioGroup,
|
|
7
7
|
tags: ['autodocs'],
|
|
8
|
+
parameters: {
|
|
9
|
+
docs: {
|
|
10
|
+
description: {
|
|
11
|
+
component: `
|
|
12
|
+
# DXRadioGroup
|
|
13
|
+
|
|
14
|
+
Компонент группы радиокнопок для выбора одного значения из списка опций.
|
|
15
|
+
|
|
16
|
+
## Назначение
|
|
17
|
+
|
|
18
|
+
DXRadioGroup предоставляет способ группировки радиокнопок для выбора одного значения.
|
|
19
|
+
Компонент автоматически управляет состоянием выбора, синхронизирует стили и поддерживает
|
|
20
|
+
вертикальное и горизонтальное расположение.
|
|
21
|
+
|
|
22
|
+
## Архитектура
|
|
23
|
+
|
|
24
|
+
### Использует
|
|
25
|
+
- \`DXRadio\` - отдельные радиокнопки в группе
|
|
26
|
+
|
|
27
|
+
### Используется в
|
|
28
|
+
- Формы с выбором одного варианта
|
|
29
|
+
- Настройки и конфигурация
|
|
30
|
+
- Фильтры с одним выбором
|
|
31
|
+
- Любые места, требующие выбор одного значения из группы
|
|
32
|
+
|
|
33
|
+
## Внутренняя логика
|
|
34
|
+
|
|
35
|
+
### Структура опций
|
|
36
|
+
Опции передаются через массив объектов:
|
|
37
|
+
\`\`\`
|
|
38
|
+
[{ value: 'value1', label: 'Label 1' }, { value: 'value2', label: 'Label 2' }]
|
|
39
|
+
\`\`\`
|
|
40
|
+
|
|
41
|
+
Каждая опция может содержать:
|
|
42
|
+
- \`value\` - значение опции (обязательно)
|
|
43
|
+
- \`label\` - текст опции (обязательно)
|
|
44
|
+
- \`disabled\` - отключить конкретную опцию
|
|
45
|
+
- \`color\` - цвет для custom variant (переопределяет глобальный цвет)
|
|
46
|
+
|
|
47
|
+
### Расположение
|
|
48
|
+
- **vertical** (по умолчанию): Вертикальное расположение (\`flex-col\`)
|
|
49
|
+
- **horizontal**: Горизонтальное расположение (\`flex flex-wrap\`)
|
|
50
|
+
|
|
51
|
+
### Варианты
|
|
52
|
+
- **default**: Нативные радиокнопки с кастомной стилизацией
|
|
53
|
+
- **custom**: Кастомные радиокнопки с точкой и настраиваемыми цветами
|
|
54
|
+
|
|
55
|
+
### Размеры
|
|
56
|
+
Поддерживает 3 размера:
|
|
57
|
+
- **sm** - маленький
|
|
58
|
+
- **md** - средний (по умолчанию)
|
|
59
|
+
- **lg** - большой
|
|
60
|
+
|
|
61
|
+
### Цвета (для custom variant)
|
|
62
|
+
Поддерживает 6 цветовых вариантов:
|
|
63
|
+
- **slate** - нейтральный серый
|
|
64
|
+
- **primary** - основной цвет (по умолчанию)
|
|
65
|
+
- **success** - зеленый цвет
|
|
66
|
+
- **danger** - красный цвет
|
|
67
|
+
- **warning** - желтый цвет
|
|
68
|
+
- **info** - синий цвет
|
|
69
|
+
|
|
70
|
+
## Особенности
|
|
71
|
+
|
|
72
|
+
### v-model
|
|
73
|
+
Полностью поддерживает двустороннее связывание через \`v-model\` для String, Number или Boolean значений.
|
|
74
|
+
|
|
75
|
+
### Лейбл и вспомогательный текст
|
|
76
|
+
- \`label\` - отображается над группой
|
|
77
|
+
- \`helper\` - вспомогательный текст под группой
|
|
78
|
+
|
|
79
|
+
### Состояния
|
|
80
|
+
- **disabled** - отключает всю группу
|
|
81
|
+
- Можно отключить отдельные опции через \`disabled\` в объекте опции
|
|
82
|
+
|
|
83
|
+
### Синхронизация
|
|
84
|
+
Все радиокнопки в группе автоматически синхронизируются:
|
|
85
|
+
- Размер применяется ко всем кнопкам
|
|
86
|
+
- Вариант применяется ко всем кнопкам
|
|
87
|
+
- Цвет применяется ко всем кнопкам (если не переопределен в опции)
|
|
88
|
+
`,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
},
|
|
8
92
|
argTypes: {
|
|
9
93
|
variant: {
|
|
10
94
|
control: 'select',
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { ref } from 'vue';
|
|
2
2
|
import DXRating from './DXRating.vue';
|
|
3
3
|
import DXFormControl from '../DXFormControl/DXFormControl.vue';
|
|
4
|
+
import DXText from '../../atoms/DXText/DXText.vue';
|
|
4
5
|
|
|
5
6
|
export default {
|
|
6
7
|
title: 'Molecules/DXRating',
|
|
7
8
|
component: DXRating,
|
|
8
|
-
tags: ['autodocs'],
|
|
9
|
+
tags: ['autodocs', 'category:data-display'],
|
|
9
10
|
parameters: {
|
|
10
11
|
docs: {
|
|
11
12
|
description: {
|
|
@@ -264,7 +265,7 @@ export const HeartSymbol = {
|
|
|
264
265
|
symbol="heart"
|
|
265
266
|
color="red"
|
|
266
267
|
/>
|
|
267
|
-
<p
|
|
268
|
+
<DXText tag="p" size="sm" color="muted">Выбрано: {{ heartRating }}</DXText>
|
|
268
269
|
</div>
|
|
269
270
|
`,
|
|
270
271
|
}),
|
|
@@ -34,12 +34,15 @@
|
|
|
34
34
|
class="cursor-pointer text-slate-400 hover:text-slate-600"
|
|
35
35
|
@click="handleClear"
|
|
36
36
|
/>
|
|
37
|
-
<
|
|
37
|
+
<DXText
|
|
38
38
|
v-if="hotkey && !modelValue"
|
|
39
|
-
|
|
39
|
+
tag="span"
|
|
40
|
+
size="xs"
|
|
41
|
+
color="muted"
|
|
42
|
+
class="border border-slate-200 rounded px-1.5 py-0.5"
|
|
40
43
|
>
|
|
41
44
|
{{ hotkeyLabel }}
|
|
42
|
-
</
|
|
45
|
+
</DXText>
|
|
43
46
|
</div>
|
|
44
47
|
</template>
|
|
45
48
|
</DXInput>
|
|
@@ -53,9 +56,9 @@
|
|
|
53
56
|
>
|
|
54
57
|
<!-- История поиска -->
|
|
55
58
|
<div v-if="showHistory && historyItems.length > 0 && !modelValue" class="p-2">
|
|
56
|
-
<div class="px-2 py-1
|
|
59
|
+
<DXText tag="div" size="xs" weight="semibold" color="muted" class="px-2 py-1 uppercase">
|
|
57
60
|
История поиска
|
|
58
|
-
</
|
|
61
|
+
</DXText>
|
|
59
62
|
<div
|
|
60
63
|
v-for="(item, index) in historyItems"
|
|
61
64
|
:key="index"
|
|
@@ -64,7 +67,7 @@
|
|
|
64
67
|
@click="selectHistoryItem(item)"
|
|
65
68
|
@mouseenter="selectedHistoryIndex = index"
|
|
66
69
|
>
|
|
67
|
-
<span>{{ item }}</
|
|
70
|
+
<DXText tag="span">{{ item }}</DXText>
|
|
68
71
|
<DXIcon
|
|
69
72
|
:icon="ClockIcon"
|
|
70
73
|
size="xs"
|
|
@@ -83,24 +86,24 @@
|
|
|
83
86
|
@click="selectSuggestion(suggestion)"
|
|
84
87
|
@mouseenter="selectedSuggestionIndex = index"
|
|
85
88
|
>
|
|
86
|
-
<div
|
|
87
|
-
<
|
|
89
|
+
<DXText tag="div" weight="medium">{{ suggestion.title }}</DXText>
|
|
90
|
+
<DXText v-if="suggestion.category" tag="div" size="xs" color="muted" class="mt-0.5">
|
|
88
91
|
{{ suggestion.category }}
|
|
89
|
-
</
|
|
92
|
+
</DXText>
|
|
90
93
|
</div>
|
|
91
94
|
</div>
|
|
92
95
|
|
|
93
96
|
<!-- Фильтры -->
|
|
94
97
|
<div v-if="filters && filters.length > 0" class="p-2 border-t border-slate-200">
|
|
95
|
-
<div class="px-2 py-1
|
|
98
|
+
<DXText tag="div" size="xs" weight="semibold" color="muted" class="px-2 py-1 uppercase mb-2">
|
|
96
99
|
Фильтры
|
|
97
|
-
</
|
|
100
|
+
</DXText>
|
|
98
101
|
<div
|
|
99
102
|
v-for="filter in filters"
|
|
100
103
|
:key="filter.id"
|
|
101
104
|
class="mb-2"
|
|
102
105
|
>
|
|
103
|
-
<label class="block
|
|
106
|
+
<DXText tag="label" size="xs" color="muted" class="block mb-1">{{ filter.label }}</DXText>
|
|
104
107
|
<select
|
|
105
108
|
v-model="selectedFilters[filter.id]"
|
|
106
109
|
class="w-full text-sm border border-slate-200 rounded-lg px-2 py-1 focus:outline-none focus:ring-2 focus:ring-slate-900/10"
|
|
@@ -128,6 +131,7 @@ import { useClassComposition } from "../../../composables/useClassComposition";
|
|
|
128
131
|
import DXInput from "../DXInput/DXInput.vue";
|
|
129
132
|
import DXIcon from "../../atoms/DXIcon/DXIcon.vue";
|
|
130
133
|
import DXLoader from "../../atoms/DXLoader/DXLoader.vue";
|
|
134
|
+
import DXText from "../../atoms/DXText/DXText.vue";
|
|
131
135
|
import {
|
|
132
136
|
MagnifyingGlassIcon,
|
|
133
137
|
XMarkIcon,
|
|
@@ -5,6 +5,77 @@ export default {
|
|
|
5
5
|
title: 'Molecules/DXSearchSelect',
|
|
6
6
|
component: DXSearchSelect,
|
|
7
7
|
tags: ['autodocs'],
|
|
8
|
+
parameters: {
|
|
9
|
+
docs: {
|
|
10
|
+
description: {
|
|
11
|
+
component: `
|
|
12
|
+
# DXSearchSelect
|
|
13
|
+
|
|
14
|
+
Компонент выбора с поиском, поддерживающий одиночный и множественный выбор.
|
|
15
|
+
|
|
16
|
+
## Назначение
|
|
17
|
+
|
|
18
|
+
DXSearchSelect предоставляет расширенный select с встроенным поиском, поддержкой
|
|
19
|
+
множественного выбора и возможностью создания новых опций. Компонент идеально подходит
|
|
20
|
+
для больших списков опций.
|
|
21
|
+
|
|
22
|
+
## Архитектура
|
|
23
|
+
|
|
24
|
+
### Использует
|
|
25
|
+
- Динамический dropdown - для отображения опций
|
|
26
|
+
- Поисковая строка - для фильтрации опций
|
|
27
|
+
|
|
28
|
+
### Используется в
|
|
29
|
+
- Выбор пользователей
|
|
30
|
+
- Выбор тегов и категорий
|
|
31
|
+
- Множественный выбор из больших списков
|
|
32
|
+
- Любые места, требующие выбор с поиском
|
|
33
|
+
|
|
34
|
+
## Внутренняя логика
|
|
35
|
+
|
|
36
|
+
### Режимы выбора
|
|
37
|
+
- **single** (по умолчанию): Выбор одного значения
|
|
38
|
+
- **multiple**: Выбор нескольких значений
|
|
39
|
+
|
|
40
|
+
### Поиск
|
|
41
|
+
- Фильтрация опций происходит в реальном времени
|
|
42
|
+
- Поиск нечувствителен к регистру
|
|
43
|
+
- При отсутствии результатов показывается "Не найдено"
|
|
44
|
+
|
|
45
|
+
### Множественный выбор
|
|
46
|
+
При \`multiple={true}\`:
|
|
47
|
+
- Выбранные опции отображаются как теги над полем
|
|
48
|
+
- Каждый тег можно удалить отдельно
|
|
49
|
+
- Отображается количество выбранных элементов
|
|
50
|
+
|
|
51
|
+
### Создание новых опций
|
|
52
|
+
При \`creatable={true}\`:
|
|
53
|
+
- Можно создать новую опцию из поискового запроса
|
|
54
|
+
- Отображается кнопка "Создать ..." при отсутствии результатов
|
|
55
|
+
|
|
56
|
+
## Особенности
|
|
57
|
+
|
|
58
|
+
### v-model
|
|
59
|
+
Полностью поддерживает двустороннее связывание через \`v-model\`:
|
|
60
|
+
- Для single: String или Number
|
|
61
|
+
- Для multiple: Array значений
|
|
62
|
+
|
|
63
|
+
### Структура опций
|
|
64
|
+
Опции передаются через массив объектов:
|
|
65
|
+
\`\`\`
|
|
66
|
+
[{ value: 'value', label: 'Label', icon?: Icon }]
|
|
67
|
+
\`\`\`
|
|
68
|
+
|
|
69
|
+
### Иконки
|
|
70
|
+
Каждая опция может иметь иконку через \`icon\` свойство.
|
|
71
|
+
|
|
72
|
+
### Клавиатурная навигация
|
|
73
|
+
- **Escape** - закрытие dropdown
|
|
74
|
+
- Поисковая строка не закрывает dropdown при вводе
|
|
75
|
+
`,
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
8
79
|
};
|
|
9
80
|
|
|
10
81
|
const users = [
|
|
@@ -24,6 +24,80 @@ export default {
|
|
|
24
24
|
title: 'Molecules/DXSegmentedControl',
|
|
25
25
|
component: DXSegmentedControl,
|
|
26
26
|
tags: ['autodocs'],
|
|
27
|
+
parameters: {
|
|
28
|
+
docs: {
|
|
29
|
+
description: {
|
|
30
|
+
component: `
|
|
31
|
+
# DXSegmentedControl
|
|
32
|
+
|
|
33
|
+
Компонент сегментированного контрола для выбора одного значения из группы с плавающим индикатором.
|
|
34
|
+
|
|
35
|
+
## Назначение
|
|
36
|
+
|
|
37
|
+
DXSegmentedControl предоставляет способ выбора одного значения из группы опций с визуальным
|
|
38
|
+
индикатором выбранного сегмента. Компонент поддерживает иконки, счетчики, анимации и
|
|
39
|
+
автоматически адаптирует размер индикатора под выбранный сегмент.
|
|
40
|
+
|
|
41
|
+
## Архитектура
|
|
42
|
+
|
|
43
|
+
### Использует
|
|
44
|
+
- \`DXIcon\` - для иконок в опциях
|
|
45
|
+
- Динамическое позиционирование - для плавающего индикатора
|
|
46
|
+
|
|
47
|
+
### Используется в
|
|
48
|
+
- Переключение режимов отображения
|
|
49
|
+
- Фильтры и сортировка
|
|
50
|
+
- Настройки и опции
|
|
51
|
+
- Любые места, требующие выбора одного значения из группы
|
|
52
|
+
|
|
53
|
+
## Внутренняя логика
|
|
54
|
+
|
|
55
|
+
### Плавающий индикатор
|
|
56
|
+
Компонент использует абсолютно позиционированный индикатор, который автоматически
|
|
57
|
+
перемещается к выбранному сегменту:
|
|
58
|
+
- Размер индикатора соответствует размеру выбранной кнопки
|
|
59
|
+
- Позиция вычисляется динамически на основе offset выбранной кнопки
|
|
60
|
+
- Плавная анимация перемещения через CSS transitions
|
|
61
|
+
|
|
62
|
+
### Структура опций
|
|
63
|
+
Каждая опция может содержать:
|
|
64
|
+
- \`value\` - значение опции (обязательно)
|
|
65
|
+
- \`label\` - текст опции
|
|
66
|
+
- \`icon\` - иконка (Heroicon компонент)
|
|
67
|
+
- \`count\` - счетчик (число)
|
|
68
|
+
|
|
69
|
+
### Анимации иконок
|
|
70
|
+
- Глобальная анимация через \`iconAnimation\` prop
|
|
71
|
+
- При \`animateActiveOnly={true}\` (по умолчанию) - анимируется только активная иконка
|
|
72
|
+
- При \`animateActiveOnly={false}\` - анимируются все иконки
|
|
73
|
+
|
|
74
|
+
### Счетчики
|
|
75
|
+
Счетчики отображаются как бейджи справа от текста/иконки:
|
|
76
|
+
- В активном сегменте: темный фон (\`bg-slate-800 text-white\`)
|
|
77
|
+
- В неактивных сегментах: светлый фон (\`bg-slate-200 text-slate-700\`)
|
|
78
|
+
|
|
79
|
+
## Особенности
|
|
80
|
+
|
|
81
|
+
### v-model
|
|
82
|
+
Полностью поддерживает двустороннее связывание через \`v-model\` для String, Number или Boolean значений.
|
|
83
|
+
|
|
84
|
+
### Визуальное оформление
|
|
85
|
+
- Фон группы: \`bg-slate-100\`
|
|
86
|
+
- Скругление: \`rounded-xl\`
|
|
87
|
+
- Индикатор: белый фон с тенью (\`bg-white shadow-sm\`)
|
|
88
|
+
- Активный сегмент: темный текст (\`text-slate-900\`)
|
|
89
|
+
- Неактивные сегменты: серый текст (\`text-slate-600\`)
|
|
90
|
+
|
|
91
|
+
### Состояния
|
|
92
|
+
- **disabled** - отключает весь контрол
|
|
93
|
+
- **selected** - визуально выделяет выбранный сегмент
|
|
94
|
+
|
|
95
|
+
### Лейбл
|
|
96
|
+
Поддерживает опциональный \`label\` prop для отображения лейбла над контролом.
|
|
97
|
+
`,
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
},
|
|
27
101
|
argTypes: {
|
|
28
102
|
iconAnimation: {
|
|
29
103
|
control: 'select',
|
|
@@ -12,7 +12,98 @@ import {
|
|
|
12
12
|
export default {
|
|
13
13
|
title: 'Molecules/DXSelect',
|
|
14
14
|
component: DXSelect,
|
|
15
|
-
tags: ['autodocs'],
|
|
15
|
+
tags: ['autodocs', 'category:form'],
|
|
16
|
+
parameters: {
|
|
17
|
+
docs: {
|
|
18
|
+
description: {
|
|
19
|
+
component: `
|
|
20
|
+
# DXSelect
|
|
21
|
+
|
|
22
|
+
Компонент выпадающего списка с поддержкой иконок, валидации и интеграции с группами полей.
|
|
23
|
+
|
|
24
|
+
## Назначение
|
|
25
|
+
|
|
26
|
+
DXSelect предоставляет стандартизированный выпадающий список для выбора одного значения из списка опций.
|
|
27
|
+
Компонент поддерживает иконки, валидацию, состояния ошибок и автоматическую адаптацию при использовании внутри DXInputGroup.
|
|
28
|
+
|
|
29
|
+
## Архитектура
|
|
30
|
+
|
|
31
|
+
### Использует
|
|
32
|
+
- \`DXFormLabel\` - для отображения лейбла, ошибок и вспомогательного текста
|
|
33
|
+
- \`DXIconWrapper\` - для отображения иконки слева
|
|
34
|
+
- \`DXIcon\` - для иконки chevron справа
|
|
35
|
+
- \`useSize\` composable - для унификации размеров (sm, md, lg)
|
|
36
|
+
- \`useClassComposition\` composable - для объединения CSS классов
|
|
37
|
+
- \`provide/inject\` - для интеграции с DXInputGroup
|
|
38
|
+
|
|
39
|
+
### Используется в
|
|
40
|
+
- \`DXInputGroup\` - группы полей с аддонами
|
|
41
|
+
- Формы выбора значений
|
|
42
|
+
- Фильтры и сортировка
|
|
43
|
+
- Любые места, требующие выбора из списка опций
|
|
44
|
+
|
|
45
|
+
## Внутренняя логика
|
|
46
|
+
|
|
47
|
+
### Интеграция с DXInputGroup
|
|
48
|
+
При использовании внутри \`DXInputGroup\`:
|
|
49
|
+
- Поле автоматически регистрируется в группе через \`provide/inject\`
|
|
50
|
+
- Размер синхронизируется с размером группы
|
|
51
|
+
- Состояние \`disabled\` наследуется от группы
|
|
52
|
+
- Состояние \`error\` синхронизируется с группой
|
|
53
|
+
- Border-radius адаптируется в зависимости от наличия аддонов слева/справа
|
|
54
|
+
|
|
55
|
+
### Структура опций
|
|
56
|
+
Опции передаются через массив объектов:
|
|
57
|
+
\`\`\`
|
|
58
|
+
[{ value: 'value1', label: 'Label 1' }, { value: 'value2', label: 'Label 2' }]
|
|
59
|
+
\`\`\`
|
|
60
|
+
- \`value\` - значение опции (String или Number)
|
|
61
|
+
- \`label\` - отображаемый текст
|
|
62
|
+
|
|
63
|
+
### Иконки
|
|
64
|
+
- **prefixIcon**: Иконка слева от селекта (Heroicon компонент)
|
|
65
|
+
- **chevron**: Иконка справа (ChevronDownIcon, всегда отображается)
|
|
66
|
+
- Размер иконки автоматически адаптируется к размеру поля
|
|
67
|
+
|
|
68
|
+
### Валидация
|
|
69
|
+
- При наличии \`error\` prop, поле получает красную рамку (\`border-rose-300\`)
|
|
70
|
+
- Текст ошибки отображается через \`DXFormLabel\`
|
|
71
|
+
- Состояние ошибки синхронизируется с \`DXInputGroup\`
|
|
72
|
+
|
|
73
|
+
### Размеры
|
|
74
|
+
Поддерживает три размера:
|
|
75
|
+
- **sm** - компактный размер
|
|
76
|
+
- **md** - средний размер (по умолчанию)
|
|
77
|
+
- **lg** - крупный размер
|
|
78
|
+
|
|
79
|
+
## Особенности
|
|
80
|
+
|
|
81
|
+
### v-model
|
|
82
|
+
Полностью поддерживает двустороннее связывание через \`v-model\` для String или Number значений.
|
|
83
|
+
|
|
84
|
+
### Placeholder
|
|
85
|
+
- Поддерживает \`placeholder\` prop для отображения подсказки
|
|
86
|
+
- Placeholder отображается как disabled опция в начале списка
|
|
87
|
+
|
|
88
|
+
### Состояния
|
|
89
|
+
- **disabled** - отключает поле (opacity-60, cursor-not-allowed, bg-slate-50)
|
|
90
|
+
- **error** - визуально выделяет ошибку (красная рамка)
|
|
91
|
+
- **required** - отмечает поле как обязательное (через DXFormLabel)
|
|
92
|
+
|
|
93
|
+
### Лейбл и вспомогательный текст
|
|
94
|
+
- \`label\` - отображается над полем
|
|
95
|
+
- \`helper\` - вспомогательный текст под полем
|
|
96
|
+
- \`error\` - текст ошибки (заменяет helper при наличии)
|
|
97
|
+
|
|
98
|
+
### Нативный select
|
|
99
|
+
Компонент использует нативный HTML \`<select>\` элемент, что обеспечивает:
|
|
100
|
+
- Нативную доступность
|
|
101
|
+
- Работу с клавиатурой
|
|
102
|
+
- Поддержку мобильных устройств
|
|
103
|
+
`,
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
},
|
|
16
107
|
};
|
|
17
108
|
|
|
18
109
|
const options = [
|
|
@@ -12,38 +12,41 @@
|
|
|
12
12
|
<div class="flex items-start justify-between">
|
|
13
13
|
<div class="flex-1">
|
|
14
14
|
<!-- Заголовок -->
|
|
15
|
-
<
|
|
15
|
+
<DXText v-if="title" tag="div" size="sm" weight="medium" color="muted" class="mb-1">
|
|
16
16
|
{{ title }}
|
|
17
|
-
</
|
|
17
|
+
</DXText>
|
|
18
18
|
|
|
19
19
|
<!-- Значение -->
|
|
20
20
|
<div class="flex items-baseline gap-2">
|
|
21
|
-
<span :
|
|
21
|
+
<DXText tag="span" :size="valueSize" weight="bold" color="default">
|
|
22
22
|
{{ formattedValue }}
|
|
23
|
-
</
|
|
23
|
+
</DXText>
|
|
24
24
|
<!-- Тренд -->
|
|
25
|
-
<
|
|
25
|
+
<DXText
|
|
26
26
|
v-if="trend"
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
tag="div"
|
|
28
|
+
size="xs"
|
|
29
|
+
weight="medium"
|
|
30
|
+
:color="trendColor"
|
|
31
|
+
class="flex items-center gap-0.5"
|
|
29
32
|
>
|
|
30
33
|
<DXIcon
|
|
31
34
|
:icon="trend.direction === 'up' ? ArrowUpIcon : ArrowDownIcon"
|
|
32
35
|
size="xs"
|
|
33
36
|
/>
|
|
34
|
-
<span>{{ Math.abs(trend.value) }}%</
|
|
35
|
-
</
|
|
37
|
+
<DXText tag="span" size="xs" weight="medium">{{ Math.abs(trend.value) }}%</DXText>
|
|
38
|
+
</DXText>
|
|
36
39
|
</div>
|
|
37
40
|
|
|
38
41
|
<!-- Описание -->
|
|
39
|
-
<
|
|
42
|
+
<DXText v-if="description" tag="div" size="xs" color="muted" class="mt-1">
|
|
40
43
|
{{ description }}
|
|
41
|
-
</
|
|
44
|
+
</DXText>
|
|
42
45
|
|
|
43
46
|
<!-- Сравнение -->
|
|
44
|
-
<
|
|
47
|
+
<DXText v-if="comparison" tag="div" size="xs" color="muted" class="mt-1">
|
|
45
48
|
{{ comparison }}
|
|
46
|
-
</
|
|
49
|
+
</DXText>
|
|
47
50
|
</div>
|
|
48
51
|
|
|
49
52
|
<!-- Иконка -->
|
|
@@ -62,6 +65,7 @@ import { useClassComposition } from "../../../composables/useClassComposition";
|
|
|
62
65
|
import { useVariantButton } from "../../../composables/useVariant";
|
|
63
66
|
import DXCard from "../../atoms/DXCard/DXCard.vue";
|
|
64
67
|
import DXIcon from "../../atoms/DXIcon/DXIcon.vue";
|
|
68
|
+
import DXText from "../../atoms/DXText/DXText.vue";
|
|
65
69
|
import { ArrowUpIcon, ArrowDownIcon } from "@heroicons/vue/24/outline";
|
|
66
70
|
|
|
67
71
|
const props = defineProps({
|
|
@@ -203,32 +207,32 @@ const formattedValue = computed(() => {
|
|
|
203
207
|
*
|
|
204
208
|
* @returns {Array} Массив классов
|
|
205
209
|
*/
|
|
206
|
-
const
|
|
210
|
+
const valueSize = computed(() => {
|
|
207
211
|
const sizeMap = {
|
|
208
|
-
sm: "
|
|
209
|
-
md: "
|
|
210
|
-
lg: "
|
|
212
|
+
sm: "2xl",
|
|
213
|
+
md: "3xl",
|
|
214
|
+
lg: "4xl",
|
|
211
215
|
};
|
|
212
216
|
return sizeMap[props.size] || sizeMap.md;
|
|
213
217
|
});
|
|
214
218
|
|
|
215
219
|
/**
|
|
216
|
-
*
|
|
220
|
+
* Цвет тренда
|
|
217
221
|
*
|
|
218
222
|
* @description
|
|
219
|
-
* Вычисляет
|
|
223
|
+
* Вычисляет цвет для отображения тренда на основе направления.
|
|
220
224
|
*
|
|
221
|
-
* @returns {
|
|
225
|
+
* @returns {string} Цвет для DXText
|
|
222
226
|
*/
|
|
223
|
-
const
|
|
224
|
-
if (!props.trend) return
|
|
227
|
+
const trendColor = computed(() => {
|
|
228
|
+
if (!props.trend) return 'default';
|
|
225
229
|
|
|
226
|
-
const
|
|
227
|
-
up: "
|
|
228
|
-
down: "
|
|
230
|
+
const directionColors = {
|
|
231
|
+
up: "success",
|
|
232
|
+
down: "danger",
|
|
229
233
|
};
|
|
230
234
|
|
|
231
|
-
return
|
|
235
|
+
return directionColors[props.trend.direction] || "default";
|
|
232
236
|
});
|
|
233
237
|
|
|
234
238
|
/**
|