@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/en/Reactive'/>
4
+
5
+ # Reactive Utilities
6
+
7
+ A set of functions for working with Vue.js reactivity.
8
+
9
+ ## `computedAsync`
10
+
11
+ Creates a Vue computed property that can handle asynchronous getters.
12
+
13
+ **Parameters:**
14
+ - `getter: (() => Promise<R>) | (() => R) | R` — asynchronous function, synchronous function, or direct value to compute the result
15
+ - `debugOptions?: DebuggerOptions` — debug options for reactive computations (supported by Vue.js library)
16
+
17
+ ```javascript
18
+ import { computedAsync } from '@dxtmisha/functional'
19
+
20
+ // With asynchronous function
21
+ const userData = computedAsync(async () => {
22
+ const response = await fetch('/api/user')
23
+ return response.json()
24
+ })
25
+
26
+ // With synchronous function
27
+ const doubled = computedAsync(() => value.value * 2)
28
+
29
+ // With direct value
30
+ const staticValue = computedAsync('Hello World')
31
+
32
+ // With debug options
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
+ ```
@@ -170,7 +170,7 @@ export function useCounter(initialValue: RefOrNormal<number> = 0) {
170
170
 
171
171
  ### Component with Flexible 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
  ### Component Usage
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
  ### List with Filters
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
  ### Conditional Loading
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 Request with Transformation
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
  ### Multiple Requests
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/en/Composables/useMeta'/>
4
+
5
+ # Composable useMeta
6
+
7
+ Composable for managing page meta tags in Vue 3 applications. Provides reactive interface for working with SEO tags, Open Graph, and Twitter Card with automatic DOM synchronization. Uses singleton pattern — all components share the same meta tags state.
8
+
9
+ ## Key Features
10
+
11
+ - **Reactive meta tag management** — automatic DOM updates when values change
12
+ - **Singleton pattern** — unified meta tags state for the entire application
13
+ - **SEO support** — manage title, description, keywords, canonical, robots, author
14
+ - **Open Graph** — full Open Graph protocol support for social networks
15
+ - **Twitter Card** — Twitter Card integration for optimal Twitter display
16
+ - **SSR support** — HTML string generation for server-side rendering
17
+ - **TypeScript support** — full typing of all properties and methods
18
+
19
+ ## Basic Usage
20
+
21
+ ### Simple Meta Tags Management
22
+
23
+ ```javascript
24
+ import { useMeta } from '@dxtmisha/functional'
25
+
26
+ // Get reactive refs for managing meta tags
27
+ const { title, description, keyword } = useMeta()
28
+
29
+ // Set values
30
+ title.value = 'Home Page'
31
+ description.value = 'Homepage description of the website'
32
+ keyword.value = 'keywords, of, the, website'
33
+ ```
34
+
35
+ ### Component Usage
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 = 'About Us'
46
+ description.value = 'Learn more about our company'
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>About Us</h1>
55
+ <p>Page content...</p>
56
+ </div>
57
+ </template>
58
+ ```
59
+
60
+ ## Return Values
61
+
62
+ ### `meta`
63
+
64
+ Instance of Meta class for advanced operations.
65
+
66
+ **Type:** `Meta`
67
+
68
+ ```javascript
69
+ const { meta } = useMeta()
70
+
71
+ // Access to advanced methods
72
+ meta.setLocale('en_US')
73
+ meta.setSuffix('My Site')
74
+
75
+ // Get child classes for detailed configuration
76
+ const og = meta.getOg()
77
+ const twitter = meta.getTwitter()
78
+ ```
79
+
80
+ ### `title`
81
+
82
+ Reactive page title (without suffix).
83
+
84
+ **Type:** `Ref<string>`
85
+
86
+ ```javascript
87
+ const { title } = useMeta()
88
+
89
+ title.value = 'New Title'
90
+ // Automatically updates:
91
+ // - document.title (with suffix if set)
92
+ // - Open Graph og:title
93
+ // - Twitter Card twitter:title
94
+ ```
95
+
96
+ ### `keyword`
97
+
98
+ Reactive keywords meta tag.
99
+
100
+ **Type:** `Ref<string>`
101
+
102
+ ```javascript
103
+ const { keyword } = useMeta()
104
+
105
+ keyword.value = 'vue, composable, meta tags, seo'
106
+ // Updates <meta name="keywords" content="...">
107
+ ```
108
+
109
+ ### `description`
110
+
111
+ Reactive description meta tag.
112
+
113
+ **Type:** `Ref<string>`
114
+
115
+ ```javascript
116
+ const { description } = useMeta()
117
+
118
+ description.value = 'Complete page description for search engines'
119
+ // Updates <meta name="description" content="...">
120
+ ```
121
+
122
+ ### `image`
123
+
124
+ Reactive image URL for Open Graph and Twitter Card.
125
+
126
+ **Type:** `Ref<string>`
127
+
128
+ ```javascript
129
+ const { image } = useMeta()
130
+
131
+ image.value = 'https://example.com/preview.jpg'
132
+ // Automatically updates:
133
+ // - Open Graph og:image
134
+ // - Twitter Card twitter:image
135
+ ```
136
+
137
+ ### `canonical`
138
+
139
+ Reactive canonical URL.
140
+
141
+ **Type:** `Ref<string>`
142
+
143
+ ```javascript
144
+ const { canonical } = useMeta()
145
+
146
+ canonical.value = 'https://example.com/page'
147
+ // Automatically updates:
148
+ // - <link rel="canonical" href="...">
149
+ // - Open Graph og:url
150
+ // - Twitter Card twitter:url
151
+ ```
152
+
153
+ ### `robots`
154
+
155
+ Reactive robots meta tag directive.
156
+
157
+ **Type:** `Ref<MetaRobots>`
158
+
159
+ ```javascript
160
+ const { robots } = useMeta()
161
+
162
+ robots.value = 'index, follow'
163
+ // Other options: 'noindex', 'nofollow', 'noindex, nofollow'
164
+ // Updates <meta name="robots" content="...">
165
+ ```
166
+
167
+ ### `author`
168
+
169
+ Reactive author meta tag.
170
+
171
+ **Type:** `Ref<string>`
172
+
173
+ ```javascript
174
+ const { author } = useMeta()
175
+
176
+ author.value = 'John Doe'
177
+ // Updates <meta name="author" content="...">
178
+ ```
179
+
180
+ ### `siteName`
181
+
182
+ Reactive site name for Open Graph and Twitter Card.
183
+
184
+ **Type:** `Ref<string>`
185
+
186
+ ```javascript
187
+ const { siteName } = useMeta()
188
+
189
+ siteName.value = 'My Site'
190
+ // Automatically updates:
191
+ // - Open Graph og:site_name
192
+ // - Twitter Card twitter:site
193
+ ```
194
+
195
+ ### `getHtmlMeta`
196
+
197
+ Function to generate HTML string with all meta tags (for SSR).
198
+
199
+ **Type:** `() => string`
200
+
201
+ ```javascript
202
+ const { getHtmlMeta } = useMeta()
203
+
204
+ // Generates HTML string with all meta tags
205
+ const metaHtml = getHtmlMeta()
206
+ // Returns: '<meta name="description" content="..."><meta property="og:title" content="...">...'
207
+ ```
208
+
209
+ ## Usage Examples
210
+
211
+ ### Dynamic Meta Tags Based on Data
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
+ ### Configure Meta Tags for Different Pages
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: 'Home Page',
259
+ description: 'Welcome to our website',
260
+ robots: 'index, follow'
261
+ },
262
+ about: {
263
+ title: 'About Us',
264
+ description: 'Learn more about our company',
265
+ robots: 'index, follow'
266
+ },
267
+ admin: {
268
+ title: 'Admin Panel',
269
+ description: 'Administrator panel',
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
+ ### Advanced Configuration with Open Graph and 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
+ // Basic meta tags
298
+ title.value = 'Article Title'
299
+ description.value = 'Brief article description'
300
+ image.value = 'https://example.com/article-image.jpg'
301
+ siteName.value = 'My Blog'
302
+
303
+ // Advanced settings
304
+ meta.setSuffix('My Blog')
305
+ meta.setLocale('en_US')
306
+
307
+ // Detailed Open Graph configuration
308
+ const og = meta.getOg()
309
+ og.setType('article')
310
+
311
+ // Detailed Twitter Card configuration
312
+ const twitter = meta.getTwitter()
313
+ twitter.setCard('summary_large_image')
314
+ })
315
+ </script>
316
+ ```
317
+
318
+ ### SSR: Generate Meta Tags on Server
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
+ // Set values
328
+ title.value = pageData.title
329
+ description.value = pageData.description
330
+ image.value = pageData.image
331
+ canonical.value = pageData.url
332
+
333
+ // Generate HTML string
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
+ <!-- content -->
345
+ </body>
346
+ </html>
347
+ `
348
+ }
349
+ ```
350
+
351
+ ### Manage Indexing for Different Environments
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
+ // Disable indexing on dev/staging environments
362
+ const isProduction = import.meta.env.PROD
363
+ robots.value = isProduction ? 'index, follow' : 'noindex, nofollow'
364
+ })
365
+ </script>
366
+ ```
367
+
368
+ ### Integration with Internationalization
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
+ // Update locale for 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
+ // Update meta tag content
389
+ title.value = t('meta.title')
390
+ description.value = t('meta.description')
391
+ }, { immediate: true })
392
+ </script>
393
+ ```
394
+
395
+ ## Important Notes
396
+
397
+ ### Singleton Pattern
398
+
399
+ The `useMeta` composable uses a singleton pattern, which means all components share a single meta tags instance. This is useful for:
400
+
401
+ - **Consistency** — changes in one component are reflected everywhere
402
+ - **Performance** — no instance duplication
403
+ - **Simplicity** — no need to pass state between components
404
+
405
+ ```javascript
406
+ // In any application component
407
+ const { title } = useMeta()
408
+ title.value = 'New Title'
409
+
410
+ // In another component, you'll get the same value
411
+ const { title: sameTitle } = useMeta()
412
+ console.log(sameTitle.value) // 'New Title'
413
+ ```
414
+
415
+ ### Automatic Synchronization
416
+
417
+ All reactive property changes are automatically synchronized with the DOM. No need to call additional methods:
418
+
419
+ ```javascript
420
+ const { title, description } = useMeta()
421
+
422
+ // These changes are immediately applied to the DOM
423
+ title.value = 'New Title'
424
+ description.value = 'New Description'
425
+ ```
426
+
427
+ ### Open Graph and Twitter Card
428
+
429
+ When changing `title`, `image`, and `canonical`, the corresponding Open Graph and Twitter Card tags are automatically updated. For detailed configuration, use `meta.getOg()` and `meta.getTwitter()` methods.
430
+
431
+
@@ -69,6 +69,17 @@ isDifferent('hello', 'hello') // false
69
69
  isDifferent({a: 1}, {a: 1}) // true (different references)
70
70
  ```
71
71
 
72
+ ## `isDomData`
73
+
74
+ Checks if the current environment is a data URL.
75
+
76
+ ```javascript
77
+ import { isDomData } from '@dxtmisha/functional'
78
+
79
+ isDomData() // true if location.href starts with 'data:', otherwise false
80
+ // Useful for detecting if code is running in iframe with data URL
81
+ ```
82
+
72
83
  ## `isDomRuntime`
73
84
 
74
85
  Checks if code is running in browser environment (DOM exists).
@@ -45,6 +45,42 @@ applyTemplate('Это [bold]жирный текст[/bold]', { bold: '<b>[conten
45
45
  applyTemplate('Text with [red]colored[/red] word', { red: '<span style="color:red">[content]</span>' })
46
46
  ```
47
47
 
48
+ ## `blobToBase64`
49
+
50
+ Преобразует Blob в строку Base64 (data URL).
51
+
52
+ **Параметры:**
53
+ - `blob: Blob` — Blob объект для преобразования
54
+
55
+ ```javascript
56
+ import { blobToBase64 } from '@dxtmisha/functional'
57
+
58
+ const blob = new Blob(['Hello World'], { type: 'text/plain' })
59
+ const base64 = await blobToBase64(blob)
60
+ // 'data:text/plain;base64,SGVsbG8gV29ybGQ='
61
+
62
+ // Использование с изображением
63
+ const imageBlob = new Blob([imageData], { type: 'image/png' })
64
+ const imageBase64 = await blobToBase64(imageBlob)
65
+ // 'data:image/png;base64,iVBORw0KGgo...'
66
+ ```
67
+
68
+
69
+ ## `encodeAttribute`
70
+
71
+ Кодирует специальные символы в строке для безопасного использования в HTML-атрибутах. Преобразует символы `&`, `<`, `>`, `"`, `'` в соответствующие HTML-сущности для предотвращения XSS-атак и корректного отображения.
72
+
73
+ **Параметры:**
74
+ - `text: string` — текст для кодирования
75
+
76
+ ```javascript
77
+ import { encodeAttribute } from '@dxtmisha/functional'
78
+
79
+ encodeAttribute('Hello & "World"') // 'Hello &amp; &quot;World&quot;'
80
+ encodeAttribute('<script>alert("XSS")</script>') // '&lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;'
81
+ encodeAttribute("It's a test") // 'It&#39;s a test'
82
+ ```
83
+
48
84
  ## `replaceRecursive`
49
85
 
50
86
  Рекурсивно заменяет значения в объекте или массиве.
@@ -78,6 +114,37 @@ replaceTemplate('User [id]: [name]', {id: '123', name: 'John'}) // 'User 123: Jo
78
114
  replaceTemplate('Time: [time]', {time: () => new Date().toLocaleString()}) // с функцией
79
115
  ```
80
116
 
117
+ ## `resizeImageByMax`
118
+
119
+ Изменяет размер изображения, чтобы оно соответствовало ограничению максимального размера.
120
+
121
+ **Параметры:**
122
+ - `image: HTMLImageElement | string` — элемент изображения или URL
123
+ - `maxSize: number` — максимальный размер ширины или высоты
124
+ - `type: 'auto' | 'width' | 'height'` — тип изменения размера (по умолчанию 'auto')
125
+ - `typeData?: string` — тип данных результирующего изображения (например, 'image/png', 'image/jpeg')
126
+
127
+ ```javascript
128
+ import { resizeImageByMax } from '@dxtmisha/functional'
129
+
130
+ // Автоматическое масштабирование (по большей стороне)
131
+ const image = document.querySelector('img')
132
+ const resized = resizeImageByMax(image, 800) // data URL
133
+ // Изображение 1200x800 станет 800x533
134
+
135
+ // Масштабирование по ширине
136
+ resizeImageByMax(image, 600, 'width')
137
+ // Ширина будет 600px, высота пропорциональна
138
+
139
+ // Масштабирование по высоте
140
+ resizeImageByMax(image, 400, 'height')
141
+ // Высота будет 400px, ширина пропорциональна
142
+
143
+ // С указанием типа данных
144
+ resizeImageByMax(image, 1024, 'auto', 'image/jpeg')
145
+ // Возвращает JPEG data URL
146
+ ```
147
+
81
148
  ## `secondToTime`
82
149
 
83
150
  Преобразует секунды в формат времени (часы:минуты:секунды).
@@ -37,6 +37,31 @@ const copy = copyObject(original)
37
37
  copy.data.age = 25 // original.data.age остается 30
38
38
  ```
39
39
 
40
+ ## `copyObjectLite`
41
+
42
+ Создает поверхностную копию простого объекта. Если передан параметр `source`, создаёт новый объект и объединяет `value` и `source`.
43
+
44
+ **Параметры:**
45
+ - `value: T` — объект для копирования
46
+ - `source?: any` — дополнительные свойства для копирования (опционально)
47
+
48
+ ```javascript
49
+ import { copyObjectLite } from '@dxtmisha/functional'
50
+
51
+ const original = { name: 'John', age: 30 }
52
+ const copy = copyObjectLite(original) // { name: 'John', age: 30 }
53
+
54
+ // С дополнительными свойствами
55
+ const extended = copyObjectLite(original, { city: 'Moscow' })
56
+ // { name: 'John', age: 30, city: 'Moscow' }
57
+
58
+ // Переопределение свойств
59
+ const overridden = copyObjectLite(original, { age: 25 })
60
+ // { name: 'John', age: 25 }
61
+ ```
62
+
63
+ **Примечание:** Это поверхностная копия — вложенные объекты сохраняют ссылки на исходные. Для глубокого клонирования используйте `copyObject`, `structuredClone` или `_.cloneDeep`.
64
+
40
65
  ## `forEach`
41
66
 
42
67
  Универсальная функция итерации для массивов, объектов и Map.
@@ -68,7 +68,7 @@ const staticDatetime = new DatetimeRef('2024-01-15', 'date', 'ru-RU')
68
68
 
69
69
  ```javascript
70
70
  const yearValue = datetime.getYear()
71
- // Автоматически обновляется при изменении д��ты
71
+ // Автоматически обновляется при изменении даты
72
72
  ```
73
73
 
74
74
  ### `getMonth`
@@ -228,7 +228,7 @@ const withoutTz = datetime.standard(false)
228
228
 
229
229
  ### Vue компонент с реактивной датой
230
230
 
231
- ```vue
231
+ ```html
232
232
  <template>
233
233
  <div>
234
234
  <span>{{ datetime.getYear() }}/{{ datetime.getMonth() + 1 }}/{{ datetime.getDay() }}</span>
@@ -259,7 +259,7 @@ const eventRef = new EventRef(buttonRef, containerRef, 'click')
259
259
 
260
260
  ### Vue компонент с реактивными событиями
261
261
 
262
- ```vue
262
+ ```html
263
263
  <template>
264
264
  <button ref="buttonEl">Нажми меня</button>
265
265
  <input ref="inputEl" placeholder="Введите...">