@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/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
|
+
```
|
|
@@ -35,7 +35,7 @@ const { data, loading, isStarting, reading } = useApiRef('/api/users')
|
|
|
35
35
|
|
|
36
36
|
### Component Usage
|
|
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
|
### List with Filters
|
|
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
|
### Conditional Loading
|
|
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 Request with Transformation
|
|
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
|
### Multiple Requests
|
|
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/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 & "World"'
|
|
80
|
+
encodeAttribute('<script>alert("XSS")</script>') // '<script>alert("XSS")</script>'
|
|
81
|
+
encodeAttribute("It's a test") // 'It'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
|
-
```
|
|
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
|
-
```
|
|
262
|
+
```html
|
|
263
263
|
<template>
|
|
264
264
|
<button ref="buttonEl">Нажми меня</button>
|
|
265
265
|
<input ref="inputEl" placeholder="Введите...">
|