itube-specs 0.0.212 → 0.0.215
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/README.md +9 -117
- package/components/cards/s-video-mini-card.vue +3 -3
- package/components/page-components/s-chips-panel.vue +2 -2
- package/components/page-components/s-filter-button.vue +5 -5
- package/components/page-components/s-filter-chips.vue +4 -4
- package/components/page-components/s-filter-model-chips.vue +1 -1
- package/components/page-components/s-filter-page.vue +6 -6
- package/components/page-components/s-filter-popup.vue +10 -10
- package/components/page-components/s-filter-videos-chips.vue +1 -1
- package/components/page-components/s-filter.vue +2 -2
- package/components/page-components/s-info-socials.vue +1 -1
- package/components/page-components/s-model-filters.vue +9 -9
- package/components/page-components/s-pagination.vue +6 -6
- package/components/page-components/s-report.vue +11 -11
- package/components/page-components/s-share.vue +6 -6
- package/components/page-components/s-sort.vue +2 -2
- package/components/page-components/s-videos-title.vue +1 -1
- package/components/ui/s-checkbox.vue +1 -1
- package/components/ui/s-chips.vue +2 -2
- package/components/ui/s-country.vue +1 -1
- package/components/ui/s-dropdown.vue +1 -1
- package/components/ui/s-input.vue +2 -2
- package/components/ui/s-model-tag.vue +1 -1
- package/components/ui/s-notification.vue +1 -1
- package/components/ui/s-popup.vue +3 -3
- package/components/ui/s-select.vue +3 -3
- package/components/ui/s-snackbar.vue +3 -3
- package/components/ui/s-timestamp.vue +1 -1
- package/components/video/s-video-autoplay.vue +1 -1
- package/package.json +1 -1
- package/types/raw/raw-category-card.d.ts +1 -1
- package/types/raw/raw-playlist-data.d.ts +4 -4
package/README.md
CHANGED
|
@@ -1,121 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
extends: [
|
|
9
|
-
process.env.LAYER_PATH || '@test/test'
|
|
10
|
-
],
|
|
11
|
-
```
|
|
12
|
-
6) Если не первый раз то обновляем пакет `npm install @test/test@latest`, если пакет уже установлен можно в ручную поменять версию и `npm install` (если пакет недавно обновился, сразу npm install может не подхватить последнюю версию);
|
|
13
|
-
7) `npx nuxi prepare`
|
|
14
|
-
8) если есть проблемы с runtime запустить в пакете npm run dev он перегенерирует tsconfig и eslint.config.mjs
|
|
15
|
-
9) и запускаем либо `npm run dev`
|
|
16
|
-
|
|
17
|
-
`nuxt.config.ts`
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
import { fileURLToPath } from 'node:url'
|
|
21
|
-
import { defineNuxtConfig } from 'nuxt/config'
|
|
22
|
-
|
|
23
|
-
export default defineNuxtConfig({
|
|
24
|
-
modules: ['@nuxt/eslint'],
|
|
25
|
-
eslint: {
|
|
26
|
-
config: {
|
|
27
|
-
// Use the generated ESLint config for lint root project as well
|
|
28
|
-
rootDir: fileURLToPath(new URL('..', import.meta.url))
|
|
29
|
-
}
|
|
30
|
-
},
|
|
31
|
-
components: {
|
|
32
|
-
dirs: [
|
|
33
|
-
{
|
|
34
|
-
path: './components',
|
|
35
|
-
pathPrefix: false
|
|
36
|
-
}
|
|
37
|
-
]
|
|
38
|
-
}
|
|
39
|
-
})
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
`package.json` - версии nuxt && vue должны быть идентичны проекту
|
|
43
|
-
```bash
|
|
44
|
-
{
|
|
45
|
-
"name": "@test/test", // свое
|
|
46
|
-
"type": "module",
|
|
47
|
-
"version": "0.0.1",
|
|
48
|
-
"main": "./nuxt.config.ts",
|
|
49
|
-
"types": "./types/index.d.ts",
|
|
50
|
-
"exports": {
|
|
51
|
-
".": {
|
|
52
|
-
"types": "./types/index.d.ts",
|
|
53
|
-
"import": "./nuxt.config.ts",
|
|
54
|
-
"default": "./nuxt.config.ts"
|
|
55
|
-
},
|
|
56
|
-
"./types": {
|
|
57
|
-
"types": "./types/index.d.ts",
|
|
58
|
-
"default": "./types/index.d.ts"
|
|
59
|
-
},
|
|
60
|
-
"./runtime": {
|
|
61
|
-
"import": "./runtime/index.ts",
|
|
62
|
-
"default": "./runtime/index.ts"
|
|
63
|
-
},
|
|
64
|
-
"./*": "./*"
|
|
65
|
-
},
|
|
66
|
-
"files": [
|
|
67
|
-
"components/",
|
|
68
|
-
"composables/",
|
|
69
|
-
"types/",
|
|
70
|
-
"nuxt.config.ts"
|
|
71
|
-
],
|
|
72
|
-
"devDependencies": {
|
|
73
|
-
"@nuxt/eslint": "latest",
|
|
74
|
-
"@types/node": "^20.19.19",
|
|
75
|
-
"eslint": "^9.37.0",
|
|
76
|
-
"nuxt": "3.17.6",
|
|
77
|
-
"typescript": "^5.9.3",
|
|
78
|
-
"vue": "3.5.17"
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
Импорт typescript типов осуществляется за счет этих опций
|
|
83
|
-
```
|
|
84
|
-
"types": "./types/index.d.ts",
|
|
85
|
-
"exports": {
|
|
86
|
-
".": {
|
|
87
|
-
"types": "./types/index.d.ts",
|
|
88
|
-
"import": "./nuxt.config.ts",
|
|
89
|
-
"default": "./nuxt.config.ts"
|
|
90
|
-
},
|
|
91
|
-
"./types": {
|
|
92
|
-
"types": "./types/index.d.ts",
|
|
93
|
-
"default": "./types/index.d.ts"
|
|
94
|
-
},
|
|
95
|
-
"./runtime": {
|
|
96
|
-
"import": "./runtime/index.ts",
|
|
97
|
-
"default": "./runtime/index.ts"
|
|
98
|
-
},
|
|
99
|
-
"./*": "./*"
|
|
100
|
-
},
|
|
101
|
-
```
|
|
102
|
-
Где:
|
|
103
|
-
- "types" указывает TypeScript, где лежит корневой файл с типами;
|
|
104
|
-
- "exports" сообщает Node и TS, какие модули доступны для импорта;
|
|
105
|
-
- "./types" позволяет писать коротко:
|
|
1
|
+
Пакет является nuxt layer проектов itube;
|
|
2
|
+
Как работать:
|
|
3
|
+
1) коммитим, потом `npm run patch` - патчит версию;
|
|
4
|
+
2) `npm i itube-specs` ставим пакет в проекте;
|
|
5
|
+
3) Если не первый раз то обновляем пакет `npm install @test/test@latest` или `npm run spec`;
|
|
6
|
+
4) npx nuxi prepare` при необходимости (могут не подсасаться композиблы или компоненты в автоимпорте);
|
|
7
|
+
5) если есть проблемы с runtime запустить в пакете npm run dev он перегенерирует tsconfig и eslint.config.mjs;
|
|
106
8
|
|
|
107
9
|
```
|
|
108
10
|
import type { IUser } from '@test/test/types'
|
|
109
11
|
```
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
`tsconfig.json`
|
|
113
|
-
|
|
114
|
-
```bash
|
|
115
|
-
{
|
|
116
|
-
"extends": "./.nuxt/tsconfig.json",
|
|
117
|
-
"compilerOptions": {
|
|
118
|
-
"types": ["node"]
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
```
|
|
12
|
+
Types не импортируются автоматически, каждый тип в свою очередь экспортируется в index.d.ts (обязательно указывать расширение при эскпорте d.ts) общий файл откуда уже и берутся все типы в проект.
|
|
13
|
+
Все что кроме nuxt сущностей (composables, components) устанавливается прописывается вручную.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
:to="link ? generateLink(`/playlists/${prefix}/${card.id}`) : null"
|
|
7
7
|
>
|
|
8
8
|
<div class="s-video-mini-card__img-wrapper">
|
|
9
|
-
<
|
|
9
|
+
<SImg
|
|
10
10
|
class="s-video-mini-card__img"
|
|
11
11
|
sizes="96px"
|
|
12
12
|
:src="card.thumbUrl"
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
height="64"
|
|
15
15
|
:alt="card.title"
|
|
16
16
|
/>
|
|
17
|
-
<
|
|
17
|
+
<SLabel
|
|
18
18
|
class="s-video-mini-card__duration"
|
|
19
19
|
theme="black"
|
|
20
20
|
:text="duration"
|
|
21
|
-
></
|
|
21
|
+
></SLabel>
|
|
22
22
|
</div>
|
|
23
23
|
<p class="s-video-mini-card__description _truncate">{{ card.title }}</p>
|
|
24
24
|
</component>
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
>
|
|
15
15
|
<slot name="prepend"></slot>
|
|
16
16
|
<slot>
|
|
17
|
-
<
|
|
17
|
+
<SChips
|
|
18
18
|
v-for="item in itemsResult"
|
|
19
19
|
:item="item"
|
|
20
20
|
:key="item.title"
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
class="f-chips-panel__more-wrapper"
|
|
30
30
|
:class="{'--small': mini}"
|
|
31
31
|
>
|
|
32
|
-
<
|
|
32
|
+
<SChips
|
|
33
33
|
class="f-chips-panel__button --more"
|
|
34
34
|
:item="{
|
|
35
35
|
title: moreButtonName,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
2
|
+
<SButton
|
|
3
3
|
class="s-filter-button"
|
|
4
4
|
:size="size"
|
|
5
5
|
:theme="theme"
|
|
@@ -7,17 +7,17 @@
|
|
|
7
7
|
:title="t('filter')"
|
|
8
8
|
@click="emit('update:modelValue', true)"
|
|
9
9
|
>
|
|
10
|
-
<
|
|
10
|
+
<SIcon name="adjustments-horizontal" size="16"/>
|
|
11
11
|
<span class="_from-sm"
|
|
12
12
|
>{{ buttonName }}
|
|
13
13
|
</span>
|
|
14
|
-
<
|
|
14
|
+
<SIcon
|
|
15
15
|
class="s-filter-button__icon _to-sm"
|
|
16
16
|
name="chevron-down"
|
|
17
17
|
size="16"
|
|
18
18
|
:class="{'--open': modelValue}"
|
|
19
19
|
/>
|
|
20
|
-
<
|
|
20
|
+
<SIcon
|
|
21
21
|
v-if="count > 0"
|
|
22
22
|
class="f-filter-button__reset _from-sm"
|
|
23
23
|
name="close"
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
v-if="count > 0"
|
|
31
31
|
class="f-filter-button__mobile-count _to-sm"
|
|
32
32
|
>{{ mobileCount }}</span>
|
|
33
|
-
</
|
|
33
|
+
</SButton>
|
|
34
34
|
</template>
|
|
35
35
|
|
|
36
36
|
<script setup lang="ts">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
3
|
-
<
|
|
2
|
+
<SChipsPanel v-if="items.length > 0">
|
|
3
|
+
<SChips
|
|
4
4
|
v-for="(item, index) in items"
|
|
5
5
|
class="s-filter-chips"
|
|
6
6
|
with-close
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
bright
|
|
9
9
|
:item="item"
|
|
10
10
|
@click="onChipsClick(item)"
|
|
11
|
-
></
|
|
12
|
-
</
|
|
11
|
+
></SChips>
|
|
12
|
+
</SChipsPanel>
|
|
13
13
|
</template>
|
|
14
14
|
|
|
15
15
|
<script setup lang="ts">
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
class="s-filter-page__group-title"
|
|
13
13
|
>
|
|
14
14
|
{{ group?.title }}
|
|
15
|
-
<
|
|
15
|
+
<SIcon
|
|
16
16
|
class="s-filter-page__group-title-icon"
|
|
17
17
|
size="32"
|
|
18
18
|
name="chevron-down"
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
<div class="s-filter-page__items">
|
|
22
22
|
<template v-for="(item, subIndex) in filters">
|
|
23
23
|
<ClientOnly>
|
|
24
|
-
<
|
|
24
|
+
<SSlider
|
|
25
25
|
v-if="(item.kind === 'range') && (item.group.name === group?.name)"
|
|
26
26
|
:min="getRangeInfo(item.options)?.min"
|
|
27
27
|
:max="getRangeInfo(item.options)?.max"
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
@update:model-value="val => updateRangeFilter(item, val)"
|
|
39
39
|
/>
|
|
40
40
|
</ClientOnly>
|
|
41
|
-
<
|
|
41
|
+
<SSelect
|
|
42
42
|
v-if="(item.kind === 'select') && (item.group.name === group?.name)"
|
|
43
43
|
:name="item.name"
|
|
44
44
|
:model-value="getSelectValue(item.name)"
|
|
@@ -55,18 +55,18 @@
|
|
|
55
55
|
</div>
|
|
56
56
|
<div class="s-filter-page__footer _from-sm">
|
|
57
57
|
<p class="s-filter-page__footer-results">
|
|
58
|
-
<
|
|
58
|
+
<SIcon name="filter" size="24"/>
|
|
59
59
|
<span class="s-filter-page__footer-text">{{ `${count} ${t('results_found')}` }}</span>
|
|
60
60
|
</p>
|
|
61
61
|
<div class="s-filter-page__footer-buttons">
|
|
62
|
-
<
|
|
62
|
+
<SButton
|
|
63
63
|
wide
|
|
64
64
|
class="s-filter-page__reset"
|
|
65
65
|
:disabled="!isFiltered"
|
|
66
66
|
@click="onResetClick"
|
|
67
67
|
theme="secondary"
|
|
68
68
|
>{{ t('reset_all') }}
|
|
69
|
-
</
|
|
69
|
+
</SButton>
|
|
70
70
|
</div>
|
|
71
71
|
</div>
|
|
72
72
|
</div>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
2
|
+
<SPopup
|
|
3
3
|
v-model="isOpen"
|
|
4
4
|
v-if="isOpen"
|
|
5
5
|
sheet
|
|
@@ -9,14 +9,14 @@
|
|
|
9
9
|
|
|
10
10
|
<template #fixedContent>
|
|
11
11
|
<div class="s-filter-popup__main-filters">
|
|
12
|
-
<
|
|
12
|
+
<SSelect
|
|
13
13
|
name="duration"
|
|
14
14
|
v-model="durationValue"
|
|
15
15
|
:items="durationItems"
|
|
16
16
|
:placeholder="t('duration')"
|
|
17
17
|
icon="tape"
|
|
18
18
|
/>
|
|
19
|
-
<
|
|
19
|
+
<SSelect
|
|
20
20
|
name="added"
|
|
21
21
|
v-model="addedValue"
|
|
22
22
|
:items="addedItems"
|
|
@@ -31,12 +31,12 @@
|
|
|
31
31
|
v-for="(item, index) in scheme"
|
|
32
32
|
:key="`scheme-${index}`"
|
|
33
33
|
>
|
|
34
|
-
<
|
|
34
|
+
<SInput
|
|
35
35
|
v-if="item.type === 'input'"
|
|
36
36
|
v-model="filterValue[item.title]"
|
|
37
37
|
:label="item?.label"
|
|
38
38
|
/>
|
|
39
|
-
<
|
|
39
|
+
<SSelect
|
|
40
40
|
v-if="item.type === 'select'"
|
|
41
41
|
:name="item.title"
|
|
42
42
|
v-model="filterValue[item.title]"
|
|
@@ -49,21 +49,21 @@
|
|
|
49
49
|
|
|
50
50
|
<template #footer>
|
|
51
51
|
<div class="s-filter-popup__buttons">
|
|
52
|
-
<
|
|
52
|
+
<SButton
|
|
53
53
|
theme="secondary"
|
|
54
54
|
wide
|
|
55
55
|
:disabled="!isFiltered"
|
|
56
56
|
@click="reset"
|
|
57
57
|
>{{ t('reset_all') }}
|
|
58
|
-
</
|
|
59
|
-
<
|
|
58
|
+
</SButton>
|
|
59
|
+
<SButton
|
|
60
60
|
wide
|
|
61
61
|
@click="saveResult"
|
|
62
62
|
>{{ t('apply') }}
|
|
63
|
-
</
|
|
63
|
+
</SButton>
|
|
64
64
|
</div>
|
|
65
65
|
</template>
|
|
66
|
-
</
|
|
66
|
+
</SPopup>
|
|
67
67
|
</template>
|
|
68
68
|
|
|
69
69
|
<script setup lang="ts">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="s-filter">
|
|
3
|
-
<
|
|
3
|
+
<SFilterButton
|
|
4
4
|
:count="filterCount"
|
|
5
5
|
v-model="filterOpen"
|
|
6
6
|
:theme="buttonTheme"
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
/>
|
|
9
9
|
|
|
10
10
|
<transition>
|
|
11
|
-
<
|
|
11
|
+
<SFilterPopup
|
|
12
12
|
v-if="filterOpen"
|
|
13
13
|
v-model="filterOpen"
|
|
14
14
|
:scheme="scheme"
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
3
|
-
<
|
|
2
|
+
<SFilterModelChips :filters="data.filters"/>
|
|
3
|
+
<SFilterPage
|
|
4
4
|
class="s-model-filters__filters _from-sm"
|
|
5
5
|
:filters="data.filters"
|
|
6
6
|
:count="data.total"
|
|
7
7
|
:class="{'_loading': status === 'pending'}"
|
|
8
8
|
/>
|
|
9
9
|
<transition>
|
|
10
|
-
<
|
|
10
|
+
<SPopup
|
|
11
11
|
v-if="model"
|
|
12
12
|
v-model="model"
|
|
13
13
|
sheet
|
|
14
14
|
class="s-model-filters__popup"
|
|
15
15
|
>
|
|
16
16
|
<template #title>{{ popupTitle }}</template>
|
|
17
|
-
<
|
|
17
|
+
<SFilterPage
|
|
18
18
|
class="s-model-filters__filters _to-sm"
|
|
19
19
|
:filters="data.filters"
|
|
20
20
|
:count="data.total"
|
|
@@ -22,23 +22,23 @@
|
|
|
22
22
|
/>
|
|
23
23
|
<template #footer>
|
|
24
24
|
<div class="s-model-filters__footer-buttons _to-sm">
|
|
25
|
-
<
|
|
25
|
+
<SButton
|
|
26
26
|
wide
|
|
27
27
|
class="s-model-filters__reset"
|
|
28
28
|
:disabled="!isFiltered"
|
|
29
29
|
@click="onResetClick"
|
|
30
30
|
theme="secondary"
|
|
31
31
|
>{{ t('reset_all') }}
|
|
32
|
-
</
|
|
33
|
-
<
|
|
32
|
+
</SButton>
|
|
33
|
+
<SButton
|
|
34
34
|
wide
|
|
35
35
|
class="_to-sm"
|
|
36
36
|
@click="onShowClick"
|
|
37
37
|
>{{ `${t('show_results')} (${data.total})` }}
|
|
38
|
-
</
|
|
38
|
+
</SButton>
|
|
39
39
|
</div>
|
|
40
40
|
</template>
|
|
41
|
-
</
|
|
41
|
+
</SPopup>
|
|
42
42
|
</transition>
|
|
43
43
|
</template>
|
|
44
44
|
|
|
@@ -88,32 +88,32 @@
|
|
|
88
88
|
</NuxtLink>
|
|
89
89
|
</template>
|
|
90
90
|
</div>
|
|
91
|
-
<
|
|
91
|
+
<SLink
|
|
92
92
|
wide
|
|
93
93
|
class="f-pagination__prev"
|
|
94
94
|
:to="linkTo(previousValue)"
|
|
95
95
|
:class="{'--disabled': activeNumber <= 1}"
|
|
96
96
|
>
|
|
97
|
-
<
|
|
97
|
+
<SIcon
|
|
98
98
|
v-if="arrowIcon"
|
|
99
99
|
name="arrow-left"
|
|
100
100
|
size="24"
|
|
101
101
|
/>
|
|
102
102
|
{{ t('previous' )}}
|
|
103
|
-
</
|
|
104
|
-
<
|
|
103
|
+
</SLink>
|
|
104
|
+
<SLink
|
|
105
105
|
wide
|
|
106
106
|
class="f-pagination__next"
|
|
107
107
|
:class="{'--disabled': activeNumber >= length}"
|
|
108
108
|
:to="linkTo(nextValue)"
|
|
109
109
|
>
|
|
110
110
|
{{ t('next') }}
|
|
111
|
-
<
|
|
111
|
+
<SIcon
|
|
112
112
|
v-if="arrowIcon"
|
|
113
113
|
name="arrow-right"
|
|
114
114
|
size="24"
|
|
115
115
|
/>
|
|
116
|
-
</
|
|
116
|
+
</SLink>
|
|
117
117
|
</nav>
|
|
118
118
|
</template>
|
|
119
119
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<transition mode="out-in">
|
|
3
|
-
<
|
|
3
|
+
<SPopup
|
|
4
4
|
v-if="isReportPopupOpen"
|
|
5
5
|
v-model="isReportPopupOpen"
|
|
6
6
|
>
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
class="f-report__form-button"
|
|
26
26
|
>
|
|
27
27
|
{{ t(`report_form.${item.title}`) }}
|
|
28
|
-
<
|
|
28
|
+
<SIcon
|
|
29
29
|
class="f-report__form-icon"
|
|
30
30
|
name="chevron-down"
|
|
31
31
|
size="24"
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
v-for="(subItem, subIndex) in item.items"
|
|
57
57
|
:key="`${subItem.label}-${subIndex}`"
|
|
58
58
|
>
|
|
59
|
-
<
|
|
59
|
+
<SInput
|
|
60
60
|
v-if="['text', 'tel', 'textarea'].includes(subItem.type)"
|
|
61
61
|
v-model="form.data[subItem.value] as string"
|
|
62
62
|
:key="`report-form-${index}`"
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
:error="error[subItem.value]"
|
|
68
68
|
@update:error="(val: boolean) => error[subItem.value] = val"
|
|
69
69
|
/>
|
|
70
|
-
<
|
|
70
|
+
<SCheckbox
|
|
71
71
|
v-if="subItem.type === 'checkbox'"
|
|
72
72
|
v-model="form.data[subItem.value] as boolean"
|
|
73
73
|
class="--wide"
|
|
@@ -75,8 +75,8 @@
|
|
|
75
75
|
:error="error[subItem.value]"
|
|
76
76
|
@update:error="(val: boolean) => error[subItem.value] = val"
|
|
77
77
|
>{{ t(`report_form.${subItem.text}`) }}
|
|
78
|
-
</
|
|
79
|
-
<
|
|
78
|
+
</SCheckbox>
|
|
79
|
+
<SRadio
|
|
80
80
|
v-if="subItem.type === 'radio' "
|
|
81
81
|
v-model="reasonValue"
|
|
82
82
|
name="report-radio-value"
|
|
@@ -89,22 +89,22 @@
|
|
|
89
89
|
/>
|
|
90
90
|
</template>
|
|
91
91
|
</form>
|
|
92
|
-
<
|
|
92
|
+
<SButton
|
|
93
93
|
:disabled="loading"
|
|
94
94
|
wide
|
|
95
95
|
@click="submit"
|
|
96
96
|
>{{ t('report_form.send_report') }}
|
|
97
|
-
</
|
|
97
|
+
</SButton>
|
|
98
98
|
</details>
|
|
99
99
|
</div>
|
|
100
|
-
<
|
|
100
|
+
<SButton
|
|
101
101
|
wide
|
|
102
102
|
theme="secondary"
|
|
103
103
|
@click="closeReportPopup"
|
|
104
104
|
>{{ t('cancel') }}
|
|
105
|
-
</
|
|
105
|
+
</SButton>
|
|
106
106
|
</div>
|
|
107
|
-
</
|
|
107
|
+
</SPopup>
|
|
108
108
|
</transition>
|
|
109
109
|
</template>
|
|
110
110
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<transition mode="out-in">
|
|
3
|
-
<
|
|
3
|
+
<SPopup
|
|
4
4
|
v-model="isSharePopupOpen"
|
|
5
5
|
v-if="isSharePopupOpen"
|
|
6
6
|
sheet
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
:key="`share-button-${index}`"
|
|
21
21
|
:href="item.link"
|
|
22
22
|
>
|
|
23
|
-
<
|
|
23
|
+
<SImg
|
|
24
24
|
sizes="24px"
|
|
25
25
|
width="24"
|
|
26
26
|
height="24"
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
{{ item.text }}
|
|
30
30
|
</a>
|
|
31
31
|
</div>
|
|
32
|
-
<
|
|
32
|
+
<SInput
|
|
33
33
|
class="f-share__copy"
|
|
34
34
|
:label="inputText"
|
|
35
35
|
:title="fullUrl"
|
|
@@ -38,13 +38,13 @@
|
|
|
38
38
|
:model-value="fullUrl"
|
|
39
39
|
@click="copyUrl"
|
|
40
40
|
/>
|
|
41
|
-
<
|
|
41
|
+
<SButton
|
|
42
42
|
wide
|
|
43
43
|
theme="ghost"
|
|
44
44
|
@click="closeSharePopup"
|
|
45
|
-
>{{ $t('cancel') }}</
|
|
45
|
+
>{{ $t('cancel') }}</SButton>
|
|
46
46
|
</div>
|
|
47
|
-
</
|
|
47
|
+
</SPopup>
|
|
48
48
|
</transition>
|
|
49
49
|
</template>
|
|
50
50
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="f-sort">
|
|
3
|
-
<
|
|
3
|
+
<SLink
|
|
4
4
|
class="f-sort__button"
|
|
5
5
|
v-for="(item, index) in items"
|
|
6
6
|
:key="`sort-item-${index}`"
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
:theme="theme"
|
|
11
11
|
>
|
|
12
12
|
{{ t(item.title) }}
|
|
13
|
-
</
|
|
13
|
+
</SLink>
|
|
14
14
|
</div>
|
|
15
15
|
</template>
|
|
16
16
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<component :is="titleTag" class="f-videos-title__title _title">
|
|
4
4
|
<slot></slot>
|
|
5
5
|
</component>
|
|
6
|
-
<
|
|
6
|
+
<SCount class="f-videos-title__count" v-if="count">{{ count }}</SCount>
|
|
7
7
|
</div>
|
|
8
8
|
</template>
|
|
9
9
|
|
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
:title="name"
|
|
15
15
|
@click="onButtonClick"
|
|
16
16
|
>
|
|
17
|
-
<
|
|
17
|
+
<SIcon
|
|
18
18
|
v-if="item.icon"
|
|
19
19
|
:name="item.icon"
|
|
20
20
|
size="16"
|
|
21
21
|
/>
|
|
22
22
|
{{ name }}
|
|
23
|
-
<
|
|
23
|
+
<SIcon
|
|
24
24
|
v-if="(isActive && !withoutClose && item.value !== 'reset' && !mini) || withClose"
|
|
25
25
|
class="s-chips__close"
|
|
26
26
|
name="close"
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
class="f-input__button"
|
|
66
66
|
@click="onButtonInputClick"
|
|
67
67
|
>
|
|
68
|
-
<
|
|
68
|
+
<SIcon
|
|
69
69
|
:name="isPassword ? 'show' : icon || ''"
|
|
70
70
|
class="f-input__button-icon"
|
|
71
71
|
size="24"
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
<!-- v-if="error"-->
|
|
77
77
|
<!-- class="f-input__error"-->
|
|
78
78
|
<!-- >-->
|
|
79
|
-
<!-- <
|
|
79
|
+
<!-- <SIcon-->
|
|
80
80
|
<!-- name="danger"-->
|
|
81
81
|
<!-- size="16"-->
|
|
82
82
|
<!-- />-->
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
type="button"
|
|
39
39
|
@click="$emit('back')"
|
|
40
40
|
>
|
|
41
|
-
<
|
|
41
|
+
<SIcon name="angle-left" size="24" />
|
|
42
42
|
</button>
|
|
43
43
|
<div
|
|
44
44
|
v-if="$slots.title"
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
type="button"
|
|
52
52
|
@click="close"
|
|
53
53
|
>
|
|
54
|
-
<
|
|
54
|
+
<SIcon name="close" size="24" />
|
|
55
55
|
</button>
|
|
56
56
|
</header>
|
|
57
57
|
<div
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
</div>
|
|
76
76
|
|
|
77
77
|
<transition mode="out-in">
|
|
78
|
-
<
|
|
78
|
+
<SSnackbar
|
|
79
79
|
v-if="snackbarText && isSnackBarInPopup"
|
|
80
80
|
/>
|
|
81
81
|
</transition>
|
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
>
|
|
13
13
|
<span class="s-select__label" v-if="label">
|
|
14
14
|
{{ label }}
|
|
15
|
-
<
|
|
15
|
+
<SCount class="s-select__count" v-if="count">{{ count }}</SCount>
|
|
16
16
|
</span>
|
|
17
17
|
<span class="s-select__wrapper">
|
|
18
|
-
<
|
|
18
|
+
<SIcon
|
|
19
19
|
v-if="icon"
|
|
20
20
|
:name="icon"
|
|
21
21
|
size="24"
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
:selected="item.value === modelValue && item.value !== placeholder"
|
|
44
44
|
>{{ capitalize(item.title as string || item.name as string) }}</option>
|
|
45
45
|
</select>
|
|
46
|
-
<
|
|
46
|
+
<SIcon
|
|
47
47
|
class="s-select__icon"
|
|
48
48
|
name="dropdown"
|
|
49
49
|
size="24"
|
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
class="s-snackbar"
|
|
4
4
|
:class="`--${snackbarTheme}`"
|
|
5
5
|
>
|
|
6
|
-
<
|
|
6
|
+
<SIcon class="s-snackbar__icon" :name="snackbarIcon" size="24"/>
|
|
7
7
|
{{
|
|
8
8
|
te(`snackbar.${convertSnackKey}`)
|
|
9
9
|
? t(`snackbar.${convertSnackKey}`)
|
|
10
10
|
: t('snackbar.something_went_wrong')
|
|
11
11
|
}}
|
|
12
|
-
<
|
|
12
|
+
<SButton
|
|
13
13
|
theme="secondary"
|
|
14
14
|
size="s"
|
|
15
15
|
@click="close"
|
|
16
16
|
>{{ t('close') }}
|
|
17
|
-
</
|
|
17
|
+
</SButton>
|
|
18
18
|
</div>
|
|
19
19
|
</template>
|
|
20
20
|
|
package/package.json
CHANGED
|
@@ -13,7 +13,7 @@ export interface IRawCategoryCard {
|
|
|
13
13
|
language_title: string; // unused
|
|
14
14
|
is_top: boolean; // unused
|
|
15
15
|
is_primary_filter: boolean; // unused
|
|
16
|
-
videosCount: number; // ✅ used (в
|
|
16
|
+
videosCount: number; // ✅ used (в SLabel)
|
|
17
17
|
video_guid: string; // unused
|
|
18
18
|
video_md5: string; // unused
|
|
19
19
|
thumb_number: number; // unused
|
|
@@ -10,7 +10,7 @@ export interface IPlaylistThumb {
|
|
|
10
10
|
export interface IRawPlaylistData {
|
|
11
11
|
guid: string; // unused
|
|
12
12
|
created: number; // unused
|
|
13
|
-
updated: number; // ✅ used → <
|
|
13
|
+
updated: number; // ✅ used → <SInfoChips :updated="playlistsData.updated" />
|
|
14
14
|
id: string; // ✅ used → :playlist-id="playlistsData.id", link to `/playlists/${id}`
|
|
15
15
|
name: string; // ✅ used → title, heading, dropdown alignment
|
|
16
16
|
identity_guid: string; // unused
|
|
@@ -19,10 +19,10 @@ export interface IRawPlaylistData {
|
|
|
19
19
|
niche: string; // unused
|
|
20
20
|
domain: string; // unused
|
|
21
21
|
thumbs: IPlaylistThumb[]; // unused
|
|
22
|
-
videos_count: number; // ✅ used → <
|
|
23
|
-
first_video_id: string; // ✅ used → <
|
|
22
|
+
videos_count: number; // ✅ used → <SInfoChips :videos-count="..." />
|
|
23
|
+
first_video_id: string; // ✅ used → <SLink :to="`/playlists/${id}/${firstVideoId}`" />
|
|
24
24
|
search_tags: string[]; // ✅ used → searchTags computed
|
|
25
|
-
views: number; // ✅ used → <
|
|
25
|
+
views: number; // ✅ used → <SInfoChips :views="..." />
|
|
26
26
|
likes: number; // ✅ used (but assigned as **dislikes**)
|
|
27
27
|
dislikes: number; // ✅ used (but assigned as **likes**)
|
|
28
28
|
available_videos: number; // unused
|