@dxtmisha/scripts 0.4.5 → 0.5.0

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 (140) hide show
  1. package/bin/ai-doc.ts +9 -0
  2. package/package.json +9 -7
  3. package/src/classes/Ai/AiAbstract.ts +94 -13
  4. package/src/classes/Ai/AiDoc.ts +62 -0
  5. package/src/classes/Ai/AiDocItem.ts +20 -0
  6. package/src/classes/Ai/AiDocItemAbstract.ts +198 -0
  7. package/src/classes/Ai/AiDocItemClasses.ts +20 -0
  8. package/src/classes/Ai/AiDocItemComposables.ts +13 -0
  9. package/src/classes/Ai/AiDocType.ts +45 -0
  10. package/src/classes/Ai/AiGoogle.ts +7 -29
  11. package/src/classes/Ai/AiGoogleCli.ts +24 -0
  12. package/src/classes/Ai/AiGoogleCliLite.ts +144 -0
  13. package/src/classes/Ai/AiGoogleLite.ts +77 -0
  14. package/src/classes/BuildItem.ts +176 -0
  15. package/src/classes/Component/ComponentCreator.ts +2 -0
  16. package/src/classes/Component/ComponentItem.ts +3 -1
  17. package/src/classes/Component/ComponentWiki.ts +107 -190
  18. package/src/classes/Component/ComponentWikiFile.ts +102 -15
  19. package/src/classes/Design/DesignCommand.ts +3 -1
  20. package/src/classes/Design/DesignComponent.ts +3 -1
  21. package/src/classes/Design/DesignConstructor.ts +3 -1
  22. package/src/classes/Design/DesignConstructors.ts +3 -1
  23. package/src/classes/Design/DesignReplace.ts +3 -1
  24. package/src/classes/Design/DesignStructure.ts +3 -1
  25. package/src/classes/Design/DesignStructureClasses.ts +3 -1
  26. package/src/classes/Design/DesignStructureItemAbstract.ts +2 -0
  27. package/src/classes/Design/DesignStructureRead.ts +3 -1
  28. package/src/classes/Design/DesignStructureStyles.ts +2 -0
  29. package/src/classes/Design/DesignTypescript.ts +1 -1
  30. package/src/classes/Design/DesignUi.ts +3 -1
  31. package/src/classes/Design/DesignWiki.ts +3 -1
  32. package/src/classes/Git/GitRead.ts +258 -0
  33. package/src/classes/Library/LibraryExport.ts +3 -1
  34. package/src/classes/Library/LibraryFlags.ts +3 -1
  35. package/src/classes/Library/LibraryItems.ts +3 -1
  36. package/src/classes/Library/LibraryMedia.ts +3 -1
  37. package/src/classes/Package/PackageInit.ts +2 -0
  38. package/src/classes/Package/PackageItem.ts +2 -0
  39. package/src/classes/Properties/Properties.ts +3 -1
  40. package/src/classes/Properties/PropertiesCache.ts +3 -1
  41. package/src/classes/Properties/PropertiesConfig.ts +21 -0
  42. package/src/classes/Properties/PropertiesConvector.ts +3 -1
  43. package/src/classes/Properties/PropertiesFile.ts +11 -1
  44. package/src/classes/Properties/PropertiesImport.ts +3 -1
  45. package/src/classes/Properties/PropertiesItems.ts +3 -1
  46. package/src/classes/Properties/PropertiesKeys.ts +3 -1
  47. package/src/classes/Properties/PropertiesMain.ts +3 -1
  48. package/src/classes/Properties/PropertiesPalette.ts +3 -1
  49. package/src/classes/Properties/PropertiesPath.ts +3 -1
  50. package/src/classes/Properties/PropertiesScss.ts +3 -1
  51. package/src/classes/Properties/PropertiesSeparator.ts +3 -1
  52. package/src/classes/Properties/PropertiesSettings.ts +3 -1
  53. package/src/classes/Properties/PropertiesStandard.ts +3 -1
  54. package/src/classes/Properties/PropertiesTool.ts +3 -1
  55. package/src/classes/Properties/PropertiesTypes.ts +3 -1
  56. package/src/classes/Properties/PropertiesValues.ts +2 -0
  57. package/src/classes/Properties/PropertiesWrap.ts +3 -1
  58. package/src/classes/Properties/convector/convectorColor.ts +2 -0
  59. package/src/classes/Properties/convector/convectorFontFamilies.ts +2 -0
  60. package/src/classes/Properties/convector/convectorShadow.ts +3 -1
  61. package/src/classes/Properties/convector/convectorTypography.ts +3 -1
  62. package/src/classes/Properties/to/PropertiesToAbstract.ts +2 -0
  63. package/src/classes/Properties/to/PropertiesToAnimate.ts +3 -1
  64. package/src/classes/Properties/to/PropertiesToClass.ts +2 -0
  65. package/src/classes/Properties/to/PropertiesToClone.ts +3 -1
  66. package/src/classes/Properties/to/PropertiesToComponent.ts +2 -0
  67. package/src/classes/Properties/to/PropertiesToDrag.ts +3 -1
  68. package/src/classes/Properties/to/PropertiesToDuplicate.ts +3 -1
  69. package/src/classes/Properties/to/PropertiesToFull.ts +2 -0
  70. package/src/classes/Properties/to/PropertiesToLink.ts +6 -3
  71. package/src/classes/Properties/to/PropertiesToMedia.ts +3 -1
  72. package/src/classes/Properties/to/PropertiesToMulti.ts +3 -1
  73. package/src/classes/Properties/to/PropertiesToNone.ts +3 -1
  74. package/src/classes/Properties/to/PropertiesToPalette.ts +3 -1
  75. package/src/classes/Properties/to/PropertiesToProperty.ts +3 -1
  76. package/src/classes/Properties/to/PropertiesToRemove.ts +3 -1
  77. package/src/classes/Properties/to/PropertiesToReplace.ts +2 -0
  78. package/src/classes/Properties/to/PropertiesToRoot.ts +2 -0
  79. package/src/classes/Properties/to/PropertiesToSimilar.ts +3 -1
  80. package/src/classes/Properties/to/PropertiesToSort.ts +3 -1
  81. package/src/classes/Properties/to/PropertiesToState.ts +3 -1
  82. package/src/classes/Properties/to/PropertiesToStyle.ts +3 -1
  83. package/src/classes/Properties/to/PropertiesToSub.ts +2 -0
  84. package/src/classes/Properties/to/PropertiesToSubclass.ts +2 -0
  85. package/src/classes/Properties/to/PropertiesToVar.ts +3 -1
  86. package/src/classes/Properties/to/PropertiesToVariable.ts +3 -1
  87. package/src/classes/Styles/Styles.ts +3 -1
  88. package/src/classes/Styles/StylesClasses.ts +3 -1
  89. package/src/classes/Styles/StylesProperties.ts +2 -0
  90. package/src/classes/Styles/StylesRoot.ts +2 -0
  91. package/src/classes/Styles/StylesTool.ts +3 -1
  92. package/src/classes/Styles/to/StylesToAbstract.ts +3 -1
  93. package/src/classes/Styles/to/StylesToAnimate.ts +2 -0
  94. package/src/classes/Styles/to/StylesToClass.ts +2 -0
  95. package/src/classes/Styles/to/StylesToClassFull.ts +2 -0
  96. package/src/classes/Styles/to/StylesToContainer.ts +2 -0
  97. package/src/classes/Styles/to/StylesToMedia.ts +2 -0
  98. package/src/classes/Styles/to/StylesToProperty.ts +3 -1
  99. package/src/classes/Styles/to/StylesToRoot.ts +2 -0
  100. package/src/classes/Styles/to/StylesToSelector.ts +3 -1
  101. package/src/classes/Styles/to/StylesToVar.ts +3 -1
  102. package/src/classes/Styles/to/StylesToVirtual.ts +2 -0
  103. package/src/composables/useAi.ts +3 -0
  104. package/src/config.ts +11 -0
  105. package/src/functions/getComponentPaths.ts +2 -0
  106. package/src/functions/getConfigAi.ts +13 -0
  107. package/src/functions/getConstructorProperties.ts +3 -1
  108. package/src/functions/getNameDirByPaths.ts +2 -0
  109. package/src/functions/toPathStandardSep.ts +2 -0
  110. package/src/library-ai.ts +3 -0
  111. package/src/library.ts +2 -89
  112. package/src/media/ai/ai-doc-types.ts +21 -0
  113. package/src/media/properties/css.ts +4 -1
  114. package/src/media/properties/listSort.ts +1 -1
  115. package/src/media/properties/style.ts +2 -0
  116. package/src/media/templates/component/DesignComponent.vue +1 -1
  117. package/src/media/templates/constructors/ConstructorsDesign.tsx +4 -2
  118. package/src/media/templates/packages/library/package.json +2 -1
  119. package/src/media/templates/prompts/aiDocClassPrompt.en.txt +66 -0
  120. package/src/media/templates/prompts/aiDocClassPrompt.ru.txt +64 -0
  121. package/src/media/templates/prompts/aiDocComposablePrompt.en.txt +67 -0
  122. package/src/media/templates/prompts/aiDocComposablePrompt.ru.txt +67 -0
  123. package/src/media/templates/prompts/aiDocFunctionPrompt.en.txt +57 -0
  124. package/src/media/templates/prompts/aiDocFunctionPrompt.ru.txt +57 -0
  125. package/src/media/templates/prompts/componentPrompt.en.txt +105 -0
  126. package/src/media/templates/prompts/componentPrompt.ru.txt +105 -0
  127. package/src/media/templates/prompts/demoClassEn.mdx +111 -0
  128. package/src/media/templates/prompts/demoClassRu.mdx +111 -0
  129. package/src/media/templates/prompts/demoComponentEn.mdx +282 -0
  130. package/src/media/templates/prompts/demoComponentRu.mdx +282 -0
  131. package/src/media/templates/prompts/demoComposableEn.mdx +103 -0
  132. package/src/media/templates/prompts/demoComposableRu.mdx +103 -0
  133. package/src/media/templates/prompts/demoDocEn.mdx +30 -0
  134. package/src/media/templates/prompts/demoDocRu.mdx +30 -0
  135. package/src/media/templates/viteComponentTemplateConfig.ts +1 -1
  136. package/src/types/aiTypes.ts +19 -0
  137. package/src/types/configTypes.ts +8 -2
  138. package/src/types/gitTypes.ts +59 -0
  139. package/src/media/templates/componentPrompt.en.txt +0 -447
  140. package/src/media/templates/componentPrompt.ru.txt +0 -449
@@ -0,0 +1,111 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='[title]'/>
4
+
5
+ # Класс TaskManager
6
+
7
+ Продвинутый менеджер для управления асинхронными задачами с поддержкой приоритетов, зависимостей и очередей выполнения. Позволяет организовывать сложные рабочие процессы с контролем состояния и обработкой ошибок.
8
+
9
+ ## Основные возможности
10
+
11
+ - **Очереди выполнения** — управление последовательным и параллельным выполнением
12
+ - **Приоритезация** — система весов для определения порядка запуска задач
13
+ - **Зависимости** — возможность указать задачи, которые должны быть выполнены перед текущей
14
+ - **Повторные попытки** — автоматический перезапуск задач при сбоях
15
+ - **Событийная модель** — подписка на изменение статуса и прогресса выполнения
16
+
17
+ ## Типы данных
18
+
19
+ ### Конфигурация задачи (TaskConfig)
20
+
21
+ Объект конфигурации, определяющий параметры создаваемой задачи.
22
+
23
+ **Свойства TaskConfig:**
24
+ - `id?: string` — уникальный идентификатор (генерируется автоматически, если не указан)
25
+ - `handler: (ctx: TaskContext) => Promise<any>` — функция выполнения задачи
26
+ - `priority?: number` — приоритет выполнения (по умолчанию: `10`)
27
+ - `dependencies?: string[]` — массив ID задач, от которых зависит данная задача
28
+ - `retry?: RetryOptions` — настройки повторных попыток при ошибке
29
+ - `timeout?: number` — максимальное время выполнения в мс
30
+
31
+ ```javascript
32
+ const config = {
33
+ priority: 100,
34
+ dependencies: ['auth-task'],
35
+ timeout: 5000,
36
+ handler: async (ctx) => {
37
+ return await api.fetchData()
38
+ }
39
+ }
40
+ ```
41
+
42
+ ### Результат выполнения (TaskResult<T>)
43
+
44
+ Объект, возвращаемый после завершения задачи.
45
+
46
+ **Свойства TaskResult:**
47
+ - `taskId: string` — идентификатор выполненной задачи
48
+ - `status: 'success' | 'error' | 'timeout'` — итоговый статус
49
+ - `data?: T` — данные, возвращенные обработчиком (при успехе)
50
+ - `error?: Error` — объект ошибки (при сбое)
51
+ - `executionTime: number` — время выполнения в миллисекундах
52
+
53
+ ## Методы класса
54
+
55
+ ### `registerTask`
56
+
57
+ Регистрирует новую задачу в системе планировщика.
58
+
59
+ **Параметры:**
60
+ - `config: TaskConfig` — конфигурация задачи
61
+
62
+ **Возвращает:** `string` — идентификатор зарегистрированной задачи
63
+
64
+ ```javascript
65
+ import { TaskManager } from '@dxtmisha/functional'
66
+
67
+ const taskId = TaskManager.registerTask({
68
+ priority: 50,
69
+ handler: async () => {
70
+ console.log('Выполнение важной задачи')
71
+ return 'done'
72
+ }
73
+ })
74
+ ```
75
+
76
+ ### `executeAll`
77
+
78
+ Запускает выполнение всех зарегистрированных задач с учетом их зависимостей и приоритетов.
79
+
80
+ **Параметры:**
81
+ - `concurrency: number` — максимальное количество параллельных задач (по умолчанию: `5`)
82
+
83
+ **Возвращает:** `Promise<Map<string, TaskResult<any>>>` — карта результатов выполнения
84
+
85
+ ```javascript
86
+ // Запуск с ограничением в 3 параллельных потока
87
+ const results = await TaskManager.executeAll(3)
88
+
89
+ if (results.get(taskId).status === 'success') {
90
+ console.log('Задача выполнена успешно')
91
+ }
92
+ ```
93
+
94
+ ### `onProgress`
95
+
96
+ Подписывается на обновления прогресса выполнения группы задач.
97
+
98
+ **Параметры:**
99
+ - `callback: (progress: number, active: number) => void` — функция обратного вызова
100
+
101
+ **Возвращает:** `() => void` — функция отписки
102
+
103
+ ```javascript
104
+ const unsubscribe = TaskManager.onProgress((percent, activeCount) => {
105
+ console.log(`Прогресс: ${percent}%, Активных задач: ${activeCount}`)
106
+ })
107
+
108
+ // Позже отписаться
109
+ unsubscribe()
110
+ ```
111
+
@@ -0,0 +1,282 @@
1
+ Component for creating popup menus, dropdown lists, and context menus with support for navigation and actions.
2
+
3
+ Menu combines the functionality of Window (positioning and visibility management), Bars (action and tool panel), and List (displaying items, groups, and nested submenus). The component provides keyboard navigation, support for nested structures, asynchronous data loading, an optimized rendering mode for large lists, and full control over the open/close state.
4
+
5
+ **Key Features:**
6
+
7
+ - Integration of Window, Bars, and List components
8
+ - Keyboard navigation through menu items
9
+ - Nested submenus with unlimited depth
10
+ - Asynchronous data loading via AJAX
11
+ - Lite mode for optimizing large lists (liteThreshold)
12
+ - Search and filtering of menu items
13
+ - Management of selected items (selected)
14
+ - Flexible positioning relative to the anchor
15
+
16
+ **Typical Use Cases:**
17
+
18
+ - Dropdown navigation menus
19
+ - Right-click context menus
20
+ - Action and operation menus
21
+ - Selectors with search and filtering
22
+ - Multi-level navigation menus
23
+ - Menus with dynamic data loading
24
+
25
+ ```html
26
+ <script setup>
27
+ import { ref } from 'vue'
28
+
29
+ const isOpen = ref(false)
30
+ const menuItems = ref([
31
+ { label: 'Create', value: 'create', icon: 'add' },
32
+ { label: 'Edit', value: 'edit', icon: 'edit' },
33
+ { label: 'Delete', value: 'delete', icon: 'delete' },
34
+ {
35
+ label: 'Export',
36
+ value: 'export',
37
+ children: [
38
+ { label: 'PDF', value: 'pdf' },
39
+ { label: 'Excel', value: 'excel' },
40
+ { label: 'CSV', value: 'csv' }
41
+ ]
42
+ }
43
+ ])
44
+
45
+ const handleClick = (value) => {
46
+ console.log('Item selected:', value)
47
+ isOpen.value = false
48
+ }
49
+ </script>
50
+
51
+ <template>
52
+ <button @click="isOpen = true">Open Menu</button>
53
+
54
+ <Menu
55
+ v-model:open="isOpen"
56
+ :list="menuItems"
57
+ @click="handleClick"
58
+ >
59
+ <template #control="{ onclick }">
60
+ <button @click="onclick">Actions</button>
61
+ </template>
62
+ </Menu>
63
+ </template>
64
+ ```
65
+
66
+ ## Navigation through Menu Items
67
+
68
+ The `previous()` and `next()` methods are designed for programmatic navigation through menu items based on the current selection and the `step` property.
69
+
70
+ **Methods:**
71
+
72
+ - `previous()` — moves the selection to the previous item (back by `step` positions)
73
+ - `next()` — moves the selection to the next item (forward by `step` positions)
74
+ - `step` — number of items to skip during navigation (default: 1)
75
+
76
+ The methods work in conjunction with the reactive `selected` state: when `previous()` or `next()` is called, the new position is automatically calculated relative to the currently selected item. If no item is selected, the methods select the first available item. When the list boundaries (first or last item) are reached, navigation stops at the boundary item, preventing exit from the list.
77
+
78
+ ```html
79
+ <script setup>
80
+ import { ref } from 'vue'
81
+
82
+ const menuRef = ref()
83
+ const selected = ref('item2')
84
+ </script>
85
+
86
+ <template>
87
+ <!-- Call via ref -->
88
+ <button @click="menuRef?.previous()">Back</button>
89
+ <button @click="menuRef?.next()">Forward</button>
90
+
91
+ <Menu
92
+ ref="menuRef"
93
+ v-model:selected="selected"
94
+ :list="[
95
+ { label: 'Item 1', value: 'item1' },
96
+ { label: 'Item 2', value: 'item2' },
97
+ { label: 'Item 3', value: 'item3' }
98
+ ]"
99
+ :step="1"
100
+ />
101
+
102
+ <!-- Navigation in control slot -->
103
+ <Menu v-model:selected="selected" :list="items">
104
+ <template #control="{ previous, next, selectedNames }">
105
+ <button @click="previous">◀</button>
106
+ <span>{{ selectedNames[0] }}</span>
107
+ <button @click="next">▶</button>
108
+ </template>
109
+ </Menu>
110
+
111
+ <!-- With custom step -->
112
+ <Menu
113
+ ref="menuRef"
114
+ v-model:selected="selected"
115
+ :list="items"
116
+ :step="2"
117
+ />
118
+ </template>
119
+ ```
120
+
121
+ ## AJAX Menu Loading
122
+
123
+ The `ajax`, `request`, and `cache` properties are designed to manage asynchronous loading and caching of menu data.
124
+
125
+ **Properties:**
126
+
127
+ - `ajax` — enables remote data loading mode (URL string or function)
128
+ - `request` — object of type `ApiFetch` with HTTP request settings
129
+ - `cache` — enables caching of loaded menu items
130
+
131
+ The properties work together: if `ajax` is not set or is `false`, the menu uses local data. When `ajax` is activated (URL string or `true`), `request` defines the HTTP request parameters (method, headers, body), and `cache` manages data storage. With `cache` enabled, reopening the menu uses stored data instead of new requests, reducing server load.
132
+
133
+ ```html
134
+ <script setup>
135
+ import { ref } from 'vue'
136
+
137
+ const isOpen = ref(false)
138
+ </script>
139
+
140
+ <template>
141
+ <!-- Load from URL -->
142
+ <Menu
143
+ v-model:open="isOpen"
144
+ ajax="/api/menu-items"
145
+ :cache="true"
146
+ />
147
+
148
+ <!-- With request settings -->
149
+ <Menu
150
+ v-model:open="isOpen"
151
+ ajax="/api/menu"
152
+ :request="{
153
+ method: 'POST',
154
+ headers: { 'X-Custom': 'value' },
155
+ auth: true
156
+ }"
157
+ :cache="true"
158
+ />
159
+
160
+ <!-- Loading function -->
161
+ <Menu
162
+ v-model:open="isOpen"
163
+ :ajax="async () => {
164
+ const response = await fetch('/api/menu')
165
+ return response.json()
166
+ }"
167
+ />
168
+ </template>
169
+ ```
170
+
171
+ ## Events
172
+
173
+ ### `click`
174
+
175
+ The event is triggered when the component is clicked, passing the original DOM event and component data.
176
+
177
+ **Parameters:**
178
+ - `event: MouseEvent` — original DOM mouse event
179
+ - `value: EventClickValue` — object with component data
180
+
181
+ **EventClickValue Structure:**
182
+ - `type: string` — identifier of the click location, set via the `data-event-type` attribute on the element
183
+ - `value: any` — component value
184
+ - `detail: Record<string, any> | undefined` — additional event data
185
+
186
+ ```html
187
+ <script setup>
188
+ const handleClick = (event, value) => {
189
+ console.log('DOM event:', event)
190
+ console.log('Click type:', value.type)
191
+ console.log('Value:', value.value)
192
+ console.log('Details:', value.detail)
193
+ }
194
+ </script>
195
+
196
+ <template>
197
+ <Component @click="handleClick">
198
+ <button data-event-type="action">Click me</button>
199
+ </Component>
200
+ </template>
201
+ ```
202
+
203
+ ### `clickLite`
204
+
205
+ The event is triggered when the component is clicked, passing only data without the original DOM event (lightweight version).
206
+
207
+ **Parameters:**
208
+ - `value: EventClickValue` — object with component data
209
+
210
+ ## Expose
211
+
212
+ ### `previous()`
213
+
214
+ Moves the selection to the previous menu item based on the `step` property value.
215
+
216
+ **Returns:** `void`
217
+
218
+ ### `next()`
219
+
220
+ Moves the selection to the next menu item based on the `step` property value.
221
+
222
+ **Returns:** `void`
223
+
224
+ ## Slots
225
+
226
+ ### `control`
227
+
228
+ Slot for placing the menu control element (trigger).
229
+
230
+ **Parameters:**
231
+ - `props: MenuControlItem` — object with menu control data
232
+ - `onclick` — function to toggle menu open/close
233
+ - `isSelected` — computed boolean indicating if any item is selected
234
+ - `selectedNames` — computed array of labels of selected items
235
+ - `selectedValues` — computed array of values of selected items
236
+ - `selectedList` — computed array of selected list items
237
+ - `loading` — ref indicating AJAX loading state
238
+ - `previous()` — method to navigate to previous item(s)
239
+ - `next()` — method to navigate to next item(s)
240
+
241
+ ```html
242
+ <script setup>
243
+ import { ref } from 'vue'
244
+
245
+ const isOpen = ref(false)
246
+ const menuItems = ref([
247
+ { label: 'Item 1', value: '1' },
248
+ { label: 'Item 2', value: '2' },
249
+ { label: 'Item 3', value: '3' }
250
+ ])
251
+ </script>
252
+
253
+ <template>
254
+ <Menu v-model:open="isOpen" :list="menuItems">
255
+ <template #control="{ onclick, isSelected, selectedNames }">
256
+ <button @click="onclick">
257
+ {{ isSelected ? selectedNames.join(', ') : 'Select Items' }}
258
+ </button>
259
+ </template>
260
+ </Menu>
261
+ </template>
262
+ ```
263
+
264
+ ### `title`
265
+
266
+ Slot for placing the menu window title.
267
+
268
+ **Parameters:**
269
+ - `props: MenuControlItem` — object with menu control data
270
+
271
+ ### `footer`
272
+
273
+ Slot for placing content at the bottom of the menu window (action buttons, information).
274
+
275
+ **Parameters:**
276
+ - `props: MenuControlItem` — object with menu control data
277
+
278
+ ### `default`
279
+
280
+ Main slot for placing the main content of the component.
281
+
282
+ **Returns:** `VNode` — main content of the component
@@ -0,0 +1,282 @@
1
+ Компонент для создания всплывающих меню, выпадающих списков и контекстных меню с поддержкой навигации и действий.
2
+
3
+ Menu объединяет функциональность Window (позиционирование и управление видимостью), Bars (панель действий и инструментов) и List (отображение пунктов, групп и вложенных подменю). Компонент обеспечивает клавиатурную навигацию, поддержку вложенной структуры, асинхронную загрузку данных, режим оптимизированного рендеринга для больших списков и полный контроль над состоянием открытия/закрытия.
4
+
5
+ **Основные возможности:**
6
+
7
+ - Интеграция Window, Bars и List компонентов
8
+ - Клавиатурная навигация по пунктам меню
9
+ - Вложенные подменю с неограниченной глубиной
10
+ - Асинхронная загрузка данных через AJAX
11
+ - Режим lite для оптимизации больших списков (liteThreshold)
12
+ - Поиск и фильтрация пунктов меню
13
+ - Управление выбранными элементами (selected)
14
+ - Гибкое позиционирование относительно якоря
15
+
16
+ **Типичные сценарии использования:**
17
+
18
+ - Выпадающие меню навигации
19
+ - Контекстные меню по правому клику
20
+ - Меню действий и операций
21
+ - Селекторы с поиском и фильтрацией
22
+ - Многоуровневые навигационные меню
23
+ - Меню с динамической загрузкой данных
24
+
25
+ ```html
26
+ <script setup>
27
+ import { ref } from 'vue'
28
+
29
+ const isOpen = ref(false)
30
+ const menuItems = ref([
31
+ { label: 'Создать', value: 'create', icon: 'add' },
32
+ { label: 'Редактировать', value: 'edit', icon: 'edit' },
33
+ { label: 'Удалить', value: 'delete', icon: 'delete' },
34
+ {
35
+ label: 'Экспорт',
36
+ value: 'export',
37
+ children: [
38
+ { label: 'PDF', value: 'pdf' },
39
+ { label: 'Excel', value: 'excel' },
40
+ { label: 'CSV', value: 'csv' }
41
+ ]
42
+ }
43
+ ])
44
+
45
+ const handleClick = (value) => {
46
+ console.log('Выбран пункт:', value)
47
+ isOpen.value = false
48
+ }
49
+ </script>
50
+
51
+ <template>
52
+ <button @click="isOpen = true">Открыть меню</button>
53
+
54
+ <Menu
55
+ v-model:open="isOpen"
56
+ :list="menuItems"
57
+ @click="handleClick"
58
+ >
59
+ <template #control="{ onclick }">
60
+ <button @click="onclick">Действия</button>
61
+ </template>
62
+ </Menu>
63
+ </template>
64
+ ```
65
+
66
+ ## Навигация по элементам меню
67
+
68
+ Методы `previous()` и `next()` предназначены для программного перемещения по элементам меню на основе текущего выбора и свойства `step`.
69
+
70
+ **Методы:**
71
+
72
+ - `previous()` — перемещает выбор на предыдущий элемент (назад на `step` позиций)
73
+ - `next()` — перемещает выбор на следующий элемент (вперед на `step` позиций)
74
+ - `step` — количество элементов для пропуска при навигации (по умолчанию: 1)
75
+
76
+ Методы работают совместно с реактивным состоянием `selected`: при вызове `previous()` или `next()` происходит автоматический расчёт новой позиции относительно текущего выделенного элемента. Если элемент не выбран, методы выбирают первый доступный элемент. При достижении границ списка (первый или последний элемент) навигация останавливается на граничном элементе, предотвращая выход за пределы списка.
77
+
78
+ ```html
79
+ <script setup>
80
+ import { ref } from 'vue'
81
+
82
+ const menuRef = ref()
83
+ const selected = ref('item2')
84
+ </script>
85
+
86
+ <template>
87
+ <!-- Вызов через ref -->
88
+ <button @click="menuRef?.previous()">Назад</button>
89
+ <button @click="menuRef?.next()">Вперед</button>
90
+
91
+ <Menu
92
+ ref="menuRef"
93
+ v-model:selected="selected"
94
+ :list="[
95
+ { label: 'Элемент 1', value: 'item1' },
96
+ { label: 'Элемент 2', value: 'item2' },
97
+ { label: 'Элемент 3', value: 'item3' }
98
+ ]"
99
+ :step="1"
100
+ />
101
+
102
+ <!-- Навигация в слоте control -->
103
+ <Menu v-model:selected="selected" :list="items">
104
+ <template #control="{ previous, next, selectedNames }">
105
+ <button @click="previous">◀</button>
106
+ <span>{{ selectedNames[0] }}</span>
107
+ <button @click="next">▶</button>
108
+ </template>
109
+ </Menu>
110
+
111
+ <!-- С пользовательским шагом -->
112
+ <Menu
113
+ ref="menuRef"
114
+ v-model:selected="selected"
115
+ :list="items"
116
+ :step="2"
117
+ />
118
+ </template>
119
+ ```
120
+
121
+ ## AJAX загрузка меню
122
+
123
+ Свойства `ajax`, `request` и `cache` предназначены для управления асинхронной загрузкой и кэшированием данных меню.
124
+
125
+ **Свойства:**
126
+
127
+ - `ajax` — включает режим удалённой загрузки данных (строка URL или функция)
128
+ - `request` — объект типа `ApiFetch` с настройками HTTP-запроса
129
+ - `cache` — включает кэширование загруженных элементов меню
130
+
131
+ Свойства работают совместно: если `ajax` не задан или равен `false`, меню использует локальные данные. При активации `ajax` (строка URL или `true`), `request` определяет параметры HTTP-запроса (метод, заголовки, тело), а `cache` управляет сохранением данных. При включённом `cache` повторные открытия меню используют сохранённые данные вместо новых запросов, снижая нагрузку на сервер.
132
+
133
+ ```html
134
+ <script setup>
135
+ import { ref } from 'vue'
136
+
137
+ const isOpen = ref(false)
138
+ </script>
139
+
140
+ <template>
141
+ <!-- Загрузка с URL -->
142
+ <Menu
143
+ v-model:open="isOpen"
144
+ ajax="/api/menu-items"
145
+ :cache="true"
146
+ />
147
+
148
+ <!-- С настройками запроса -->
149
+ <Menu
150
+ v-model:open="isOpen"
151
+ ajax="/api/menu"
152
+ :request="{
153
+ method: 'POST',
154
+ headers: { 'X-Custom': 'value' },
155
+ auth: true
156
+ }"
157
+ :cache="true"
158
+ />
159
+
160
+ <!-- Функция загрузки -->
161
+ <Menu
162
+ v-model:open="isOpen"
163
+ :ajax="async () => {
164
+ const response = await fetch('/api/menu')
165
+ return response.json()
166
+ }"
167
+ />
168
+ </template>
169
+ ```
170
+
171
+ ## Events
172
+
173
+ ### `click`
174
+
175
+ Событие срабатывает при клике на компонент, передавая оригинальное DOM событие и данные компонента.
176
+
177
+ **Параметры:**
178
+ - `event: MouseEvent` — оригинальное DOM событие мыши
179
+ - `value: EventClickValue` — объект с данными компонента
180
+
181
+ **Структура EventClickValue:**
182
+ - `type: string` — идентификатор места нажатия, задается через атрибут `data-event-type` у элемента
183
+ - `value: any` — значение компонента
184
+ - `detail: Record<string, any> | undefined` — дополнительные данные события
185
+
186
+ ```html
187
+ <script setup>
188
+ const handleClick = (event, value) => {
189
+ console.log('DOM событие:', event)
190
+ console.log('Тип клика:', value.type)
191
+ console.log('Значение:', value.value)
192
+ console.log('Детали:', value.detail)
193
+ }
194
+ </script>
195
+
196
+ <template>
197
+ <Component @click="handleClick">
198
+ <button data-event-type="action">Нажми меня</button>
199
+ </Component>
200
+ </template>
201
+ ```
202
+
203
+ ### `clickLite`
204
+
205
+ Событие срабатывает при клике на компонент, передавая только данные без оригинального DOM события (облегченная версия).
206
+
207
+ **Параметры:**
208
+ - `value: EventClickValue` — объект с данными компонента
209
+
210
+ ## Expose
211
+
212
+ ### `previous()`
213
+
214
+ Перемещает выбор на предыдущий элемент меню на основе значения свойства `step`.
215
+
216
+ **Возвращает:** `void`
217
+
218
+ ### `next()`
219
+
220
+ Перемещает выбор на следующий элемент меню на основе значения свойства `step`.
221
+
222
+ **Возвращает:** `void`
223
+
224
+ ## Slots
225
+
226
+ ### `control`
227
+
228
+ Слот для размещения элемента управления (триггера) меню.
229
+
230
+ **Параметры:**
231
+ - `props: MenuControlItem` — объект с данными управления меню
232
+ - `onclick` — функция для переключения открытия/закрытия меню
233
+ - `isSelected` — computed boolean, указывающий, выбран ли какой-либо элемент
234
+ - `selectedNames` — computed массив меток выбранных элементов
235
+ - `selectedValues` — computed массив значений выбранных элементов
236
+ - `selectedList` — computed массив выбранных элементов списка
237
+ - `loading` — ref, указывающий на состояние загрузки AJAX
238
+ - `previous()` — метод для перехода к предыдущему элементу(ам)
239
+ - `next()` — метод для перехода к следующему элементу(ам)
240
+
241
+ ```html
242
+ <script setup>
243
+ import { ref } from 'vue'
244
+
245
+ const isOpen = ref(false)
246
+ const menuItems = ref([
247
+ { label: 'Элемент 1', value: '1' },
248
+ { label: 'Элемент 2', value: '2' },
249
+ { label: 'Элемент 3', value: '3' }
250
+ ])
251
+ </script>
252
+
253
+ <template>
254
+ <Menu v-model:open="isOpen" :list="menuItems">
255
+ <template #control="{ onclick, isSelected, selectedNames }">
256
+ <button @click="onclick">
257
+ {{ isSelected ? selectedNames.join(', ') : 'Выбрать элементы' }}
258
+ </button>
259
+ </template>
260
+ </Menu>
261
+ </template>
262
+ ```
263
+
264
+ ### `title`
265
+
266
+ Слот для размещения заголовка окна меню.
267
+
268
+ **Параметры:**
269
+ - `props: MenuControlItem` — объект с данными управления меню
270
+
271
+ ### `footer`
272
+
273
+ Слот для размещения содержимого в нижней части окна меню (кнопки действий, информация).
274
+
275
+ **Параметры:**
276
+ - `props: MenuControlItem` — объект с данными управления меню
277
+
278
+ ### `default`
279
+
280
+ Основной слот для размещения главного содержимого компонента.
281
+
282
+ **Возвращает:** `VNode` — основное содержимое компонента