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