itube-specs 0.0.793 → 0.0.795
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 +18 -25
- package/components/adv/native-banner.vue +22 -17
- package/components/adv/native-bottom.vue +8 -6
- package/components/adv/native-player.vue +8 -6
- package/components/adv/ntv.vue +4 -3
- package/components/auth/icon.vue +4 -3
- package/components/auth/login.vue +39 -33
- package/components/auth/popup.vue +30 -24
- package/components/auth/recovery.vue +29 -24
- package/components/auth/register.vue +59 -50
- package/components/card/category-mini.vue +6 -4
- package/components/card/category.vue +25 -21
- package/components/card/channel-mini.vue +17 -13
- package/components/card/channel.vue +36 -29
- package/components/card/model-mini.vue +24 -19
- package/components/card/model.vue +43 -33
- package/components/card/playlist-mini.vue +19 -16
- package/components/card/playlist.vue +97 -73
- package/components/card/round.vue +16 -13
- package/components/card/video/dropdown.vue +55 -41
- package/components/card/video/index.vue +99 -81
- package/components/card/video/mini.vue +19 -15
- package/components/card/video/preview.vue +7 -6
- package/components/category/by-letter.vue +4 -3
- package/components/category/group.vue +18 -13
- package/components/category/letter-groups.vue +4 -3
- package/components/category/list.vue +19 -16
- package/components/category/nav.vue +15 -12
- package/components/filter/btn.vue +13 -10
- package/components/filter/chips.vue +8 -7
- package/components/filter/main.vue +27 -23
- package/components/filter/model-field.vue +43 -38
- package/components/filter/model.vue +33 -28
- package/components/filter/page.vue +53 -43
- package/components/filter/popup.vue +75 -60
- package/components/filter/selects.vue +63 -49
- package/components/filter/slider.vue +23 -20
- package/components/filter/videos-chips.vue +3 -2
- package/components/grid/categories.vue +5 -4
- package/components/grid/channels.vue +9 -7
- package/components/grid/models.vue +10 -8
- package/components/grid/playlists.vue +6 -5
- package/components/grid/videos.vue +35 -31
- package/components/info/grid.vue +43 -34
- package/components/info/main.vue +94 -71
- package/components/info/socials.vue +13 -11
- package/components/layout/burger-item.vue +44 -36
- package/components/layout/burger.vue +45 -35
- package/components/layout/cookie.vue +14 -11
- package/components/layout/extra-links.vue +6 -5
- package/components/layout/footer-language.vue +35 -28
- package/components/layout/header-user.vue +66 -51
- package/components/layout/header.vue +55 -42
- package/components/layout/language.vue +67 -54
- package/components/layout/logo.vue +11 -9
- package/components/layout/nav.vue +36 -29
- package/components/layout/skip-link.vue +3 -2
- package/components/player/aside-videos.vue +10 -8
- package/components/player/autoplay.vue +7 -5
- package/components/player/channel.vue +25 -19
- package/components/player/core.vue +11 -10
- package/components/player/follow.vue +17 -13
- package/components/player/info.vue +9 -6
- package/components/player/interface.vue +50 -38
- package/components/player/like.vue +32 -24
- package/components/player/main.vue +12 -10
- package/components/player/playlist.vue +79 -61
- package/components/player/sponsored.vue +20 -16
- package/components/playlist/add.vue +89 -71
- package/components/playlist/delete-video.vue +23 -18
- package/components/playlist/edit.vue +64 -49
- package/components/playlist/input.vue +32 -24
- package/components/playlist/main.vue +21 -18
- package/components/playlist/private-toggle.vue +4 -3
- package/components/profile/delete.vue +7 -6
- package/components/profile/guest.vue +10 -7
- package/components/profile/password.vue +25 -22
- package/components/profile/setup.vue +88 -71
- package/components/report/main.vue +89 -71
- package/components/search/input.vue +37 -31
- package/components/search/item.vue +22 -18
- package/components/search/main.vue +34 -26
- package/components/search/result.vue +72 -57
- package/components/section/categories-island.server.vue +7 -5
- package/components/section/categories.vue +4 -3
- package/components/section/models.vue +4 -3
- package/components/section/nav-links.vue +8 -7
- package/components/section/seo-text.vue +9 -6
- package/components/section/swiper-cards.vue +19 -14
- package/components/section/toolbar.vue +26 -20
- package/components/share/main.vue +32 -26
- package/components/ui/avatar.vue +10 -8
- package/components/ui/breadcrumbs.vue +33 -25
- package/components/ui/btn.vue +13 -12
- package/components/ui/checkbox.vue +21 -17
- package/components/ui/chips.vue +33 -29
- package/components/ui/count.vue +4 -3
- package/components/ui/dropdown.vue +42 -34
- package/components/ui/empty-state.vue +11 -9
- package/components/ui/expand-row.vue +34 -28
- package/components/ui/full-descr.vue +6 -4
- package/components/ui/icon.vue +4 -3
- package/components/ui/img.vue +11 -10
- package/components/ui/input.vue +75 -66
- package/components/ui/label.vue +4 -3
- package/components/ui/link.vue +20 -18
- package/components/ui/notification.vue +22 -17
- package/components/ui/pagination.vue +89 -76
- package/components/ui/popup.vue +39 -30
- package/components/ui/radio.vue +17 -14
- package/components/ui/section-title.vue +20 -15
- package/components/ui/segmented.vue +19 -15
- package/components/ui/select.vue +44 -35
- package/components/ui/slider.vue +16 -13
- package/components/ui/snackbar.vue +7 -5
- package/components/ui/swiper.vue +32 -24
- package/components/ui/toggle.vue +17 -14
- package/components/ui/tooltip.vue +15 -12
- package/components/view/model-videos.vue +71 -57
- package/components/view/models.vue +71 -57
- package/components/view/video.vue +64 -51
- package/components/view/videos.vue +55 -45
- package/package.json +1 -1
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
<!-- Мини-карточка канала: логотип слева, название, счётчик видео (горизонтальная) -->
|
|
2
2
|
<template>
|
|
3
3
|
<div class="card-channel-mini">
|
|
4
|
-
<img
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
<img
|
|
5
|
+
v-if="card.avatarUrl && !imageError"
|
|
6
|
+
:src="card.avatarUrl"
|
|
7
|
+
:alt="card.name"
|
|
8
|
+
class="card-channel-mini__logo"
|
|
9
|
+
width="64"
|
|
10
|
+
height="64"
|
|
11
|
+
@error="imageError = true"
|
|
11
12
|
>
|
|
12
|
-
<span
|
|
13
|
-
|
|
13
|
+
<span
|
|
14
|
+
v-else
|
|
15
|
+
class="card-channel-mini__logo --placeholder"
|
|
14
16
|
>
|
|
15
17
|
{{ card.name.charAt(0) }}
|
|
16
18
|
</span>
|
|
@@ -18,13 +20,15 @@
|
|
|
18
20
|
<p class="card-channel-mini__name">{{ card.name }}</p>
|
|
19
21
|
<div class="card-channel-mini__info">
|
|
20
22
|
<span class="card-channel-mini__detail">
|
|
21
|
-
<UiIcon
|
|
22
|
-
|
|
23
|
+
<UiIcon
|
|
24
|
+
name="video-camera"
|
|
25
|
+
size="14"
|
|
23
26
|
/>
|
|
24
27
|
{{ card.videosCount }}
|
|
25
28
|
</span>
|
|
26
|
-
<span
|
|
27
|
-
|
|
29
|
+
<span
|
|
30
|
+
v-if="$features.FeatureFollowEnabled"
|
|
31
|
+
class="card-channel-mini__detail"
|
|
28
32
|
>{{ $n(8400, 'compact') }}</span>
|
|
29
33
|
</div>
|
|
30
34
|
</div>
|
|
@@ -1,48 +1,55 @@
|
|
|
1
1
|
<!-- Карточка канала: обложка 16:9, логотип, статистика (видео/подписчики/дата) -->
|
|
2
2
|
<template>
|
|
3
|
-
<NuxtLink
|
|
4
|
-
|
|
3
|
+
<NuxtLink
|
|
4
|
+
:to="generateLink(`/channels/${slug}`)"
|
|
5
|
+
class="card-channel"
|
|
5
6
|
>
|
|
6
7
|
<div class="card-channel__img-wrapper">
|
|
7
|
-
<UiImg
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
<UiImg
|
|
9
|
+
:src="currentImage"
|
|
10
|
+
:urls="card.thumbUrls"
|
|
11
|
+
:sizes="`(max-width: ${CSS_BREAKPOINTS.lg}px) 50vw, 480px`"
|
|
12
|
+
:alt="card.name"
|
|
13
|
+
:loading="priority ? 'eager' : 'lazy'"
|
|
14
|
+
:priority="priority"
|
|
15
|
+
class="card-channel__img"
|
|
16
|
+
width="480"
|
|
17
|
+
height="270"
|
|
18
|
+
@error="onImageError"
|
|
17
19
|
/>
|
|
18
|
-
<UiLabel
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
<UiLabel
|
|
21
|
+
v-if="card.isNetwork"
|
|
22
|
+
:text="$t('network')"
|
|
23
|
+
class="card-channel__label"
|
|
24
|
+
theme="primary"
|
|
22
25
|
/>
|
|
23
26
|
</div>
|
|
24
27
|
<div class="card-channel__container">
|
|
25
|
-
<img
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
<img
|
|
29
|
+
v-if="card.avatarUrl"
|
|
30
|
+
:src="card.avatarUrl"
|
|
31
|
+
:alt="card.name"
|
|
32
|
+
class="card-channel__logo _from-xs"
|
|
33
|
+
width="32"
|
|
34
|
+
height="32"
|
|
31
35
|
>
|
|
32
|
-
<span
|
|
33
|
-
|
|
36
|
+
<span
|
|
37
|
+
v-else
|
|
38
|
+
class="card-channel__logo --placeholder _from-xs"
|
|
34
39
|
>
|
|
35
40
|
{{ logoPlaceholder }}
|
|
36
41
|
</span>
|
|
37
42
|
<span class="card-channel__title _truncate">{{ card.name }}
|
|
38
43
|
</span>
|
|
39
44
|
<div class="card-channel__info-wrapper">
|
|
40
|
-
<p
|
|
41
|
-
|
|
42
|
-
|
|
45
|
+
<p
|
|
46
|
+
v-for="(item, index) in infoItems"
|
|
47
|
+
:key="`channel-info-${index}`"
|
|
48
|
+
class="card-channel__info"
|
|
43
49
|
>
|
|
44
|
-
<UiIcon
|
|
45
|
-
|
|
50
|
+
<UiIcon
|
|
51
|
+
:name="item.icon"
|
|
52
|
+
size="14"
|
|
46
53
|
/>
|
|
47
54
|
{{ item.text }}
|
|
48
55
|
</p>
|
|
@@ -1,36 +1,41 @@
|
|
|
1
1
|
<!-- Мини-карточка модели: аватар слева, имя, возраст/счётчик видео -->
|
|
2
2
|
<template>
|
|
3
3
|
<div class="card-model-mini">
|
|
4
|
-
<UiImg
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
<UiImg
|
|
5
|
+
:src="currentImage"
|
|
6
|
+
:alt="card.title"
|
|
7
|
+
class="card-model-mini__img"
|
|
8
|
+
width="48"
|
|
9
|
+
height="48"
|
|
10
|
+
sizes="48px"
|
|
11
|
+
@error="imageError = true"
|
|
11
12
|
/>
|
|
12
13
|
<div class="card-model-mini__wrapper">
|
|
13
14
|
<p class="card-model-mini__name">
|
|
14
15
|
{{ card.title }}
|
|
15
|
-
<img
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
<img
|
|
17
|
+
v-if="card.country"
|
|
18
|
+
:alt="card.country"
|
|
19
|
+
:src="`/icons/flags/${card.country}.svg`"
|
|
20
|
+
class="card-model-mini__flag"
|
|
21
|
+
width="16"
|
|
22
|
+
height="12"
|
|
21
23
|
>
|
|
22
24
|
</p>
|
|
23
25
|
<div class="card-model-mini__info">
|
|
24
|
-
<span
|
|
25
|
-
|
|
26
|
+
<span
|
|
27
|
+
v-if="card.videosCount"
|
|
28
|
+
class="card-model-mini__detail"
|
|
26
29
|
>
|
|
27
|
-
<UiIcon
|
|
28
|
-
|
|
30
|
+
<UiIcon
|
|
31
|
+
name="video-camera"
|
|
32
|
+
size="14"
|
|
29
33
|
/>
|
|
30
34
|
{{ card.videosCount }}
|
|
31
35
|
</span>
|
|
32
|
-
<span
|
|
33
|
-
|
|
36
|
+
<span
|
|
37
|
+
v-if="card.age"
|
|
38
|
+
class="card-model-mini__detail"
|
|
34
39
|
>{{ card.age }} {{ $t('yo') }}</span>
|
|
35
40
|
</div>
|
|
36
41
|
</div>
|
|
@@ -1,61 +1,71 @@
|
|
|
1
1
|
<!-- Карточка модели: аватар, параметры, страна, счётчики видео/обновлений -->
|
|
2
2
|
<template>
|
|
3
|
-
<NuxtLink
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
<NuxtLink
|
|
4
|
+
:to="generateLink(`/models/${convertString().toSlug(card.title)}`)"
|
|
5
|
+
:title="card.title"
|
|
6
|
+
class="card-model"
|
|
6
7
|
>
|
|
7
8
|
<div class="card-model__inner">
|
|
8
|
-
<UiImg
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
<UiImg
|
|
10
|
+
:src="currentImage"
|
|
11
|
+
:loading="loading"
|
|
12
|
+
:alt="card.title"
|
|
13
|
+
:priority="priority"
|
|
14
|
+
class="card-model__img"
|
|
15
|
+
width="64"
|
|
16
|
+
height="64"
|
|
17
|
+
sizes="xs:64px sm:64px md:64px lg:64px"
|
|
18
|
+
@error="onImageError"
|
|
17
19
|
/>
|
|
18
20
|
<div class="card-model__wrapper">
|
|
19
21
|
<p class="card-model__info">
|
|
20
22
|
<span class="card-model__info-name">
|
|
21
23
|
{{ card.title }}
|
|
22
24
|
</span>
|
|
23
|
-
<span
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
<span
|
|
26
|
+
v-if="card.country && card.country.name"
|
|
27
|
+
:title="`${t('birthplace_country')}: ${card.country.title}`"
|
|
28
|
+
class="card-model__country-wrapper"
|
|
26
29
|
>
|
|
27
|
-
<img
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
<img
|
|
31
|
+
:alt="card.country.title"
|
|
32
|
+
:src="`/icons/flags/${card.country.name}.svg`"
|
|
33
|
+
class="card-model__info-country"
|
|
34
|
+
width="16"
|
|
35
|
+
height="12"
|
|
32
36
|
>
|
|
33
37
|
</span>
|
|
34
38
|
</p>
|
|
35
39
|
<p class="card-model__parameters">
|
|
36
|
-
<span
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
<span
|
|
41
|
+
v-for="(parameter, index) in card.parameters"
|
|
42
|
+
:key="`parameter-${index}`"
|
|
43
|
+
class="card-model__parameter"
|
|
39
44
|
>
|
|
40
|
-
<span
|
|
41
|
-
|
|
45
|
+
<span
|
|
46
|
+
v-if="parameter.title"
|
|
47
|
+
class="card-model__parameter-title"
|
|
42
48
|
>{{ getValue(parameter) }}</span>
|
|
43
49
|
</span>
|
|
44
50
|
</p>
|
|
45
51
|
<p class="card-model__parameters-footer">
|
|
46
|
-
<span
|
|
47
|
-
|
|
52
|
+
<span
|
|
53
|
+
v-if="card.videosCount"
|
|
54
|
+
class="card-model__count"
|
|
48
55
|
>
|
|
49
|
-
<UiIcon
|
|
50
|
-
|
|
56
|
+
<UiIcon
|
|
57
|
+
name="video-camera"
|
|
58
|
+
size="14"
|
|
51
59
|
/>
|
|
52
60
|
{{ $n(card.videosCount, 'compact') }}
|
|
53
61
|
</span>
|
|
54
|
-
<span
|
|
55
|
-
|
|
62
|
+
<span
|
|
63
|
+
v-if="card.lastVideoAddedAt"
|
|
64
|
+
class="card-model__update"
|
|
56
65
|
>
|
|
57
|
-
<UiIcon
|
|
58
|
-
|
|
66
|
+
<UiIcon
|
|
67
|
+
name="time-updated"
|
|
68
|
+
size="14"
|
|
59
69
|
/>
|
|
60
70
|
{{ formatDate(card.lastVideoAddedAt) }}
|
|
61
71
|
</span>
|
|
@@ -1,29 +1,32 @@
|
|
|
1
1
|
<!-- Мини-карточка плейлиста: мозаика обложек слева + название/автор -->
|
|
2
2
|
<template>
|
|
3
3
|
<div class="card-playlist-mini">
|
|
4
|
-
<div
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
<div
|
|
5
|
+
:class="[
|
|
6
|
+
`--${card.thumbUrls?.length > 3 ? '4' : `${card.thumbUrls?.length}`}-child`,
|
|
7
|
+
{'--empty': !card.thumbUrls?.length},
|
|
8
|
+
]"
|
|
9
|
+
class="card-playlist-mini__img-wrapper"
|
|
9
10
|
>
|
|
10
|
-
<UiImg
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
<UiImg
|
|
12
|
+
v-for="(item, index) in card.thumbUrls"
|
|
13
|
+
:key="`playlist-mini-image-${index}`"
|
|
14
|
+
:src="getCurrentImage(index)"
|
|
15
|
+
:alt="card.name"
|
|
16
|
+
class="card-playlist-mini__img"
|
|
17
|
+
width="320"
|
|
18
|
+
height="180"
|
|
19
|
+
sizes="120px"
|
|
20
|
+
@error="onImageError(index)"
|
|
19
21
|
/>
|
|
20
22
|
</div>
|
|
21
23
|
<div class="card-playlist-mini__wrapper">
|
|
22
24
|
<p class="card-playlist-mini__name">{{ card.name }}</p>
|
|
23
25
|
<p class="card-playlist-mini__user">{{ $t('by') }} {{ card.username }}</p>
|
|
24
26
|
<span class="card-playlist-mini__count">
|
|
25
|
-
<UiIcon
|
|
26
|
-
|
|
27
|
+
<UiIcon
|
|
28
|
+
name="video-camera"
|
|
29
|
+
size="16"
|
|
27
30
|
/>
|
|
28
31
|
{{ card.videosCount }}
|
|
29
32
|
</span>
|
|
@@ -1,88 +1,102 @@
|
|
|
1
1
|
<!-- Карточка плейлиста: галерея 1-4 обложек, статистика, меню действий -->
|
|
2
2
|
<template>
|
|
3
3
|
<div class="card-playlist">
|
|
4
|
-
<NuxtLink
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
<NuxtLink
|
|
5
|
+
:class="[
|
|
6
|
+
`--${card.thumbUrls?.length > 3 ? '4' : `${card.thumbUrls?.length}`}-child`,
|
|
7
|
+
{'--empty': !card.thumbUrls?.length},
|
|
8
|
+
]"
|
|
9
|
+
:to="generateLink(link)"
|
|
10
|
+
class="card-playlist__img-wrapper"
|
|
10
11
|
>
|
|
11
|
-
<UiImg
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
12
|
+
<UiImg
|
|
13
|
+
v-for="(item, index) in card.thumbUrls"
|
|
14
|
+
:key="`playlist-image-${index}`"
|
|
15
|
+
:src="getCurrentImage(item, index)"
|
|
16
|
+
:urls="isSingle ? item : undefined"
|
|
17
|
+
:width="isSingle ? ThumbSize.Medium.split('x')[0] : ThumbSize.Small.split('x')[0]"
|
|
18
|
+
:height="isSingle ? ThumbSize.Medium.split('x')[1] : ThumbSize.Small.split('x')[1]"
|
|
19
|
+
:sizes="isSingle ? `(max-width: ${CSS_BREAKPOINTS.lg}px) 50vw, ${ThumbSize.Medium.split('x')[0]}px` : `${ThumbSize.Small.split('x')[0]}px`"
|
|
20
|
+
:alt="card.name"
|
|
21
|
+
:loading="priority ? 'eager' : 'lazy'"
|
|
22
|
+
:priority="priority"
|
|
23
|
+
class="card-playlist__img"
|
|
24
|
+
@error="onImageError(index)"
|
|
23
25
|
/>
|
|
24
|
-
<UiLabel
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
<UiLabel
|
|
27
|
+
:text="card.videosCount"
|
|
28
|
+
class="card-playlist__count"
|
|
29
|
+
theme="black"
|
|
27
30
|
>
|
|
28
|
-
<UiIcon
|
|
29
|
-
|
|
31
|
+
<UiIcon
|
|
32
|
+
name="cam"
|
|
33
|
+
size="16"
|
|
30
34
|
/>
|
|
31
35
|
</UiLabel>
|
|
32
36
|
|
|
33
|
-
<UiLabel
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
<UiLabel
|
|
38
|
+
v-if="card.playlistType === 'private'"
|
|
39
|
+
:text="t('private')"
|
|
40
|
+
class="card-playlist__private"
|
|
41
|
+
theme="backdrop"
|
|
37
42
|
>
|
|
38
|
-
<UiIcon
|
|
39
|
-
|
|
43
|
+
<UiIcon
|
|
44
|
+
name="lock"
|
|
45
|
+
size="16"
|
|
40
46
|
/>
|
|
41
47
|
</UiLabel>
|
|
42
48
|
</NuxtLink>
|
|
43
49
|
<div class="card-playlist__wrapper">
|
|
44
50
|
<div class="card-playlist__wrapper-header">
|
|
45
51
|
<p class="card-playlist__numbers">
|
|
46
|
-
<span
|
|
47
|
-
|
|
52
|
+
<span
|
|
53
|
+
v-if="card.likes != null"
|
|
54
|
+
class="card-playlist__like"
|
|
48
55
|
>
|
|
49
|
-
<UiIcon
|
|
50
|
-
|
|
56
|
+
<UiIcon
|
|
57
|
+
name="thumbs-up"
|
|
58
|
+
size="12"
|
|
51
59
|
/>
|
|
52
60
|
{{ $n(card.likes, 'compact') }}
|
|
53
61
|
</span>
|
|
54
|
-
<span
|
|
55
|
-
|
|
62
|
+
<span
|
|
63
|
+
v-if="card.views != null"
|
|
64
|
+
class="card-playlist__views"
|
|
56
65
|
>
|
|
57
|
-
<UiIcon
|
|
58
|
-
|
|
66
|
+
<UiIcon
|
|
67
|
+
name="show"
|
|
68
|
+
size="14"
|
|
59
69
|
/>
|
|
60
70
|
{{ $n(card.views, 'compact') }}
|
|
61
71
|
</span>
|
|
62
72
|
</p>
|
|
63
73
|
<p class="card-playlist__created">
|
|
64
|
-
<UiIcon
|
|
65
|
-
|
|
74
|
+
<UiIcon
|
|
75
|
+
name="date"
|
|
76
|
+
size="12"
|
|
66
77
|
/>
|
|
67
78
|
{{ formatDate(card.created) }}
|
|
68
79
|
</p>
|
|
69
80
|
</div>
|
|
70
81
|
<div class="card-playlist__content">
|
|
71
|
-
<UiImg
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
82
|
+
<UiImg
|
|
83
|
+
v-if="avatar"
|
|
84
|
+
:src="avatar"
|
|
85
|
+
:alt="card.username"
|
|
86
|
+
class="card-playlist__avatar _from-xs"
|
|
87
|
+
width="36"
|
|
88
|
+
height="36"
|
|
89
|
+
sizes="36px"
|
|
78
90
|
/>
|
|
79
|
-
<div
|
|
80
|
-
|
|
91
|
+
<div
|
|
92
|
+
v-else
|
|
93
|
+
class="card-playlist__avatar --placeholder _from-xs"
|
|
81
94
|
>
|
|
82
95
|
{{ avatarPlaceholder }}
|
|
83
96
|
</div>
|
|
84
|
-
<NuxtLink
|
|
85
|
-
|
|
97
|
+
<NuxtLink
|
|
98
|
+
:to="generateLink(`/playlists/${card.id}/${card.firstVideoId}`)"
|
|
99
|
+
class="card-playlist__title"
|
|
86
100
|
>
|
|
87
101
|
{{ card.name }}
|
|
88
102
|
</NuxtLink>
|
|
@@ -90,40 +104,48 @@
|
|
|
90
104
|
{{ card.username }}
|
|
91
105
|
</p>
|
|
92
106
|
<div class="card-playlist__content-wrapper">
|
|
93
|
-
<UiDropdown
|
|
94
|
-
|
|
95
|
-
|
|
107
|
+
<UiDropdown
|
|
108
|
+
right
|
|
109
|
+
use-v-if
|
|
110
|
+
class="card-playlist__dropdown"
|
|
96
111
|
>
|
|
97
112
|
<template #trigger>
|
|
98
|
-
<button
|
|
99
|
-
|
|
113
|
+
<button
|
|
114
|
+
class="card-playlist__dots"
|
|
115
|
+
type="button"
|
|
100
116
|
>
|
|
101
|
-
<UiIcon
|
|
102
|
-
|
|
117
|
+
<UiIcon
|
|
118
|
+
name="dots-vertical"
|
|
119
|
+
size="16"
|
|
103
120
|
/>
|
|
104
121
|
</button>
|
|
105
122
|
</template>
|
|
106
123
|
<template #header>
|
|
107
|
-
<CardPlaylistMini
|
|
108
|
-
|
|
124
|
+
<CardPlaylistMini
|
|
125
|
+
:card="card"
|
|
126
|
+
class="card-playlist__preview _to-sm"
|
|
109
127
|
/>
|
|
110
128
|
</template>
|
|
111
129
|
<template #items="className">
|
|
112
|
-
<button
|
|
113
|
-
|
|
114
|
-
|
|
130
|
+
<button
|
|
131
|
+
v-if="card.firstVideoId"
|
|
132
|
+
:class="className"
|
|
133
|
+
type="button"
|
|
115
134
|
>
|
|
116
|
-
<UiIcon
|
|
117
|
-
|
|
135
|
+
<UiIcon
|
|
136
|
+
name="star"
|
|
137
|
+
size="16"
|
|
118
138
|
/>
|
|
119
139
|
{{ t('add_to') }}
|
|
120
140
|
</button>
|
|
121
|
-
<button
|
|
122
|
-
|
|
123
|
-
|
|
141
|
+
<button
|
|
142
|
+
:class="className"
|
|
143
|
+
type="button"
|
|
144
|
+
@click="isShareOpen = true"
|
|
124
145
|
>
|
|
125
|
-
<UiIcon
|
|
126
|
-
|
|
146
|
+
<UiIcon
|
|
147
|
+
name="share"
|
|
148
|
+
size="16"
|
|
127
149
|
/>
|
|
128
150
|
{{ t('share') }}
|
|
129
151
|
</button>
|
|
@@ -131,15 +153,17 @@
|
|
|
131
153
|
</UiDropdown>
|
|
132
154
|
</div>
|
|
133
155
|
</div>
|
|
134
|
-
<p
|
|
135
|
-
|
|
156
|
+
<p
|
|
157
|
+
v-if="card.searchTags && card.searchTags?.length > 0"
|
|
158
|
+
class="card-playlist__tags _truncate"
|
|
136
159
|
>
|
|
137
160
|
{{ card.searchTags.join(' · ')}}
|
|
138
161
|
</p>
|
|
139
162
|
</div>
|
|
140
163
|
|
|
141
|
-
<ShareMain
|
|
142
|
-
|
|
164
|
+
<ShareMain
|
|
165
|
+
v-model="isShareOpen"
|
|
166
|
+
:url="link"
|
|
143
167
|
>
|
|
144
168
|
<template #card>
|
|
145
169
|
<CardPlaylistMini :card="card" />
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
<!-- Круглая аватар-карточка с рамкой, названием и счётчиком (для популярного) -->
|
|
2
2
|
<template>
|
|
3
|
-
<NuxtLink
|
|
4
|
-
|
|
3
|
+
<NuxtLink
|
|
4
|
+
:to="generateLink(card.link)"
|
|
5
|
+
class="card-round"
|
|
5
6
|
>
|
|
6
|
-
<UiImg
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
<UiImg
|
|
8
|
+
:src="currentImage"
|
|
9
|
+
:loading="loading"
|
|
10
|
+
:alt="card.title"
|
|
11
|
+
:priority="priority"
|
|
12
|
+
class="card-round__img"
|
|
13
|
+
width="96"
|
|
14
|
+
height="96"
|
|
15
|
+
sizes="96px"
|
|
16
|
+
@error="onImageError"
|
|
15
17
|
/>
|
|
16
18
|
<p class="card-round__title">
|
|
17
19
|
{{ card.title }}
|
|
@@ -20,8 +22,9 @@
|
|
|
20
22
|
<!-- </ClientOnly>-->
|
|
21
23
|
</p>
|
|
22
24
|
<p class="card-round__count">
|
|
23
|
-
<UiIcon
|
|
24
|
-
|
|
25
|
+
<UiIcon
|
|
26
|
+
name="cam"
|
|
27
|
+
size="12"
|
|
25
28
|
/>
|
|
26
29
|
<span class="card-round__count-text">{{ card.videosCount }}</span>
|
|
27
30
|
</p>
|