itube-specs 0.0.1018 → 0.0.1021

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/SITE_UPDATES.md CHANGED
@@ -11,6 +11,33 @@
11
11
  коммиты до бампа); `npm run patch` сам проставит ей номер версии. Формат пункта: что сделать и где,
12
12
  кому именно (всем / сайтам с N), что будет, если не сделать.
13
13
 
14
+ ## 0.0.1021 — 2026-10-08
15
+
16
+ - **Сайтам со своей темой** (`assets/scss/vars/_theme.scss` в сайте, как у hdsex-remaster): завести токены
17
+ нового инфо-блока модели — как в `themes/dark/_theme.scss` слоя: `$info-model-about-title`,
18
+ `$info-model-about-text`, `$info-model-summary-bg`, `$info-model-summary-bg--hover`, `$info-model-summary-text`,
19
+ `$info-model-summary-icon`, `$info-grid-item-value`. Удалены (можно убрать): `$info-model-border`,
20
+ `$info-model-bg`, `$info-model-footer-border`. По макету: `$info-model-description` → `$color-zinc-300`,
21
+ `$info-grid-item-title` → `$color-zinc-450`. Не завести — сборка падает на undefined variable.
22
+ - **Сайтам с форком `components/view/model-videos.vue`:** убрать `<LazyUiFullDescr>` с `fullDescription` внизу
23
+ страницы — длинное описание теперь показывает `InfoModel` в блоке «About». Не убрать — текст на странице
24
+ задублируется.
25
+
26
+ ## 0.0.1019 — 2026-10-08
27
+
28
+ - **Сайтам со своей темой** (`assets/scss/vars/_theme.scss` в сайте, как у hdsex-remaster): завести токены
29
+ строки над плеером и описания — как в `themes/dark/_theme.scss` слоя:
30
+ `$player-tags-chip-bg`, `$player-tags-tag-bg`, `$player-tags-more-text`, `$player-tags-more-text--hover`,
31
+ `$video-info-handler-text--hover`. Плюс по макету изменились значения: `$video-channel-bg` → `$color-zinc-800`,
32
+ `$video-info-handler-text` → `$color-zinc-500`. Не завести — сборка падает на undefined variable. Образец —
33
+ коммит hdsex-remaster с переходом на эту версию.
34
+ - **Сайтам с форком `components/view/video.vue`:** строку над плеером `<UiExpandRow …>` заменить на
35
+ `<PlayerTags …>` (те же `items` и слот `prepend`) — новая раскладка по макету: «More +N» после влезших чипсов,
36
+ теги светлее категорий, на мобиле строка листается. Не заменить — у сайта останется старая строка.
37
+ - **Сайтам с хуком попандера на карточке видео** (`pu-trigger` на `<CardVideo>`): класс перенести в проп
38
+ `link-class="pu-trigger"` — он ляжет только на ссылки на ролик (превью и тайтл), меню и кнопки карточки
39
+ перестанут открывать попандер. Остальным — ничего.
40
+
14
41
  ## 0.0.1013 — 2026-10-07
15
42
 
16
43
  - **Всем сайтам — чистка своих переводов (`i18n/locales/*.json`, во всех локалях):** образец —
@@ -4,8 +4,7 @@
4
4
  box-sizing: border-box;
5
5
  }
6
6
 
7
- ul[class],
8
- ol[class] {
7
+ :where(ul[class], ol[class]) {
9
8
  padding: 0;
10
9
  }
11
10
 
@@ -15,8 +14,7 @@ h2,
15
14
  h3,
16
15
  h4,
17
16
  p,
18
- ul[class],
19
- ol[class],
17
+ :where(ul[class], ol[class]),
20
18
  li,
21
19
  figure,
22
20
  figcaption,
@@ -33,8 +31,7 @@ body {
33
31
  line-height: 1.5;
34
32
  }
35
33
 
36
- ul[class],
37
- ol[class] {
34
+ :where(ul[class], ol[class]) {
38
35
  list-style: none;
39
36
  }
40
37
 
@@ -238,7 +238,8 @@ $video-menu-preview-border: $color-zinc-800;
238
238
 
239
239
  // ─── Video info ───
240
240
  $video-info-item-text: $color-zinc-500-70;
241
- $video-info-handler-text: $color-zinc-400;
241
+ $video-info-handler-text: $color-zinc-500;
242
+ $video-info-handler-text--hover: $color-white;
242
243
  $video-info-description-text: $color-zinc-400;
243
244
 
244
245
  // ─── Video interface ───
@@ -253,7 +254,7 @@ $video-interface-mobile-label: $color-zinc-300;
253
254
  $video-interface-mobile-border: $color-zinc-800;
254
255
 
255
256
  // ─── Video channel ───
256
- $video-channel-bg: $color-zinc-800-60;
257
+ $video-channel-bg: $color-zinc-800;
257
258
  $video-channel-initials-gradient-from: $color-indigo-500;
258
259
  $video-channel-initials-gradient-to: $color-purple-600;
259
260
  $video-channel-initials-text: $color-white;
@@ -813,8 +814,9 @@ $filters-main-bg--hover: $color-zinc-700-70;
813
814
  $info-grid-group-title: $color-zinc-300;
814
815
  $info-grid-item-border: $color-zinc-700-50;
815
816
  $info-grid-item-bg--hover: $color-zinc-700-30;
816
- $info-grid-item-title: $color-zinc-500;
817
+ $info-grid-item-title: $color-zinc-450;
817
818
  $info-grid-item-title-bg: $color-zinc-900;
819
+ $info-grid-item-value: $color-zinc-300;
818
820
  $info-grid-item-value-bg: $color-zinc-900;
819
821
  $info-grid-item-value-bg--link: $color-zinc-700-50;
820
822
  $info-grid-item-value-link-bg--hover: $color-zinc-700-50;
@@ -831,11 +833,14 @@ $info-img-border: $color-zinc-700;
831
833
  $info-description: $color-zinc-400;
832
834
 
833
835
  // ─── Info model ───
834
- $info-model-border: $color-zinc-800-50;
835
- $info-model-bg: $color-zinc-900-50;
836
836
  $info-model-img-bg: $color-zinc-800;
837
- $info-model-description: $color-zinc-400;
838
- $info-model-footer-border: $color-zinc-800-50;
837
+ $info-model-description: $color-zinc-300;
838
+ $info-model-about-title: $color-zinc-300;
839
+ $info-model-about-text: $color-zinc-400;
840
+ $info-model-summary-bg: $color-zinc-700-50;
841
+ $info-model-summary-bg--hover: $color-zinc-700;
842
+ $info-model-summary-text: $color-white;
843
+ $info-model-summary-icon: $color-zinc-400;
839
844
  $info-model-more-text: $color-zinc-500;
840
845
  $info-model-more-text--hover: $color-zinc-300;
841
846
  $info-model-also: $color-zinc-400;
@@ -1171,3 +1176,9 @@ $switcher-subtitle--active: $color-white-60;
1171
1176
  $card-webcam-languages-border: $color-white-20;
1172
1177
  $card-webcam-languages-fallback-bg: $color-zinc-800;
1173
1178
  $card-webcam-languages-fallback-icon: $color-zinc-300;
1179
+
1180
+ // ─── Player tags (строка над плеером) ───
1181
+ $player-tags-chip-bg: $color-zinc-800;
1182
+ $player-tags-tag-bg: $color-zinc-800-50;
1183
+ $player-tags-more-text: $color-zinc-400;
1184
+ $player-tags-more-text--hover: $color-white;
@@ -295,6 +295,7 @@ $video-menu-preview-border: transparent;
295
295
  // ─── Video info ───
296
296
  $video-info-item-text: $color-gray-400;
297
297
  $video-info-handler-text: $color-gray-400;
298
+ $video-info-handler-text--hover: $color-gray-900;
298
299
  $video-info-description-text: $color-gray-700;
299
300
 
300
301
  // ─── Video interface ───
@@ -842,6 +843,7 @@ $info-grid-item-border: $color-gray-300;
842
843
  $info-grid-item-bg--hover: $color-slate-700;
843
844
  $info-grid-item-title: $color-gray-500;
844
845
  $info-grid-item-title-bg: $color-white;
846
+ $info-grid-item-value: $color-gray-900;
845
847
  $info-grid-item-value-bg: $color-gray-100;
846
848
  $info-grid-item-value-bg--link: $color-slate-700;
847
849
  $info-grid-item-value-link-bg--hover: $color-slate-750;
@@ -858,11 +860,14 @@ $info-img-border: transparent;
858
860
  $info-description: $color-gray-600;
859
861
 
860
862
  // ─── Info model ───
861
- $info-model-border: transparent;
862
- $info-model-bg: $color-gray-200;
863
863
  $info-model-img-bg: $color-gray-300;
864
864
  $info-model-description: $color-gray-600;
865
- $info-model-footer-border: $color-gray-300;
865
+ $info-model-about-title: $color-gray-600;
866
+ $info-model-about-text: $color-gray-600;
867
+ $info-model-summary-bg: $color-slate-700;
868
+ $info-model-summary-bg--hover: $color-slate-750;
869
+ $info-model-summary-text: $color-white;
870
+ $info-model-summary-icon: $color-gray-400;
866
871
  $info-model-more-text: $color-gray-600;
867
872
  $info-model-more-text--hover: $color-gray-600;
868
873
  $info-model-also: $color-gray-600;
@@ -1198,3 +1203,9 @@ $switcher-subtitle--active: $color-white-60;
1198
1203
  $card-webcam-languages-border: $color-gray-300;
1199
1204
  $card-webcam-languages-fallback-bg: $color-gray-200;
1200
1205
  $card-webcam-languages-fallback-icon: $color-gray-600;
1206
+
1207
+ // ─── Player tags (строка над плеером) ───
1208
+ $player-tags-chip-bg: $color-gray-200;
1209
+ $player-tags-tag-bg: $color-gray-100;
1210
+ $player-tags-more-text: $color-gray-700;
1211
+ $player-tags-more-text--hover: $color-gray-900;
@@ -13,6 +13,7 @@
13
13
  >
14
14
  <NuxtLink
15
15
  :to="link"
16
+ :class="linkClass"
16
17
  class="card-video__poster-wrapper"
17
18
  @mouseenter.passive="startPreviewByHover(previewId)"
18
19
  @mouseleave.passive="stopPreviewByHover(previewId)"
@@ -91,6 +92,7 @@
91
92
  <NuxtLink
92
93
  :to="link"
93
94
  :title="card.title"
95
+ :class="linkClass"
94
96
  class="card-video__title _truncate"
95
97
  >{{ card.title }}
96
98
  </NuxtLink>
@@ -153,6 +155,8 @@ const props = defineProps<{
153
155
  history?: boolean
154
156
  /** Развилка мета-строки истории: вместо «когда смотрели» — сколько осталось до конца («Продолжить просмотр») */
155
157
  remaining?: boolean
158
+ /** Класс на ссылки на ролик (превью и тайтл) — например хук попандера сайта, чтобы меню и кнопки карточки его не задевали */
159
+ linkClass?: string
156
160
  }>();
157
161
 
158
162
  const emit = defineEmits<{
@@ -677,9 +677,7 @@ onBeforeUnmount(() => {
677
677
  }
678
678
  }
679
679
 
680
- // селектор с родителем не случайно: ресет обнуляет отступы у `ul[class]`, и
681
- // одиночного класса ему не хватает
682
- .card-webcam > .card-webcam__tags {
680
+ .card-webcam__tags {
683
681
  display: flex;
684
682
  flex-wrap: wrap;
685
683
  gap: 6px;
@@ -688,7 +686,7 @@ onBeforeUnmount(() => {
688
686
 
689
687
  // на узких экранах теги в один ряд с горизонтальным скроллом: в две колонки они
690
688
  // не влезают, а перенос делал карточки в сетке разной высоты
691
- .card-webcam > .card-webcam__tags {
689
+ .card-webcam__tags {
692
690
  @include to-br(xm) {
693
691
  flex-wrap: nowrap;
694
692
  overflow-x: auto;
@@ -26,7 +26,7 @@
26
26
  :is="item.isFilter && value ? NuxtLink : 'div'"
27
27
  :key="`s-info-grid-value-${gIndex}-${index}-${vIndex}`"
28
28
  :class="{'--link': item.isFilter && value}"
29
- :to="item.isFilter && value ? generateLink(link(item, value.name)) : undefined"
29
+ :to="item.isFilter && value ? generateLink(modelFilterLink(item, value.name)) : undefined"
30
30
  class="info-grid__item"
31
31
  >
32
32
  <span
@@ -67,7 +67,8 @@
67
67
  </template>
68
68
 
69
69
  <script setup lang="ts">
70
- import type { IGroupedParameter, IGroupedParameterItem } from '../../types';
70
+ import type { IGroupedParameter } from '../../types';
71
+ import { modelFilterLink } from '../../utils/info-grid/model-filter-link';
71
72
 
72
73
  defineProps<{
73
74
  groups: IGroupedParameter[]
@@ -84,16 +85,6 @@ const NuxtLink = resolveComponent('NuxtLink');
84
85
  const { hiddenByUnits } = useUnits();
85
86
  const { generateLink } = useGenerateLink();
86
87
 
87
- function link(item: IGroupedParameterItem, value: string) {
88
- const formattedValue = value.toLowerCase().replace(/\s+/g, '+');
89
-
90
- if (item.kind === 'range') {
91
- return `/models?filter_${item.name}_from=${formattedValue}&filter_${item.name}_to=${formattedValue}`;
92
- } else {
93
- return `/models?filter_${item.name}=${formattedValue}`;
94
- }
95
- }
96
-
97
88
  function isSuccess(value: string) {
98
89
  const values = ['active'];
99
90
  return values.includes(value);
@@ -108,7 +99,7 @@ function isWarning(value: string) {
108
99
  <style lang="scss">
109
100
  .info-grid {
110
101
  display: grid;
111
- row-gap: 28px;
102
+ row-gap: 20px;
112
103
  }
113
104
 
114
105
  .info-grid__group-title {
@@ -116,9 +107,9 @@ function isWarning(value: string) {
116
107
 
117
108
  margin-bottom: 12px;
118
109
  color: $info-grid-group-title;
119
- line-height: 16px;
110
+ font-weight: 600;
111
+ letter-spacing: var(--tracking-wide);
120
112
  text-transform: uppercase;
121
- font-weight: 500;
122
113
  }
123
114
 
124
115
  .info-grid__group-items {
@@ -133,14 +124,16 @@ function isWarning(value: string) {
133
124
 
134
125
  display: flex;
135
126
  flex-wrap: nowrap;
136
- align-items: center;
127
+ height: 36px;
137
128
  border-radius: $radius-lg;
138
129
  border: 1px solid $info-grid-item-border;
139
130
  overflow: hidden;
140
131
  }
141
132
 
142
133
  .info-grid__item-title {
143
- padding: 6px 10px;
134
+ display: flex;
135
+ align-items: center;
136
+ padding-inline: 10px;
144
137
  color: $info-grid-item-title;
145
138
  background-color: $info-grid-item-title-bg;
146
139
  }
@@ -150,7 +143,7 @@ function isWarning(value: string) {
150
143
  flex-wrap: nowrap;
151
144
  align-items: center;
152
145
  column-gap: 4px;
153
- padding: 6px 10px;
146
+ padding-inline: 10px;
154
147
  }
155
148
 
156
149
  .info-grid__item.--link {
@@ -175,10 +168,14 @@ function isWarning(value: string) {
175
168
  }
176
169
 
177
170
  .info-grid__item:not(.--link) .info-grid__item-value {
178
- border-left: 1px solid $info-grid-item-value-border;
171
+ color: $info-grid-item-value;
179
172
  background-color: $info-grid-item-value-bg;
180
173
  }
181
174
 
175
+ .info-grid__item:not(.--link) .info-grid__item-title + .info-grid__item-value {
176
+ border-left: 1px solid $info-grid-item-value-border;
177
+ }
178
+
182
179
  .info-grid__item:not(.--link) .info-grid__item-title {
183
180
  background-color: $info-grid-item-value-bg;
184
181
  }
@@ -203,6 +200,9 @@ function isWarning(value: string) {
203
200
  .info-grid__plain-text {
204
201
  @include font-sm;
205
202
 
203
+ max-width: 740px;
204
+ margin-block: -6px;
206
205
  color: $info-grid-plain-text;
206
+ line-height: 1.625;
207
207
  }
208
208
  </style>