itube-specs 0.0.976 → 0.0.979

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.
@@ -93,11 +93,11 @@ const { generateLink } = useGenerateLink();
93
93
  const { t } = useI18n();
94
94
 
95
95
  /**
96
- * Пороги — колоночная лестница `.grid-models` (2 → 3 с 640px → … → 6 с 1280px), а не `$brkpnts`.
97
- * Слот от 640px и выше держится в 206–249px, поэтому один `250px` покрывает всю правую часть.
96
+ * Пороги — колоночная лестница `.grid-models` (2 → 3 с 450px → … → 6 с 1160px), а не `$brkpnts`.
97
+ * До 1386px слот держится в 213px, дальше растёт до 249 — оттуда и правое значение.
98
98
  * `auto` впереди — см. `UiImg`.
99
99
  */
100
- const SIZES = 'auto, (max-width: 639px) 50vw, 250px';
100
+ const SIZES = 'auto, (max-width: 449px) 50vw, (max-width: 1385px) 215px, 250px';
101
101
 
102
102
  const fallbackImage = '/img/model-placeholder.webp';
103
103
  const imageError = ref(false);
@@ -112,7 +112,9 @@ $action-size: 36px;
112
112
  var(--transition) color;
113
113
  }
114
114
 
115
- .card-video:is(:hover, :focus-within) .card-video-actions__btn {
115
+ /* :focus-visible, а не :focus-within: после клика мышью фокус остаётся на кнопке, и она
116
+ продолжала висеть видимой, когда курсор уже ушёл с карточки. Клавиатурный обход не страдает. */
117
+ .card-video:is(:hover, :has(:focus-visible)) .card-video-actions__btn {
116
118
  opacity: 1;
117
119
  }
118
120
 
@@ -442,20 +442,16 @@ $dropdown-column: 18px;
442
442
  --line-clamp: 2;
443
443
 
444
444
  grid-row: 1;
445
+ font-weight: 500;
445
446
  color: $video-card-text;
446
447
 
447
448
  @include to-cq($layout-breakpoint) {
448
449
  grid-column: 1;
449
450
  }
450
451
 
451
- @media (hover: hover) {
452
- transition: var(--transition) color;
453
- }
454
- }
455
-
456
- .card-video:is(:hover, :focus-visible) .card-video__title {
457
- @media (hover: hover) {
452
+ @include hover(color, opacity) {
458
453
  color: $video-card-text--hover;
454
+ opacity: 0.9;
459
455
  }
460
456
  }
461
457
 
@@ -529,8 +525,7 @@ $dropdown-column: 18px;
529
525
  }
530
526
 
531
527
  .card-video__logo-wrapper[href],
532
- .card-video__channel-wrapper[href],
533
- .card-video__title {
528
+ .card-video__channel-wrapper[href] {
534
529
  @include hover(opacity) {
535
530
  opacity: 0.9;
536
531
  }
@@ -26,26 +26,35 @@ defineProps<{
26
26
  </script>
27
27
 
28
28
  <style lang="scss">
29
- /* Лестница колонок как в макете: 2 → 3 (640px) → 4 (768px) → 5 (1024px) → 6 (1280px).
30
- Пороги — литералы макета, с тирами $brkpnts намеренно не совпадают. */
29
+ /* Лестница колонок: 2 → 3 (450px) → 4 (690px) → 5 (920px) → 6 (1160px). Больше шести в ряд
30
+ не даём — продуктовое требование.
31
+
32
+ Пороги — литералы, с тирами $brkpnts намеренно не совпадают: они подобраны так, чтобы слот
33
+ карточки держался в 213px. Это ширина исходника 640, делённая на 3 — предел плотности
34
+ современных телефонов. Считается как
35
+ (вьюпорт − 2×--container-padding-inline − 12×(колонок−1)) / колонок.
36
+
37
+ Единственное место, где 213 превышены — шесть колонок шире 1386px: там слот растёт до 249.
38
+ Это осознанно: при тройной плотности такому слоту нужно 746px, но десктопов с тройной
39
+ плотностью практически не бывает, а DPR2 просит 497 и укладывается в наши 640. */
31
40
  .grid-models {
32
41
  display: grid;
33
42
  grid-template-columns: repeat(2, minmax(0, 1fr));
34
43
  gap: 12px;
35
44
 
36
- @include from-br(640px) {
45
+ @include from-br(450px) {
37
46
  grid-template-columns: repeat(3, minmax(0, 1fr));
38
47
  }
39
48
 
40
- @include from-br(768px) {
49
+ @include from-br(690px) {
41
50
  grid-template-columns: repeat(4, minmax(0, 1fr));
42
51
  }
43
52
 
44
- @include from-br(1024px) {
53
+ @include from-br(920px) {
45
54
  grid-template-columns: repeat(5, minmax(0, 1fr));
46
55
  }
47
56
 
48
- @include from-br(1280px) {
57
+ @include from-br(1160px) {
49
58
  grid-template-columns: repeat(6, minmax(0, 1fr));
50
59
  }
51
60
  }
@@ -6,7 +6,7 @@ export interface ITestModelPortrait {
6
6
  primaryImageSmallAvifUrl?: string;
7
7
  }
8
8
 
9
- /** Модели из тестовой поставки нарезчика: `public/img/models/<guid>{,-640,-300}.{png,webp,avif}`. */
9
+ /** Модели из тестовой поставки нарезчика: `public/img/models/<guid>{,-640,-256}.{png,webp,avif}`. */
10
10
  const PORTRAIT_GUIDS = [
11
11
  '00003fff-0aa5-4e65-9356-7e01358408fe',
12
12
  '0000cca2-8ec5-4c12-950f-4460920805b9',
@@ -24,11 +24,12 @@ const PORTRAIT_GUIDS = [
24
24
  * Тестовые портреты моделей:
25
25
  *
26
26
  * - `?img=png` — исходники 1024×1536;
27
- * - `?img=webp` — без avif-ветки, чтобы померить вес и качество одного webp;
27
+ * - `?img=444` — наш avif в полной цветности 4:4:4 при том же качестве яркости, что у поставки
28
+ * нарезчика (она в 4:2:0). Сравнение стоит вести по цвету: губы, румянец, переходы кожи;
28
29
  * - без параметра — нарезка по `DOCS/MODEL-IMAGES.md`: один 640w, avif через `<picture>`.
29
30
  *
30
31
  * Две ширины, выбирает их КОМПОНЕНТ, а не браузер: srcset мы не ставим. 640w — портрет в
31
- * карточку сетки, 300w — квадратный кроп по лицу в круглые аватары, мини-карточки и подсказки
32
+ * карточку сетки, 256w — квадратный кроп по лицу в круглые аватары, мини-карточки и подсказки
32
33
  * поиска.
33
34
  *
34
35
  * Ступеней через srcset НЕ делаем. Ступень мельче слота заведомо хуже полного файла: её портит
@@ -55,10 +56,10 @@ export function useTestModelImages() {
55
56
 
56
57
  return {
57
58
  primaryImageUrl: `${base}-640.webp`,
58
- thumbUrl: `${base}-300.webp`,
59
- primaryImageSmallUrl: `${base}-300.webp`,
60
- primaryImageAvifUrl: format === 'webp' ? undefined : `${base}-640.avif`,
61
- primaryImageSmallAvifUrl: format === 'webp' ? undefined : `${base}-300.avif`,
59
+ thumbUrl: `${base}-256.webp`,
60
+ primaryImageSmallUrl: `${base}-256.webp`,
61
+ primaryImageAvifUrl: format === '444' ? `${base}-640-444.avif` : `${base}-640.avif`,
62
+ primaryImageSmallAvifUrl: format === '444' ? `${base}-256-444.avif` : `${base}-256.avif`,
62
63
  };
63
64
  });
64
65
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "itube-specs",
3
3
  "type": "module",
4
- "version": "0.0.976",
4
+ "version": "0.0.979",
5
5
  "main": "./nuxt.config.ts",
6
6
  "types": "./types/index.d.ts",
7
7
  "scripts": {