Limit thumbnail sizes
This commit is contained in:
parent
7e4022a554
commit
cf78883c70
15 changed files with 151 additions and 123 deletions
|
@ -3,7 +3,7 @@
|
|||
@import '_miniature';
|
||||
|
||||
.margin-content {
|
||||
@include adapt-margin-content-width;
|
||||
@include fluid-videos-miniature-layout;
|
||||
}
|
||||
|
||||
.section {
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
<div *ngIf="isVideo(result)" class="entry video">
|
||||
<my-video-miniature
|
||||
[video]="result" [user]="user" [displayAsRow]="true" [displayVideoActions]="!hideActions()"
|
||||
[useLazyLoadUrl]="advancedSearch.searchTarget === 'search-index'"
|
||||
[displayOptions]="videoDisplayOptions" [useLazyLoadUrl]="advancedSearch.searchTarget === 'search-index'"
|
||||
(videoBlocked)="removeVideoFromArray(result)" (videoRemoved)="removeVideoFromArray(result)"
|
||||
></my-video-miniature>
|
||||
</div>
|
||||
|
|
|
@ -8,11 +8,11 @@ import { SearchService } from '@app/search/search.service'
|
|||
import { immutableAssign } from '@app/shared/misc/utils'
|
||||
import { ComponentPagination } from '@app/shared/rest/component-pagination.model'
|
||||
import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
|
||||
import { MiniatureDisplayOptions } from '@app/shared/video/video-miniature.component'
|
||||
import { Video } from '@app/shared/video/video.model'
|
||||
import { MetaService } from '@ngx-meta/core'
|
||||
import { I18n } from '@ngx-translate/i18n-polyfill'
|
||||
import { ServerConfig } from '@shared/models'
|
||||
import { UserService } from '@app/shared'
|
||||
import { SearchTargetType } from '@shared/models/search/search-target-query.model'
|
||||
|
||||
@Component({
|
||||
|
@ -32,6 +32,17 @@ export class SearchComponent implements OnInit, OnDestroy {
|
|||
isSearchFilterCollapsed = true
|
||||
currentSearch: string
|
||||
|
||||
videoDisplayOptions: MiniatureDisplayOptions = {
|
||||
date: true,
|
||||
views: true,
|
||||
by: true,
|
||||
avatar: false,
|
||||
privacyLabel: false,
|
||||
privacyText: false,
|
||||
state: false,
|
||||
blacklistInfo: false
|
||||
}
|
||||
|
||||
errorMessage: string
|
||||
serverConfig: ServerConfig
|
||||
|
||||
|
|
|
@ -36,11 +36,11 @@ export class ScreenService {
|
|||
|
||||
let numberOfVideos = 1
|
||||
|
||||
if (screenWidth > 1850) numberOfVideos = 6
|
||||
else if (screenWidth > 1600) numberOfVideos = 5
|
||||
else if (screenWidth > 1370) numberOfVideos = 4
|
||||
else if (screenWidth > 1100) numberOfVideos = 3
|
||||
else if (screenWidth > 850) numberOfVideos = 2
|
||||
if (screenWidth > 1850) numberOfVideos = 7
|
||||
else if (screenWidth > 1600) numberOfVideos = 6
|
||||
else if (screenWidth > 1370) numberOfVideos = 5
|
||||
else if (screenWidth > 1100) numberOfVideos = 4
|
||||
else if (screenWidth > 850) numberOfVideos = 3
|
||||
|
||||
return numberOfVideos
|
||||
}
|
||||
|
|
|
@ -35,13 +35,15 @@
|
|||
{{ getCurrentGroupedDateLabel(video) }}
|
||||
</div>
|
||||
|
||||
<my-video-miniature
|
||||
[fitWidth]="true"
|
||||
[video]="video" [user]="user" [ownerDisplayType]="ownerDisplayType"
|
||||
[displayVideoActions]="displayVideoActions" [displayOptions]="displayOptions"
|
||||
(videoBlocked)="removeVideoFromArray(video)" (videoRemoved)="removeVideoFromArray(video)"
|
||||
>
|
||||
</my-video-miniature>
|
||||
<div class="video-wrapper">
|
||||
<my-video-miniature
|
||||
[fitWidth]="true"
|
||||
[video]="video" [user]="user" [ownerDisplayType]="ownerDisplayType"
|
||||
[displayVideoActions]="displayVideoActions" [displayOptions]="displayOptions"
|
||||
(videoBlocked)="removeVideoFromArray(video)" (videoRemoved)="removeVideoFromArray(video)"
|
||||
>
|
||||
</my-video-miniature>
|
||||
</div>
|
||||
</ng-container>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -3,24 +3,6 @@
|
|||
@import '_mixins';
|
||||
@import '_miniature';
|
||||
|
||||
.videos {
|
||||
$column-width: #{$video-thumbnail-width - 25px};
|
||||
|
||||
display: grid;
|
||||
column-gap: calc(10px + .2%);
|
||||
grid-template-columns: repeat(
|
||||
auto-fill,
|
||||
minmax(
|
||||
var(--miniature-min-width, #{$column-width}),
|
||||
1fr
|
||||
)
|
||||
);
|
||||
|
||||
@media screen and (min-width: #{breakpoint(fhd)}) {
|
||||
--miniature-min-width: #{$column-width + 100px};
|
||||
}
|
||||
}
|
||||
|
||||
.videos-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
|
@ -74,8 +56,8 @@
|
|||
}
|
||||
}
|
||||
|
||||
:host-context(.main-col:not(.expanded)) .margin-content {
|
||||
@include adapt-margin-content-width($fluid: true);
|
||||
.margin-content {
|
||||
@include fluid-videos-miniature-layout;
|
||||
}
|
||||
|
||||
@media screen and (max-width: $mobile-view) {
|
||||
|
@ -83,6 +65,7 @@
|
|||
flex-direction: column;
|
||||
align-items: center;
|
||||
height: auto;
|
||||
margin-bottom: 10px;
|
||||
|
||||
.title-page {
|
||||
margin-bottom: 10px;
|
||||
|
|
|
@ -56,7 +56,7 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy, DisableFor
|
|||
date: true,
|
||||
views: true,
|
||||
by: true,
|
||||
avatar: true,
|
||||
avatar: false,
|
||||
privacyLabel: true,
|
||||
privacyText: false,
|
||||
state: false,
|
||||
|
@ -139,6 +139,11 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy, DisableFor
|
|||
if (this.hasDoneFirstQuery) this.reloadVideos()
|
||||
}
|
||||
)
|
||||
|
||||
// Display avatar in mobile view
|
||||
if (this.screenService.isInMobileView()) {
|
||||
this.displayOptions.avatar = true
|
||||
}
|
||||
}
|
||||
|
||||
ngOnDestroy () {
|
||||
|
|
|
@ -9,32 +9,34 @@
|
|||
|
||||
<div class="video-bottom">
|
||||
<div class="video-miniature-information">
|
||||
<a
|
||||
tabindex="-1"
|
||||
class="video-miniature-name"
|
||||
[routerLink]="videoLink" [attr.title]="video.name" [ngClass]="{ 'blur-filter': isVideoBlur }"
|
||||
>{{ video.name }}</a>
|
||||
|
||||
<div class="d-inline-flex">
|
||||
<avatar-channel *ngIf="displayOptions.avatar" class="mr-1 pt-1" [video]="video" size="sm"></avatar-channel>
|
||||
<div *ngIf="displayOptions.avatar" class="avatar">
|
||||
<img [src]="getAvatarUrl()" alt="Avatar" />
|
||||
</div>
|
||||
|
||||
<div class="d-flex flex-column">
|
||||
<a
|
||||
tabindex="-1"
|
||||
class="video-miniature-name"
|
||||
[routerLink]="videoLink" [attr.title]="video.name" [ngClass]="{ 'blur-filter': isVideoBlur }"
|
||||
>{{ video.name }}</a>
|
||||
|
||||
<span class="video-miniature-created-at-views">
|
||||
<my-date-toggle *ngIf="displayOptions.date" [date]="video.publishedAt"></my-date-toggle>
|
||||
|
||||
|
||||
<span class="views">
|
||||
<ng-container *ngIf="displayOptions.date && displayOptions.views"> • </ng-container>
|
||||
<ng-container i18n *ngIf="displayOptions.views">{video.views, plural, =1 {1 view} other {{{ video.views | myNumberFormatter }} views}}</ng-container>
|
||||
</span>
|
||||
</span>
|
||||
|
||||
|
||||
<a tabindex="-1" *ngIf="displayOptions.by && displayOwnerAccount()" class="video-miniature-account" [routerLink]="[ '/accounts', video.byAccount ]">
|
||||
{{ video.byAccount }}
|
||||
</a>
|
||||
<a tabindex="-1" *ngIf="displayOptions.by && displayOwnerVideoChannel()" class="video-miniature-channel" [routerLink]="[ '/video-channels', video.byVideoChannel ]">
|
||||
{{ video.byVideoChannel }}
|
||||
</a>
|
||||
|
||||
|
||||
<div class="video-info-privacy">
|
||||
<ng-container *ngIf="displayOptions.privacyText">{{ video.privacy.label }}</ng-container>
|
||||
<ng-container *ngIf="displayOptions.privacyText && displayOptions.state && getStateLabel(video)"> - </ng-container>
|
||||
|
|
|
@ -19,16 +19,22 @@ $more-margin-right: 15px;
|
|||
.video-miniature-information {
|
||||
width: $video-miniature-width - $more-button-width - $more-margin-right;
|
||||
line-height: normal;
|
||||
font-size: 13px;
|
||||
|
||||
.avatar {
|
||||
margin: 10px 10px 0 0;
|
||||
|
||||
img {
|
||||
@include avatar(40px);
|
||||
}
|
||||
}
|
||||
|
||||
.video-miniature-name {
|
||||
@include miniature-name;
|
||||
font-size: 110%;
|
||||
}
|
||||
|
||||
.video-miniature-created-at-views {
|
||||
display: block;
|
||||
font-size: 95%;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.video-miniature-account,
|
||||
|
@ -37,7 +43,7 @@ $more-margin-right: 15px;
|
|||
@include ellipsis;
|
||||
|
||||
display: block;
|
||||
font-size: 95%;
|
||||
font-size: 13px;
|
||||
color: pvar(--greyForegroundColor);
|
||||
|
||||
&:hover {
|
||||
|
|
|
@ -178,6 +178,14 @@ export class VideoMiniatureComponent implements OnInit {
|
|||
return ''
|
||||
}
|
||||
|
||||
getAvatarUrl () {
|
||||
if (this.ownerDisplayTypeChosen === 'account') {
|
||||
return this.video.accountAvatarUrl
|
||||
}
|
||||
|
||||
return this.video.videoChannelAvatarUrl
|
||||
}
|
||||
|
||||
loadActions () {
|
||||
if (this.displayVideoActions) this.showActions = true
|
||||
|
||||
|
|
|
@ -7,25 +7,29 @@
|
|||
>
|
||||
<ng-container *ngFor="let overview of overviews">
|
||||
|
||||
<div class="section" *ngFor="let object of overview.categories">
|
||||
<div class="section videos" *ngFor="let object of overview.categories">
|
||||
<div class="section-title">
|
||||
<a routerLink="/search" [queryParams]="{ categoryOneOf: [ object.category.id ] }">{{ object.category.label }}</a>
|
||||
</div>
|
||||
|
||||
<my-video-miniature class="pr-2" *ngFor="let video of buildVideos(object.videos)" [video]="video" [user]="user" [displayVideoActions]="false">
|
||||
</my-video-miniature>
|
||||
<div class="video-wrapper" *ngFor="let video of buildVideos(object.videos)">
|
||||
<my-video-miniature [video]="video" [fitWidth]="true" [user]="user" [displayVideoActions]="false">
|
||||
</my-video-miniature>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section" *ngFor="let object of overview.tags">
|
||||
<div class="section videos" *ngFor="let object of overview.tags">
|
||||
<div class="section-title">
|
||||
<a routerLink="/search" [queryParams]="{ tagsOneOf: [ object.tag ] }">#{{ object.tag }}</a>
|
||||
</div>
|
||||
|
||||
<my-video-miniature class="pr-2" *ngFor="let video of buildVideos(object.videos)" [video]="video" [user]="user" [displayVideoActions]="false">
|
||||
</my-video-miniature>
|
||||
<div class="video-wrapper" *ngFor="let video of buildVideos(object.videos)">
|
||||
<my-video-miniature [video]="video" [fitWidth]="true" [user]="user" [displayVideoActions]="false">
|
||||
</my-video-miniature>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section channel" *ngFor="let object of overview.channels">
|
||||
<div class="section channel videos" *ngFor="let object of overview.channels">
|
||||
<div class="section-title">
|
||||
<a [routerLink]="[ '/video-channels', buildVideoChannelBy(object) ]">
|
||||
<img [src]="buildVideoChannelAvatarUrl(object)" alt="Avatar" />
|
||||
|
@ -34,8 +38,10 @@
|
|||
</a>
|
||||
</div>
|
||||
|
||||
<my-video-miniature class="pr-2" *ngFor="let video of buildVideos(object.videos)" [video]="video" [user]="user" [displayVideoActions]="false">
|
||||
</my-video-miniature>
|
||||
<div class="video-wrapper" *ngFor="let video of buildVideos(object.videos)">
|
||||
<my-video-miniature [video]="video" [fitWidth]="true" [user]="user" [displayVideoActions]="false">
|
||||
</my-video-miniature>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</ng-container>
|
||||
|
|
|
@ -2,8 +2,13 @@
|
|||
@import '_mixins';
|
||||
@import '_miniature';
|
||||
|
||||
.section-title {
|
||||
// make the element span a full grid row within .videos grid
|
||||
grid-column: 1 / -1;
|
||||
}
|
||||
|
||||
.margin-content {
|
||||
@include adapt-margin-content-width;
|
||||
@include fluid-videos-miniature-layout;
|
||||
}
|
||||
|
||||
.section {
|
||||
|
|
|
@ -18,7 +18,7 @@ $grid-breakpoints: (
|
|||
xxl: 1600px,
|
||||
|
||||
// SCREEN GROUP
|
||||
fhd: 1920px,
|
||||
fhd: 1800px,
|
||||
qhd: 2560px,
|
||||
uhd: 3840px
|
||||
);
|
||||
|
|
|
@ -108,38 +108,6 @@ $play-overlay-width: 18px;
|
|||
color: #fff;
|
||||
}
|
||||
|
||||
@mixin video-miniature-small-screen {
|
||||
text-align: center;
|
||||
|
||||
::ng-deep .video-miniature {
|
||||
padding-right: 0;
|
||||
height: auto;
|
||||
width: 100%;
|
||||
margin-bottom: 20px;
|
||||
|
||||
.video-miniature-information {
|
||||
width: 100% !important;
|
||||
text-align: left;
|
||||
|
||||
span {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.video-thumbnail {
|
||||
margin-bottom: 10px;
|
||||
width: 100%;
|
||||
height: calc(100% / #{$video-thumbnail-ratio});
|
||||
border-radius: 0;
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin miniature-rows {
|
||||
&:first-child {
|
||||
padding-top: 30px;
|
||||
|
@ -149,10 +117,6 @@ $play-overlay-width: 18px;
|
|||
}
|
||||
}
|
||||
|
||||
my-video-miniature {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
font-size: 24px;
|
||||
font-weight: $font-semibold;
|
||||
|
@ -213,44 +177,81 @@ $play-overlay-width: 18px;
|
|||
max-height: initial;
|
||||
overflow: initial;
|
||||
|
||||
@include video-miniature-small-screen;
|
||||
|
||||
.section-title {
|
||||
font-size: 17px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin adapt-margin-content-width($fluid: false) {
|
||||
@if $fluid {
|
||||
margin-left: 3vw !important;
|
||||
margin-right: 3vw !important;
|
||||
} @else {
|
||||
width: $video-miniature-width * 6;
|
||||
margin: auto !important;
|
||||
@mixin fluid-videos-miniature-layout {
|
||||
margin-left: 3vw !important;
|
||||
margin-right: 3vw !important;
|
||||
|
||||
@media screen and (max-width: 1800px) {
|
||||
width: $video-miniature-width * 5;
|
||||
@media screen and (max-width: $mobile-view) {
|
||||
width: auto;
|
||||
margin: 0 !important;
|
||||
|
||||
.videos {
|
||||
text-align: center;
|
||||
|
||||
::ng-deep .video-miniature {
|
||||
padding-right: 0;
|
||||
height: auto;
|
||||
width: 100%;
|
||||
margin-bottom: 25px;
|
||||
|
||||
.video-miniature-information {
|
||||
width: 100% !important;
|
||||
text-align: left;
|
||||
|
||||
span {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.video-thumbnail {
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1800px - $video-miniature-width) {
|
||||
width: $video-miniature-width * 4;
|
||||
}
|
||||
@media screen and (min-width: #{breakpoint(fhd)}) {
|
||||
margin-left: 6vw !important;
|
||||
margin-right: 6vw !important;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1800px - (2* $video-miniature-width)) {
|
||||
width: $video-miniature-width * 3;
|
||||
}
|
||||
@media screen and (min-width: $mobile-view) {
|
||||
|
||||
@media screen and (max-width: 1800px - (3* $video-miniature-width)) {
|
||||
width: $video-miniature-width * 2;
|
||||
}
|
||||
.videos {
|
||||
--miniature-min-width: #{$video-thumbnail-width - 15px};
|
||||
--miniature-max-width: #{$video-thumbnail-width};
|
||||
|
||||
@media screen and (max-width: $mobile-view) {
|
||||
width: auto;
|
||||
margin: 0 !important;
|
||||
display: grid;
|
||||
column-gap: 5px;
|
||||
grid-template-columns: repeat(
|
||||
auto-fill,
|
||||
minmax(
|
||||
var(--miniature-min-width),
|
||||
1fr
|
||||
)
|
||||
);
|
||||
|
||||
.videos {
|
||||
@include video-miniature-small-screen;
|
||||
@media screen and (min-width: #{breakpoint(fhd)}) {
|
||||
column-gap: 1%;
|
||||
--miniature-min-width: #{$video-thumbnail-width};
|
||||
}
|
||||
|
||||
.video-wrapper {
|
||||
margin: 0 auto;
|
||||
width: 100%;
|
||||
|
||||
my-video-miniature {
|
||||
display: block;
|
||||
min-width: var(--miniature-min-width);
|
||||
max-width: var(--miniature-max-width);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,7 +59,6 @@ $video-miniature-width: 238px;
|
|||
$video-miniature-margin-bottom: 30px;
|
||||
$video-thumbnail-height: 122px;
|
||||
$video-thumbnail-width: 223px;
|
||||
$video-thumbnail-ratio: $video-thumbnail-width / $video-thumbnail-height;
|
||||
|
||||
$theater-bottom-space: 115px;
|
||||
|
||||
|
|
Loading…
Reference in a new issue