@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.
- package/package.json +7 -7
- package/src/classes/WikiStorybookItem.ts +24 -0
- package/src/media/descriptions/wikiDescriptions.ts +28 -0
- package/src/media/descriptions/wikiDescriptionsAccordion.ts +158 -0
- package/src/media/descriptions/wikiDescriptionsActionSheet.ts +211 -0
- package/src/media/descriptions/wikiDescriptionsActions.ts +161 -0
- package/src/media/descriptions/wikiDescriptionsAnchor.ts +42 -0
- package/src/media/descriptions/wikiDescriptionsArrow.ts +181 -0
- package/src/media/descriptions/wikiDescriptionsBlock.ts +97 -0
- package/src/media/descriptions/wikiDescriptionsButton.ts +0 -1
- package/src/media/descriptions/wikiDescriptionsCell.ts +2 -1
- package/src/media/descriptions/wikiDescriptionsChipGroup.ts +168 -0
- package/src/media/descriptions/wikiDescriptionsDialog.ts +182 -0
- package/src/media/descriptions/wikiDescriptionsField.ts +2 -0
- package/src/media/descriptions/wikiDescriptionsImage.ts +41 -6
- package/src/media/descriptions/wikiDescriptionsInput.ts +257 -0
- package/src/media/descriptions/wikiDescriptionsMenu.ts +123 -0
- package/src/media/descriptions/wikiDescriptionsModal.ts +145 -0
- package/src/media/descriptions/wikiDescriptionsMotionTransform.ts +2 -6
- package/src/media/descriptions/wikiDescriptionsSelect.ts +209 -0
- package/src/media/descriptions/wikiDescriptionsSelectValue.ts +78 -0
- package/src/media/descriptions/wikiDescriptionsTextareaAutosize.ts +50 -0
- package/src/media/descriptions/wikiDescriptionsTooltip.ts +89 -0
- package/src/media/functional/en/conversions.mdx +67 -0
- package/src/media/functional/en/dataUtils.mdx +25 -0
- package/src/media/functional/en/datetimeRef.mdx +1 -1
- package/src/media/functional/en/eventRef.mdx +1 -1
- package/src/media/functional/en/executionUtils.mdx +58 -0
- package/src/media/functional/en/geoFlagRef.mdx +1 -1
- package/src/media/functional/en/geoIntlRef.mdx +1 -1
- package/src/media/functional/en/geoRef.mdx +2 -2
- package/src/media/functional/en/meta.mdx +1206 -0
- package/src/media/functional/en/metaManager.mdx +376 -0
- package/src/media/functional/en/metaOg.mdx +694 -0
- package/src/media/functional/en/metaTwitter.mdx +853 -0
- package/src/media/functional/en/reactive.mdx +40 -0
- package/src/media/functional/en/refTypes.mdx +1 -1
- package/src/media/functional/en/useApiRef.mdx +5 -5
- package/src/media/functional/en/useMeta.mdx +431 -0
- package/src/media/functional/en/validationUtils.mdx +11 -0
- package/src/media/functional/ru/conversions.mdx +67 -0
- package/src/media/functional/ru/dataUtils.mdx +25 -0
- package/src/media/functional/ru/datetimeRef.mdx +2 -2
- package/src/media/functional/ru/eventRef.mdx +1 -1
- package/src/media/functional/ru/executionUtils.mdx +58 -0
- package/src/media/functional/ru/geoFlagRef.mdx +1 -1
- package/src/media/functional/ru/geoIntl.mdx +2 -2
- package/src/media/functional/ru/geoIntlRef.mdx +1 -1
- package/src/media/functional/ru/geoRef.mdx +2 -2
- package/src/media/functional/ru/listTypes.mdx +1 -1
- package/src/media/functional/ru/meta.mdx +1330 -0
- package/src/media/functional/ru/metaManager.mdx +376 -0
- package/src/media/functional/ru/metaOg.mdx +694 -0
- package/src/media/functional/ru/metaTwitter.mdx +853 -0
- package/src/media/functional/ru/reactive.mdx +40 -0
- package/src/media/functional/ru/refTypes.mdx +2 -2
- package/src/media/functional/ru/useApiRef.mdx +5 -5
- package/src/media/functional/ru/useMeta.mdx +431 -0
- package/src/media/functional/ru/validationUtils.mdx +11 -0
- package/src/media/mdx/Accordion/accordion.en.mdx +59 -0
- package/src/media/mdx/Accordion/accordion.ru.mdx +59 -0
- package/src/media/mdx/Accordion/slots.en.mdx +6 -0
- package/src/media/mdx/Accordion/slots.ru.mdx +6 -0
- package/src/media/mdx/Accordion/wikiMdxAccordion.ts +25 -0
- package/src/media/mdx/ActionSheet/actionSheet.en.mdx +61 -0
- package/src/media/mdx/ActionSheet/actionSheet.ru.mdx +61 -0
- package/src/media/mdx/ActionSheet/touchClose.en.mdx +21 -0
- package/src/media/mdx/ActionSheet/touchClose.ru.mdx +21 -0
- package/src/media/mdx/ActionSheet/wikiMdxActionSheet.ts +25 -0
- package/src/media/mdx/Actions/actions.en.mdx +48 -0
- package/src/media/mdx/Actions/actions.ru.mdx +48 -0
- package/src/media/mdx/Actions/flexible.en.mdx +19 -0
- package/src/media/mdx/Actions/flexible.ru.mdx +19 -0
- package/src/media/mdx/Actions/list.en.mdx +50 -0
- package/src/media/mdx/Actions/list.ru.mdx +50 -0
- package/src/media/mdx/Actions/wikiMdxActions.ts +31 -0
- package/src/media/mdx/Anchor/anchor.en.mdx +34 -0
- package/src/media/mdx/Anchor/anchor.ru.mdx +34 -0
- package/src/media/mdx/Anchor/expose.go.en.mdx +6 -0
- package/src/media/mdx/Anchor/expose.go.ru.mdx +6 -0
- package/src/media/mdx/Anchor/hide.en.mdx +28 -0
- package/src/media/mdx/Anchor/hide.ru.mdx +28 -0
- package/src/media/mdx/Anchor/isCopy.en.mdx +23 -0
- package/src/media/mdx/Anchor/isCopy.ru.mdx +23 -0
- package/src/media/mdx/Anchor/scroll.en.mdx +34 -0
- package/src/media/mdx/Anchor/scroll.ru.mdx +35 -0
- package/src/media/mdx/Anchor/wikiMdxAnchor.ts +43 -0
- package/src/media/mdx/Arrow/arrow.en.mdx +33 -0
- package/src/media/mdx/Arrow/arrow.ru.mdx +33 -0
- package/src/media/mdx/Arrow/wikiMdxArrow.ts +19 -0
- package/src/media/mdx/Block/block.en.mdx +42 -0
- package/src/media/mdx/Block/block.ru.mdx +42 -0
- package/src/media/mdx/Block/wikiMdxBlock.ts +19 -0
- package/src/media/mdx/ChipGroup/chipGroup.en.mdx +51 -0
- package/src/media/mdx/ChipGroup/chipGroup.ru.mdx +51 -0
- package/src/media/mdx/ChipGroup/selected.en.mdx +50 -0
- package/src/media/mdx/ChipGroup/selected.ru.mdx +50 -0
- package/src/media/mdx/ChipGroup/wikiMdxChipGroup.ts +25 -0
- package/src/media/mdx/Dialog/buttons.en.mdx +45 -0
- package/src/media/mdx/Dialog/buttons.ru.mdx +45 -0
- package/src/media/mdx/Dialog/dialog.en.mdx +66 -0
- package/src/media/mdx/Dialog/dialog.ru.mdx +65 -0
- package/src/media/mdx/Dialog/events.en.mdx +63 -0
- package/src/media/mdx/Dialog/events.ru.mdx +63 -0
- package/src/media/mdx/Dialog/states.en.mdx +58 -0
- package/src/media/mdx/Dialog/states.ru.mdx +57 -0
- package/src/media/mdx/Dialog/wikiMdxDialog.ts +37 -0
- package/src/media/mdx/Field/arrows.en.mdx +22 -6
- package/src/media/mdx/Field/arrows.ru.mdx +22 -6
- package/src/media/mdx/Field/slots.en.mdx +0 -13
- package/src/media/mdx/Field/slots.ru.mdx +0 -13
- package/src/media/mdx/Image/img-tag.en.mdx +105 -0
- package/src/media/mdx/Image/img-tag.ru.mdx +105 -0
- package/src/media/mdx/Image/wikiMdxImage.ts +6 -0
- package/src/media/mdx/Input/currency.en.mdx +38 -0
- package/src/media/mdx/Input/currency.ru.mdx +38 -0
- package/src/media/mdx/Input/date.en.mdx +53 -0
- package/src/media/mdx/Input/date.ru.mdx +53 -0
- package/src/media/mdx/Input/input.en.mdx +143 -0
- package/src/media/mdx/Input/input.ru.mdx +71 -0
- package/src/media/mdx/Input/mask.en.mdx +30 -0
- package/src/media/mdx/Input/mask.ru.mdx +30 -0
- package/src/media/mdx/Input/number.en.mdx +41 -0
- package/src/media/mdx/Input/number.ru.mdx +41 -0
- package/src/media/mdx/Input/type.en.mdx +26 -0
- package/src/media/mdx/Input/type.ru.mdx +26 -0
- package/src/media/mdx/Input/wikiMdxInput.ts +49 -0
- package/src/media/mdx/Menu/event.updateValue.en.mdx +29 -0
- package/src/media/mdx/Menu/event.updateValue.ru.mdx +30 -0
- package/src/media/mdx/Menu/expose.navigation.en.mdx +12 -0
- package/src/media/mdx/Menu/expose.navigation.ru.mdx +12 -0
- package/src/media/mdx/Menu/navigation.en.mdx +56 -0
- package/src/media/mdx/Menu/navigation.ru.mdx +56 -0
- package/src/media/mdx/Menu/slots.control.en.mdx +65 -0
- package/src/media/mdx/Menu/slots.control.ru.mdx +65 -0
- package/src/media/mdx/Menu/slots.en.mdx +2 -24
- package/src/media/mdx/Menu/slots.ru.mdx +2 -24
- package/src/media/mdx/Menu/wikiMdxMenu.ts +27 -3
- package/src/media/mdx/Modal/differences.en.mdx +130 -0
- package/src/media/mdx/Modal/differences.ru.mdx +65 -0
- package/src/media/mdx/Modal/modal.en.mdx +63 -0
- package/src/media/mdx/Modal/modal.ru.mdx +63 -0
- package/src/media/mdx/Modal/wikiMdxModal.ts +25 -0
- package/src/media/mdx/MotionTransform/expose.motionTransformElement.en.mdx +13 -0
- package/src/media/mdx/MotionTransform/expose.motionTransformElement.ru.mdx +14 -0
- package/src/media/mdx/MotionTransform/wikiMdxMotionTransform.ts +6 -0
- package/src/media/mdx/Select/select.en.mdx +69 -0
- package/src/media/mdx/Select/select.ru.mdx +69 -0
- package/src/media/mdx/Select/wikiMdxSelect.ts +19 -0
- package/src/media/mdx/SelectValue/selectValue.en.mdx +64 -0
- package/src/media/mdx/SelectValue/selectValue.ru.mdx +64 -0
- package/src/media/mdx/SelectValue/wikiMdxSelectValue.ts +19 -0
- package/src/media/mdx/TextareaAutosize/textarea-autosize.en.mdx +65 -0
- package/src/media/mdx/TextareaAutosize/textarea-autosize.ru.mdx +65 -0
- package/src/media/mdx/TextareaAutosize/wikiMdxTextareaAutosize.ts +19 -0
- package/src/media/mdx/Tooltip/event.tooltip.en.mdx +7 -0
- package/src/media/mdx/Tooltip/event.tooltip.ru.mdx +8 -0
- package/src/media/mdx/Tooltip/slot.control.en.mdx +14 -0
- package/src/media/mdx/Tooltip/slot.control.ru.mdx +14 -0
- package/src/media/mdx/Tooltip/tooltip.en.mdx +34 -0
- package/src/media/mdx/Tooltip/tooltip.ru.mdx +34 -0
- package/src/media/mdx/Tooltip/wikiMdxTooltip.ts +31 -0
- package/src/media/mdx/Window/classes.ru.mdx +1 -1
- package/src/media/mdx/event/events.actions.en.mdx +44 -0
- package/src/media/mdx/event/events.actions.ru.mdx +44 -0
- package/src/media/mdx/event/events.inputStandard.en.mdx +6 -0
- package/src/media/mdx/event/events.inputStandard.ru.mdx +6 -0
- package/src/media/mdx/event/wikiMdxEvent.ts +20 -8
- package/src/media/mdx/expose/expose.descriptionId.en.mdx +6 -0
- package/src/media/mdx/expose/expose.descriptionId.ru.mdx +6 -0
- package/src/media/mdx/expose/expose.id.en.mdx +6 -0
- package/src/media/mdx/expose/expose.id.ru.mdx +6 -0
- package/src/media/mdx/expose/expose.labelId.en.mdx +6 -0
- package/src/media/mdx/expose/expose.labelId.ru.mdx +6 -0
- package/src/media/mdx/expose/wikiMdxExpose.ts +18 -0
- package/src/media/mdx/slot/body.en.mdx +6 -0
- package/src/media/mdx/slot/body.ru.mdx +6 -0
- package/src/media/mdx/slot/headline.en.mdx +7 -0
- package/src/media/mdx/slot/headline.ru.mdx +6 -0
- package/src/media/mdx/slot/leading.en.mdx +7 -0
- package/src/media/mdx/slot/leading.ru.mdx +7 -0
- package/src/media/mdx/slot/secondary.en.mdx +5 -0
- package/src/media/mdx/slot/secondary.ru.mdx +5 -0
- package/src/media/mdx/slot/trailing.en.mdx +7 -0
- package/src/media/mdx/slot/trailing.ru.mdx +7 -0
- package/src/media/mdx/slot/wikiMdxSlot.ts +30 -0
- package/src/media/mdx/style/isSkeleton.en.mdx +2 -2
- package/src/media/mdx/style/isSkeleton.ru.mdx +2 -2
- package/src/media/mdx/value/v-model-selected.en.mdx +28 -0
- package/src/media/mdx/value/v-model-selected.ru.mdx +28 -0
- package/src/media/mdx/value/v-model.en.mdx +26 -0
- package/src/media/mdx/value/v-model.ru.mdx +26 -0
- package/src/media/mdx/value/wikiMdxValue.ts +24 -3
- package/src/media/mdx/wikiMdx.ts +29 -1
- package/src/media/props/wiki.ts +42 -0
- package/src/media/props/wikiActions.ts +43 -0
- package/src/media/props/wikiActionsInclude.ts +62 -0
- package/src/media/props/wikiAnchor.ts +84 -0
- package/src/media/props/wikiAria.ts +102 -0
- package/src/media/props/wikiArrow.ts +24 -0
- package/src/media/props/wikiArrowInclude.ts +45 -0
- package/src/media/props/wikiBarsInclude.ts +80 -0
- package/src/media/props/wikiChipGroup.ts +39 -0
- package/src/media/props/wikiDialog.ts +34 -0
- package/src/media/props/wikiField.ts +0 -21
- package/src/media/props/wikiFieldCounterInclude.ts +78 -0
- package/src/media/props/wikiForm.ts +248 -0
- package/src/media/props/wikiHook.ts +20 -0
- package/src/media/props/wikiIcon.ts +3 -3
- package/src/media/props/wikiIconInclude.ts +319 -0
- package/src/media/props/wikiImage.ts +71 -19
- package/src/media/props/wikiInformation.ts +160 -0
- package/src/media/props/wikiInput.ts +34 -0
- package/src/media/props/wikiListItem.ts +20 -0
- package/src/media/props/wikiMask.ts +0 -10
- package/src/media/props/wikiMaskInclude.ts +54 -0
- package/src/media/props/wikiMenu.ts +0 -10
- package/src/media/props/wikiMotionTransform.ts +0 -10
- package/src/media/props/wikiOption.ts +113 -0
- package/src/media/props/wikiSelect.ts +68 -0
- package/src/media/props/wikiSelectValue.ts +30 -0
- package/src/media/props/wikiStatus.ts +29 -41
- package/src/media/props/wikiStyle.ts +154 -243
- package/src/media/props/wikiTechnical.ts +65 -0
- package/src/media/props/wikiText.ts +57 -0
- package/src/media/props/wikiTooltip.ts +53 -0
- package/src/media/props/wikiValue.ts +14 -203
- package/src/media/props/wikiWindow.ts +0 -31
- package/src/styles/storybookStyle.scss +3 -1
- 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
|
-
###
|
|
171
|
+
### Компонент с гибкими props
|
|
172
172
|
|
|
173
|
-
```
|
|
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
|
-
```
|
|
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
|
-
```
|
|
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
|
-
```
|
|
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
|
-
```
|
|
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
|
-
```
|
|
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 — компонент для создания раскрывающихся секций с поддержкой анимаций, управления состоянием и гибкой кастомизации.
|