itube-specs 0.0.911 → 0.0.913

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/assets/scss/base/_animations.scss +11 -10
  2. package/assets/scss/mixins/_font-sizes.scss +5 -2
  3. package/assets/scss/themes/dark/_theme.scss +22 -18
  4. package/assets/scss/themes/light/_theme.scss +17 -13
  5. package/assets/scss/vars/_tokens.scss +1 -1
  6. package/assets/scss/vars/_vars.scss +1 -0
  7. package/components/auth/register.vue +0 -4
  8. package/components/card/collections-more.vue +1 -1
  9. package/components/card/dropdown/index.vue +2 -2
  10. package/components/card/playlist.vue +7 -8
  11. package/components/card/video/actions.vue +2 -2
  12. package/components/card/video/index.vue +9 -9
  13. package/components/filter/popup.vue +1 -0
  14. package/components/library/feed.vue +1 -14
  15. package/components/playlist/add.vue +123 -113
  16. package/components/playlist/edit.vue +133 -199
  17. package/components/playlist/input.vue +23 -133
  18. package/components/playlist/main.vue +21 -40
  19. package/components/playlist/visibility.vue +149 -0
  20. package/components/section/collections.vue +2 -2
  21. package/components/section/swiper-cards.vue +3 -3
  22. package/components/ui/chips.vue +7 -2
  23. package/components/ui/confirm.vue +17 -5
  24. package/components/ui/dropdown.vue +17 -8
  25. package/components/ui/expand-row.vue +0 -4
  26. package/components/ui/popup.vue +33 -15
  27. package/components/ui/section-title.vue +6 -6
  28. package/components/ui/tooltip.vue +35 -14
  29. package/composables/__tests__/use-overlay-stack.test.ts +110 -0
  30. package/composables/__tests__/use-video-collections.test.ts +75 -0
  31. package/composables/use-overlay-stack.ts +58 -0
  32. package/composables/use-playlist-edit.ts +13 -3
  33. package/composables/use-snackbar.ts +15 -1
  34. package/composables/use-user.ts +0 -4
  35. package/composables/use-video-collections.ts +27 -5
  36. package/package.json +1 -1
  37. package/pages/following.vue +4 -4
  38. package/pages/history.vue +1 -1
  39. package/pages/library/index.vue +4 -4
  40. package/pages/playlists/index.vue +7 -76
  41. package/runtime/constants/playlist-type.ts +5 -0
  42. package/components/playlist/private-toggle.vue +0 -20
  43. package/composables/use-favorites.ts +0 -20
  44. package/pages/favorites.vue +0 -31
@@ -2,22 +2,23 @@
2
2
  @use '../mixins' as *;
3
3
 
4
4
  /**
5
- Анимация открытия попапов, для анимации открытия попапа обернуть SPopup в transition
5
+ Анимация открытия попапов, для анимации открытия попапа обернуть попап в transition.
6
+ Гейты `--no-enter-anim` / `--no-leave-anim` вешает useOverlayStack: появление
7
+ анимируется только у первого оверлея в стеке, закрытие — только у последнего.
8
+ Негации завёрнуты в `:where()`, чтобы не поднимать вес селектора — иначе они начинают
9
+ спорить с правилами компонентов (`.ui-snackbar.v-enter-from` и Ко).
6
10
  */
7
- .v-enter-active,
8
- .v-leave-active {
9
- transition: 100ms ease opacity;
11
+ .v-enter-active:where(:not(.--no-enter-anim)),
12
+ .v-leave-active:where(:not(.--no-leave-anim)) {
13
+ transition: 200ms linear opacity, 200ms linear transform;
10
14
 
11
15
  @include from-br(sm) {
12
16
  transition: 300ms linear opacity, 200ms linear transform;
13
17
  }
14
18
  }
15
19
 
16
- .v-enter-from,
17
- .v-leave-to {
20
+ .v-enter-from:where(:not(.--no-enter-anim)),
21
+ .v-leave-to:where(:not(.--no-leave-anim)) {
18
22
  opacity: 0;
19
-
20
- @include from-br(sm) {
21
- transform: scale(0.99) translateY(8px);
22
- }
23
+ transform: scale(0.99) translateY(8px);
23
24
  }
@@ -48,9 +48,12 @@
48
48
  line-height: 1.333;
49
49
  }
50
50
 
51
+ @mixin font-3xl {
52
+ font-size: 30px;
53
+ line-height: 1.2;
54
+ }
55
+
51
56
  @mixin font-4xl {
52
57
  font-size: 36px;
53
58
  line-height: 1.111;
54
59
  }
55
-
56
-
@@ -59,8 +59,10 @@ $chips-bg--active: $color-zinc-700;
59
59
  $chips-text: $color-zinc-400;
60
60
  $chips-text--hover: $color-white;
61
61
  $chips-text--active: $color-white;
62
- $chips-micro-bg: $color-zinc-800;
63
- $chips-micro-text: $color-zinc-400;
62
+ $chips-micro-bg: $color-zinc-800-80;
63
+ $chips-micro-bg--hover: $color-zinc-700;
64
+ $chips-micro-text: $color-zinc-300;
65
+ $chips-micro-text--hover: $color-white;
64
66
  $chips-small-bg: $color-zinc-800-50;
65
67
  $chips-small-bg--hover: $color-zinc-700;
66
68
  $chips-small-text: $color-zinc-400;
@@ -200,8 +202,8 @@ $video-card-dropdown-icon--hover: $color-white;
200
202
  $video-card-secondary: $color-zinc-500;
201
203
  $video-card-mini-title: $color-zinc-300;
202
204
  $video-card-mini-weight: 400;
203
- $video-card-user-text: $color-zinc-400;
204
- $video-card-user-bg: $color-zinc-700;
205
+ $video-card-user-text: $color-zinc-500;
206
+ $video-card-user-bg: $color-zinc-800;
205
207
  $video-card-progress-bg: $mono-white-50;
206
208
  $video-card-progress-fill: $color-indigo-500;
207
209
  $video-card-remaining: $color-indigo-400;
@@ -300,18 +302,18 @@ $like-bar-bg: $color-zinc-700;
300
302
  $like-bar-likes: $color-zinc-500;
301
303
 
302
304
  // ─── Playlist input ───
303
- $playlist-input-label: $color-white;
304
- $playlist-input-toggle-icon: $color-zinc-500;
305
- $playlist-input-toggle-icon--active: $color-zinc-400;
306
- $playlist-input-hint-text: $color-zinc-900;
307
- $playlist-input-hint-bg: $color-zinc-600;
308
- $playlist-input-hint-bg--hover: $color-zinc-500;
305
+ $playlist-input-bg: $color-zinc-900;
309
306
  $playlist-input-back: $color-zinc-500;
310
307
  $playlist-input-back--hover: $color-white;
311
- $playlist-input-tooltip-highlight: $color-white;
312
- $playlist-input-delete-text: $color-red-400;
313
- $playlist-input-delete-bg: $color-red-500-10;
314
- $playlist-input-delete-bg--hover: $color-red-500-20;
308
+ $playlist-input-back-bg: $color-zinc-800;
309
+ $playlist-input-back-bg--hover: $color-zinc-700;
310
+
311
+ // ─── Playlist visibility ───
312
+ $playlist-visibility-icon: $color-zinc-400;
313
+ $playlist-visibility-hint-text: $color-zinc-900;
314
+ $playlist-visibility-hint-bg: $color-zinc-600;
315
+ $playlist-visibility-hint-bg--hover: $color-zinc-500;
316
+ $playlist-visibility-tooltip-highlight: $color-white;
315
317
 
316
318
  // ─── Playlist add ───
317
319
  $playlist-add-item-bg--hover: $color-zinc-800-50;
@@ -324,8 +326,10 @@ $playlist-add-item-edit: $color-zinc-500;
324
326
  $playlist-add-item-edit--hover: $color-white;
325
327
 
326
328
  // ─── Playlist edit ───
327
- $playlist-edit-border: $color-zinc-800;
328
- $playlist-edit-icon: $color-indigo-600;
329
+ $playlist-edit-delete-text: $color-red-400;
330
+ $playlist-edit-delete-text--hover: $color-red-300;
331
+ $playlist-edit-confirm-highlight: $color-white;
332
+ $playlist-edit-confirm-note: $color-zinc-500;
329
333
 
330
334
  // ─── Playlist delete video ───
331
335
  $playlist-delete-video-icon: $color-indigo-600;
@@ -554,7 +558,7 @@ $select-border--active: $color-indigo-500;
554
558
 
555
559
  // ─── Toggle ───
556
560
  $toggle-bg: $color-zinc-700;
557
- $toggle-bg--active: $color-emerald-500;
561
+ $toggle-bg--active: $color-zinc-500;
558
562
  $toggle-handle: $mono-white-50;
559
563
  $toggle-handle--active: $mono-white-100;
560
564
  $toggle-text--disabled: $mono-white-25;
@@ -696,6 +700,7 @@ $filter-popup--active: $color-zinc-400;
696
700
  $filter-popup-active-bg: $color-zinc-800;
697
701
  $filter-popup-quick-title: $color-zinc-400;
698
702
  $filter-popup-group-border: $color-zinc-800;
703
+ $filter-popup-summary-arrow: $color-zinc-400;
699
704
  $filter-popup-summary-description: $color-zinc-500;
700
705
  $filter-popup-active-chip-bg: $color-indigo-600;
701
706
  $filter-popup-active-chip-bg--hover: $color-indigo-500;
@@ -980,7 +985,6 @@ $contacts-link: $color-indigo-400;
980
985
  $contacts-link--hover: $color-indigo-300;
981
986
 
982
987
  // ─── Page: playlists ───
983
- $page-playlists-border: $color-zinc-800;
984
988
 
985
989
  // ─── Page: channels ───
986
990
  $page-channels-border: $color-zinc-800;
@@ -72,7 +72,9 @@ $chips-text: $color-gray-700;
72
72
  $chips-text--hover: $color-gray-900;
73
73
  $chips-text--active: $color-white;
74
74
  $chips-micro-bg: $color-gray-300;
75
+ $chips-micro-bg--hover: $color-gray-400;
75
76
  $chips-micro-text: $color-gray-700;
77
+ $chips-micro-text--hover: $color-gray-900;
76
78
  $chips-small-bg: $color-gray-300;
77
79
  $chips-small-bg--hover: $color-gray-400;
78
80
  $chips-small-text: $color-gray-700;
@@ -357,18 +359,18 @@ $like-bar-bg: $color-slate-700;
357
359
  $like-bar-likes: $color-gray-500;
358
360
 
359
361
  // ─── Playlist input ───
360
- $playlist-input-label: $color-white;
361
- $playlist-input-toggle-icon: $color-gray-500;
362
- $playlist-input-toggle-icon--active: $color-gray-400;
363
- $playlist-input-hint-text: $color-gray-900;
364
- $playlist-input-hint-bg: $color-gray-600;
365
- $playlist-input-hint-bg--hover: $color-gray-500;
362
+ $playlist-input-bg: $color-slate-900;
366
363
  $playlist-input-back: $color-gray-400;
367
364
  $playlist-input-back--hover: $color-white;
368
- $playlist-input-tooltip-highlight: $color-white;
369
- $playlist-input-delete-text: $color-red-400;
370
- $playlist-input-delete-bg: $color-red-500-10;
371
- $playlist-input-delete-bg--hover: $color-red-500-20;
365
+ $playlist-input-back-bg: $color-slate-750;
366
+ $playlist-input-back-bg--hover: $color-slate-700;
367
+
368
+ // ─── Playlist visibility ───
369
+ $playlist-visibility-icon: $color-gray-400;
370
+ $playlist-visibility-hint-text: $color-gray-900;
371
+ $playlist-visibility-hint-bg: $color-gray-600;
372
+ $playlist-visibility-hint-bg--hover: $color-gray-500;
373
+ $playlist-visibility-tooltip-highlight: $color-white;
372
374
 
373
375
  // ─── Playlist add ───
374
376
  $playlist-add-item-bg--hover: $color-slate-750;
@@ -381,8 +383,10 @@ $playlist-add-item-edit: $color-gray-400;
381
383
  $playlist-add-item-edit--hover: $color-white;
382
384
 
383
385
  // ─── Playlist edit ───
384
- $playlist-edit-border: transparent;
385
- $playlist-edit-icon: $color-indigo-600;
386
+ $playlist-edit-delete-text: $color-red-400;
387
+ $playlist-edit-delete-text--hover: $color-red-300;
388
+ $playlist-edit-confirm-highlight: $color-white;
389
+ $playlist-edit-confirm-note: $color-gray-500;
386
390
 
387
391
  // ─── Playlist delete video ───
388
392
  $playlist-delete-video-icon: $color-indigo-600;
@@ -747,6 +751,7 @@ $filter-popup--active: $color-gray-400;
747
751
  $filter-popup-active-bg: transparent;
748
752
  $filter-popup-quick-title: $color-gray-400;
749
753
  $filter-popup-group-border: transparent;
754
+ $filter-popup-summary-arrow: $color-gray-400;
750
755
  $filter-popup-summary-description: $color-gray-500;
751
756
  $filter-popup-active-chip-bg: $color-indigo-600;
752
757
  $filter-popup-active-chip-bg--hover: $color-indigo-500;
@@ -1008,7 +1013,6 @@ $contacts-link: $color-indigo-400;
1008
1013
  $contacts-link--hover: $color-indigo-300;
1009
1014
 
1010
1015
  // ─── Page: playlists ───
1011
- $page-playlists-border: transparent;
1012
1016
 
1013
1017
  // ─── Page: channels ───
1014
1018
  $page-channels-border: transparent;
@@ -21,7 +21,7 @@
21
21
  // ─── Project-specific ───
22
22
  --chips-height: 32px;
23
23
  --chips-height-small: 24px;
24
- --chips-height-micro: 20px;
24
+ --chips-height-micro: 24px;
25
25
  --transition: var(--default-transition-duration) var(--default-transition-timing-function);
26
26
  --header-height: 64px;
27
27
  --control-min-width: 126px;
@@ -3,6 +3,7 @@ $spacing: 4px;
3
3
  // ─── Border radius ───
4
4
  $radius: 10px;
5
5
  $radius-small: 4px;
6
+ $radius-6: 6px;
6
7
  $radius-md: 8px;
7
8
  $radius-lg: 10px;
8
9
  $radius-12: 12px;
@@ -171,10 +171,6 @@ async function submit() {
171
171
 
172
172
  await useUser(AuthorizationApiService).register(form.value);
173
173
 
174
- // Создаем сразу Favorites плейлист, возможно костыль убрать когда будет нормальная логика с беком
175
- // const { FAVORITES_KEY } = useFavorites();
176
- // await PlaylistsApiService.postPlaylist(FAVORITES_KEY, PlaylistType.Private);
177
-
178
174
  useAuthPopup().closeAuthPopup();
179
175
  show('Registration success');
180
176
  } catch (err) {
@@ -118,7 +118,7 @@ const images = computed(() => {
118
118
  }
119
119
 
120
120
  .card-collections-more__count {
121
- @include font-2xl;
121
+ @include font-3xl;
122
122
 
123
123
  font-weight: 700;
124
124
  color: $collections-more-count;
@@ -31,7 +31,7 @@
31
31
  v-if="showWatchLater"
32
32
  :class="className"
33
33
  type="button"
34
- @click="toggleWatchLater(card.guid)"
34
+ @click="toggleWatchLater(card.guid, card.title)"
35
35
  >
36
36
  <UiIcon
37
37
  name="clock"
@@ -43,7 +43,7 @@
43
43
  v-if="showFavorites"
44
44
  :class="className"
45
45
  type="button"
46
- @click="toggleFavorite(card.guid)"
46
+ @click="toggleFavorite(card.guid, card.title)"
47
47
  >
48
48
  <UiIcon
49
49
  name="heart-stroke"
@@ -55,7 +55,7 @@
55
55
  >
56
56
  <UiIcon
57
57
  name="thumbs-up"
58
- size="12"
58
+ size="14"
59
59
  />
60
60
  {{ $n(card.likes, 'compact') }}
61
61
  </span>
@@ -73,7 +73,7 @@
73
73
  <p class="card-playlist__created">
74
74
  <UiIcon
75
75
  name="date"
76
- size="12"
76
+ size="14"
77
77
  />
78
78
  {{ formatDate(card.created) }}
79
79
  </p>
@@ -83,7 +83,7 @@
83
83
  v-if="avatar"
84
84
  :src="avatar"
85
85
  :alt="card.username"
86
- class="card-playlist__avatar _from-xs"
86
+ class="card-collections-more__count _from-xs"
87
87
  width="36"
88
88
  height="36"
89
89
  sizes="36px"
@@ -292,7 +292,7 @@ const avatarPlaceholder = computed(() => props.card.username.charAt(0));
292
292
  .card-playlist__wrapper {
293
293
  display: grid;
294
294
  align-items: center;
295
- padding: 16px;
295
+ padding: 12px;
296
296
  }
297
297
 
298
298
  .card-playlist__wrapper-header {
@@ -300,7 +300,7 @@ const avatarPlaceholder = computed(() => props.card.username.charAt(0));
300
300
  align-items: center;
301
301
  justify-content: space-between;
302
302
  column-gap: 24px;
303
- margin-bottom: 12px;
303
+ margin-bottom: 8px;
304
304
  }
305
305
 
306
306
  .card-playlist__wrapper.--top {
@@ -407,8 +407,8 @@ const avatarPlaceholder = computed(() => props.card.username.charAt(0));
407
407
  --line-clamp: 1;
408
408
 
409
409
  color: $playlist-card-tags;
410
- padding-top: 12px;
411
- margin-top: 12px;
410
+ padding-top: 8px;
411
+ margin-top: 8px;
412
412
  border-top: 1px solid $playlist-card-tags-border;
413
413
  }
414
414
 
@@ -456,7 +456,6 @@ const avatarPlaceholder = computed(() => props.card.username.charAt(0));
456
456
  grid-template-columns: auto 1fr;
457
457
  column-gap: 12px;
458
458
  align-items: start;
459
- margin-bottom: 12px;
460
459
  }
461
460
 
462
461
  .card-playlist__content-wrapper {
@@ -7,7 +7,7 @@
7
7
  class="card-video-actions__btn --active"
8
8
  type="button"
9
9
  aria-pressed="true"
10
- @click="toggleFavorite(card.guid)"
10
+ @click="toggleFavorite(card.guid, card.title)"
11
11
  >
12
12
  <UiIcon
13
13
  name="heart"
@@ -22,7 +22,7 @@
22
22
  :aria-pressed="later"
23
23
  :class="['card-video-actions__btn', '--watch-later', { '--active': later }]"
24
24
  type="button"
25
- @click="toggleWatchLater(card.guid)"
25
+ @click="toggleWatchLater(card.guid, card.title)"
26
26
  >
27
27
  <UiIcon
28
28
  :name="later ? 'clock-filled' : 'clock'"
@@ -398,14 +398,14 @@ $dropdown-column: 18px;
398
398
  }
399
399
 
400
400
  @include from-cq($layout-breakpoint) {
401
- column-gap: 8px;
402
- grid-template-columns: 32px 1fr $dropdown-column;
401
+ column-gap: 12px;
402
+ grid-template-columns: 36px 1fr $dropdown-column;
403
403
  }
404
404
  }
405
405
 
406
406
  .--avatar .card-video__wrapper {
407
- column-gap: 8px;
408
- grid-template-columns: 32px 1fr $dropdown-column;
407
+ column-gap: 12px;
408
+ grid-template-columns: 36px 1fr $dropdown-column;
409
409
  }
410
410
 
411
411
  .--avatar .card-video__title {
@@ -585,23 +585,23 @@ $dropdown-column: 18px;
585
585
 
586
586
  @include from-cq($layout-breakpoint) {
587
587
  grid-column: 2;
588
- margin-top: 8px;
588
+ margin-top: 10px;
589
589
  }
590
590
  }
591
591
 
592
592
  .card-video__tags-wrapper {
593
- max-height: calc( var(--chips-height-micro) * 2 + 2px);
593
+ max-height: calc( var(--chips-height-micro) * 2 + 8px);
594
594
  overflow: hidden;
595
595
  display: flex;
596
596
  flex-wrap: wrap;
597
- gap: 2px;
597
+ gap: 8px;
598
598
  }
599
599
 
600
600
  .card-video__user {
601
601
  @include font-xs;
602
602
 
603
- width: 32px;
604
- height: 32px;
603
+ width: 36px;
604
+ height: 36px;
605
605
  display: grid;
606
606
  place-content: center;
607
607
  font-weight: 700;
@@ -288,6 +288,7 @@ const { t } = useI18n();
288
288
 
289
289
  .filter-popup__summary-arrow {
290
290
  flex-shrink: 0;
291
+ color: $filter-popup-summary-arrow;
291
292
  transition: transform var(--transition);
292
293
  }
293
294
 
@@ -141,19 +141,6 @@
141
141
  compact
142
142
  />
143
143
  </div>
144
-
145
- <!-- <UiLink
146
- :to="item.to"
147
- theme="secondary"
148
- class="library-feed__all _to-sm"
149
- wide
150
- >
151
- {{ videosText }}
152
- <UiIcon
153
- name="arrow-right"
154
- size="16"
155
- />
156
- </UiLink> -->
157
144
  </article>
158
145
  </template>
159
146
 
@@ -212,7 +199,7 @@ const ageText = computed(() => {
212
199
  grid-template-columns: auto minmax(0, 1fr) auto;
213
200
  column-gap: 16px;
214
201
  row-gap: 12px;
215
- align-items: center;
202
+ align-items: start;
216
203
  margin-bottom: 20px;
217
204
  }
218
205