dxd-style-code 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/dxd-style-code.js +7470 -6336
  2. package/dist/dxd-style-code.umd.cjs +3 -3
  3. package/dist/style.css +1 -1
  4. package/package.json +2 -2
  5. package/src/components/atoms/DX/DX.stories.js +265 -0
  6. package/src/components/atoms/DX/DX.vue +80 -0
  7. package/src/components/atoms/DX/index.js +2 -0
  8. package/src/components/atoms/DXAvatar/DXAvatar.stories.js +1 -2
  9. package/src/components/atoms/DXBackdrop/DXBackdrop.stories.js +77 -1
  10. package/src/components/atoms/DXBadge/DXBadge.stories.js +83 -1
  11. package/src/components/atoms/DXBlockquote/DXBlockquote.stories.js +67 -1
  12. package/src/components/atoms/DXBox/DXBox.stories.js +1 -1
  13. package/src/components/atoms/DXBox/DXBox.vue +69 -2
  14. package/src/components/atoms/DXButton/DXButton.stories.js +94 -1
  15. package/src/components/atoms/DXButton/DXButton.vue +145 -11
  16. package/src/components/atoms/DXCard/DXCard.stories.js +72 -14
  17. package/src/components/atoms/DXCard/DXCard.vue +3 -4
  18. package/src/components/atoms/DXCheckbox/DXCheckbox.stories.js +85 -1
  19. package/src/components/atoms/DXCode/DXCode.stories.js +67 -1
  20. package/src/components/atoms/DXContainer/DXContainer.stories.js +1 -1
  21. package/src/components/atoms/DXContainer/DXContainer.vue +28 -1
  22. package/src/components/atoms/DXDivider/DXDivider.stories.js +84 -1
  23. package/src/components/atoms/DXFlex/DXFlex.stories.js +1 -1
  24. package/src/components/atoms/DXFlex/DXFlex.vue +57 -3
  25. package/src/components/atoms/DXFormLabel/DXFormLabel.stories.js +70 -1
  26. package/src/components/atoms/DXGrid/DXGrid.stories.js +1 -1
  27. package/src/components/atoms/DXHeading/DXHeading.stories.js +90 -1
  28. package/src/components/atoms/DXIcon/DXIcon.stories.js +74 -0
  29. package/src/components/atoms/DXIconWrapper/DXIconWrapper.stories.js +69 -0
  30. package/src/components/atoms/DXImage/DXImage.stories.js +483 -0
  31. package/src/components/atoms/DXImage/DXImage.vue +294 -0
  32. package/src/components/atoms/DXImage/index.js +2 -0
  33. package/src/components/atoms/DXInputAddon/DXInputAddon.stories.js +86 -1
  34. package/src/components/atoms/DXLabel/DXLabel.stories.js +62 -1
  35. package/src/components/atoms/DXLink/DXLink.stories.js +75 -10
  36. package/src/components/atoms/DXLink/DXLink.vue +59 -3
  37. package/src/components/atoms/DXList/DXList.stories.js +76 -1
  38. package/src/components/atoms/DXLoader/DXLoader.stories.js +75 -1
  39. package/src/components/atoms/DXNav/DXNav.stories.js +236 -0
  40. package/src/components/atoms/DXNav/DXNav.vue +114 -0
  41. package/src/components/atoms/DXNav/index.js +2 -0
  42. package/src/components/atoms/DXProgress/DXProgress.stories.js +76 -1
  43. package/src/components/atoms/DXRadio/DXRadio.stories.js +85 -1
  44. package/src/components/atoms/DXSkeleton/DXSkeleton.stories.js +59 -1
  45. package/src/components/atoms/DXSlider/DXSlider.stories.js +89 -0
  46. package/src/components/atoms/DXSpacer/DXSpacer.stories.js +1 -1
  47. package/src/components/atoms/DXStack/DXStack.stories.js +1 -1
  48. package/src/components/atoms/DXStack/DXStack.vue +5 -2
  49. package/src/components/atoms/DXTags/DXTags.stories.js +77 -0
  50. package/src/components/atoms/DXText/DXText.stories.js +83 -1
  51. package/src/components/atoms/DXToast/DXToast.stories.js +64 -1
  52. package/src/components/atoms/DXToggle/DXToggle.stories.js +84 -1
  53. package/src/components/atoms/DXToggleButton/DXToggleButton.stories.js +78 -1
  54. package/src/components/atoms/DXTooltip/DXTooltip.stories.js +98 -1
  55. package/src/components/atoms/index.js +3 -0
  56. package/src/components/molecules/DXActionButtons/DXActionButtons.stories.js +280 -77
  57. package/src/components/molecules/DXActionButtons/DXActionButtons.vue +31 -31
  58. package/src/components/molecules/DXAlert/DXAlert.stories.js +199 -1
  59. package/src/components/molecules/DXAlert/DXAlert.vue +35 -13
  60. package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.stories.js +125 -1
  61. package/src/components/molecules/DXBreadcrumb/DXBreadcrumb.vue +22 -18
  62. package/src/components/molecules/DXButtonGroup/DXButtonGroup.stories.js +193 -6
  63. package/src/components/molecules/DXButtonGroup/DXButtonGroup.vue +39 -3
  64. package/src/components/molecules/DXCloseButton/DXCloseButton.stories.js +64 -1
  65. package/src/components/molecules/DXComboBox/DXComboBox.stories.js +66 -0
  66. package/src/components/molecules/DXCopyField/DXCopyField.stories.js +128 -1
  67. package/src/components/molecules/DXCopyField/DXCopyField.vue +60 -7
  68. package/src/components/molecules/DXDataFilter/DXDataFilter.vue +8 -6
  69. package/src/components/molecules/DXDatePicker/DXDatePicker.stories.js +58 -0
  70. package/src/components/molecules/DXFileUpload/DXFileUpload.stories.js +66 -0
  71. package/src/components/molecules/DXFilterGroup/DXFilterGroup.stories.js +61 -0
  72. package/src/components/molecules/DXFormControl/DXFormControl.stories.js +76 -0
  73. package/src/components/molecules/DXFormControl/DXFormControl.vue +9 -8
  74. package/src/components/molecules/DXInput/DXInput.stories.js +100 -1
  75. package/src/components/molecules/DXInputGroup/DXInputGroup.stories.js +89 -1
  76. package/src/components/molecules/DXInputMask/DXInputMask.stories.js +67 -0
  77. package/src/components/molecules/DXMenu/DXMenu.stories.js +111 -4
  78. package/src/components/molecules/DXMenu/DXMenu.vue +18 -5
  79. package/src/components/molecules/DXMenu/README.md +1 -1
  80. package/src/components/molecules/DXPagination/DXPagination.stories.js +105 -2
  81. package/src/components/molecules/DXPagination/DXPagination.vue +18 -33
  82. package/src/components/molecules/DXPasswordInput/DXPasswordInput.stories.js +67 -1
  83. package/src/components/molecules/DXRadioCard/DXRadioCard.stories.js +64 -0
  84. package/src/components/molecules/DXRadioGroup/DXRadioGroup.stories.js +84 -0
  85. package/src/components/molecules/DXRating/DXRating.stories.js +3 -2
  86. package/src/components/molecules/DXSearchBar/DXSearchBar.stories.js +1 -1
  87. package/src/components/molecules/DXSearchBar/DXSearchBar.vue +16 -12
  88. package/src/components/molecules/DXSearchSelect/DXSearchSelect.stories.js +71 -0
  89. package/src/components/molecules/DXSegmentedControl/DXSegmentedControl.stories.js +74 -0
  90. package/src/components/molecules/DXSelect/DXSelect.stories.js +92 -1
  91. package/src/components/molecules/DXStatCard/DXStatCard.stories.js +1 -1
  92. package/src/components/molecules/DXStatCard/DXStatCard.vue +30 -26
  93. package/src/components/molecules/DXTableFiltersPanel/index.js +3 -0
  94. package/src/components/molecules/DXTablePagination/DXTablePagination.stories.js +67 -0
  95. package/src/components/molecules/DXTableToolbar/DXTableToolbar.stories.js +71 -0
  96. package/src/components/molecules/DXTextarea/DXTextarea.stories.js +87 -1
  97. package/src/components/molecules/DXTimePicker/DXTimePicker.stories.js +1 -1
  98. package/src/components/molecules/DXValidationIcon/DXValidationIcon.stories.js +59 -1
  99. package/src/components/molecules/index.js +0 -1
  100. package/src/components/organisms/DXAccordion/DXAccordion.stories.js +75 -0
  101. package/src/components/organisms/DXAppLayout/DXAppLayout.stories.js +27 -25
  102. package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.stories.js +0 -2
  103. package/src/components/organisms/DXAuthenticationForm/DXAuthenticationForm.vue +5 -8
  104. package/src/components/{molecules → organisms}/DXBaseTable/DXBaseTable.stories.js +78 -1
  105. package/src/components/{molecules → organisms}/DXBaseTable/DXBaseTable.vue +2 -2
  106. package/src/components/organisms/DXChartContainer/DXChartContainer.stories.js +1 -1
  107. package/src/components/organisms/DXChartContainer/DXChartContainer.vue +10 -6
  108. package/src/components/organisms/DXChatInterface/DXChatInterface.stories.js +1 -1
  109. package/src/components/organisms/DXChatInterface/DXChatInterface.vue +6 -4
  110. package/src/components/organisms/DXCommentSection/DXCommentSection.stories.js +1 -1
  111. package/src/components/organisms/DXCommentSection/DXCommentSection.vue +7 -6
  112. package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.stories.js +1 -1
  113. package/src/components/organisms/DXDashboardGrid/DXDashboardGrid.vue +4 -2
  114. package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.stories.js +1 -1
  115. package/src/components/organisms/DXDashboardWidget/DXDashboardWidget.vue +3 -2
  116. package/src/components/organisms/DXDataTable/DXDataTable.stories.js +1 -1
  117. package/src/components/organisms/DXDropdown/DXDropdown.stories.js +84 -1
  118. package/src/components/organisms/DXEmptyState/DXEmptyState.stories.js +64 -0
  119. package/src/components/organisms/DXEmptyState/DXEmptyState.vue +4 -2
  120. package/src/components/organisms/DXHeaderBar/DXHeaderBar.stories.js +409 -3
  121. package/src/components/organisms/DXHeaderBar/DXHeaderBar.vue +261 -52
  122. package/src/components/organisms/DXMediaGallery/DXMediaGallery.stories.js +1 -1
  123. package/src/components/organisms/DXMediaGallery/DXMediaGallery.vue +6 -4
  124. package/src/components/organisms/DXModal/DXModal.stories.js +93 -1
  125. package/src/components/organisms/DXModal/DXModal.vue +3 -2
  126. package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.stories.js +1 -1
  127. package/src/components/organisms/DXNotificationCenter/DXNotificationCenter.vue +2 -1
  128. package/src/components/organisms/DXReportGenerator/DXReportGenerator.vue +4 -3
  129. package/src/components/organisms/DXSettingsPanel/DXSettingsPanel.vue +11 -8
  130. package/src/components/organisms/DXSidebar/DXSidebar.stories.js +1 -1
  131. package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.stories.js +104 -1
  132. package/src/components/organisms/DXSidebarMenu/DXSidebarMenu.vue +14 -4
  133. package/src/components/organisms/DXSidebarMenu/README.md +3 -3
  134. package/src/components/organisms/DXTable/DXTable.stories.js +138 -11
  135. package/src/components/organisms/DXTable/DXTable.vue +1 -1
  136. package/src/components/organisms/DXTabs/DXTabs.stories.js +91 -1
  137. package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.stories.js +1 -1
  138. package/src/components/organisms/DXUserProfileCard/DXUserProfileCard.vue +20 -18
  139. package/src/components/organisms/index.js +1 -0
  140. package/src/components/utilities/DXAnimatePresence/DXAnimatePresence.stories.js +1 -1
  141. package/src/components/utilities/DXBreakpointProvider/DXBreakpointProvider.stories.js +1 -1
  142. package/src/components/utilities/DXObserver/DXObserver.stories.js +1 -1
  143. package/src/components/utilities/DXPortal/DXPortal.stories.js +1 -1
  144. package/src/components/utilities/DXStaggeredAnimation/DXStaggeredAnimation.stories.js +2 -2
  145. package/src/components/utilities/DXThemeProvider/DXThemeProvider.stories.js +1 -1
  146. package/src/components/utilities/DXTransitionGroup/DXTransitionGroup.stories.js +1 -1
  147. package/src/composables/useSize.js +8 -1
  148. /package/src/components/{molecules → organisms}/DXBaseTable/index.js +0 -0
@@ -1,24 +1,211 @@
1
1
  import DXButtonGroup from './DXButtonGroup.vue';
2
+ import DXButton from '../../atoms/DXButton/DXButton.vue';
3
+ import DXFlex from '../../atoms/DXFlex/DXFlex.vue';
4
+ import DXIcon from '../../atoms/DXIcon/DXIcon.vue';
2
5
  import { ref } from 'vue';
6
+ import { Squares2X2Icon, ListBulletIcon, TableCellsIcon, SquaresPlusIcon } from '@heroicons/vue/24/outline';
3
7
 
4
8
  export default {
5
9
  title: 'Molecules/DXButtonGroup',
6
10
  component: DXButtonGroup,
7
- tags: ['autodocs'],
11
+ tags: ['autodocs', 'category:form'],
12
+ parameters: {
13
+ docs: {
14
+ description: {
15
+ component: `
16
+
17
+ Группа связанных кнопок для выбора одного или нескольких значений с поддержкой v-model.
18
+
19
+ ## Назначение
20
+
21
+ DXButtonGroup предоставляет способ группировки кнопок для создания интерфейсов выбора,
22
+ аналогичных segmented controls или toggle groups. Компонент автоматически управляет
23
+ состоянием выбора, визуальным оформлением и синхронизацией размеров кнопок.
24
+
25
+ ## Архитектура
26
+
27
+ ### Использует
28
+ - \`DXButton\` - кнопки в группе (автоматически адаптируются при использовании внутри группы)
29
+ - \`provide/inject\` - для передачи контекста группы к дочерним компонентам
30
+ - Система регистрации компонентов - для отслеживания позиции кнопок и правильного применения стилей
31
+
32
+ ### Используется в
33
+ - Фильтры и сортировка
34
+ - Переключение режимов отображения
35
+ - Выбор опций форматирования
36
+ - Навигационные элементы
37
+ - Настройки с переключателями
38
+
39
+ ## Внутренняя логика
40
+
41
+ ### Режимы выбора
42
+ - **single** (по умолчанию): Выбор одного значения, \`modelValue\` - String или Number
43
+ - **multiple**: Множественный выбор, \`modelValue\` - Array
44
+
45
+ ### Система регистрации компонентов
46
+ Компонент отслеживает порядок регистрации дочерних \`DXButton\` компонентов для:
47
+ - Правильного применения border-radius (первая/последняя/средние кнопки)
48
+ - Корректного отображения разделителей между кнопками
49
+ - Синхронизации размеров всех кнопок в группе
50
+
51
+ ### Интеграция с DXButton
52
+ При использовании \`DXButton\` внутри группы:
53
+ - Кнопка автоматически регистрируется в группе
54
+ - Размер кнопки синхронизируется с размером группы
55
+ - Состояние disabled синхронизируется с группой
56
+ - Применяется правильный border-radius в зависимости от позиции
57
+ - Автоматически применяется состояние selected (bg-slate-900 text-white)
58
+ - Убираются индивидуальные границы (группа обрабатывает их через divide-x)
59
+
60
+ ## Особенности
61
+
62
+ ### Размеры
63
+ Поддерживает три размера: \`sm\` (h-8), \`md\` (h-10), \`lg\` (h-12).
64
+ Размер применяется ко всем кнопкам в группе автоматически.
65
+
66
+ ### Label
67
+ Label отображается над группой кнопок, аналогично другим компонентам форм (DXInputGroup).
68
+
69
+ ### Состояния
70
+ - **disabled**: Отключает всю группу и все кнопки внутри
71
+ - **selected**: Визуально выделяет выбранные кнопки темным фоном
72
+
73
+ ### Разделители
74
+ Между кнопками автоматически отображаются вертикальные разделители (border-left),
75
+ кроме первой кнопки.
76
+
77
+ ### v-model
78
+ Полностью поддерживает двустороннее связывание через \`v-model\`:
79
+ - Для single mode: значение - String или Number
80
+ - Для multiple mode: значение - Array
81
+ `,
82
+ },
83
+ },
84
+ },
8
85
  };
9
86
 
10
87
  export const Default = {
11
88
  render: () => ({
12
- components: { DXButtonGroup },
89
+ components: { DXButtonGroup, DXButton },
90
+ setup() {
91
+ const selected = ref('left');
92
+ return { selected };
93
+ },
94
+ template: `
95
+ <DXButtonGroup v-model="selected" label="Select alignment">
96
+ <DXButton value="left">Left</DXButton>
97
+ <DXButton value="center">Center</DXButton>
98
+ <DXButton value="right">Right</DXButton>
99
+ </DXButtonGroup>
100
+ `,
101
+ }),
102
+ };
103
+
104
+ export const Multiple = {
105
+ render: () => ({
106
+ components: { DXButtonGroup, DXButton },
107
+ setup() {
108
+ const selected = ref(['bold', 'italic']);
109
+ return { selected };
110
+ },
111
+ template: `
112
+ <DXButtonGroup v-model="selected" multiple label="Text formatting">
113
+ <DXButton value="bold">Bold</DXButton>
114
+ <DXButton value="italic">Italic</DXButton>
115
+ <DXButton value="underline">Underline</DXButton>
116
+ </DXButtonGroup>
117
+ `,
118
+ }),
119
+ };
120
+
121
+ export const Sizes = {
122
+ render: () => ({
123
+ components: { DXButtonGroup, DXButton, DXFlex },
124
+ setup() {
125
+ const small = ref('left');
126
+ const medium = ref('left');
127
+ const large = ref('left');
128
+ return { small, medium, large };
129
+ },
130
+ template: `
131
+ <DXFlex direction="col" gap="md" align="start">
132
+ <DXButtonGroup v-model="small" size="sm" label="Small">
133
+ <DXButton value="left">Left</DXButton>
134
+ <DXButton value="center">Center</DXButton>
135
+ <DXButton value="right">Right</DXButton>
136
+ </DXButtonGroup>
137
+
138
+ <DXButtonGroup v-model="medium" size="md" label="Medium (default)">
139
+ <DXButton value="left">Left</DXButton>
140
+ <DXButton value="center">Center</DXButton>
141
+ <DXButton value="right">Right</DXButton>
142
+ </DXButtonGroup>
143
+
144
+ <DXButtonGroup v-model="large" size="lg" label="Large">
145
+ <DXButton value="left">Left</DXButton>
146
+ <DXButton value="center">Center</DXButton>
147
+ <DXButton value="right">Right</DXButton>
148
+ </DXButtonGroup>
149
+ </DXFlex>
150
+ `,
151
+ }),
152
+ };
153
+
154
+ export const Disabled = {
155
+ render: () => ({
156
+ components: { DXButtonGroup, DXButton },
13
157
  setup() {
14
158
  const selected = ref('left');
15
159
  return { selected };
16
160
  },
17
161
  template: `
18
- <DXButtonGroup v-model="selected">
19
- <button value="left" class="px-4 py-2 text-sm border border-slate-200 rounded-l-xl" :class="selected === 'left' ? 'bg-slate-900 text-white' : 'bg-white'">Left</button>
20
- <button value="center" class="px-4 py-2 text-sm border-y border-slate-200" :class="selected === 'center' ? 'bg-slate-900 text-white' : 'bg-white'">Center</button>
21
- <button value="right" class="px-4 py-2 text-sm border border-slate-200 rounded-r-xl" :class="selected === 'right' ? 'bg-slate-900 text-white' : 'bg-white'">Right</button>
162
+ <DXButtonGroup v-model="selected" disabled label="Disabled group">
163
+ <DXButton value="left">Left</DXButton>
164
+ <DXButton value="center">Center</DXButton>
165
+ <DXButton value="right">Right</DXButton>
166
+ </DXButtonGroup>
167
+ `,
168
+ }),
169
+ };
170
+
171
+ export const WithIcons = {
172
+ parameters: {
173
+ docs: {
174
+ description: {
175
+ story: 'Пример группы кнопок с иконками. Иконки размещаются внутри DXButton компонентов и автоматически адаптируются к стилю группы.',
176
+ },
177
+ },
178
+ },
179
+ render: () => ({
180
+ components: { DXButtonGroup, DXButton, DXIcon },
181
+ setup() {
182
+ const selected = ref('grid');
183
+ return {
184
+ selected,
185
+ Squares2X2Icon,
186
+ ListBulletIcon,
187
+ TableCellsIcon,
188
+ SquaresPlusIcon,
189
+ };
190
+ },
191
+ template: `
192
+ <DXButtonGroup v-model="selected" label="View mode">
193
+ <DXButton value="grid">
194
+ <DXIcon :icon="Squares2X2Icon" size="sm" />
195
+ Grid
196
+ </DXButton>
197
+ <DXButton value="list">
198
+ <DXIcon :icon="ListBulletIcon" size="sm" />
199
+ List
200
+ </DXButton>
201
+ <DXButton value="table">
202
+ <DXIcon :icon="TableCellsIcon" size="sm" />
203
+ Table
204
+ </DXButton>
205
+ <DXButton value="cards">
206
+ <DXIcon :icon="SquaresPlusIcon" size="sm" />
207
+ Cards
208
+ </DXButton>
22
209
  </DXButtonGroup>
23
210
  `,
24
211
  }),
@@ -1,12 +1,12 @@
1
1
  <template>
2
2
  <div
3
- class="inline-flex"
3
+ class="inline-flex flex-col"
4
4
  data-component="DXButtonGroup"
5
5
  :data-size="size"
6
6
  :data-multiple="multiple"
7
7
  :data-disabled="disabled"
8
8
  >
9
- <p v-if="label" class="text-sm font-medium text-slate-700 mb-2">{{ label }}</p>
9
+ <label v-if="label" class="block text-sm font-medium text-slate-700 mb-1">{{ label }}</label>
10
10
  <div
11
11
  class="inline-flex border border-slate-200 rounded-xl overflow-hidden divide-x divide-slate-200"
12
12
  :class="sizeClass"
@@ -17,7 +17,7 @@
17
17
  </template>
18
18
 
19
19
  <script setup>
20
- import { provide, computed } from "vue";
20
+ import { provide, computed, ref } from "vue";
21
21
 
22
22
  const props = defineProps({
23
23
  /** Значение (v-model) */
@@ -42,6 +42,39 @@ const SIZE_CLASSES = {
42
42
 
43
43
  const sizeClass = computed(() => SIZE_CLASSES[props.size] || SIZE_CLASSES.md);
44
44
 
45
+ // Система регистрации компонентов для отслеживания структуры
46
+ const components = ref([]);
47
+ let componentCounter = 0;
48
+
49
+ const registerComponent = (type, id) => {
50
+ if (!components.value.find(c => c.id === id)) {
51
+ // Используем счетчик для гарантии правильного порядка
52
+ const order = componentCounter++;
53
+ components.value.push({ type, id, order });
54
+ // Сортируем по порядку регистрации
55
+ components.value.sort((a, b) => a.order - b.order);
56
+ }
57
+ };
58
+
59
+ const unregisterComponent = (id) => {
60
+ components.value = components.value.filter(c => c.id !== id);
61
+ };
62
+
63
+ const getComponentPosition = (id) => {
64
+ const currentIndex = components.value.findIndex(c => c.id === id);
65
+ if (currentIndex === -1) {
66
+ return { isFirst: false, isLast: false, isMiddle: false };
67
+ }
68
+
69
+ const totalComponents = components.value.length;
70
+
71
+ return {
72
+ isFirst: currentIndex === 0,
73
+ isLast: currentIndex === totalComponents - 1,
74
+ isMiddle: currentIndex > 0 && currentIndex < totalComponents - 1,
75
+ };
76
+ };
77
+
45
78
  const handleSelect = (value) => {
46
79
  if (props.disabled) return;
47
80
  if (props.multiple) {
@@ -73,6 +106,9 @@ provide("buttonGroup", {
73
106
  disabled: props.disabled,
74
107
  handleSelect,
75
108
  isSelected,
109
+ registerComponent,
110
+ unregisterComponent,
111
+ getComponentPosition,
76
112
  });
77
113
  </script>
78
114
 
@@ -3,7 +3,70 @@ import DXCloseButton from './DXCloseButton.vue';
3
3
  export default {
4
4
  title: 'Molecules/DXCloseButton',
5
5
  component: DXCloseButton,
6
- tags: ['autodocs'],
6
+ tags: ['autodocs', 'category:navigation'],
7
+ parameters: {
8
+ docs: {
9
+ description: {
10
+ component: `
11
+ # DXCloseButton
12
+
13
+ Компонент кнопки закрытия с поддержкой различных размеров и вариантов оформления.
14
+
15
+ ## Назначение
16
+
17
+ DXCloseButton предоставляет стандартизированную кнопку закрытия для модальных окон, алертов,
18
+ панелей и других компонентов, требующих возможность закрытия. Компонент поддерживает различные
19
+ размеры и варианты оформления для адаптации под различные контексты использования.
20
+
21
+ ## Архитектура
22
+
23
+ ### Использует
24
+ - \`DXIcon\` - для отображения иконки закрытия (XMarkIcon)
25
+ - \`useSize\` composable - для унификации размеров (sm, md, lg)
26
+
27
+ ### Используется в
28
+ - \`DXModal\` - кнопка закрытия модальных окон
29
+ - \`DXAlert\` - кнопка закрытия уведомлений
30
+ - \`DXSidebar\` - кнопка закрытия боковой панели
31
+ - Панели и панели настроек
32
+ - Любые компоненты, требующие кнопку закрытия
33
+
34
+ ## Внутренняя логика
35
+
36
+ ### Варианты оформления
37
+ - **default** (по умолчанию): Стандартная кнопка для светлого фона
38
+ - **light**: Кнопка для темного фона (светлая иконка)
39
+ - **danger**: Кнопка с красным цветом для критических действий
40
+
41
+ ### Размеры
42
+ Поддерживает три размера:
43
+ - **sm** - маленький размер
44
+ - **md** - средний размер (по умолчанию)
45
+ - **lg** - большой размер
46
+
47
+ ### Иконка
48
+ Всегда использует \`XMarkIcon\` из Heroicons для единообразия.
49
+
50
+ ## Особенности
51
+
52
+ ### События
53
+ - Событие \`click\` при клике на кнопку
54
+ - Обычно обрабатывается родительским компонентом для закрытия
55
+
56
+ ### Доступность
57
+ - Использует \`aria-label\` для описания действия
58
+ - Поддержка клавиатурной навигации
59
+ - Правильные семантические атрибуты
60
+
61
+ ### Визуальное оформление
62
+ - Круглая форма кнопки
63
+ - Иконка по центру
64
+ - Hover эффекты для интерактивности
65
+ - Transition для плавных переходов
66
+ `,
67
+ },
68
+ },
69
+ },
7
70
  argTypes: {
8
71
  size: {
9
72
  control: 'select',
@@ -5,6 +5,72 @@ export default {
5
5
  title: 'Molecules/DXComboBox',
6
6
  component: DXComboBox,
7
7
  tags: ['autodocs'],
8
+ parameters: {
9
+ docs: {
10
+ description: {
11
+ component: `
12
+ # DXComboBox
13
+
14
+ Компонент комбобокса с поиском и возможностью выбора из списка или ввода кастомного значения.
15
+
16
+ ## Назначение
17
+
18
+ DXComboBox предоставляет гибридный компонент, объединяющий возможности input и select.
19
+ Компонент поддерживает поиск по опциям, выбор из списка и возможность ввода кастомного значения.
20
+
21
+ ## Архитектура
22
+
23
+ ### Использует
24
+ - Нативный input - для ввода текста
25
+ - Динамический dropdown - для отображения опций
26
+
27
+ ### Используется в
28
+ - Выбор с поиском
29
+ - Ввод с автодополнением
30
+ - Кастомные значения
31
+ - Любые места, требующие гибкий выбор/ввод
32
+
33
+ ## Внутренняя логика
34
+
35
+ ### Поиск
36
+ При \`filterable={true}\` (по умолчанию):
37
+ - Опции фильтруются по введенному тексту
38
+ - Поиск нечувствителен к регистру
39
+ - Фильтрация происходит в реальном времени
40
+
41
+ ### Кастомные значения
42
+ При \`allowCustom={true}\`:
43
+ - Можно ввести значение, которого нет в списке
44
+ - При нажатии Enter создается новое значение
45
+ - Отображается подсказка "Нажмите Enter для ..."
46
+
47
+ ### Клавиатурная навигация
48
+ - **ArrowDown/ArrowUp** - навигация по опциям
49
+ - **Enter** - выбор выделенной опции или создание кастомного значения
50
+ - **Escape** - закрытие dropdown
51
+
52
+ ## Особенности
53
+
54
+ ### v-model
55
+ Полностью поддерживает двустороннее связывание через \`v-model\` для String или Number значений.
56
+
57
+ ### Структура опций
58
+ Опции передаются через массив объектов:
59
+ \`\`\`
60
+ [{ value: 'value', label: 'Label', icon?: Icon }]
61
+ \`\`\`
62
+
63
+ ### Иконки
64
+ Каждая опция может иметь иконку через \`icon\` свойство.
65
+
66
+ ### Визуальная индикация
67
+ - Выбранная опция отмечена галочкой
68
+ - Выделенная опция имеет серый фон
69
+ - Chevron поворачивается при открытии dropdown
70
+ `,
71
+ },
72
+ },
73
+ },
8
74
  };
9
75
 
10
76
  const countries = [
@@ -10,15 +10,99 @@ import {
10
10
  export default {
11
11
  title: 'Molecules/DXCopyField',
12
12
  component: DXCopyField,
13
- tags: ['autodocs'],
13
+ tags: ['autodocs', 'category:form'],
14
+ parameters: {
15
+ docs: {
16
+ description: {
17
+ component: `
18
+ # DXCopyField
19
+
20
+ Компонент для отображения значения с возможностью копирования в буфер обмена.
21
+
22
+ ## Назначение
23
+
24
+ DXCopyField предоставляет удобный способ отображения значений (ссылок, кодов, API ключей и т.д.)
25
+ с одной кнопкой для копирования в буфер обмена. Компонент автоматически показывает состояние успеха
26
+ после копирования и поддерживает различные анимации иконок.
27
+
28
+ ## Архитектура
29
+
30
+ ### Использует
31
+ - \`DXIcon\` - для иконок копирования и успеха
32
+ - \`useSize\` composable - для унификации размеров с другими компонентами формы
33
+
34
+ ### Используется в
35
+ - Отображение API ключей и токенов
36
+ - Ссылки для шаринга
37
+ - Команды установки и коды
38
+ - Любые значения, которые нужно быстро скопировать
39
+
40
+ ## Внутренняя логика
41
+
42
+ ### Копирование в буфер обмена
43
+ Компонент использует \`navigator.clipboard.writeText()\` для копирования значения.
44
+ После успешного копирования показывается состояние успеха с зеленой рамкой и иконкой галочки.
45
+
46
+ ### Анимации иконок
47
+ Поддерживает четыре типа анимаций:
48
+ - \`none\` - без анимации
49
+ - \`wiggle\` - покачивание
50
+ - \`scale\` - масштабирование (по умолчанию)
51
+ - \`rotate\` - вращение
52
+
53
+ ### Размерная сетка
54
+ Компонент поддерживает три размера, соответствующие другим элементам формы:
55
+ - \`sm\` - компактный (h-8, text-xs, px-3 py-1.5)
56
+ - \`md\` - стандартный (h-10, text-sm, px-4 py-2.5) - по умолчанию
57
+ - \`lg\` - крупный (h-12, text-base, px-5 py-3)
58
+
59
+ Размеры автоматически синхронизируются:
60
+ - Padding контейнера соответствует размерам input
61
+ - Размер текста соответствует размерам текста
62
+ - Размер кнопки соответствует размерам buttonIcon
63
+ - Размер иконки адаптируется под размер компонента
64
+
65
+ ## Особенности
66
+
67
+ ### Скругления
68
+ - Контейнер: \`rounded-xl\` (12px) - соответствует стандартам дизайн-системы
69
+ - Кнопка: \`rounded-xl\` (12px) - соответствует стандартам дизайн-системы
70
+
71
+ ### Состояния
72
+ - **default**: Обычное состояние с иконкой копирования
73
+ - **copied**: Состояние успеха с зеленой рамкой и иконкой галочки
74
+ - Автоматическое возвращение к default через \`successDuration\` (по умолчанию 2000мс)
75
+
76
+ ### События
77
+ - \`@copied\` - эмитится при успешном копировании, передает скопированное значение
78
+
79
+ ## Ограничения
80
+
81
+ - Требует поддержки \`navigator.clipboard\` API (современные браузеры)
82
+ - При ошибке копирования выводит сообщение в консоль
83
+ `,
84
+ },
85
+ },
86
+ },
14
87
  argTypes: {
88
+ size: {
89
+ control: { type: 'select' },
90
+ options: ['sm', 'md', 'lg'],
91
+ description: 'Размер компонента',
92
+ table: {
93
+ type: { summary: 'string' },
94
+ defaultValue: { summary: 'md' },
95
+ },
96
+ },
15
97
  copyIconAnimation: {
16
98
  control: 'select',
17
99
  options: ['none', 'wiggle', 'scale', 'rotate'],
100
+ description: 'Анимация иконки копирования',
18
101
  },
19
102
  copiedIconAnimation: {
20
103
  control: 'select',
21
104
  options: ['none', 'wiggle', 'scale', 'rotate'],
105
+ description: 'Анимация иконки успеха',
22
106
  },
23
107
  },
24
108
  };
@@ -44,6 +128,49 @@ export const ApiKey = {
44
128
  },
45
129
  };
46
130
 
131
+ export const Sizes = {
132
+ parameters: {
133
+ docs: {
134
+ description: {
135
+ story: 'Примеры всех размеров компонента. Размеры синхронизированы с другими элементами формы (DXInput, DXButton).',
136
+ },
137
+ },
138
+ },
139
+ render: () => ({
140
+ components: { DXCopyField },
141
+ template: `
142
+ <div class="space-y-6">
143
+ <div>
144
+ <h3 class="text-sm font-semibold text-slate-900 mb-3">Small (sm)</h3>
145
+ <DXCopyField
146
+ value="https://example.com/share/abc123"
147
+ label="Share Link"
148
+ size="sm"
149
+ />
150
+ </div>
151
+
152
+ <div>
153
+ <h3 class="text-sm font-semibold text-slate-900 mb-3">Medium (md) - Default</h3>
154
+ <DXCopyField
155
+ value="https://example.com/share/abc123"
156
+ label="Share Link"
157
+ size="md"
158
+ />
159
+ </div>
160
+
161
+ <div>
162
+ <h3 class="text-sm font-semibold text-slate-900 mb-3">Large (lg)</h3>
163
+ <DXCopyField
164
+ value="https://example.com/share/abc123"
165
+ label="Share Link"
166
+ size="lg"
167
+ />
168
+ </div>
169
+ </div>
170
+ `,
171
+ }),
172
+ };
173
+
47
174
  // С анимацией wiggle
48
175
  export const WiggleAnimation = {
49
176
  args: {