itube-specs 0.0.971 → 0.0.973

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.
@@ -6,51 +6,52 @@ export interface ITestModelPortrait {
6
6
  primaryImageSmallAvifUrl?: string;
7
7
  }
8
8
 
9
- const PORTRAIT_COUNT = 16;
9
+ /** Модели из тестовой поставки нарезчика: `public/img/models/<guid>{,-640,-300}.{png,webp,avif}`. */
10
+ const PORTRAIT_GUIDS = [
11
+ '00003fff-0aa5-4e65-9356-7e01358408fe',
12
+ '0000cca2-8ec5-4c12-950f-4460920805b9',
13
+ '0002b6da-f82d-484a-aa0b-9a7f9ecb11da',
14
+ '00038fca-1453-40d8-8ace-66ea034c804e',
15
+ '0004202c-10a1-461b-9f80-e3c0fafdff04',
16
+ '0004c061-1393-42d0-8582-29952591129f',
17
+ '0006f78f-e668-4c35-9370-a936565780a4',
18
+ '0006fe81-996a-4ab3-b5b9-27285dd1c2cd',
19
+ '00072f5d-6068-4fa0-a22f-16b07d6f4e6b',
20
+ '000785cd-9500-4915-a7f4-836dda420f34',
21
+ ];
10
22
 
11
23
  /**
12
- * Тестовые портреты моделей из `public/img/models/`. Везде один файл 640w:
24
+ * Тестовые портреты моделей. `?img=png` отдаёт исходники 1024×1536 для сравнения, без
25
+ * параметра — нарезку по `DOCS/MODEL-IMAGES.md`: avif через `<picture>`, фолбэк webp.
13
26
  *
14
- * - `?img=png` — исходники;
15
- * - `?img=webp` — только webp, без avif-ветки;
16
- * - без параметра — avif q63 4:4:4 через `<picture>`, фолбэк webp `-q 85 -m 6 -pass 10 -sharp_yuv`.
27
+ * Две ширины, выбирает их КОМПОНЕНТ, а не браузер: srcset мы не ставим. 640w — портрет в
28
+ * карточку сетки, 300w — квадратный кроп по лицу в круглые аватары, мини-карточки и подсказки
29
+ * поиска.
17
30
  *
18
- * Две ширины: 640w в карточку сетки и 300w во всё мелкое — круглые аватары, мини-карточки,
19
- * подсказки поиска. 300w закрывает их с запасом даже при DPR3 (круглому нужно 288) и весит
20
- * 8.5 KB против 40.6 у полного файла. Выбирает не браузер, а компонент: srcset мы не ставим.
21
- *
22
- * Качество ступеней подобрано по равной ошибке в высоких частотах: webp q85 даёт 0.00405,
23
- * avif q63 — 0.00399. Вес при этом 645 против 434 KB на 16 картинок, то есть avif легче на
24
- * треть при том же качестве. Разрыв держится на всём диапазоне, от точки не зависит.
25
- *
26
- * Один файл, а НЕ ступени через srcset. Исходники 640, слот карточки максимум 297 CSS, так
27
- * что 640w закрывает любое устройство вплоть до DPR3. Ступень мельче слота при этом заведомо
28
- * хуже полного файла: её портит двойной пересчёт (наш ресайз плюс браузерный), а её артефакты
29
- * показываются почти 1:1, тогда как 640w в том же слоте ужимается в 2.6 раза и они
30
- * размазываются. Проверено на DPR1-мониторе: ладдер мылит, один файл нет. Ступени станут
31
- * осмысленны, только если исходники вырастут заметно выше 640.
32
- *
33
- * Кроп под 3:4 не делаем — обрезает `object-fit`. Почему именно так, см. `IModelImageUrls`.
31
+ * Ступеней через srcset НЕ делаем. Ступень мельче слота заведомо хуже полного файла: её портит
32
+ * двойной пересчёт (ресайз нарезчика плюс браузерный), а её артефакты показываются почти 1:1,
33
+ * тогда как 640w в слоте карточки ужимается в 2.6 раза и они размазываются. Проверено на
34
+ * DPR1-мониторе: ладдер мылит, один файл нет.
34
35
  *
35
36
  * Читается один раз на монтировании, поэтому переключение — перезагрузкой, а не навигацией
36
37
  * по query. Для замера сети это и нужно: он честен только с чистого захода.
37
38
  */
38
39
  export function useTestModelImages() {
39
- const format = useRoute().query['img'];
40
+ const isSource = useRoute().query['img'] === 'png';
40
41
 
41
- const portraits: ITestModelPortrait[] = Array.from({ length: PORTRAIT_COUNT }, (_, index) => {
42
- const base = `/img/models/portrait-${index + 1}`;
42
+ const portraits: ITestModelPortrait[] = PORTRAIT_GUIDS.map((guid) => {
43
+ const base = `/img/models/${guid}`;
43
44
 
44
- if (format === 'png') {
45
+ if (isSource) {
45
46
  return { primaryImageUrl: `${base}.png`, thumbUrl: `${base}.png` };
46
47
  }
47
48
 
48
49
  return {
49
- primaryImageUrl: `${base}-q85.webp`,
50
- thumbUrl: `${base}-300-q85.webp`,
51
- primaryImageSmallUrl: `${base}-300-q85.webp`,
52
- primaryImageAvifUrl: format === 'webp' ? undefined : `${base}-q63.avif`,
53
- primaryImageSmallAvifUrl: format === 'webp' ? undefined : `${base}-300-q63.avif`,
50
+ primaryImageUrl: `${base}-640.webp`,
51
+ thumbUrl: `${base}-300.webp`,
52
+ primaryImageSmallUrl: `${base}-300.webp`,
53
+ primaryImageAvifUrl: `${base}-640.avif`,
54
+ primaryImageSmallAvifUrl: `${base}-300.avif`,
54
55
  };
55
56
  });
56
57
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "itube-specs",
3
3
  "type": "module",
4
- "version": "0.0.971",
4
+ "version": "0.0.973",
5
5
  "main": "./nuxt.config.ts",
6
6
  "types": "./types/index.d.ts",
7
7
  "scripts": {