(consistency) channel nameWithHost copy button, comment avatar link
[oweals/peertube.git] / client / src / app / videos / +video-watch / video-watch.component.scss
1 @import '_variables';
2 @import '_mixins';
3 @import '_bootstrap-variables';
4 @import '_miniature';
5
6 $player-factor: 1.7; // 16/9
7 $video-info-margin-left: 44px;
8
9 @function getPlayerHeight($width){
10   @return calc(#{$width} / #{$player-factor})
11 }
12
13 @function getPlayerWidth($height){
14   @return calc(#{$height} * #{$player-factor})
15 }
16
17 @mixin playlist-below-player {
18   width: 100% !important;
19   height: auto !important;
20   max-height: 300px !important;
21   max-width: initial;
22   border-bottom: 1px solid $separator-border-color !important;
23 }
24
25 .root {
26   &.theater-enabled #video-wrapper {
27     flex-direction: column;
28     justify-content: center;
29
30     #videojs-wrapper {
31       width: 100%;
32     }
33
34     ::ng-deep .video-js {
35       $height: calc(100vh - #{$header-height} - #{$theater-bottom-space});
36
37       height: $height;
38       width: 100%;
39       max-width: initial;
40     }
41
42     my-video-watch-playlist ::ng-deep .playlist {
43       @include playlist-below-player;
44     }
45   }
46 }
47
48 .blacklisted-label {
49   font-weight: $font-semibold;
50 }
51
52 #video-wrapper {
53   background-color: #000;
54   display: flex;
55   justify-content: center;
56   margin: 0 -15px;
57
58   #videojs-wrapper {
59     display: flex;
60     justify-content: center;
61     flex-grow: 1;
62   }
63
64   .remote-server-down {
65     color: #fff;
66     display: flex;
67     flex-direction: column;
68     align-items: center;
69     text-align: center;
70     justify-content: center;
71     background-color: #141313;
72     width: 100%;
73     font-size: 24px;
74     height: 500px;
75
76     @media screen and (max-width: 1000px) {
77       font-size: 20px;
78     }
79
80     @media screen and (max-width: 600px) {
81       font-size: 16px;
82     }
83   }
84
85   ::ng-deep .video-js {
86     width: 100%;
87     max-width: getPlayerWidth(66vh);
88     height: 66vh;
89
90     // VideoJS create an inner video player
91     video {
92       outline: 0;
93       position: relative !important;
94     }
95   }
96
97   @media screen and (max-width: 600px) {
98     .remote-server-down,
99     ::ng-deep .video-js {
100       width: 100vw;
101       height: getPlayerHeight(100vw)
102     }
103   }
104 }
105
106 .alert {
107   text-align: center;
108   border-radius: 0;
109 }
110
111 .flex-direction-column {
112   flex-direction: column;
113 }
114
115 #video-not-found {
116   height: 300px;
117   line-height: 300px;
118   margin-top: 50px;
119   text-align: center;
120   font-weight: $font-semibold;
121   font-size: 15px;
122 }
123
124 .video-bottom {
125   display: flex;
126   margin-top: 40px;
127
128   .video-info {
129     flex-grow: 1;
130     // Set min width for flex item
131     min-width: 1px;
132     max-width: 100%;
133
134     .video-info-first-row {
135       display: flex;
136
137       & > div:first-child {
138         flex-grow: 1;
139       }
140
141       .video-info-name {
142         margin-right: 30px;
143         min-height: 40px; // Align with the action buttons
144         font-size: 27px;
145         font-weight: $font-semibold;
146         flex-grow: 1;
147       }
148
149       .video-info-first-row-bottom {
150         display: grid;
151         grid-template-columns: 1fr auto;
152         align-items: center;
153         width: 100%;
154       }
155
156       .video-info-date-views {
157         flex-grow: 1;
158         align-self: start;
159         margin-bottom: 10px;
160         margin-right: 10px;
161         font-size: 1em;
162       }
163
164       .video-info-channel {
165         font-weight: $font-semibold;
166         font-size: 15px;
167
168         a {
169           @include disable-default-a-behaviour;
170
171           color: var(--mainForegroundColor);
172
173           &:hover {
174             opacity: 0.8;
175           }
176
177           img {
178             @include avatar(18px);
179
180             margin: -2px 5px 0 0;
181           }
182         }
183
184         .video-info-channel-left {
185           flex-grow: 1;
186
187           .video-info-channel-left-links {
188             display: flex;
189             flex-direction: column;
190             position: relative;
191             line-height: 1.3;
192
193             a:nth-of-type(2) {
194               font-weight: 500;
195               font-size: 90%;
196             }
197           }
198         }
199
200         my-subscribe-button {
201           margin-left: 5px;
202         }
203       }
204
205       my-feed {
206         margin-left: 5px;
207         margin-top: 1px;
208       }
209
210       .video-actions-rates {
211         margin: 0 0 10px 0;
212         align-items: start;
213         align-self: end;
214         width: max-content;
215
216         .video-actions {
217           height: 40px; // Align with the title
218           display: flex;
219           align-items: center;
220
221           .action-button:not(:first-child),
222           .action-dropdown,
223           my-video-actions-dropdown {
224             margin-left: 10px;
225           }
226
227           .action-button {
228             @include peertube-button;
229             @include grey-button;
230             @include button-with-icon(21px, 0, -1px);
231             @include apply-svg-color($grey-foreground-color);
232
233             font-size: 15px;
234             font-weight: $font-semibold;
235             display: inline-block;
236             padding: 0 10px 0 10px;
237             white-space: nowrap;
238
239             &::after {
240               display: none;
241             }
242
243             .action-button-like,
244             .action-button-dislike {
245               .count {
246                 margin-right: 5px;
247               }
248             }
249
250             &.action-button-like.activated {
251               background-color: $green;
252
253               .count {
254                 color: #fff;
255               }
256
257               my-global-icon {
258                 @include apply-svg-color(#fff);
259               }
260             }
261
262             &.action-button-dislike.activated {
263               background-color: $red;
264
265               .count {
266                 color: #fff;
267               }
268
269               my-global-icon {
270                 @include apply-svg-color(#fff);
271               }
272             }
273
274             &.action-button-support {
275               color: var(--supportButtonColor);
276               background-color: var(--supportButtonBackgroundColor);
277
278               &:hover {
279                 opacity: 0.9;
280               }
281
282               my-global-icon {
283                 @include apply-svg-color(var(--supportButtonColor));
284               }
285             }
286
287             &.action-button-save {
288               my-global-icon {
289                 top: 0 !important;
290                 right: -1px;
291               }
292             }
293
294             .icon-text {
295               margin-left: 3px;
296             }
297           }
298         }
299
300         .video-info-likes-dislikes-bar-outerContainer {
301           position: relative;
302         }
303
304         .video-info-likes-dislikes-bar-innerContainer {
305           position: absolute;
306           height: 30px;
307         }
308
309         .video-info-likes-dislikes-bar {
310           $likes-bar-height: 2px;
311           height: $likes-bar-height;
312           margin-top: -$likes-bar-height;
313           width: 186px;
314           background-color: $red;
315           position: relative;
316           top: 10px;
317
318           .likes-bar {
319             height: 100%;
320             background-color: $green;
321           }
322         }
323       }
324     }
325
326     .video-info-description {
327       margin: 20px 0;
328       margin-left: $video-info-margin-left;
329       font-size: 15px;
330
331       .video-info-description-html {
332         @include peertube-word-wrap;
333       }
334
335       .glyphicon, .description-loading {
336         margin-left: 3px;
337       }
338
339       .description-loading {
340         display: inline-block;
341       }
342
343       .video-info-description-more {
344         cursor: pointer;
345         font-weight: $font-semibold;
346         color: $grey-foreground-color;
347         font-size: 14px;
348
349         .glyphicon {
350           position: relative;
351           top: 2px;
352         }
353       }
354     }
355
356     .video-attributes {
357       margin-left: $video-info-margin-left;
358     }
359
360     .video-attributes .video-attribute {
361       font-size: 13px;
362       display: block;
363       margin-bottom: 12px;
364
365       .video-attribute-label {
366         min-width: 142px;
367         padding-right: 5px;
368         display: inline-block;
369         color: $grey-foreground-color;
370         font-weight: $font-bold;
371       }
372
373       a.video-attribute-value {
374         @include disable-default-a-behaviour;
375         color: var(--mainForegroundColor);
376
377         &:hover {
378           opacity: 0.9;
379         }
380       }
381
382       &.video-attribute-tags {
383         .video-attribute-value:not(:nth-child(2)) {
384           &::before {
385             content: ', '
386           }
387         }
388       }
389     }
390   }
391
392   ::ng-deep .other-videos {
393     padding-left: 15px;
394
395     .title-page {
396       margin: 0 !important;
397     }
398
399     .video-miniature {
400       display: flex;
401       width: max-content;
402       height: 100%;
403       margin-bottom: 20px;
404       flex-wrap: wrap;
405
406       .video-thumbnail {
407         margin-right: 10px
408       }
409     }
410   }
411 }
412
413 my-video-comments {
414   display: inline-block;
415   width: 100%;
416   margin-bottom: 20px;
417 }
418
419 // If the view is not expanded, take into account the menu
420 .privacy-concerns {
421   width: calc(100% - #{$menu-width});
422 }
423
424 @media screen and (max-width: $small-view) {
425   .privacy-concerns {
426     margin-left: $menu-width - 15px; // Menu is absolute
427   }
428 }
429
430 :host-context(.expanded) {
431   .privacy-concerns {
432     width: 100%;
433     margin-left: -15px;
434   }
435 }
436
437 .privacy-concerns {
438   position: fixed;
439   bottom: 0;
440
441   padding: 5px 15px;
442
443   display: flex;
444   flex-wrap: nowrap;
445   align-items: center;
446   justify-content: flex-start;
447   background-color: rgba(0, 0, 0, 0.9);
448   color: #fff;
449
450   .privacy-concerns-text {
451     margin: 0 5px;
452   }
453
454   a {
455     @include disable-default-a-behaviour;
456
457     color: var(--mainColor);
458     transition: color 0.3s;
459
460     &:hover {
461       color: #fff;
462     }
463   }
464
465   .privacy-concerns-okay {
466     background-color: var(--mainColor);
467     padding: 5px 8px 5px 7px;
468     margin-left: auto;
469     border-radius: 3px;
470     cursor: pointer;
471     transition: background-color 0.3s;
472     font-weight: $font-semibold;
473
474     &:hover {
475       background-color: #000;
476     }
477   }
478 }
479
480 @media screen and (max-width: 1600px) {
481   .video-bottom .video-info .video-attributes .video-attribute {
482     margin-bottom: 5px;
483   }
484 }
485
486 @media screen and (max-width: 1300px) {
487   .privacy-concerns {
488     font-size: 12px;
489     padding: 2px 5px;
490
491     .privacy-concerns-text {
492       margin: 0;
493     }
494   }
495 }
496
497 @media screen and (max-width: 1100px) {
498   #video-wrapper {
499     flex-direction: column;
500     justify-content: center;
501
502     my-video-watch-playlist ::ng-deep .playlist {
503       @include playlist-below-player;
504     }
505   }
506
507   .video-bottom {
508     flex-direction: column;
509
510     ::ng-deep .other-videos {
511       padding-left: 0 !important;
512
513       ::ng-deep .video-miniature  {
514         flex-direction: row;
515         width: auto;
516       }
517     }
518   }
519 }
520
521 @media screen and (max-width: 600px) {
522   .video-bottom {
523     margin: 20px 0 0 0 !important;
524
525     .video-info {
526       padding: 0;
527
528       .video-info-first-row {
529
530         .video-info-name {
531           font-size: 20px;
532           height: auto;
533         }
534       }
535     }
536   }
537
538   ::ng-deep .other-videos .video-miniature  {
539     flex-direction: column;
540   }
541
542   .privacy-concerns {
543     width: 100%;
544
545     strong {
546       display: none;
547     }
548   }
549 }
550
551 @media screen and (max-width: 450px) {
552   .video-bottom {
553     .action-button .icon-text {
554       display: none !important;
555     }
556
557     .video-info .video-info-first-row {
558       .video-info-name {
559         font-size: 18px;
560       }
561
562       .video-info-date-views {
563         font-size: 14px;
564       }
565
566       .video-actions-rates {
567         margin-top: 10px;
568       }
569     }
570
571     .video-info-description {
572       font-size: 14px !important;
573     }
574   }
575 }