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.
Files changed (123) hide show
  1. package/README.md +18 -25
  2. package/components/adv/native-banner.vue +22 -17
  3. package/components/adv/native-bottom.vue +8 -6
  4. package/components/adv/native-player.vue +8 -6
  5. package/components/adv/ntv.vue +4 -3
  6. package/components/auth/icon.vue +4 -3
  7. package/components/auth/login.vue +39 -33
  8. package/components/auth/popup.vue +30 -24
  9. package/components/auth/recovery.vue +29 -24
  10. package/components/auth/register.vue +59 -50
  11. package/components/card/category-mini.vue +6 -4
  12. package/components/card/category.vue +25 -21
  13. package/components/card/channel-mini.vue +17 -13
  14. package/components/card/channel.vue +36 -29
  15. package/components/card/model-mini.vue +24 -19
  16. package/components/card/model.vue +43 -33
  17. package/components/card/playlist-mini.vue +19 -16
  18. package/components/card/playlist.vue +97 -73
  19. package/components/card/round.vue +16 -13
  20. package/components/card/video/dropdown.vue +55 -41
  21. package/components/card/video/index.vue +99 -81
  22. package/components/card/video/mini.vue +19 -15
  23. package/components/card/video/preview.vue +7 -6
  24. package/components/category/by-letter.vue +4 -3
  25. package/components/category/group.vue +18 -13
  26. package/components/category/letter-groups.vue +4 -3
  27. package/components/category/list.vue +19 -16
  28. package/components/category/nav.vue +15 -12
  29. package/components/filter/btn.vue +13 -10
  30. package/components/filter/chips.vue +8 -7
  31. package/components/filter/main.vue +27 -23
  32. package/components/filter/model-field.vue +43 -38
  33. package/components/filter/model.vue +33 -28
  34. package/components/filter/page.vue +53 -43
  35. package/components/filter/popup.vue +75 -60
  36. package/components/filter/selects.vue +63 -49
  37. package/components/filter/slider.vue +23 -20
  38. package/components/filter/videos-chips.vue +3 -2
  39. package/components/grid/categories.vue +5 -4
  40. package/components/grid/channels.vue +9 -7
  41. package/components/grid/models.vue +10 -8
  42. package/components/grid/playlists.vue +6 -5
  43. package/components/grid/videos.vue +35 -31
  44. package/components/info/grid.vue +43 -34
  45. package/components/info/main.vue +94 -71
  46. package/components/info/socials.vue +13 -11
  47. package/components/layout/burger-item.vue +44 -36
  48. package/components/layout/burger.vue +45 -35
  49. package/components/layout/cookie.vue +14 -11
  50. package/components/layout/extra-links.vue +6 -5
  51. package/components/layout/footer-language.vue +35 -28
  52. package/components/layout/header-user.vue +66 -51
  53. package/components/layout/header.vue +55 -42
  54. package/components/layout/language.vue +67 -54
  55. package/components/layout/logo.vue +11 -9
  56. package/components/layout/nav.vue +36 -29
  57. package/components/layout/skip-link.vue +3 -2
  58. package/components/player/aside-videos.vue +10 -8
  59. package/components/player/autoplay.vue +7 -5
  60. package/components/player/channel.vue +25 -19
  61. package/components/player/core.vue +11 -10
  62. package/components/player/follow.vue +17 -13
  63. package/components/player/info.vue +9 -6
  64. package/components/player/interface.vue +50 -38
  65. package/components/player/like.vue +32 -24
  66. package/components/player/main.vue +12 -10
  67. package/components/player/playlist.vue +79 -61
  68. package/components/player/sponsored.vue +20 -16
  69. package/components/playlist/add.vue +89 -71
  70. package/components/playlist/delete-video.vue +23 -18
  71. package/components/playlist/edit.vue +64 -49
  72. package/components/playlist/input.vue +32 -24
  73. package/components/playlist/main.vue +21 -18
  74. package/components/playlist/private-toggle.vue +4 -3
  75. package/components/profile/delete.vue +7 -6
  76. package/components/profile/guest.vue +10 -7
  77. package/components/profile/password.vue +25 -22
  78. package/components/profile/setup.vue +88 -71
  79. package/components/report/main.vue +89 -71
  80. package/components/search/input.vue +37 -31
  81. package/components/search/item.vue +22 -18
  82. package/components/search/main.vue +34 -26
  83. package/components/search/result.vue +72 -57
  84. package/components/section/categories-island.server.vue +7 -5
  85. package/components/section/categories.vue +4 -3
  86. package/components/section/models.vue +4 -3
  87. package/components/section/nav-links.vue +8 -7
  88. package/components/section/seo-text.vue +9 -6
  89. package/components/section/swiper-cards.vue +19 -14
  90. package/components/section/toolbar.vue +26 -20
  91. package/components/share/main.vue +32 -26
  92. package/components/ui/avatar.vue +10 -8
  93. package/components/ui/breadcrumbs.vue +33 -25
  94. package/components/ui/btn.vue +13 -12
  95. package/components/ui/checkbox.vue +21 -17
  96. package/components/ui/chips.vue +33 -29
  97. package/components/ui/count.vue +4 -3
  98. package/components/ui/dropdown.vue +42 -34
  99. package/components/ui/empty-state.vue +11 -9
  100. package/components/ui/expand-row.vue +34 -28
  101. package/components/ui/full-descr.vue +6 -4
  102. package/components/ui/icon.vue +4 -3
  103. package/components/ui/img.vue +11 -10
  104. package/components/ui/input.vue +75 -66
  105. package/components/ui/label.vue +4 -3
  106. package/components/ui/link.vue +20 -18
  107. package/components/ui/notification.vue +22 -17
  108. package/components/ui/pagination.vue +89 -76
  109. package/components/ui/popup.vue +39 -30
  110. package/components/ui/radio.vue +17 -14
  111. package/components/ui/section-title.vue +20 -15
  112. package/components/ui/segmented.vue +19 -15
  113. package/components/ui/select.vue +44 -35
  114. package/components/ui/slider.vue +16 -13
  115. package/components/ui/snackbar.vue +7 -5
  116. package/components/ui/swiper.vue +32 -24
  117. package/components/ui/toggle.vue +17 -14
  118. package/components/ui/tooltip.vue +15 -12
  119. package/components/view/model-videos.vue +71 -57
  120. package/components/view/models.vue +71 -57
  121. package/components/view/video.vue +64 -51
  122. package/components/view/videos.vue +55 -45
  123. package/package.json +1 -1
package/README.md CHANGED
@@ -21,39 +21,32 @@ runtime-хелперы, типы и lib-данные. Приложения ра
21
21
 
22
22
  ## Как работать со слоем
23
23
 
24
- Слой публикуется в npm, приложения используют **опубликованную** копию (`node_modules/itube-specs`).
25
- **Локальные правки не видны приложению, пока не опубликована новая версия.**
24
+ Слой публикуется в npm, прод/CI собираются с **опубликованной** копии (`node_modules/itube-specs`).
25
+ Локально приложение подсасывает слой напрямую через симлинк правки видны сразу, без публикации.
26
26
 
27
- 1. Коммитим правки в слое.
28
- 2. `npm run patch` — патчим версию → пуш → мерж.
29
- 3. В проекте: `npm run spec` (`npm install itube-specs@latest`), при необходимости `npx nuxi prepare`
30
- (если не подхватились автоимпорты composables/компонентов).
31
- 4. При runtime-проблемах — `npm run dev` в слое перегенерит `tsconfig` и `eslint.config.mjs`.
27
+ ### Локальная разработка (авто-линк из приложения)
32
28
 
33
- > **npm install и другие команды, меняющие зависимости, в этом репозитории не запускаем** — зависимости
34
- > и публикацию ведёт мейнтейнер вручную. Править `package.json` можно, ставить пакеты — нет.
29
+ В приложении `npm run dev` перед стартом (хук `predev`) вешает симлинк
30
+ `node_modules/itube-specs` `LAYER_PATH` (путь берётся из `.env` приложения). Дальше:
35
31
 
36
- ### Отладка из приложения
32
+ 1. Правим слой прямо здесь (по `LAYER_PATH`) — изменения видны на локалке приложения сразу (HMR),
33
+ cmd+click по сущностям слоя ведёт в эти исходники.
34
+ 2. Правки готовы: коммит в слое → `npm run patch` → пуш → мерж → публикация.
35
+ 3. В приложении: `npm run spec` (`npm install itube-specs@latest`) тянет опубликованную версию
36
+ (симлинк заменяется реальным пакетом), коммит, пуш на прод.
37
37
 
38
- Правим слой прямо здесь (по `LAYER_PATH`), затем `npm run patch` + `npm run spec` в приложении.
38
+ `npm run dev:published` в приложении дев против опубликованной версии, минуя авто-линк.
39
39
 
40
- Приоритет авто-импорта в приложении: `*-debug` > проектные `components/`/`composables/` > слой.
40
+ > **npm install и другие команды, меняющие зависимости, в этом репозитории не запускаем** зависимости
41
+ > и публикацию ведёт мейнтейнер вручную. Править `package.json` можно, ставить пакеты — нет.
41
42
 
42
- **Постоянная кастомизация:** приложение может завести файл с **тем же именем**, что сущность слоя
43
- (напр. `<UiBtn>`), в своих `components/`/`composables/` — победит проектный (он выше слоя). Так форк
44
- меняет вёрстку/логику под себя **без переименования**. Осмысленно: если разницу решает пропс — делать
45
- пропсом, а не форкать весь компонент.
43
+ ### Проектные оверрайды
46
44
 
47
- **Отладка слоя:** копируем сущность слоя в `components-debug/` / `composables-debug/` приложения
48
- (без сегмента `components/`/`composables/` слоевого пути), `npx nuxi prepare` — копия перекрывает слой
49
- (отдельные авто-корни, наивысший приоритет). При необходимости оверрайд можно закоммитить и выкатить
50
- в бой для отладки (папки не в git-ignore). Правим, переносим в слой (или скилл `debug-clean`),
51
- `npm run patch` + `npm run spec`, копию удаляем. Импорты в копии — пакетные
52
- (`itube-specs/runtime|types|lib|services|utils`). **Дисциплина: держать пусто, когда нет активной задачи** —
53
- копия перекрывает слой только для одного проекта, правки должны уходить в слой и расходиться на все форки.
45
+ Приоритет авто-импорта в приложении: проектные `components/`/`composables/` > слой.
54
46
 
55
- Для мелких утилит/runtime можно и грубее временный disk-импорт с диска
56
- (`import { test } from '../../../../specs/runtime/utils'`), только для локальной отладки, в коммит не идёт.
47
+ Приложение может завести файл с **тем же именем**, что сущность слоя (напр. `<UiBtn>`), в своих
48
+ `components/`/`composables/` победит проектный (он выше слоя). Так форк меняет вёрстку/логику под себя
49
+ **без переименования**. Осмысленно: если разницу решает пропс — делать пропсом, а не форкать весь компонент.
57
50
 
58
51
  ---
59
52
 
@@ -1,27 +1,32 @@
1
1
  <template>
2
2
  <ClientOnly>
3
- <div v-if="spot"
4
- :class="{
5
- 'ntv': isNtv,
6
- }"
7
- class="adv-native-card"
3
+ <div
4
+ v-if="spot"
5
+ :class="{
6
+ 'ntv': isNtv,
7
+ }"
8
+ class="adv-native-card"
8
9
  >
9
- <div v-once
10
- class="adv-native-card__slot"
10
+ <div
11
+ v-once
12
+ class="adv-native-card__slot"
11
13
  >
12
- <div data-asg-ins
13
- :data-spots="spot"
14
+ <div
15
+ data-asg-ins
16
+ :data-spots="spot"
14
17
  />
15
18
  </div>
16
- <div v-if="!isNtv"
17
- class="adv-native-card__bottom"
19
+ <div
20
+ v-if="!isNtv"
21
+ class="adv-native-card__bottom"
18
22
  >
19
- <UiImg :alt="t('advertising_banner')"
20
- class="adv-native-card__channel-logo"
21
- width="32"
22
- height="32"
23
- src="/img/user-uploaded.svg"
24
- sizes="32px"
23
+ <UiImg
24
+ :alt="t('advertising_banner')"
25
+ class="adv-native-card__channel-logo"
26
+ width="32"
27
+ height="32"
28
+ src="/img/user-uploaded.svg"
29
+ sizes="32px"
25
30
  />
26
31
 
27
32
  <div class="adv-native-card__titles">
@@ -1,11 +1,13 @@
1
1
  <template>
2
- <iframe :src="`/embed/${BannerHelper.getBannerSpot(AdBannerType.NativeBottom, AdSpotType.Primary)}`"
3
- class="adv-native-bottom"
4
- title="content"
2
+ <iframe
3
+ :src="`/embed/${BannerHelper.getBannerSpot(AdBannerType.NativeBottom, AdSpotType.Primary)}`"
4
+ class="adv-native-bottom"
5
+ title="content"
5
6
  />
6
- <iframe :src="`/embed/${BannerHelper.getBannerSpot(AdBannerType.NativeBottom, AdSpotType.Secondary)}`"
7
- class="adv-native-bottom"
8
- title="content"
7
+ <iframe
8
+ :src="`/embed/${BannerHelper.getBannerSpot(AdBannerType.NativeBottom, AdSpotType.Secondary)}`"
9
+ class="adv-native-bottom"
10
+ title="content"
9
11
  />
10
12
  </template>
11
13
 
@@ -1,11 +1,13 @@
1
1
  <template>
2
- <iframe :src="`/embed/${BannerHelper.getBannerSpot(AdBannerType.NativePlayer, AdSpotType.Primary)}`"
3
- class="adv-native-player"
4
- title="content"
2
+ <iframe
3
+ :src="`/embed/${BannerHelper.getBannerSpot(AdBannerType.NativePlayer, AdSpotType.Primary)}`"
4
+ class="adv-native-player"
5
+ title="content"
5
6
  />
6
- <iframe :src="`/embed/${BannerHelper.getBannerSpot(AdBannerType.NativePlayer, AdSpotType.Secondary)}`"
7
- class="adv-native-player"
8
- title="content"
7
+ <iframe
8
+ :src="`/embed/${BannerHelper.getBannerSpot(AdBannerType.NativePlayer, AdSpotType.Secondary)}`"
9
+ class="adv-native-player"
10
+ title="content"
9
11
  />
10
12
  </template>
11
13
 
@@ -1,7 +1,8 @@
1
1
  <template>
2
- <iframe :src="`/embed/${BannerHelper.getBannerSpot(AdBannerType.NTV, AdSpotType.Primary)}?ntv=1`"
3
- class="adv-ntv"
4
- title="content"
2
+ <iframe
3
+ :src="`/embed/${BannerHelper.getBannerSpot(AdBannerType.NTV, AdSpotType.Primary)}?ntv=1`"
4
+ class="adv-ntv"
5
+ title="content"
5
6
  />
6
7
  </template>
7
8
 
@@ -1,8 +1,9 @@
1
1
  <template>
2
2
  <div class="auth-icon">
3
- <UiIcon :name="icon"
4
- class="auth-icon__icon"
5
- size="24"
3
+ <UiIcon
4
+ :name="icon"
5
+ class="auth-icon__icon"
6
+ size="24"
6
7
  />
7
8
  </div>
8
9
  </template>
@@ -1,52 +1,58 @@
1
1
  <template>
2
- <div :class="{ _loading: loading }"
3
- class="auth-login"
2
+ <div
3
+ :class="{ _loading: loading }"
4
+ class="auth-login"
4
5
  >
5
6
  <AuthIcon class="auth-login__icon" />
6
7
 
7
- <UiInput v-model="form.username"
8
- :label="t('auth.username')"
9
- :placeholder="t('auth.username')"
10
- hide-label
11
- :error="error.username"
12
- name="login-name"
13
- enterkeyhint="next"
14
- @update:error="(val: boolean) => (error.username = val)"
15
- @enter="passwordRef?.focus()"
8
+ <UiInput
9
+ v-model="form.username"
10
+ :label="t('auth.username')"
11
+ :placeholder="t('auth.username')"
12
+ hide-label
13
+ :error="error.username"
14
+ name="login-name"
15
+ enterkeyhint="next"
16
+ @update:error="(val: boolean) => (error.username = val)"
17
+ @enter="passwordRef?.focus()"
16
18
  />
17
- <UiInput ref="passwordRef"
18
- v-model="form.password_hash"
19
- :label="t('auth.password')"
20
- :placeholder="t('auth.password')"
21
- hide-label
22
- :error="error.password_hash"
23
- type="password"
24
- enterkeyhint="go"
25
- @update:error="(val: boolean) => (error.password_hash = val)"
26
- @enter="login"
19
+ <UiInput
20
+ ref="passwordRef"
21
+ v-model="form.password_hash"
22
+ :label="t('auth.password')"
23
+ :placeholder="t('auth.password')"
24
+ hide-label
25
+ :error="error.password_hash"
26
+ type="password"
27
+ enterkeyhint="go"
28
+ @update:error="(val: boolean) => (error.password_hash = val)"
29
+ @enter="login"
27
30
  />
28
31
 
29
32
  <div class="auth-login__buttons">
30
- <UiBtn :disabled="loading"
31
- class="auth-login__login"
32
- wide
33
- size="l"
34
- theme="primary"
35
- @click="login"
33
+ <UiBtn
34
+ :disabled="loading"
35
+ class="auth-login__login"
36
+ wide
37
+ size="l"
38
+ theme="primary"
39
+ @click="login"
36
40
  >{{ t("auth.log_in") }}
37
41
  </UiBtn>
38
- <button class="auth-login__forgot"
39
- type="button"
40
- @click="onForgotClick"
42
+ <button
43
+ class="auth-login__forgot"
44
+ type="button"
45
+ @click="onForgotClick"
41
46
  >
42
47
  {{ t("auth.forgot") }}
43
48
  </button>
44
49
 
45
50
  <p class="auth-login__back">
46
51
  {{ t("register_text") }}
47
- <button class="auth-login__back-button"
48
- type="button"
49
- @click="onCreateClick"
52
+ <button
53
+ class="auth-login__back-button"
54
+ type="button"
55
+ @click="onCreateClick"
50
56
  >
51
57
  {{ t("auth.sign_up") }}
52
58
  </button>
@@ -1,44 +1,50 @@
1
1
  <template>
2
- <div v-if="isAuthPopupOpen"
3
- class="auth-popup__decorate"
2
+ <div
3
+ v-if="isAuthPopupOpen"
4
+ class="auth-popup__decorate"
4
5
  />
5
6
  <transition mode="out-in">
6
- <UiPopup v-if="currentStep === AuthSteps.Registration && isAuthPopupOpen"
7
- v-model="isAuthPopupOpen"
8
- transparent-backdrop
9
- :back="isBackShow"
10
- class="auth-popup"
11
- @back="currentStep -= 1"
7
+ <UiPopup
8
+ v-if="currentStep === AuthSteps.Registration && isAuthPopupOpen"
9
+ v-model="isAuthPopupOpen"
10
+ transparent-backdrop
11
+ :back="isBackShow"
12
+ class="auth-popup"
13
+ @back="currentStep -= 1"
12
14
  >
13
15
  <template #title>{{ $t('auth.create_new') }}</template>
14
- <AuthRegister :additional-text="additionalText"
15
- @login="onLoginClick"
16
+ <AuthRegister
17
+ :additional-text="additionalText"
18
+ @login="onLoginClick"
16
19
  />
17
20
  </UiPopup>
18
21
  </transition>
19
22
 
20
23
  <transition mode="out-in">
21
- <UiPopup v-if="currentStep === AuthSteps.Login && isAuthPopupOpen"
22
- v-model="isAuthPopupOpen"
23
- transparent-backdrop
24
- :back="isBackShow"
25
- class="auth-popup"
26
- @back="currentStep -= 1"
24
+ <UiPopup
25
+ v-if="currentStep === AuthSteps.Login && isAuthPopupOpen"
26
+ v-model="isAuthPopupOpen"
27
+ transparent-backdrop
28
+ :back="isBackShow"
29
+ class="auth-popup"
30
+ @back="currentStep -= 1"
27
31
  >
28
32
  <template #title>{{ $t('auth.welcome_back') }}</template>
29
- <AuthLogin @forgot="onRecoveryClick"
30
- @create="currentStep -= 1"
33
+ <AuthLogin
34
+ @forgot="onRecoveryClick"
35
+ @create="currentStep -= 1"
31
36
  />
32
37
  </UiPopup>
33
38
  </transition>
34
39
 
35
40
  <transition mode="out-in">
36
- <UiPopup v-if="currentStep === AuthSteps.Recovery && isAuthPopupOpen"
37
- v-model="isAuthPopupOpen"
38
- transparent-backdrop
39
- :back="isBackShow"
40
- class="auth-popup"
41
- @back="currentStep -= 1"
41
+ <UiPopup
42
+ v-if="currentStep === AuthSteps.Recovery && isAuthPopupOpen"
43
+ v-model="isAuthPopupOpen"
44
+ transparent-backdrop
45
+ :back="isBackShow"
46
+ class="auth-popup"
47
+ @back="currentStep -= 1"
42
48
  >
43
49
  <template #title>{{ $t('auth.recovery_title')}}</template>
44
50
  <AuthRecovery @login="onLoginClick"/>
@@ -1,37 +1,42 @@
1
1
  <template>
2
- <div :class="{'_loading': loading}"
3
- class="auth-recovery"
2
+ <div
3
+ :class="{'_loading': loading}"
4
+ class="auth-recovery"
4
5
  >
5
6
 
6
- <AuthIcon class="auth-recovery__icon"
7
- icon="envelope"
7
+ <AuthIcon
8
+ class="auth-recovery__icon"
9
+ icon="envelope"
8
10
  />
9
11
 
10
12
  <p class="auth-recovery__text">{{ t('auth.recovery_text') }}</p>
11
- <UiInput v-model="form.email"
12
- :label="$t('email')"
13
- :placeholder="$t('email')"
14
- hide-label
15
- :error="error.email"
16
- type="email"
17
- inputmode="email"
18
- enterkeyhint="send"
19
- autocomplete="email"
20
- @update:error="(val: boolean) => error.email = val"
21
- @enter="submit"
13
+ <UiInput
14
+ v-model="form.email"
15
+ :label="$t('email')"
16
+ :placeholder="$t('email')"
17
+ hide-label
18
+ :error="error.email"
19
+ type="email"
20
+ inputmode="email"
21
+ enterkeyhint="send"
22
+ autocomplete="email"
23
+ @update:error="(val: boolean) => error.email = val"
24
+ @enter="submit"
22
25
  />
23
26
 
24
- <UiBtn :disabled="loading"
25
- class="auth-recovery__button"
26
- wide
27
- size="l"
28
- theme="primary"
29
- @click="submit"
27
+ <UiBtn
28
+ :disabled="loading"
29
+ class="auth-recovery__button"
30
+ wide
31
+ size="l"
32
+ theme="primary"
33
+ @click="submit"
30
34
  >{{ t('auth.get_recovery') }}
31
35
  </UiBtn>
32
- <button class="auth-recovery__login"
33
- type="button"
34
- @click="onLoginClick"
36
+ <button
37
+ class="auth-recovery__login"
38
+ type="button"
39
+ @click="onLoginClick"
35
40
  >{{ t('auth.back_to_login') }}
36
41
  </button>
37
42
  </div>
@@ -1,62 +1,69 @@
1
1
  <template>
2
2
  <ClientOnly>
3
- <div :class="{'_loading': loading}"
4
- class="auth-register"
3
+ <div
4
+ :class="{'_loading': loading}"
5
+ class="auth-register"
5
6
  >
6
7
  <AuthIcon class="auth-register__icon" />
7
- <p v-if="additionalText"
8
- class="auth-register__text"
8
+ <p
9
+ v-if="additionalText"
10
+ class="auth-register__text"
9
11
  >{{ t(additionalText) }}
10
12
  </p>
11
- <UiInput v-model="form.email"
12
- :placeholder="t('email')"
13
- :label="t('email')"
14
- hide-label
15
- :error="error.email"
16
- type="email"
17
- inputmode="email"
18
- enterkeyhint="next"
19
- autocomplete="email"
20
- @update:error="(val: boolean) => error.email = val"
21
- @enter="usernameRef?.focus()"
13
+ <UiInput
14
+ v-model="form.email"
15
+ :placeholder="t('email')"
16
+ :label="t('email')"
17
+ hide-label
18
+ :error="error.email"
19
+ type="email"
20
+ inputmode="email"
21
+ enterkeyhint="next"
22
+ autocomplete="email"
23
+ @update:error="(val: boolean) => error.email = val"
24
+ @enter="usernameRef?.focus()"
22
25
  />
23
- <UiInput ref="usernameRef"
24
- v-model="form.username"
25
- :label="t('login')"
26
- :placeholder="t('login')"
27
- hide-label
28
- :error="error.username"
29
- name="login-name"
30
- enterkeyhint="next"
31
- @update:error="(val: boolean) => error.username = val"
32
- @enter="passwordRef?.focus()"
26
+ <UiInput
27
+ ref="usernameRef"
28
+ v-model="form.username"
29
+ :label="t('login')"
30
+ :placeholder="t('login')"
31
+ hide-label
32
+ :error="error.username"
33
+ name="login-name"
34
+ enterkeyhint="next"
35
+ @update:error="(val: boolean) => error.username = val"
36
+ @enter="passwordRef?.focus()"
33
37
  />
34
- <UiInput ref="passwordRef"
35
- v-model="form.password_hash"
36
- :label="t('auth.password')"
37
- :placeholder="t('auth.password')"
38
- hide-label
39
- :error="error.password_hash"
40
- type="password"
41
- enterkeyhint="send"
42
- autocomplete="new-password"
43
- @update:error="(val: boolean) => error.password_hash = val"
44
- @enter="submit"
38
+ <UiInput
39
+ ref="passwordRef"
40
+ v-model="form.password_hash"
41
+ :label="t('auth.password')"
42
+ :placeholder="t('auth.password')"
43
+ hide-label
44
+ :error="error.password_hash"
45
+ type="password"
46
+ enterkeyhint="send"
47
+ autocomplete="new-password"
48
+ @update:error="(val: boolean) => error.password_hash = val"
49
+ @enter="submit"
45
50
  />
46
51
 
47
52
  <div class="auth-register__buttons">
48
- <UiBtn :disabled="loading"
49
- wide
50
- size="l"
51
- theme="primary"
52
- @click="submit"
53
+ <UiBtn
54
+ :disabled="loading"
55
+ wide
56
+ size="l"
57
+ theme="primary"
58
+ @click="submit"
53
59
  >{{ t('auth.sign_up') }}
54
60
  </UiBtn>
55
61
  <p class="auth-register__login">
56
62
  {{ t('login_text') }}
57
- <button class="auth-register__login-button"
58
- type="button"
59
- @click="onLoginClick"
63
+ <button
64
+ class="auth-register__login-button"
65
+ type="button"
66
+ @click="onLoginClick"
60
67
  >
61
68
  {{ t('auth.log_in') }}
62
69
  </button>
@@ -64,15 +71,17 @@
64
71
  </div>
65
72
 
66
73
  <p class="auth-register__agreement">{{ t('auth.agree_begin') }}
67
- <NuxtLink class="auth-register__agreement-link"
68
- to="/terms"
69
- target="_blank"
74
+ <NuxtLink
75
+ class="auth-register__agreement-link"
76
+ to="/terms"
77
+ target="_blank"
70
78
  >{{ t('auth.agree_terms') }}
71
79
  </NuxtLink>
72
80
  {{ t('auth.agree_and') }}
73
- <NuxtLink class="auth-register__agreement-link"
74
- to="/policy"
75
- target="_blank"
81
+ <NuxtLink
82
+ class="auth-register__agreement-link"
83
+ to="/policy"
84
+ target="_blank"
76
85
  >{{ t('auth.agree_policy') }}
77
86
  </NuxtLink>
78
87
  </p>
@@ -5,13 +5,15 @@
5
5
  <p class="card-category-mini__name">{{ card.title }}</p>
6
6
  <div class="card-category-mini__info">
7
7
  <span class="card-category-mini__detail">
8
- <UiIcon name="video-camera"
9
- size="14"
8
+ <UiIcon
9
+ name="video-camera"
10
+ size="14"
10
11
  />
11
12
  {{ $n(card.videosCount, 'compact') }}
12
13
  </span>
13
- <span v-if="$features.FeatureFollowEnabled"
14
- class="card-category-mini__detail"
14
+ <span
15
+ v-if="$features.FeatureFollowEnabled"
16
+ class="card-category-mini__detail"
15
17
  >{{ $n(8400, 'compact') }}</span>
16
18
  </div>
17
19
  </div>
@@ -1,35 +1,39 @@
1
1
  <!-- Карточка категории: обложка, название с флагом, счётчик видео -->
2
2
  <template>
3
- <NuxtLink :title="card.title"
4
- :to="localePath(`/categories/${convertString().toSlug(slug)}`)"
5
- class="card-category"
3
+ <NuxtLink
4
+ :title="card.title"
5
+ :to="localePath(`/categories/${convertString().toSlug(slug)}`)"
6
+ class="card-category"
6
7
  >
7
- <UiImg :alt="card.title"
8
- :src="currentImage"
9
- :loading="priority ? 'eager' : 'lazy'"
10
- :priority="priority"
11
- class="card-category__img"
12
- sizes="320px"
13
- width="320"
14
- height="180"
15
- @error="onImageError"
8
+ <UiImg
9
+ :alt="card.title"
10
+ :src="currentImage"
11
+ :loading="priority ? 'eager' : 'lazy'"
12
+ :priority="priority"
13
+ class="card-category__img"
14
+ sizes="320px"
15
+ width="320"
16
+ height="180"
17
+ @error="onImageError"
16
18
  />
17
19
  <div class="card-category__wrapper">
18
20
  <div class="card-category__wrapper-header">
19
21
  <span class="card-category__title">
20
22
  {{ card.title }}
21
- <img v-if="card.icon"
22
- :src="`/icons/flags/${card.icon}.svg`"
23
- :alt="card.icon"
24
- class="card-category__icon"
25
- width="17"
26
- height="17"
27
- loading="lazy"
23
+ <img
24
+ v-if="card.icon"
25
+ :src="`/icons/flags/${card.icon}.svg`"
26
+ :alt="card.icon"
27
+ class="card-category__icon"
28
+ width="17"
29
+ height="17"
30
+ loading="lazy"
28
31
  >
29
32
  </span>
30
33
  <span class="card-category__count">
31
- <UiIcon name="video-camera"
32
- size="14"
34
+ <UiIcon
35
+ name="video-camera"
36
+ size="14"
33
37
  />
34
38
  {{ $n(card.videosCount, 'compact') }}
35
39
  </span>