@dxtmisha/wiki 0.24.3 → 0.39.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 (278) hide show
  1. package/package.json +8 -8
  2. package/src/classes/WikiStorybook.ts +92 -1
  3. package/src/classes/WikiStorybookItem.ts +79 -5
  4. package/src/classes/WikiStorybookProp.ts +109 -0
  5. package/src/library.ts +1 -0
  6. package/src/media/descriptions/wikiDescriptions.ts +32 -0
  7. package/src/media/descriptions/wikiDescriptionsAccordion.ts +204 -0
  8. package/src/media/descriptions/wikiDescriptionsActionSheet.ts +264 -0
  9. package/src/media/descriptions/wikiDescriptionsActions.ts +189 -0
  10. package/src/media/descriptions/wikiDescriptionsAnchor.ts +78 -0
  11. package/src/media/descriptions/wikiDescriptionsArrow.ts +214 -0
  12. package/src/media/descriptions/wikiDescriptionsBadge.ts +43 -0
  13. package/src/media/descriptions/wikiDescriptionsBars.ts +33 -0
  14. package/src/media/descriptions/wikiDescriptionsBlock.ts +159 -0
  15. package/src/media/descriptions/wikiDescriptionsButton.ts +32 -1
  16. package/src/media/descriptions/wikiDescriptionsCell.ts +26 -1
  17. package/src/media/descriptions/wikiDescriptionsChip.ts +42 -0
  18. package/src/media/descriptions/wikiDescriptionsChipGroup.ts +199 -0
  19. package/src/media/descriptions/wikiDescriptionsDialog.ts +226 -0
  20. package/src/media/descriptions/wikiDescriptionsField.ts +57 -2
  21. package/src/media/descriptions/wikiDescriptionsFieldCounter.ts +32 -0
  22. package/src/media/descriptions/wikiDescriptionsFieldLabel.ts +22 -0
  23. package/src/media/descriptions/wikiDescriptionsFieldMessage.ts +25 -0
  24. package/src/media/descriptions/wikiDescriptionsIcon.ts +46 -8
  25. package/src/media/descriptions/wikiDescriptionsImage.ts +91 -7
  26. package/src/media/descriptions/wikiDescriptionsInput.ts +313 -0
  27. package/src/media/descriptions/wikiDescriptionsList.ts +31 -0
  28. package/src/media/descriptions/wikiDescriptionsListGroup.ts +57 -0
  29. package/src/media/descriptions/wikiDescriptionsListItem.ts +42 -0
  30. package/src/media/descriptions/wikiDescriptionsListMenu.ts +41 -0
  31. package/src/media/descriptions/wikiDescriptionsMask.ts +42 -0
  32. package/src/media/descriptions/wikiDescriptionsMenu.ts +179 -0
  33. package/src/media/descriptions/wikiDescriptionsModal.ts +200 -0
  34. package/src/media/descriptions/wikiDescriptionsMotionTransform.ts +59 -6
  35. package/src/media/descriptions/wikiDescriptionsPage.ts +155 -0
  36. package/src/media/descriptions/wikiDescriptionsProgress.ts +39 -0
  37. package/src/media/descriptions/wikiDescriptionsRipple.ts +42 -3
  38. package/src/media/descriptions/wikiDescriptionsScrollbar.ts +48 -0
  39. package/src/media/descriptions/wikiDescriptionsSection.ts +152 -0
  40. package/src/media/descriptions/wikiDescriptionsSelect.ts +253 -0
  41. package/src/media/descriptions/wikiDescriptionsSelectValue.ts +107 -0
  42. package/src/media/descriptions/wikiDescriptionsSkeleton.ts +42 -1
  43. package/src/media/descriptions/wikiDescriptionsTextareaAutosize.ts +80 -0
  44. package/src/media/descriptions/wikiDescriptionsTooltip.ts +136 -0
  45. package/src/media/descriptions/wikiDescriptionsWindow.ts +60 -0
  46. package/src/media/functional/en/conversions.mdx +67 -0
  47. package/src/media/functional/en/dataUtils.mdx +25 -0
  48. package/src/media/functional/en/datetimeRef.mdx +1 -1
  49. package/src/media/functional/en/eventRef.mdx +1 -1
  50. package/src/media/functional/en/executionUtils.mdx +58 -0
  51. package/src/media/functional/en/geoFlagRef.mdx +1 -1
  52. package/src/media/functional/en/geoIntlRef.mdx +1 -1
  53. package/src/media/functional/en/geoRef.mdx +2 -2
  54. package/src/media/functional/en/meta.mdx +1206 -0
  55. package/src/media/functional/en/metaManager.mdx +376 -0
  56. package/src/media/functional/en/metaOg.mdx +694 -0
  57. package/src/media/functional/en/metaTwitter.mdx +853 -0
  58. package/src/media/functional/en/reactive.mdx +40 -0
  59. package/src/media/functional/en/refTypes.mdx +1 -1
  60. package/src/media/functional/en/useApiRef.mdx +5 -5
  61. package/src/media/functional/en/useMeta.mdx +431 -0
  62. package/src/media/functional/en/validationUtils.mdx +11 -0
  63. package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.en.mdx +25 -0
  64. package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.ru.mdx +25 -0
  65. package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.vi.mdx +25 -0
  66. package/src/media/functional/functional-basic/functions/isEnter/isEnter.en.mdx +30 -0
  67. package/src/media/functional/functional-basic/functions/isEnter/isEnter.ru.mdx +30 -0
  68. package/src/media/functional/functional-basic/functions/isEnter/isEnter.vi.mdx +30 -0
  69. package/src/media/functional/ru/conversions.mdx +67 -0
  70. package/src/media/functional/ru/dataUtils.mdx +25 -0
  71. package/src/media/functional/ru/datetimeRef.mdx +2 -2
  72. package/src/media/functional/ru/eventRef.mdx +1 -1
  73. package/src/media/functional/ru/executionUtils.mdx +58 -0
  74. package/src/media/functional/ru/geoFlagRef.mdx +1 -1
  75. package/src/media/functional/ru/geoIntl.mdx +2 -2
  76. package/src/media/functional/ru/geoIntlRef.mdx +1 -1
  77. package/src/media/functional/ru/geoRef.mdx +2 -2
  78. package/src/media/functional/ru/listTypes.mdx +1 -1
  79. package/src/media/functional/ru/meta.mdx +1330 -0
  80. package/src/media/functional/ru/metaManager.mdx +376 -0
  81. package/src/media/functional/ru/metaOg.mdx +694 -0
  82. package/src/media/functional/ru/metaTwitter.mdx +853 -0
  83. package/src/media/functional/ru/reactive.mdx +40 -0
  84. package/src/media/functional/ru/refTypes.mdx +2 -2
  85. package/src/media/functional/ru/useApiRef.mdx +5 -5
  86. package/src/media/functional/ru/useMeta.mdx +431 -0
  87. package/src/media/functional/ru/validationUtils.mdx +11 -0
  88. package/src/media/mdx/Accordion/accordion.en.mdx +59 -0
  89. package/src/media/mdx/Accordion/accordion.ru.mdx +59 -0
  90. package/src/media/mdx/Accordion/slots.en.mdx +6 -0
  91. package/src/media/mdx/Accordion/slots.ru.mdx +6 -0
  92. package/src/media/mdx/Accordion/wikiMdxAccordion.ts +25 -0
  93. package/src/media/mdx/ActionSheet/actionSheet.en.mdx +61 -0
  94. package/src/media/mdx/ActionSheet/actionSheet.ru.mdx +61 -0
  95. package/src/media/mdx/ActionSheet/touchClose.en.mdx +21 -0
  96. package/src/media/mdx/ActionSheet/touchClose.ru.mdx +21 -0
  97. package/src/media/mdx/ActionSheet/wikiMdxActionSheet.ts +25 -0
  98. package/src/media/mdx/Actions/actions.en.mdx +48 -0
  99. package/src/media/mdx/Actions/actions.ru.mdx +48 -0
  100. package/src/media/mdx/Actions/flexible.en.mdx +19 -0
  101. package/src/media/mdx/Actions/flexible.ru.mdx +19 -0
  102. package/src/media/mdx/Actions/list.en.mdx +50 -0
  103. package/src/media/mdx/Actions/list.ru.mdx +50 -0
  104. package/src/media/mdx/Actions/wikiMdxActions.ts +31 -0
  105. package/src/media/mdx/Anchor/anchor.en.mdx +34 -0
  106. package/src/media/mdx/Anchor/anchor.ru.mdx +34 -0
  107. package/src/media/mdx/Anchor/expose.go.en.mdx +6 -0
  108. package/src/media/mdx/Anchor/expose.go.ru.mdx +6 -0
  109. package/src/media/mdx/Anchor/hide.en.mdx +28 -0
  110. package/src/media/mdx/Anchor/hide.ru.mdx +28 -0
  111. package/src/media/mdx/Anchor/isCopy.en.mdx +23 -0
  112. package/src/media/mdx/Anchor/isCopy.ru.mdx +23 -0
  113. package/src/media/mdx/Anchor/scroll.en.mdx +34 -0
  114. package/src/media/mdx/Anchor/scroll.ru.mdx +35 -0
  115. package/src/media/mdx/Anchor/wikiMdxAnchor.ts +43 -0
  116. package/src/media/mdx/Arrow/arrow.en.mdx +33 -0
  117. package/src/media/mdx/Arrow/arrow.ru.mdx +33 -0
  118. package/src/media/mdx/Arrow/wikiMdxArrow.ts +19 -0
  119. package/src/media/mdx/Block/block.en.mdx +42 -0
  120. package/src/media/mdx/Block/block.ru.mdx +42 -0
  121. package/src/media/mdx/Block/wikiMdxBlock.ts +19 -0
  122. package/src/media/mdx/ChipGroup/chipGroup.en.mdx +51 -0
  123. package/src/media/mdx/ChipGroup/chipGroup.ru.mdx +51 -0
  124. package/src/media/mdx/ChipGroup/selected.en.mdx +50 -0
  125. package/src/media/mdx/ChipGroup/selected.ru.mdx +50 -0
  126. package/src/media/mdx/ChipGroup/wikiMdxChipGroup.ts +25 -0
  127. package/src/media/mdx/Dialog/buttons.en.mdx +45 -0
  128. package/src/media/mdx/Dialog/buttons.ru.mdx +45 -0
  129. package/src/media/mdx/Dialog/dialog.en.mdx +66 -0
  130. package/src/media/mdx/Dialog/dialog.ru.mdx +65 -0
  131. package/src/media/mdx/Dialog/events.en.mdx +63 -0
  132. package/src/media/mdx/Dialog/events.ru.mdx +63 -0
  133. package/src/media/mdx/Dialog/states.en.mdx +58 -0
  134. package/src/media/mdx/Dialog/states.ru.mdx +57 -0
  135. package/src/media/mdx/Dialog/wikiMdxDialog.ts +37 -0
  136. package/src/media/mdx/Field/arrows.en.mdx +22 -6
  137. package/src/media/mdx/Field/arrows.ru.mdx +22 -6
  138. package/src/media/mdx/Field/slots.en.mdx +0 -13
  139. package/src/media/mdx/Field/slots.ru.mdx +0 -13
  140. package/src/media/mdx/Image/flag.en.mdx +23 -0
  141. package/src/media/mdx/Image/flag.ru.mdx +23 -0
  142. package/src/media/mdx/Image/image.en.mdx +26 -21
  143. package/src/media/mdx/Image/image.ru.mdx +26 -22
  144. package/src/media/mdx/Image/img-tag.en.mdx +105 -0
  145. package/src/media/mdx/Image/img-tag.ru.mdx +105 -0
  146. package/src/media/mdx/Image/wikiMdxImage.ts +12 -0
  147. package/src/media/mdx/Input/currency.en.mdx +38 -0
  148. package/src/media/mdx/Input/currency.ru.mdx +38 -0
  149. package/src/media/mdx/Input/date.en.mdx +53 -0
  150. package/src/media/mdx/Input/date.ru.mdx +53 -0
  151. package/src/media/mdx/Input/input.en.mdx +143 -0
  152. package/src/media/mdx/Input/input.ru.mdx +71 -0
  153. package/src/media/mdx/Input/mask.en.mdx +30 -0
  154. package/src/media/mdx/Input/mask.ru.mdx +30 -0
  155. package/src/media/mdx/Input/number.en.mdx +41 -0
  156. package/src/media/mdx/Input/number.ru.mdx +41 -0
  157. package/src/media/mdx/Input/type.en.mdx +26 -0
  158. package/src/media/mdx/Input/type.ru.mdx +26 -0
  159. package/src/media/mdx/Input/wikiMdxInput.ts +49 -0
  160. package/src/media/mdx/Menu/event.updateValue.en.mdx +29 -0
  161. package/src/media/mdx/Menu/event.updateValue.ru.mdx +30 -0
  162. package/src/media/mdx/Menu/expose.navigation.en.mdx +12 -0
  163. package/src/media/mdx/Menu/expose.navigation.ru.mdx +12 -0
  164. package/src/media/mdx/Menu/navigation.en.mdx +56 -0
  165. package/src/media/mdx/Menu/navigation.ru.mdx +56 -0
  166. package/src/media/mdx/Menu/slots.control.en.mdx +65 -0
  167. package/src/media/mdx/Menu/slots.control.ru.mdx +65 -0
  168. package/src/media/mdx/Menu/slots.en.mdx +2 -24
  169. package/src/media/mdx/Menu/slots.ru.mdx +2 -24
  170. package/src/media/mdx/Menu/wikiMdxMenu.ts +27 -3
  171. package/src/media/mdx/Modal/differences.en.mdx +130 -0
  172. package/src/media/mdx/Modal/differences.ru.mdx +65 -0
  173. package/src/media/mdx/Modal/modal.en.mdx +63 -0
  174. package/src/media/mdx/Modal/modal.ru.mdx +63 -0
  175. package/src/media/mdx/Modal/wikiMdxModal.ts +25 -0
  176. package/src/media/mdx/MotionTransform/expose.motionTransformElement.en.mdx +13 -0
  177. package/src/media/mdx/MotionTransform/expose.motionTransformElement.ru.mdx +14 -0
  178. package/src/media/mdx/MotionTransform/wikiMdxMotionTransform.ts +6 -0
  179. package/src/media/mdx/Page/page.en.mdx +38 -0
  180. package/src/media/mdx/Page/page.ru.mdx +38 -0
  181. package/src/media/mdx/Page/wikiMdxPage.ts +19 -0
  182. package/src/media/mdx/Section/section.en.mdx +38 -0
  183. package/src/media/mdx/Section/section.ru.mdx +38 -0
  184. package/src/media/mdx/Section/wikiMdxSection.ts +19 -0
  185. package/src/media/mdx/Select/select.en.mdx +69 -0
  186. package/src/media/mdx/Select/select.ru.mdx +69 -0
  187. package/src/media/mdx/Select/wikiMdxSelect.ts +19 -0
  188. package/src/media/mdx/SelectValue/selectValue.en.mdx +64 -0
  189. package/src/media/mdx/SelectValue/selectValue.ru.mdx +64 -0
  190. package/src/media/mdx/SelectValue/wikiMdxSelectValue.ts +19 -0
  191. package/src/media/mdx/TextareaAutosize/textarea-autosize.en.mdx +65 -0
  192. package/src/media/mdx/TextareaAutosize/textarea-autosize.ru.mdx +65 -0
  193. package/src/media/mdx/TextareaAutosize/wikiMdxTextareaAutosize.ts +19 -0
  194. package/src/media/mdx/Tooltip/event.tooltip.en.mdx +7 -0
  195. package/src/media/mdx/Tooltip/event.tooltip.ru.mdx +8 -0
  196. package/src/media/mdx/Tooltip/slot.control.en.mdx +14 -0
  197. package/src/media/mdx/Tooltip/slot.control.ru.mdx +14 -0
  198. package/src/media/mdx/Tooltip/tooltip.en.mdx +34 -0
  199. package/src/media/mdx/Tooltip/tooltip.ru.mdx +34 -0
  200. package/src/media/mdx/Tooltip/wikiMdxTooltip.ts +31 -0
  201. package/src/media/mdx/Window/classes.ru.mdx +1 -1
  202. package/src/media/mdx/event/events.actions.en.mdx +44 -0
  203. package/src/media/mdx/event/events.actions.ru.mdx +44 -0
  204. package/src/media/mdx/event/events.inputStandard.en.mdx +6 -0
  205. package/src/media/mdx/event/events.inputStandard.ru.mdx +6 -0
  206. package/src/media/mdx/event/wikiMdxEvent.ts +20 -8
  207. package/src/media/mdx/expose/expose.clear.en.mdx +1 -1
  208. package/src/media/mdx/expose/expose.descriptionId.en.mdx +6 -0
  209. package/src/media/mdx/expose/expose.descriptionId.ru.mdx +6 -0
  210. package/src/media/mdx/expose/expose.id.en.mdx +6 -0
  211. package/src/media/mdx/expose/expose.id.ru.mdx +6 -0
  212. package/src/media/mdx/expose/expose.labelId.en.mdx +6 -0
  213. package/src/media/mdx/expose/expose.labelId.ru.mdx +6 -0
  214. package/src/media/mdx/expose/wikiMdxExpose.ts +18 -0
  215. package/src/media/mdx/slot/body.en.mdx +6 -0
  216. package/src/media/mdx/slot/body.ru.mdx +6 -0
  217. package/src/media/mdx/slot/headline.en.mdx +7 -0
  218. package/src/media/mdx/slot/headline.ru.mdx +6 -0
  219. package/src/media/mdx/slot/leading.en.mdx +7 -0
  220. package/src/media/mdx/slot/leading.ru.mdx +7 -0
  221. package/src/media/mdx/slot/secondary.en.mdx +5 -0
  222. package/src/media/mdx/slot/secondary.ru.mdx +5 -0
  223. package/src/media/mdx/slot/trailing.en.mdx +7 -0
  224. package/src/media/mdx/slot/trailing.ru.mdx +7 -0
  225. package/src/media/mdx/slot/wikiMdxSlot.ts +30 -0
  226. package/src/media/mdx/style/isSkeleton.en.mdx +2 -2
  227. package/src/media/mdx/style/isSkeleton.ru.mdx +2 -2
  228. package/src/media/mdx/value/v-model-selected.en.mdx +28 -0
  229. package/src/media/mdx/value/v-model-selected.ru.mdx +28 -0
  230. package/src/media/mdx/value/v-model.en.mdx +26 -0
  231. package/src/media/mdx/value/v-model.ru.mdx +26 -0
  232. package/src/media/mdx/value/wikiMdxValue.ts +24 -3
  233. package/src/media/mdx/wikiMdx.ts +33 -1
  234. package/src/media/props/wiki.ts +44 -0
  235. package/src/media/props/wikiActions.ts +43 -0
  236. package/src/media/props/wikiActionsInclude.ts +62 -0
  237. package/src/media/props/wikiAnchor.ts +85 -0
  238. package/src/media/props/wikiAria.ts +123 -0
  239. package/src/media/props/wikiArrow.ts +24 -0
  240. package/src/media/props/wikiArrowInclude.ts +45 -0
  241. package/src/media/props/wikiAttributes.ts +143 -0
  242. package/src/media/props/wikiBadge.ts +7 -4
  243. package/src/media/props/wikiBars.ts +7 -6
  244. package/src/media/props/wikiBarsInclude.ts +82 -0
  245. package/src/media/props/wikiButton.ts +8 -4
  246. package/src/media/props/wikiChip.ts +4 -2
  247. package/src/media/props/wikiChipGroup.ts +39 -0
  248. package/src/media/props/wikiDialog.ts +33 -0
  249. package/src/media/props/wikiField.ts +18 -31
  250. package/src/media/props/wikiFieldCounterInclude.ts +87 -0
  251. package/src/media/props/wikiForm.ts +267 -0
  252. package/src/media/props/wikiHook.ts +20 -0
  253. package/src/media/props/wikiIcon.ts +19 -6
  254. package/src/media/props/wikiIconInclude.ts +322 -0
  255. package/src/media/props/wikiImage.ts +97 -20
  256. package/src/media/props/wikiInformation.ts +164 -0
  257. package/src/media/props/wikiInput.ts +34 -0
  258. package/src/media/props/wikiList.ts +10 -4
  259. package/src/media/props/wikiListItem.ts +23 -2
  260. package/src/media/props/wikiMask.ts +2 -12
  261. package/src/media/props/wikiMaskInclude.ts +54 -0
  262. package/src/media/props/wikiMenu.ts +1 -11
  263. package/src/media/props/wikiMotionTransform.ts +7 -13
  264. package/src/media/props/wikiOption.ts +356 -0
  265. package/src/media/props/wikiProgress.ts +8 -5
  266. package/src/media/props/wikiScrollbar.ts +6 -6
  267. package/src/media/props/wikiSelect.ts +68 -0
  268. package/src/media/props/wikiSelectValue.ts +30 -0
  269. package/src/media/props/wikiStatus.ts +34 -57
  270. package/src/media/props/wikiStyle.ts +85 -406
  271. package/src/media/props/wikiTechnical.ts +141 -1
  272. package/src/media/props/wikiText.ts +167 -0
  273. package/src/media/props/wikiTooltip.ts +53 -0
  274. package/src/media/props/wikiValue.ts +22 -276
  275. package/src/media/props/wikiWindow.ts +24 -45
  276. package/src/shims-mdx.d.ts +5 -0
  277. package/src/styles/storybookStyle.scss +3 -1
  278. package/src/types/storybookTypes.ts +48 -4
@@ -0,0 +1,376 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/functional/ru/Classes/MetaManager'/>
4
+
5
+ # Класс MetaManager
6
+
7
+ Класс для работы с HTML мета-тегами с автоматической синхронизацией DOM и безопасным кодированием атрибутов. Обеспечивает чтение, обновление и генерацию мета-тегов для SEO-оптимизации и интеграции с социальными сетями (Open Graph, Twitter Cards).
8
+
9
+ ## Основные возможности
10
+
11
+ - **Синхронизация DOM** — автоматическое обновление мета-тегов в head документа
12
+ - **Поддержка двух форматов** — работа с атрибутами `name` и `property`
13
+ - **Генерация HTML** — преобразование мета-тегов в HTML-строки для серверного рендеринга
14
+ - **Безопасное кодирование** — автоматическое экранирование специальных символов в атрибутах
15
+ - **Типобезопасность** — поддержка TypeScript с дженериками для определения типов
16
+ - **Гибкий API** — цепочечные методы для удобного использования
17
+ - **Совместимость с SSR** — работает в браузере и серверной среде
18
+ - **Автоинициализация** — считывает существующие мета-теги из DOM при создании
19
+
20
+ ## Конструктор
21
+
22
+ ### `constructor`
23
+
24
+ Создает экземпляр MetaManager с указанными параметрами и автоматически считывает текущие мета-теги из DOM.
25
+
26
+ **Параметры:**
27
+ - `listMeta: string[]` — список имен мета-тегов для управления
28
+ - `isProperty?: boolean` — использовать атрибут `property` вместо `name` (по умолчанию: `false`)
29
+
30
+ ```javascript
31
+ import { MetaManager } from '@dxtmisha/functional'
32
+
33
+ // Стандартные мета-теги (атрибут name)
34
+ const meta = new MetaManager([
35
+ 'description',
36
+ 'keywords',
37
+ 'author'
38
+ ])
39
+
40
+ // Мета-теги Open Graph (атрибут property)
41
+ const ogMeta = new MetaManager([
42
+ 'og:title',
43
+ 'og:description',
44
+ 'og:image',
45
+ 'og:url'
46
+ ], true)
47
+
48
+ // Twitter Cards
49
+ const twitterMeta = new MetaManager([
50
+ 'twitter:card',
51
+ 'twitter:title',
52
+ 'twitter:description',
53
+ 'twitter:image'
54
+ ])
55
+ ```
56
+
57
+ ## Методы запроса данных
58
+
59
+ ### `getListMeta`
60
+
61
+ Возвращает список имен управляемых мета-тегов.
62
+
63
+ **Возвращает:** `string[]` — массив имен мета-тегов
64
+
65
+ ```javascript
66
+ const meta = new MetaManager(['description', 'keywords', 'author'])
67
+
68
+ const names = meta.getListMeta()
69
+ // ['description', 'keywords', 'author']
70
+
71
+ // Проверка управляемого тега
72
+ const isManaged = names.includes('description') // true
73
+
74
+ // Итерация по управляемым тегам
75
+ names.forEach(name => {
76
+ console.log(`Управление: ${name}`)
77
+ })
78
+ ```
79
+
80
+ ### `getItem`
81
+
82
+ Получает содержимое мета-тега по имени из внутреннего хранилища.
83
+
84
+ **Параметры:**
85
+ - `name: string` — имя мета-тега
86
+
87
+ **Возвращает:** `string` — содержимое мета-тега (пустая строка если не установлен)
88
+
89
+ ```javascript
90
+ const meta = new MetaManager(['description', 'keywords', 'author'])
91
+
92
+ // Получить meta description
93
+ const description = meta.get('description')
94
+
95
+ // Получить keywords
96
+ const keywords = meta.get('keywords')
97
+
98
+ // Несуществующий тег возвращает пустую строку
99
+ const missing = meta.get('non-existent') // ''
100
+
101
+ // Использование в условиях
102
+ if (meta.get('description')) {
103
+ console.log('Description установлен')
104
+ }
105
+ ```
106
+
107
+ ### `getItems`
108
+
109
+ Возвращает все мета-теги в виде объекта.
110
+
111
+ **Возвращает:** `Record<string, string | undefined>` — объект со всеми мета-тегами
112
+
113
+ ```javascript
114
+ const meta = new MetaManager(['description', 'keywords', 'author'])
115
+
116
+ const allMeta = meta.getItems()
117
+ // { description: '...', keywords: '...', author: '...' }
118
+
119
+ // Проверка всех мета-тегов
120
+ Object.keys(allMeta).forEach(key => {
121
+ console.log(`${key}: ${allMeta[key]}`)
122
+ })
123
+
124
+ // Использование в валидации
125
+ const hasAllTags = Object.values(allMeta).every(value => value !== '')
126
+
127
+ // Экспорт для логирования
128
+ console.log('Текущее состояние мета:', allMeta)
129
+ ```
130
+
131
+ ## Методы управления данными
132
+
133
+ ### `set`
134
+
135
+ Устанавливает содержимое мета-тега во внутреннем хранилище и обновляет или создает соответствующий мета-элемент в DOM.
136
+
137
+ **Параметры:**
138
+ - `name: string` — имя мета-тега
139
+ - `content: string` — содержимое мета-тега
140
+
141
+ **Возвращает:** `this` — для цепочечных вызовов
142
+
143
+ ```javascript
144
+ const meta = new MetaManager(['description', 'keywords', 'author'])
145
+
146
+ // Установить один мета-тег
147
+ meta.set('description', 'Описание сайта')
148
+
149
+ // Цепочка обновлений
150
+ meta
151
+ .set('description', 'Мой замечательный сайт')
152
+ .set('keywords', 'веб, разработка, javascript')
153
+ .set('author', 'Иван Иванов')
154
+
155
+ // Динамическое обновление
156
+ const updateSEO = (pageData) => {
157
+ meta
158
+ .set('description', pageData.description)
159
+ .set('keywords', pageData.keywords)
160
+ }
161
+
162
+ // Удаление мета-тега
163
+ meta.set('temporary', '')
164
+ ```
165
+
166
+ ### `setByList`
167
+
168
+ Устанавливает несколько мета-тегов из объекта.
169
+
170
+ **Параметры:**
171
+ - `metaList: Record<string, string | undefined>` — объект с именами и содержимым мета-тегов
172
+
173
+ **Возвращает:** `this` — для цепочечных вызовов
174
+
175
+ ```javascript
176
+ const meta = new MetaManager(['description', 'keywords', 'author'])
177
+
178
+ // Установить несколько тегов сразу
179
+ meta.setByList({
180
+ description: 'Мой замечательный сайт',
181
+ keywords: 'веб, разработка, javascript',
182
+ author: 'Иван Иванов'
183
+ })
184
+
185
+ // Динамическое обновление страницы
186
+ const updatePageMeta = (page) => {
187
+ meta.setByList(page.meta)
188
+ }
189
+
190
+ // Из ответа API
191
+ fetch('/api/page-meta')
192
+ .then(res => res.json())
193
+ .then(data => meta.setByList(data))
194
+
195
+ // Частичные обновления
196
+ meta.setByList({
197
+ description: 'Обновленное описание'
198
+ // Остальные теги остаются без изменений
199
+ })
200
+ ```
201
+
202
+ ### `html`
203
+
204
+ Возвращает все мета-теги в виде HTML-строки с безопасным кодированием атрибутов. Полезно для серверного рендеринга.
205
+
206
+ **Возвращает:** `string` — HTML-строка с мета-тегами
207
+
208
+ ```javascript
209
+ const meta = new MetaManager(['description', 'keywords', 'author'])
210
+
211
+ meta.setByList({
212
+ description: 'Мой сайт с "кавычками" & спецсимволами',
213
+ keywords: 'веб, javascript',
214
+ author: 'Иван Иванов'
215
+ })
216
+
217
+ const htmlString = meta.html()
218
+ // <meta name="description" content="Мой сайт с &quot;кавычками&quot; &amp; спецсимволами">
219
+ // <meta name="keywords" content="веб, javascript">
220
+ // <meta name="author" content="Иван Иванов">
221
+
222
+ // Использование в SSR шаблонах
223
+ const htmlTemplate = `
224
+ <!DOCTYPE html>
225
+ <html>
226
+ <head>
227
+ ${meta.html()}
228
+ <title>Заголовок страницы</title>
229
+ </head>
230
+ <body>...</body>
231
+ </html>
232
+ `
233
+
234
+ // Пример с Express.js
235
+ app.get('/page', (req, res) => {
236
+ const meta = new MetaManager(['description', 'keywords'])
237
+ meta.setByList(req.pageData.meta)
238
+
239
+ res.send(`
240
+ <html>
241
+ <head>${meta.html()}</head>
242
+ <body>...</body>
243
+ </html>
244
+ `)
245
+ })
246
+ ```
247
+
248
+ ## Практические примеры
249
+
250
+ ### Управление SEO
251
+
252
+ ```javascript
253
+ const seoMeta = new MetaManager([
254
+ 'description',
255
+ 'keywords',
256
+ 'author',
257
+ 'robots',
258
+ 'viewport'
259
+ ])
260
+
261
+ // Установка SEO тегов
262
+ seoMeta.setByList({
263
+ description: 'Полное руководство по веб-разработке',
264
+ keywords: 'веб, html, css, javascript, учебник',
265
+ author: 'Команда WebDev',
266
+ robots: 'index, follow',
267
+ viewport: 'width=device-width, initial-scale=1.0'
268
+ })
269
+
270
+ // Обновление при смене маршрута
271
+ router.on('change', (route) => {
272
+ seoMeta.setByList(route.meta)
273
+ })
274
+ ```
275
+
276
+ ### Интеграция Open Graph
277
+
278
+ ```javascript
279
+ const ogMeta = new MetaManager([
280
+ 'og:title',
281
+ 'og:description',
282
+ 'og:image',
283
+ 'og:url',
284
+ 'og:type',
285
+ 'og:site_name'
286
+ ], true)
287
+
288
+ // Установка данных Open Graph
289
+ ogMeta.setByList({
290
+ 'og:title': 'Потрясающий заголовок статьи',
291
+ 'og:description': 'Эта статья взорвет ваш мозг',
292
+ 'og:image': 'https://example.com/image.jpg',
293
+ 'og:url': 'https://example.com/article',
294
+ 'og:type': 'article',
295
+ 'og:site_name': 'Мой сайт'
296
+ })
297
+
298
+ // Для шаринга в соцсетях
299
+ const shareData = {
300
+ title: ogMeta.get('og:title'),
301
+ description: ogMeta.get('og:description'),
302
+ image: ogMeta.get('og:image')
303
+ }
304
+ ```
305
+
306
+ ### Мультиплатформенное управление мета-тегами
307
+
308
+ ```javascript
309
+ // Создание менеджеров для разных платформ
310
+ const standardMeta = new MetaManager(['description', 'keywords'])
311
+ const ogMeta = new MetaManager(['og:title', 'og:description', 'og:image'], true)
312
+ const twitterMeta = new MetaManager(['twitter:card', 'twitter:title', 'twitter:description'])
313
+
314
+ // Обновление всех платформ
315
+ const updateAllMeta = (data) => {
316
+ standardMeta.setByList({
317
+ description: data.description,
318
+ keywords: data.keywords
319
+ })
320
+
321
+ ogMeta.setByList({
322
+ 'og:title': data.title,
323
+ 'og:description': data.description,
324
+ 'og:image': data.image
325
+ })
326
+
327
+ twitterMeta.setByList({
328
+ 'twitter:card': 'summary_large_image',
329
+ 'twitter:title': data.title,
330
+ 'twitter:description': data.description
331
+ })
332
+ }
333
+
334
+ // Генерация объединенного HTML для SSR
335
+ const allMetaHTML = [
336
+ standardMeta.html(),
337
+ ogMeta.html(),
338
+ twitterMeta.html()
339
+ ].join('')
340
+ ```
341
+
342
+ ### Динамическое обновление страниц
343
+
344
+ ```javascript
345
+ const meta = new MetaManager(['description', 'keywords'])
346
+
347
+ // Single Page Application
348
+ const loadPage = async (pageId) => {
349
+ const pageData = await fetch(`/api/pages/${pageId}`).then(r => r.json())
350
+
351
+ // Обновление мета-тегов
352
+ meta.setByList(pageData.meta)
353
+
354
+ // Обновление заголовка
355
+ document.title = pageData.title
356
+ }
357
+
358
+ // Интеграция с React/Vue
359
+ useEffect(() => {
360
+ meta.set('description', page.description)
361
+ return () => {
362
+ // Очистка при необходимости
363
+ meta.set('description', '')
364
+ }
365
+ }, [page])
366
+ ```
367
+
368
+ ## Примечания
369
+
370
+ - Конструктор автоматически считывает существующие мета-теги из DOM с помощью метода `update()`
371
+ - Методы, изменяющие DOM, проверяют среду выполнения через `isDomRuntime()` перед доступом к `document`
372
+ - Метод `html()` использует функцию `encodeAttribute()` для предотвращения XSS при внедрении в SSR шаблоны
373
+ - Специальные символы в содержимом автоматически экранируются: `"` → `&quot;`, `&` → `&amp;` и т.д.
374
+ - Когда мета-тег не существует в DOM, `set()` создает его в `document.head`
375
+ - Пустые строки являются допустимыми значениями и обновят содержимое мета-тега на пустое
376
+ - Класс работает как в браузере, так и в Node.js (SSR) окружении