Set thumbnail height
[oweals/peertube.git] / client / src / sass / include / _mixins.scss
1 @import '_variables';
2
3 @mixin disable-default-a-behaviour {
4   &:hover, &:focus, &:active {
5     text-decoration: none !important;
6     outline: none !important;
7   }
8 }
9
10 @mixin disable-outline {
11   &:focus:not(.focus-visible) {
12     outline: none;
13   }
14
15   &::-moz-focus-inner {
16     border: 0;
17     padding: 0
18   }
19 }
20
21
22 @mixin ellipsis {
23   white-space: nowrap;
24   overflow: hidden;
25   text-overflow: ellipsis;
26 }
27
28 @mixin ellipsis-multiline($font-size: 16px, $number-of-lines: 2) {
29   display: block;
30   /* Fallback for non-webkit */
31   display: -webkit-box;
32   max-height: $font-size * $number-of-lines;
33   /* Fallback for non-webkit */
34   font-size: $font-size;
35   line-height: $font-size;
36   overflow: hidden;
37   text-overflow: ellipsis;
38 }
39
40 @mixin prefix($property, $parameters...) {
41   @each $prefix in -webkit-, -moz-, -ms-, -o-, "" {
42     #{$prefix}#{$property}: $parameters;
43   }
44 }
45
46 @mixin peertube-word-wrap {
47   word-break: normal;
48   word-wrap: break-word;
49   overflow-wrap: break-word;
50   -webkit-hyphens: auto;
51   -ms-hyphens: auto;
52   -moz-hyphens: auto;
53   hyphens: auto;
54 }
55
56 @mixin apply-svg-color ($color) {
57   /deep/ svg {
58     path[fill="#000000"],
59     g[fill="#000000"],
60     rect[fill="#000000"],
61     circle[fill="#000000"],
62     polygon[fill="#000000"] {
63       fill: $color;
64     }
65
66     path[stroke="#000000"],
67     g[stroke="#000000"],
68     rect[stroke="#000000"],
69     circle[stroke="#000000"],
70     polygon[stroke="#000000"] {
71       stroke: $color;
72     }
73
74     stop[stop-color="#000000"] {
75       stop-color: $color;
76     }
77   }
78 }
79
80 @mixin peertube-input-text($width) {
81   display: inline-block;
82   height: $button-height;
83   width: $width;
84   background: var(--inputColor);
85   border: 1px solid #C6C6C6;
86   border-radius: 3px;
87   padding-left: 15px;
88   padding-right: 15px;
89   font-size: 15px;
90
91   &::placeholder {
92     color: var(--inputPlaceholderColor);
93   }
94
95   @media screen and (max-width: $width) {
96     width: 100%;
97   }
98 }
99
100 @mixin peertube-input-group($width) {
101   width: $width;
102   height: $button-height;
103   padding-top: 0;
104   padding-bottom: 0;
105
106   .input-group-text{
107     font-size: 14px;
108     color: gray;
109   }
110 }
111
112 @mixin peertube-textarea ($width, $height) {
113   @include peertube-input-text($width);
114
115   height: $height;
116   padding: 5px 15px;
117   font-size: 15px;
118 }
119
120 @mixin orange-button {
121   &, &:active, &:focus {
122     color: #fff;
123     background-color: var(--mainColor);
124   }
125
126   &:hover {
127     color: #fff;
128     background-color: var(--mainHoverColor);
129   }
130
131   &[disabled], &.disabled {
132     cursor: default;
133     color: #fff;
134     background-color: #C6C6C6;
135   }
136
137   my-global-icon {
138     @include apply-svg-color(#fff)
139   }
140 }
141
142 @mixin grey-button {
143   &, &:active, &:focus {
144     background-color: $grey-background-color;
145     color: $grey-foreground-color;
146   }
147
148   &:hover, &:active, &:focus, &[disabled], &.disabled {
149     color: $grey-foreground-color;
150     background-color: $grey-background-hover-color;
151   }
152
153   &[disabled], &.disabled {
154     cursor: default;
155   }
156
157   my-global-icon {
158     @include apply-svg-color($grey-foreground-color)
159   }
160 }
161
162 @mixin peertube-button {
163   border: none;
164   font-weight: $font-semibold;
165   font-size: 15px;
166   height: $button-height;
167   line-height: $button-height;
168   border-radius: 3px;
169   text-align: center;
170   padding: 0 17px 0 13px;
171   cursor: pointer;
172   outline: 0;
173 }
174
175 @mixin peertube-button-link {
176   display: inline-block;
177
178   @include disable-default-a-behaviour;
179   @include peertube-button;
180 }
181
182 @mixin button-with-icon($width: 20px, $margin-right: 3px, $top: -1px) {
183   my-global-icon {
184     position: relative;
185     width: $width;
186     margin-right: $margin-right;
187     top: $top;
188   }
189 }
190
191 @mixin peertube-button-file ($width) {
192   position: relative;
193   overflow: hidden;
194   display: inline-block;
195   width: $width;
196
197   @include peertube-button;
198   @include orange-button;
199
200   input[type=file] {
201     position: absolute;
202     top: 0;
203     right: 0;
204     min-width: 100%;
205     min-height: 100%;
206     font-size: 100px;
207     text-align: right;
208     filter: alpha(opacity=0);
209     opacity: 0;
210     outline: none;
211     background: white;
212     cursor: inherit;
213     display: block;
214   }
215 }
216
217 @mixin icon ($size) {
218   display: inline-block;
219   background-repeat: no-repeat;
220   background-size: contain;
221   width: $size;
222   height: $size;
223   vertical-align: middle;
224   cursor: pointer;
225 }
226
227 @mixin peertube-select-container ($width) {
228   padding: 0;
229   margin: 0;
230   border: 1px solid #C6C6C6;
231   width: $width;
232   border-radius: 3px;
233   overflow: hidden;
234   background: var(--inputColor);
235   position: relative;
236   font-size: 15px;
237
238   &:after {
239     top: 50%;
240     right: calc(0% + 15px);
241     content: " ";
242     height: 0;
243     width: 0;
244     position: absolute;
245     pointer-events: none;
246     border: 5px solid rgba(0, 0, 0, 0);
247     border-top-color: #000;
248     margin-top: -2px;
249     z-index: 100;
250   }
251
252   select {
253     padding: 0 35px 0 12px;
254     width: calc(100% + 2px);
255     position: relative;
256     left: 1px;
257     border: none;
258     box-shadow: none;
259     background: transparent none;
260     appearance: none;
261     cursor: pointer;
262     height: $button-height;
263     text-overflow: ellipsis;
264     color: var(--mainForegroundColor);
265
266     &:focus {
267       outline: none;
268     }
269
270     &:-moz-focusring {
271       color: transparent;
272       text-shadow: 0 0 0 #000;
273     }
274
275     option {
276       color: #000;
277     }
278   }
279 }
280
281 @mixin peertube-select-disabled-container ($width) {
282   @include peertube-select-container($width);
283
284   background-color: #E5E5E5;
285
286   select {
287     cursor: default;
288   }
289 }
290
291 // Thanks: https://codepen.io/triss90/pen/XNEdRe/
292 @mixin peertube-radio-container {
293   input[type="radio"] {
294     display: none;
295
296     & + label {
297       font-weight: $font-regular;
298       cursor: pointer;
299
300       &:before {
301         position: relative;
302         top: -2px;
303         content: '';
304         background: #fff;
305         border-radius: 100%;
306         border: 1px solid #000;
307         display: inline-block;
308         width: 15px;
309         height: 15px;
310         vertical-align: middle;
311         cursor: pointer;
312         text-align: center;
313         margin-right: 10px;
314       }
315     }
316
317     &:checked + label:before {
318       background-color: #000;
319       box-shadow: inset 0 0 0 4px #fff;
320     }
321
322     &:focus + label:before {
323       outline: none;
324       border-color: #000;
325     }
326   }
327 }
328
329 @mixin peertube-checkbox ($border-width) {
330   display: none;
331
332   & + span {
333     position: relative;
334     width: 18px;
335     height: 18px;
336     border: $border-width solid var(--mainForegroundColor);
337     border-radius: 3px;
338     vertical-align: middle;
339     cursor: pointer;
340
341     &:after {
342       content: '';
343       position: absolute;
344       top: calc(2px - #{$border-width});
345       left: 5px;
346       width: 5px;
347       height: 12px;
348       opacity: 0;
349       transform: rotate(45deg) scale(0);
350       border-right: 2px solid var(--mainBackgroundColor);
351       border-bottom: 2px solid var(--mainBackgroundColor);
352     }
353   }
354
355   &:checked + span {
356     border-color: transparent;
357     background: var(--mainColor);
358     animation: jelly 0.6s ease;
359
360     &:after {
361       opacity: 1;
362       transform: rotate(45deg) scale(1);
363     }
364   }
365
366   & + span + span {
367     font-size: 15px;
368     font-weight: $font-regular;
369     margin-left: 5px;
370     cursor: pointer;
371     display: inline;
372   }
373
374   &[disabled] + span,
375   &[disabled] + span + span{
376     opacity: 0.5;
377     cursor: default;
378   }
379 }
380
381
382 @mixin avatar ($size) {
383   object-fit: cover;
384   border-radius: 50%;
385   width: $size;
386   height: $size;
387 }
388
389 @mixin chevron ($size, $border-width) {
390   border-style: solid;
391   border-width: $border-width $border-width 0 0;
392   content: '';
393   display: inline-block;
394   transform: rotate(-45deg);
395   height: $size;
396   width: $size;
397 }
398
399 @mixin chevron-right ($size, $border-width) {
400   @include chevron($size, $border-width);
401
402   left: 0;
403   transform: rotate(45deg);
404 }
405
406 @mixin chevron-left ($size, $border-width) {
407   @include chevron($size, $border-width);
408
409   left: 0.25em;
410   transform: rotate(-135deg);
411 }
412
413 @mixin in-content-small-title {
414   text-transform: uppercase;
415   color: var(--mainColor);
416   font-weight: $font-bold;
417   font-size: 13px;
418 }
419
420 @mixin actor-owner {
421   @include disable-default-a-behaviour;
422
423   display: inline-table;
424   font-size: 13px;
425   margin-top: 4px;
426   color: var(--mainForegroundColor);
427
428   span:hover {
429     opacity: 0.8;
430   }
431
432   img {
433     @include avatar(18px);
434
435     margin-left: 7px;
436     position: relative;
437     top: -2px;
438   }
439 }
440
441 @mixin sub-menu-with-actor {
442   height: 160px;
443   display: flex;
444   flex-direction: column;
445   align-items: flex-start;
446
447   .actor {
448     display: flex;
449     margin-top: 20px;
450     margin-bottom: 20px;
451
452     img {
453       @include avatar(80px);
454
455       margin-right: 20px;
456     }
457
458     .actor-info {
459       display: flex;
460       flex-direction: column;
461       justify-content: center;
462
463       .actor-names {
464         display: flex;
465         align-items: center;
466
467         .actor-display-name {
468           font-size: 23px;
469           font-weight: $font-bold;
470         }
471
472         .actor-name {
473           margin-left: 7px;
474           position: relative;
475           top: 3px;
476           font-size: 14px;
477           color: $grey-actor-name;
478         }
479       }
480
481       .actor-followers {
482         font-size: 15px;
483       }
484
485       .actor-owner {
486         @include actor-owner;
487       }
488     }
489   }
490
491   .links {
492     margin-top: 0;
493     margin-bottom: 10px;
494
495     a {
496       margin-top: 0;
497       margin-bottom: 0;
498     }
499   }
500 }
501
502 @mixin create-button {
503   @include peertube-button-link;
504   @include orange-button;
505   @include button-with-icon(20px, 5px, -1px);
506 }
507
508 @mixin row-blocks {
509   display: flex;
510   min-height: 130px;
511   padding-bottom: 20px;
512   margin-bottom: 20px;
513   border-bottom: 1px solid #C6C6C6;
514
515   @media screen and (max-width: 800px) {
516     flex-direction: column;
517     height: auto;
518     text-align: center;
519     align-items: center;
520   }
521 }
522
523 @mixin dropdown-with-icon-item {
524   padding: 6px 24px;
525
526   my-global-icon {
527     width: 24px;
528
529     margin-right: 10px;
530     position: relative;
531     top: -2px;
532   }
533 }