@dxtmisha/wiki 0.24.3 → 0.25.1

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 (230) hide show
  1. package/package.json +7 -7
  2. package/src/classes/WikiStorybookItem.ts +24 -0
  3. package/src/media/descriptions/wikiDescriptions.ts +28 -0
  4. package/src/media/descriptions/wikiDescriptionsAccordion.ts +158 -0
  5. package/src/media/descriptions/wikiDescriptionsActionSheet.ts +211 -0
  6. package/src/media/descriptions/wikiDescriptionsActions.ts +161 -0
  7. package/src/media/descriptions/wikiDescriptionsAnchor.ts +42 -0
  8. package/src/media/descriptions/wikiDescriptionsArrow.ts +181 -0
  9. package/src/media/descriptions/wikiDescriptionsBlock.ts +97 -0
  10. package/src/media/descriptions/wikiDescriptionsButton.ts +0 -1
  11. package/src/media/descriptions/wikiDescriptionsCell.ts +2 -1
  12. package/src/media/descriptions/wikiDescriptionsChipGroup.ts +168 -0
  13. package/src/media/descriptions/wikiDescriptionsDialog.ts +182 -0
  14. package/src/media/descriptions/wikiDescriptionsField.ts +2 -0
  15. package/src/media/descriptions/wikiDescriptionsImage.ts +41 -6
  16. package/src/media/descriptions/wikiDescriptionsInput.ts +257 -0
  17. package/src/media/descriptions/wikiDescriptionsMenu.ts +123 -0
  18. package/src/media/descriptions/wikiDescriptionsModal.ts +145 -0
  19. package/src/media/descriptions/wikiDescriptionsMotionTransform.ts +2 -6
  20. package/src/media/descriptions/wikiDescriptionsSelect.ts +209 -0
  21. package/src/media/descriptions/wikiDescriptionsSelectValue.ts +78 -0
  22. package/src/media/descriptions/wikiDescriptionsTextareaAutosize.ts +50 -0
  23. package/src/media/descriptions/wikiDescriptionsTooltip.ts +89 -0
  24. package/src/media/functional/en/conversions.mdx +67 -0
  25. package/src/media/functional/en/dataUtils.mdx +25 -0
  26. package/src/media/functional/en/datetimeRef.mdx +1 -1
  27. package/src/media/functional/en/eventRef.mdx +1 -1
  28. package/src/media/functional/en/executionUtils.mdx +58 -0
  29. package/src/media/functional/en/geoFlagRef.mdx +1 -1
  30. package/src/media/functional/en/geoIntlRef.mdx +1 -1
  31. package/src/media/functional/en/geoRef.mdx +2 -2
  32. package/src/media/functional/en/meta.mdx +1206 -0
  33. package/src/media/functional/en/metaManager.mdx +376 -0
  34. package/src/media/functional/en/metaOg.mdx +694 -0
  35. package/src/media/functional/en/metaTwitter.mdx +853 -0
  36. package/src/media/functional/en/reactive.mdx +40 -0
  37. package/src/media/functional/en/refTypes.mdx +1 -1
  38. package/src/media/functional/en/useApiRef.mdx +5 -5
  39. package/src/media/functional/en/useMeta.mdx +431 -0
  40. package/src/media/functional/en/validationUtils.mdx +11 -0
  41. package/src/media/functional/ru/conversions.mdx +67 -0
  42. package/src/media/functional/ru/dataUtils.mdx +25 -0
  43. package/src/media/functional/ru/datetimeRef.mdx +2 -2
  44. package/src/media/functional/ru/eventRef.mdx +1 -1
  45. package/src/media/functional/ru/executionUtils.mdx +58 -0
  46. package/src/media/functional/ru/geoFlagRef.mdx +1 -1
  47. package/src/media/functional/ru/geoIntl.mdx +2 -2
  48. package/src/media/functional/ru/geoIntlRef.mdx +1 -1
  49. package/src/media/functional/ru/geoRef.mdx +2 -2
  50. package/src/media/functional/ru/listTypes.mdx +1 -1
  51. package/src/media/functional/ru/meta.mdx +1330 -0
  52. package/src/media/functional/ru/metaManager.mdx +376 -0
  53. package/src/media/functional/ru/metaOg.mdx +694 -0
  54. package/src/media/functional/ru/metaTwitter.mdx +853 -0
  55. package/src/media/functional/ru/reactive.mdx +40 -0
  56. package/src/media/functional/ru/refTypes.mdx +2 -2
  57. package/src/media/functional/ru/useApiRef.mdx +5 -5
  58. package/src/media/functional/ru/useMeta.mdx +431 -0
  59. package/src/media/functional/ru/validationUtils.mdx +11 -0
  60. package/src/media/mdx/Accordion/accordion.en.mdx +59 -0
  61. package/src/media/mdx/Accordion/accordion.ru.mdx +59 -0
  62. package/src/media/mdx/Accordion/slots.en.mdx +6 -0
  63. package/src/media/mdx/Accordion/slots.ru.mdx +6 -0
  64. package/src/media/mdx/Accordion/wikiMdxAccordion.ts +25 -0
  65. package/src/media/mdx/ActionSheet/actionSheet.en.mdx +61 -0
  66. package/src/media/mdx/ActionSheet/actionSheet.ru.mdx +61 -0
  67. package/src/media/mdx/ActionSheet/touchClose.en.mdx +21 -0
  68. package/src/media/mdx/ActionSheet/touchClose.ru.mdx +21 -0
  69. package/src/media/mdx/ActionSheet/wikiMdxActionSheet.ts +25 -0
  70. package/src/media/mdx/Actions/actions.en.mdx +48 -0
  71. package/src/media/mdx/Actions/actions.ru.mdx +48 -0
  72. package/src/media/mdx/Actions/flexible.en.mdx +19 -0
  73. package/src/media/mdx/Actions/flexible.ru.mdx +19 -0
  74. package/src/media/mdx/Actions/list.en.mdx +50 -0
  75. package/src/media/mdx/Actions/list.ru.mdx +50 -0
  76. package/src/media/mdx/Actions/wikiMdxActions.ts +31 -0
  77. package/src/media/mdx/Anchor/anchor.en.mdx +34 -0
  78. package/src/media/mdx/Anchor/anchor.ru.mdx +34 -0
  79. package/src/media/mdx/Anchor/expose.go.en.mdx +6 -0
  80. package/src/media/mdx/Anchor/expose.go.ru.mdx +6 -0
  81. package/src/media/mdx/Anchor/hide.en.mdx +28 -0
  82. package/src/media/mdx/Anchor/hide.ru.mdx +28 -0
  83. package/src/media/mdx/Anchor/isCopy.en.mdx +23 -0
  84. package/src/media/mdx/Anchor/isCopy.ru.mdx +23 -0
  85. package/src/media/mdx/Anchor/scroll.en.mdx +34 -0
  86. package/src/media/mdx/Anchor/scroll.ru.mdx +35 -0
  87. package/src/media/mdx/Anchor/wikiMdxAnchor.ts +43 -0
  88. package/src/media/mdx/Arrow/arrow.en.mdx +33 -0
  89. package/src/media/mdx/Arrow/arrow.ru.mdx +33 -0
  90. package/src/media/mdx/Arrow/wikiMdxArrow.ts +19 -0
  91. package/src/media/mdx/Block/block.en.mdx +42 -0
  92. package/src/media/mdx/Block/block.ru.mdx +42 -0
  93. package/src/media/mdx/Block/wikiMdxBlock.ts +19 -0
  94. package/src/media/mdx/ChipGroup/chipGroup.en.mdx +51 -0
  95. package/src/media/mdx/ChipGroup/chipGroup.ru.mdx +51 -0
  96. package/src/media/mdx/ChipGroup/selected.en.mdx +50 -0
  97. package/src/media/mdx/ChipGroup/selected.ru.mdx +50 -0
  98. package/src/media/mdx/ChipGroup/wikiMdxChipGroup.ts +25 -0
  99. package/src/media/mdx/Dialog/buttons.en.mdx +45 -0
  100. package/src/media/mdx/Dialog/buttons.ru.mdx +45 -0
  101. package/src/media/mdx/Dialog/dialog.en.mdx +66 -0
  102. package/src/media/mdx/Dialog/dialog.ru.mdx +65 -0
  103. package/src/media/mdx/Dialog/events.en.mdx +63 -0
  104. package/src/media/mdx/Dialog/events.ru.mdx +63 -0
  105. package/src/media/mdx/Dialog/states.en.mdx +58 -0
  106. package/src/media/mdx/Dialog/states.ru.mdx +57 -0
  107. package/src/media/mdx/Dialog/wikiMdxDialog.ts +37 -0
  108. package/src/media/mdx/Field/arrows.en.mdx +22 -6
  109. package/src/media/mdx/Field/arrows.ru.mdx +22 -6
  110. package/src/media/mdx/Field/slots.en.mdx +0 -13
  111. package/src/media/mdx/Field/slots.ru.mdx +0 -13
  112. package/src/media/mdx/Image/img-tag.en.mdx +105 -0
  113. package/src/media/mdx/Image/img-tag.ru.mdx +105 -0
  114. package/src/media/mdx/Image/wikiMdxImage.ts +6 -0
  115. package/src/media/mdx/Input/currency.en.mdx +38 -0
  116. package/src/media/mdx/Input/currency.ru.mdx +38 -0
  117. package/src/media/mdx/Input/date.en.mdx +53 -0
  118. package/src/media/mdx/Input/date.ru.mdx +53 -0
  119. package/src/media/mdx/Input/input.en.mdx +143 -0
  120. package/src/media/mdx/Input/input.ru.mdx +71 -0
  121. package/src/media/mdx/Input/mask.en.mdx +30 -0
  122. package/src/media/mdx/Input/mask.ru.mdx +30 -0
  123. package/src/media/mdx/Input/number.en.mdx +41 -0
  124. package/src/media/mdx/Input/number.ru.mdx +41 -0
  125. package/src/media/mdx/Input/type.en.mdx +26 -0
  126. package/src/media/mdx/Input/type.ru.mdx +26 -0
  127. package/src/media/mdx/Input/wikiMdxInput.ts +49 -0
  128. package/src/media/mdx/Menu/event.updateValue.en.mdx +29 -0
  129. package/src/media/mdx/Menu/event.updateValue.ru.mdx +30 -0
  130. package/src/media/mdx/Menu/expose.navigation.en.mdx +12 -0
  131. package/src/media/mdx/Menu/expose.navigation.ru.mdx +12 -0
  132. package/src/media/mdx/Menu/navigation.en.mdx +56 -0
  133. package/src/media/mdx/Menu/navigation.ru.mdx +56 -0
  134. package/src/media/mdx/Menu/slots.control.en.mdx +65 -0
  135. package/src/media/mdx/Menu/slots.control.ru.mdx +65 -0
  136. package/src/media/mdx/Menu/slots.en.mdx +2 -24
  137. package/src/media/mdx/Menu/slots.ru.mdx +2 -24
  138. package/src/media/mdx/Menu/wikiMdxMenu.ts +27 -3
  139. package/src/media/mdx/Modal/differences.en.mdx +130 -0
  140. package/src/media/mdx/Modal/differences.ru.mdx +65 -0
  141. package/src/media/mdx/Modal/modal.en.mdx +63 -0
  142. package/src/media/mdx/Modal/modal.ru.mdx +63 -0
  143. package/src/media/mdx/Modal/wikiMdxModal.ts +25 -0
  144. package/src/media/mdx/MotionTransform/expose.motionTransformElement.en.mdx +13 -0
  145. package/src/media/mdx/MotionTransform/expose.motionTransformElement.ru.mdx +14 -0
  146. package/src/media/mdx/MotionTransform/wikiMdxMotionTransform.ts +6 -0
  147. package/src/media/mdx/Select/select.en.mdx +69 -0
  148. package/src/media/mdx/Select/select.ru.mdx +69 -0
  149. package/src/media/mdx/Select/wikiMdxSelect.ts +19 -0
  150. package/src/media/mdx/SelectValue/selectValue.en.mdx +64 -0
  151. package/src/media/mdx/SelectValue/selectValue.ru.mdx +64 -0
  152. package/src/media/mdx/SelectValue/wikiMdxSelectValue.ts +19 -0
  153. package/src/media/mdx/TextareaAutosize/textarea-autosize.en.mdx +65 -0
  154. package/src/media/mdx/TextareaAutosize/textarea-autosize.ru.mdx +65 -0
  155. package/src/media/mdx/TextareaAutosize/wikiMdxTextareaAutosize.ts +19 -0
  156. package/src/media/mdx/Tooltip/event.tooltip.en.mdx +7 -0
  157. package/src/media/mdx/Tooltip/event.tooltip.ru.mdx +8 -0
  158. package/src/media/mdx/Tooltip/slot.control.en.mdx +14 -0
  159. package/src/media/mdx/Tooltip/slot.control.ru.mdx +14 -0
  160. package/src/media/mdx/Tooltip/tooltip.en.mdx +34 -0
  161. package/src/media/mdx/Tooltip/tooltip.ru.mdx +34 -0
  162. package/src/media/mdx/Tooltip/wikiMdxTooltip.ts +31 -0
  163. package/src/media/mdx/Window/classes.ru.mdx +1 -1
  164. package/src/media/mdx/event/events.actions.en.mdx +44 -0
  165. package/src/media/mdx/event/events.actions.ru.mdx +44 -0
  166. package/src/media/mdx/event/events.inputStandard.en.mdx +6 -0
  167. package/src/media/mdx/event/events.inputStandard.ru.mdx +6 -0
  168. package/src/media/mdx/event/wikiMdxEvent.ts +20 -8
  169. package/src/media/mdx/expose/expose.descriptionId.en.mdx +6 -0
  170. package/src/media/mdx/expose/expose.descriptionId.ru.mdx +6 -0
  171. package/src/media/mdx/expose/expose.id.en.mdx +6 -0
  172. package/src/media/mdx/expose/expose.id.ru.mdx +6 -0
  173. package/src/media/mdx/expose/expose.labelId.en.mdx +6 -0
  174. package/src/media/mdx/expose/expose.labelId.ru.mdx +6 -0
  175. package/src/media/mdx/expose/wikiMdxExpose.ts +18 -0
  176. package/src/media/mdx/slot/body.en.mdx +6 -0
  177. package/src/media/mdx/slot/body.ru.mdx +6 -0
  178. package/src/media/mdx/slot/headline.en.mdx +7 -0
  179. package/src/media/mdx/slot/headline.ru.mdx +6 -0
  180. package/src/media/mdx/slot/leading.en.mdx +7 -0
  181. package/src/media/mdx/slot/leading.ru.mdx +7 -0
  182. package/src/media/mdx/slot/secondary.en.mdx +5 -0
  183. package/src/media/mdx/slot/secondary.ru.mdx +5 -0
  184. package/src/media/mdx/slot/trailing.en.mdx +7 -0
  185. package/src/media/mdx/slot/trailing.ru.mdx +7 -0
  186. package/src/media/mdx/slot/wikiMdxSlot.ts +30 -0
  187. package/src/media/mdx/style/isSkeleton.en.mdx +2 -2
  188. package/src/media/mdx/style/isSkeleton.ru.mdx +2 -2
  189. package/src/media/mdx/value/v-model-selected.en.mdx +28 -0
  190. package/src/media/mdx/value/v-model-selected.ru.mdx +28 -0
  191. package/src/media/mdx/value/v-model.en.mdx +26 -0
  192. package/src/media/mdx/value/v-model.ru.mdx +26 -0
  193. package/src/media/mdx/value/wikiMdxValue.ts +24 -3
  194. package/src/media/mdx/wikiMdx.ts +29 -1
  195. package/src/media/props/wiki.ts +42 -0
  196. package/src/media/props/wikiActions.ts +43 -0
  197. package/src/media/props/wikiActionsInclude.ts +62 -0
  198. package/src/media/props/wikiAnchor.ts +84 -0
  199. package/src/media/props/wikiAria.ts +102 -0
  200. package/src/media/props/wikiArrow.ts +24 -0
  201. package/src/media/props/wikiArrowInclude.ts +45 -0
  202. package/src/media/props/wikiBarsInclude.ts +80 -0
  203. package/src/media/props/wikiChipGroup.ts +39 -0
  204. package/src/media/props/wikiDialog.ts +34 -0
  205. package/src/media/props/wikiField.ts +0 -21
  206. package/src/media/props/wikiFieldCounterInclude.ts +78 -0
  207. package/src/media/props/wikiForm.ts +248 -0
  208. package/src/media/props/wikiHook.ts +20 -0
  209. package/src/media/props/wikiIcon.ts +3 -3
  210. package/src/media/props/wikiIconInclude.ts +319 -0
  211. package/src/media/props/wikiImage.ts +71 -19
  212. package/src/media/props/wikiInformation.ts +160 -0
  213. package/src/media/props/wikiInput.ts +34 -0
  214. package/src/media/props/wikiListItem.ts +20 -0
  215. package/src/media/props/wikiMask.ts +0 -10
  216. package/src/media/props/wikiMaskInclude.ts +54 -0
  217. package/src/media/props/wikiMenu.ts +0 -10
  218. package/src/media/props/wikiMotionTransform.ts +0 -10
  219. package/src/media/props/wikiOption.ts +113 -0
  220. package/src/media/props/wikiSelect.ts +68 -0
  221. package/src/media/props/wikiSelectValue.ts +30 -0
  222. package/src/media/props/wikiStatus.ts +29 -41
  223. package/src/media/props/wikiStyle.ts +154 -243
  224. package/src/media/props/wikiTechnical.ts +65 -0
  225. package/src/media/props/wikiText.ts +57 -0
  226. package/src/media/props/wikiTooltip.ts +53 -0
  227. package/src/media/props/wikiValue.ts +14 -203
  228. package/src/media/props/wikiWindow.ts +0 -31
  229. package/src/styles/storybookStyle.scss +3 -1
  230. package/src/types/storybookTypes.ts +26 -4
@@ -0,0 +1,40 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/functional/ru/Reactive'/>
4
+
5
+ # Реактивные утилиты
6
+
7
+ Набор функций для работы с реактивностью Vue.js.
8
+
9
+ ## `computedAsync`
10
+
11
+ Создаёт вычисляемое свойство Vue, которое может обрабатывать асинхронные геттеры.
12
+
13
+ **Параметры:**
14
+ - `getter: (() => Promise<R>) | (() => R) | R` — асинхронная функция, синхронная функция или прямое значение для вычисления результата
15
+ - `debugOptions?: DebuggerOptions` — опции отладки для реактивных вычислений (поддерживается библиотекой Vue.js)
16
+
17
+ ```javascript
18
+ import { computedAsync } from '@dxtmisha/functional'
19
+
20
+ // С асинхронной функцией
21
+ const userData = computedAsync(async () => {
22
+ const response = await fetch('/api/user')
23
+ return response.json()
24
+ })
25
+
26
+ // С синхронной функцией
27
+ const doubled = computedAsync(() => value.value * 2)
28
+
29
+ // С прямым значением
30
+ const staticValue = computedAsync('Hello World')
31
+
32
+ // С опциями отладки
33
+ const debugged = computedAsync(
34
+ async () => await fetchData(),
35
+ {
36
+ onTrack: (e) => console.log('tracked:', e),
37
+ onTrigger: (e) => console.log('triggered:', e)
38
+ }
39
+ )
40
+ ```
@@ -168,9 +168,9 @@ export function useCounter(initialValue: RefOrNormal<number> = 0) {
168
168
  }
169
169
  ```
170
170
 
171
- ### Компоне��т с гибкими props
171
+ ### Компонент с гибкими props
172
172
 
173
- ```vue
173
+ ```html
174
174
  <template>
175
175
  <div class="flexible-component">
176
176
  <h2>{{ resolvedTitle }}</h2>
@@ -35,7 +35,7 @@ const { data, loading, isStarting, reading } = useApiRef('/api/users')
35
35
 
36
36
  ### Использование в компоненте
37
37
 
38
- ```vue
38
+ ```html
39
39
  <script setup>
40
40
  import { useApiRef } from '@dxtmisha/functional'
41
41
 
@@ -248,7 +248,7 @@ await reset()
248
248
 
249
249
  ### Список с фильтрами
250
250
 
251
- ```vue
251
+ ```html
252
252
  <script setup>
253
253
  import { ref, computed } from 'vue'
254
254
  import { useApiRef } from '@dxtmisha/functional'
@@ -289,7 +289,7 @@ const handleSearch = (query) => {
289
289
 
290
290
  ### Условная загрузка
291
291
 
292
- ```vue
292
+ ```html
293
293
  <script setup>
294
294
  import { ref } from 'vue'
295
295
  import { useApiRef } from '@dxtmisha/functional'
@@ -324,7 +324,7 @@ const toggleDetails = () => {
324
324
 
325
325
  ### POST запрос с трансформацией
326
326
 
327
- ```vue
327
+ ```html
328
328
  <script setup>
329
329
  import { ref } from 'vue'
330
330
  import { useApiRef } from '@dxtmisha/functional'
@@ -376,7 +376,7 @@ const handleSubmit = async () => {
376
376
 
377
377
  ### Множественные запросы
378
378
 
379
- ```vue
379
+ ```html
380
380
  <script setup>
381
381
  import { useApiRef } from '@dxtmisha/functional'
382
382
 
@@ -0,0 +1,431 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/functional/ru/Composables/useMeta'/>
4
+
5
+ # Композабл useMeta
6
+
7
+ Композабл для управления мета-тегами страницы в Vue 3 приложениях. Предоставляет реактивный интерфейс для работы с SEO-тегами, Open Graph и Twitter Card с автоматической синхронизацией DOM. Использует паттерн singleton — все компоненты работают с единым состоянием мета-тегов.
8
+
9
+ ## Основные возможности
10
+
11
+ - **Реактивное управление мета-тегами** — автоматическое обновление DOM при изменении значений
12
+ - **Singleton паттерн** — единое состояние мета-тегов для всего приложения
13
+ - **SEO поддержка** — управление title, description, keywords, canonical, robots, author
14
+ - **Open Graph** — полная поддержка Open Graph протокола для социальных сетей
15
+ - **Twitter Card** — интеграция Twitter Card для оптимального отображения в Twitter
16
+ - **SSR поддержка** — генерация HTML строки для серверного рендеринга
17
+ - **TypeScript поддержка** — полная типизация всех свойств и методов
18
+
19
+ ## Базовое использование
20
+
21
+ ### Простое управление мета-тегами
22
+
23
+ ```javascript
24
+ import { useMeta } from '@dxtmisha/functional'
25
+
26
+ // Получаем реактивные refs для управления мета-тегами
27
+ const { title, description, keyword } = useMeta()
28
+
29
+ // Устанавливаем значения
30
+ title.value = 'Главная страница'
31
+ description.value = 'Описание главной страницы сайта'
32
+ keyword.value = 'ключевые, слова, сайта'
33
+ ```
34
+
35
+ ### Использование в компоненте
36
+
37
+ ```html
38
+ <script setup>
39
+ import { useMeta } from '@dxtmisha/functional'
40
+ import { onMounted } from 'vue'
41
+
42
+ const { title, description, image, canonical } = useMeta()
43
+
44
+ onMounted(() => {
45
+ title.value = 'О компании'
46
+ description.value = 'Узнайте больше о нашей компании'
47
+ image.value = 'https://example.com/about-image.jpg'
48
+ canonical.value = 'https://example.com/about'
49
+ })
50
+ </script>
51
+
52
+ <template>
53
+ <div>
54
+ <h1>О компании</h1>
55
+ <p>Контент страницы...</p>
56
+ </div>
57
+ </template>
58
+ ```
59
+
60
+ ## Возвращаемые значения
61
+
62
+ ### `meta`
63
+
64
+ Экземпляр класса Meta для расширенных операций.
65
+
66
+ **Тип:** `Meta`
67
+
68
+ ```javascript
69
+ const { meta } = useMeta()
70
+
71
+ // Доступ к расширенным методам
72
+ meta.setLocale('ru_RU')
73
+ meta.setSuffix('Мой Сайт')
74
+
75
+ // Получение дочерних классов для детальной настройки
76
+ const og = meta.getOg()
77
+ const twitter = meta.getTwitter()
78
+ ```
79
+
80
+ ### `title`
81
+
82
+ Реактивный заголовок страницы (без суффикса).
83
+
84
+ **Тип:** `Ref<string>`
85
+
86
+ ```javascript
87
+ const { title } = useMeta()
88
+
89
+ title.value = 'Новый заголовок'
90
+ // Автоматически обновляет:
91
+ // - document.title (с суффиксом, если установлен)
92
+ // - Open Graph og:title
93
+ // - Twitter Card twitter:title
94
+ ```
95
+
96
+ ### `keyword`
97
+
98
+ Реактивный мета-тег keywords.
99
+
100
+ **Тип:** `Ref<string>`
101
+
102
+ ```javascript
103
+ const { keyword } = useMeta()
104
+
105
+ keyword.value = 'vue, композабл, мета-теги, seo'
106
+ // Обновляет <meta name="keywords" content="...">
107
+ ```
108
+
109
+ ### `description`
110
+
111
+ Реактивный мета-тег description.
112
+
113
+ **Тип:** `Ref<string>`
114
+
115
+ ```javascript
116
+ const { description } = useMeta()
117
+
118
+ description.value = 'Полное описание страницы для поисковых систем'
119
+ // Обновляет <meta name="description" content="...">
120
+ ```
121
+
122
+ ### `image`
123
+
124
+ Реактивный URL изображения для Open Graph и Twitter Card.
125
+
126
+ **Тип:** `Ref<string>`
127
+
128
+ ```javascript
129
+ const { image } = useMeta()
130
+
131
+ image.value = 'https://example.com/preview.jpg'
132
+ // Автоматически обновляет:
133
+ // - Open Graph og:image
134
+ // - Twitter Card twitter:image
135
+ ```
136
+
137
+ ### `canonical`
138
+
139
+ Реактивный канонический URL.
140
+
141
+ **Тип:** `Ref<string>`
142
+
143
+ ```javascript
144
+ const { canonical } = useMeta()
145
+
146
+ canonical.value = 'https://example.com/page'
147
+ // Автоматически обновляет:
148
+ // - <link rel="canonical" href="...">
149
+ // - Open Graph og:url
150
+ // - Twitter Card twitter:url
151
+ ```
152
+
153
+ ### `robots`
154
+
155
+ Реактивная директива мета-тега robots.
156
+
157
+ **Тип:** `Ref<MetaRobots>`
158
+
159
+ ```javascript
160
+ const { robots } = useMeta()
161
+
162
+ robots.value = 'index, follow'
163
+ // Другие варианты: 'noindex', 'nofollow', 'noindex, nofollow'
164
+ // Обновляет <meta name="robots" content="...">
165
+ ```
166
+
167
+ ### `author`
168
+
169
+ Реактивный мета-тег author.
170
+
171
+ **Тип:** `Ref<string>`
172
+
173
+ ```javascript
174
+ const { author } = useMeta()
175
+
176
+ author.value = 'Иван Иванов'
177
+ // Обновляет <meta name="author" content="...">
178
+ ```
179
+
180
+ ### `siteName`
181
+
182
+ Реактивное название сайта для Open Graph и Twitter Card.
183
+
184
+ **Тип:** `Ref<string>`
185
+
186
+ ```javascript
187
+ const { siteName } = useMeta()
188
+
189
+ siteName.value = 'Мой Сайт'
190
+ // Автоматически обновляет:
191
+ // - Open Graph og:site_name
192
+ // - Twitter Card twitter:site
193
+ ```
194
+
195
+ ### `getHtmlMeta`
196
+
197
+ Функция для генерации HTML строки со всеми мета-тегами (для SSR).
198
+
199
+ **Тип:** `() => string`
200
+
201
+ ```javascript
202
+ const { getHtmlMeta } = useMeta()
203
+
204
+ // Генерирует HTML строку со всеми мета-тегами
205
+ const metaHtml = getHtmlMeta()
206
+ // Возвращает: '<meta name="description" content="..."><meta property="og:title" content="...">...'
207
+ ```
208
+
209
+ ## Примеры использования
210
+
211
+ ### Динамические мета-теги на основе данных
212
+
213
+ ```html
214
+ <script setup>
215
+ import { ref, watch } from 'vue'
216
+ import { useMeta } from '@dxtmisha/functional'
217
+ import { useApiRef } from '@dxtmisha/functional'
218
+
219
+ const articleId = ref(1)
220
+ const { data: article } = useApiRef(
221
+ computed(() => `/api/articles/${articleId.value}`)
222
+ )
223
+
224
+ const { title, description, image, author, canonical } = useMeta()
225
+
226
+ watch(article, (newArticle) => {
227
+ if (newArticle) {
228
+ title.value = newArticle.title
229
+ description.value = newArticle.excerpt
230
+ image.value = newArticle.coverImage
231
+ author.value = newArticle.authorName
232
+ canonical.value = `https://example.com/articles/${newArticle.slug}`
233
+ }
234
+ })
235
+ </script>
236
+
237
+ <template>
238
+ <article v-if="article">
239
+ <h1>{{ article.title }}</h1>
240
+ <p>{{ article.content }}</p>
241
+ </article>
242
+ </template>
243
+ ```
244
+
245
+ ### Настройка мета-тегов для разных страниц
246
+
247
+ ```html
248
+ <script setup>
249
+ import { useMeta } from '@dxtmisha/functional'
250
+ import { useRoute } from 'vue-router'
251
+ import { watch } from 'vue'
252
+
253
+ const route = useRoute()
254
+ const { title, description, robots } = useMeta()
255
+
256
+ const pageMetadata = {
257
+ home: {
258
+ title: 'Главная страница',
259
+ description: 'Добро пожаловать на наш сайт',
260
+ robots: 'index, follow'
261
+ },
262
+ about: {
263
+ title: 'О компании',
264
+ description: 'Узнайте больше о нашей компании',
265
+ robots: 'index, follow'
266
+ },
267
+ admin: {
268
+ title: 'Админ панель',
269
+ description: 'Панель администратора',
270
+ robots: 'noindex, nofollow'
271
+ }
272
+ }
273
+
274
+ watch(
275
+ () => route.name,
276
+ (routeName) => {
277
+ const meta = pageMetadata[routeName] || pageMetadata.home
278
+ title.value = meta.title
279
+ description.value = meta.description
280
+ robots.value = meta.robots
281
+ },
282
+ { immediate: true }
283
+ )
284
+ </script>
285
+ ```
286
+
287
+ ### Расширенная настройка с Open Graph и Twitter Card
288
+
289
+ ```html
290
+ <script setup>
291
+ import { useMeta } from '@dxtmisha/functional'
292
+ import { onMounted } from 'vue'
293
+
294
+ const { meta, title, description, image, siteName } = useMeta()
295
+
296
+ onMounted(() => {
297
+ // Основные мета-теги
298
+ title.value = 'Название статьи'
299
+ description.value = 'Краткое описание статьи'
300
+ image.value = 'https://example.com/article-image.jpg'
301
+ siteName.value = 'Мой Блог'
302
+
303
+ // Расширенные настройки
304
+ meta.setSuffix('Мой Блог')
305
+ meta.setLocale('ru_RU')
306
+
307
+ // Детальная настройка Open Graph
308
+ const og = meta.getOg()
309
+ og.setType('article')
310
+
311
+ // Детальная настройка Twitter Card
312
+ const twitter = meta.getTwitter()
313
+ twitter.setCard('summary_large_image')
314
+ })
315
+ </script>
316
+ ```
317
+
318
+ ### SSR: Генерация мета-тегов на сервере
319
+
320
+ ```javascript
321
+ // server.js
322
+ import { useMeta } from '@dxtmisha/functional'
323
+
324
+ export function renderMetaTags(pageData) {
325
+ const { title, description, image, canonical, getHtmlMeta } = useMeta()
326
+
327
+ // Устанавливаем значения
328
+ title.value = pageData.title
329
+ description.value = pageData.description
330
+ image.value = pageData.image
331
+ canonical.value = pageData.url
332
+
333
+ // Генерируем HTML строку
334
+ const metaHtml = getHtmlMeta()
335
+
336
+ return `
337
+ <!DOCTYPE html>
338
+ <html>
339
+ <head>
340
+ <title>${pageData.title}</title>
341
+ ${metaHtml}
342
+ </head>
343
+ <body>
344
+ <!-- контент -->
345
+ </body>
346
+ </html>
347
+ `
348
+ }
349
+ ```
350
+
351
+ ### Управление индексацией для разных окружений
352
+
353
+ ```html
354
+ <script setup>
355
+ import { useMeta } from '@dxtmisha/functional'
356
+ import { onMounted } from 'vue'
357
+
358
+ const { robots } = useMeta()
359
+
360
+ onMounted(() => {
361
+ // Запрещаем индексацию на dev/staging окружениях
362
+ const isProduction = import.meta.env.PROD
363
+ robots.value = isProduction ? 'index, follow' : 'noindex, nofollow'
364
+ })
365
+ </script>
366
+ ```
367
+
368
+ ### Интеграция с многоязычностью
369
+
370
+ ```html
371
+ <script setup>
372
+ import { useMeta } from '@dxtmisha/functional'
373
+ import { useI18n } from 'vue-i18n'
374
+ import { watch } from 'vue'
375
+
376
+ const { locale } = useI18n()
377
+ const { meta, title, description } = useMeta()
378
+
379
+ watch(locale, (newLocale) => {
380
+ // Обновляем локаль для Open Graph
381
+ const localeMap = {
382
+ 'ru': 'ru_RU',
383
+ 'en': 'en_US',
384
+ 'de': 'de_DE'
385
+ }
386
+ meta.setLocale(localeMap[newLocale] || 'en_US')
387
+
388
+ // Обновляем контент мета-тегов
389
+ title.value = t('meta.title')
390
+ description.value = t('meta.description')
391
+ }, { immediate: true })
392
+ </script>
393
+ ```
394
+
395
+ ## Важные замечания
396
+
397
+ ### Singleton паттерн
398
+
399
+ Композабл `useMeta` использует singleton паттерн, что означает, что все компоненты работают с единым экземпляром мета-тегов. Это полезно для:
400
+
401
+ - **Согласованности** — изменения в одном компоненте отражаются везде
402
+ - **Производительности** — нет дублирования экземпляров
403
+ - **Простоты** — не нужно передавать состояние между компонентами
404
+
405
+ ```javascript
406
+ // В любом компоненте приложения
407
+ const { title } = useMeta()
408
+ title.value = 'Новый заголовок'
409
+
410
+ // В другом компоненте получим то же значение
411
+ const { title: sameTitle } = useMeta()
412
+ console.log(sameTitle.value) // 'Новый заголовок'
413
+ ```
414
+
415
+ ### Автоматическая синхронизация
416
+
417
+ Все изменения реактивных свойств автоматически синхронизируются с DOM. Не нужно вызывать дополнительные методы:
418
+
419
+ ```javascript
420
+ const { title, description } = useMeta()
421
+
422
+ // Эти изменения сразу применяются в DOM
423
+ title.value = 'Новый заголовок'
424
+ description.value = 'Новое описание'
425
+ ```
426
+
427
+ ### Open Graph и Twitter Card
428
+
429
+ При изменении `title`, `image` и `canonical` автоматически обновляются соответствующие теги Open Graph и Twitter Card. Для детальной настройки используйте методы `meta.getOg()` и `meta.getTwitter()`.
430
+
431
+
@@ -69,6 +69,17 @@ isDifferent('hello', 'hello') // false
69
69
  isDifferent({a: 1}, {a: 1}) // true (разные ссылки)
70
70
  ```
71
71
 
72
+ ## `isDomData`
73
+
74
+ Проверяет, является ли текущая среда URL-адресом данных (data URL).
75
+
76
+ ```javascript
77
+ import { isDomData } from '@dxtmisha/functional'
78
+
79
+ isDomData() // true если location.href начинается с 'data:', иначе false
80
+ // Полезно для определения, работает ли код в iframe с data URL
81
+ ```
82
+
72
83
  ## `isDomRuntime`
73
84
 
74
85
  Проверяет, выполняется ли код в браузерной среде (есть ли DOM).
@@ -0,0 +1,59 @@
1
+ ## Description
2
+
3
+ Expandable container for organizing content with smooth opening and closing animations, simplifying information structuring in the interface.
4
+
5
+ Accordion allows creating expandable sections with automatic animations, interactive header, and state management via v-model. The component supports padding configuration, visual dividers, and content customization through slots.
6
+
7
+ **Key features:**
8
+
9
+ - Smooth expand and collapse animations
10
+ - Header with label, description, and icons
11
+ - State management via v-model:open
12
+ - Programmatic control (toggle, toOpen, toClose)
13
+ - Internal padding configuration (padding)
14
+ - Visual divider between sections
15
+ - Customization via head and default slots
16
+
17
+ **Common use cases:**
18
+
19
+ - FAQ sections
20
+ - Settings panels
21
+ - Product filters
22
+ - Information blocks
23
+ - Menus with subsections
24
+
25
+ ```html
26
+ <script setup>
27
+ import { ref } from 'vue'
28
+
29
+ const isOpen = ref(false)
30
+ </script>
31
+
32
+ <template>
33
+ <!-- Basic accordion -->
34
+ <Accordion label="Question 1">
35
+ <p>Answer to the question.</p>
36
+ </Accordion>
37
+
38
+ <!-- With state management -->
39
+ <Accordion
40
+ v-model:open="isOpen"
41
+ label="Settings"
42
+ icon="settings"
43
+ >
44
+ <p>Settings content.</p>
45
+ </Accordion>
46
+
47
+ <!-- With custom header -->
48
+ <Accordion>
49
+ <template #head>
50
+ <div>Custom header</div>
51
+ </template>
52
+ <template #default>
53
+ <p>Section content.</p>
54
+ </template>
55
+ </Accordion>
56
+ </template>
57
+ ```
58
+
59
+ > Accordion is a component for creating expandable sections with animation support, state management, and flexible customization.
@@ -0,0 +1,59 @@
1
+ ## Описание
2
+
3
+ Раскрывающийся контейнер для организации контента с плавными анимациями открытия и закрытия, упрощающий структурирование информации в интерфейсе.
4
+
5
+ Accordion позволяет создавать раскрывающиеся секции с автоматическими анимациями, интерактивным заголовком и возможностью управления через v-model. Компонент поддерживает настройку отступов, визуальных разделителей и кастомизацию содержимого через слоты.
6
+
7
+ **Основные возможности:**
8
+
9
+ - Плавные анимации раскрытия и сворачивания
10
+ - Заголовок с меткой, описанием и иконками
11
+ - Управление состоянием через v-model:open
12
+ - Программное управление (toggle, toOpen, toClose)
13
+ - Настройка внутренних отступов (padding)
14
+ - Визуальный разделитель между секциями
15
+ - Кастомизация через слоты head и default
16
+
17
+ **Типичные сценарии использования:**
18
+
19
+ - FAQ секции
20
+ - Панели настроек
21
+ - Фильтры товаров
22
+ - Информационные блоки
23
+ - Меню с подразделами
24
+
25
+ ```html
26
+ <script setup>
27
+ import { ref } from 'vue'
28
+
29
+ const isOpen = ref(false)
30
+ </script>
31
+
32
+ <template>
33
+ <!-- Базовый аккордеон -->
34
+ <Accordion label="Вопрос 1">
35
+ <p>Ответ на вопрос.</p>
36
+ </Accordion>
37
+
38
+ <!-- С управлением состоянием -->
39
+ <Accordion
40
+ v-model:open="isOpen"
41
+ label="Настройки"
42
+ icon="settings"
43
+ >
44
+ <p>Содержимое настроек.</p>
45
+ </Accordion>
46
+
47
+ <!-- С кастомным заголовком -->
48
+ <Accordion>
49
+ <template #head>
50
+ <div>Свой заголовок</div>
51
+ </template>
52
+ <template #default>
53
+ <p>Содержимое секции.</p>
54
+ </template>
55
+ </Accordion>
56
+ </template>
57
+ ```
58
+
59
+ > Accordion — компонент для создания раскрывающихся секций с поддержкой анимаций, управления состоянием и гибкой кастомизации.
@@ -0,0 +1,6 @@
1
+ ### `default`
2
+
3
+ Slot for placing the main accordion content that appears when the section is expanded.
4
+
5
+ **Parameters:**
6
+ - `props: MotionTransformControlItem` — object with state management data (isOpen, isShow, classes)
@@ -0,0 +1,6 @@
1
+ ### `default`
2
+
3
+ Слот для размещения основного содержимого аккордеона, которое появляется при раскрытии секции.
4
+
5
+ **Параметры:**
6
+ - `props: MotionTransformControlItem` — объект с данными управления состоянием (isOpen, isShow, classes)