@import '_variables'; @mixin disable-default-a-behaviour { &:hover, &:focus, &:active { text-decoration: none !important; outline: none !important; } } @mixin disable-outline { &:focus:not(.focus-visible) { outline: none; } } @mixin ellipsis { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } @mixin ellipsis-multiline($font-size: 16px, $number-of-lines: 2) { display: block; /* Fallback for non-webkit */ display: -webkit-box; max-height: $font-size * $number-of-lines; /* Fallback for non-webkit */ font-size: $font-size; line-height: $font-size; overflow: hidden; text-overflow: ellipsis; } @mixin prefix($property, $parameters...) { @each $prefix in -webkit-, -moz-, -ms-, -o-, "" { #{$prefix}#{$property}: $parameters; } } @mixin peertube-word-wrap { word-break: break-word; word-wrap: break-word; overflow-wrap: break-word; -webkit-hyphens: auto; -ms-hyphens: auto; -moz-hyphens: auto; hyphens: auto; } @mixin apply-svg-color ($color) { ::ng-deep .feather, ::ng-deep .material { color: $color; } ::ng-deep svg { path[fill="#000"], g[fill="#000"], rect[fill="#000"], circle[fill="#000"], polygon[fill="#000"] { fill: $color; } path[stroke="#000"], g[stroke="#000"], rect[stroke="#000"], circle[stroke="#000"], polygon[stroke="#000"] { stroke: $color; } stop[stop-color="#000"] { stop-color: $color; } } } @mixin fill-svg-color ($color) { ::ng-deep svg { path { fill: $color; } } } @mixin button-focus($color) { &:focus, &.focus-visible { box-shadow: #{$focus-box-shadow-form} $color; } } @mixin peertube-input-text($width) { display: inline-block; height: $button-height; width: $width; color: pvar(--inputForegroundColor); background-color: pvar(--inputBackgroundColor); border: 1px solid #C6C6C6; border-radius: 3px; padding-left: 15px; padding-right: 15px; font-size: 15px; &::placeholder { color: pvar(--inputPlaceholderColor); } @media screen and (max-width: $width) { width: 100%; } } @mixin peertube-input-group($width) { width: $width; min-height: $button-height; padding-top: 0; padding-bottom: 0; .input-group-text{ font-size: 14px; color: gray; } } @mixin peertube-textarea ($width, $height) { @include peertube-input-text($width); color: pvar(--textareaForegroundColor); background-color: pvar(--textareaBackgroundColor); height: $height; padding: 5px 15px; font-size: 15px; } @mixin orange-button { @include button-focus(pvar(--mainColorLightest)); &, &:active, &:focus { color: #fff; background-color: pvar(--mainColor); } &:hover { color: #fff; background-color: pvar(--mainHoverColor); } &[disabled], &.disabled { cursor: default; color: #fff; background-color: #C6C6C6; } my-global-icon { @include apply-svg-color(#fff) } } @mixin tertiary-button { @include button-focus($grey-button-outline-color); color: pvar(--greyForegroundColor); background-color: transparent; &[disabled], &.disabled { cursor: default; } my-global-icon { @include apply-svg-color(transparent) } } @mixin grey-button { @include button-focus($grey-button-outline-color); background-color: $grey-background-color; color: pvar(--greyForegroundColor); &:hover, &:active, &:focus, &[disabled], &.disabled { color: pvar(--greyForegroundColor); background-color: $grey-background-hover-color; } &[disabled], &.disabled { cursor: default; } my-global-icon { @include apply-svg-color(pvar(--greyForegroundColor)) } } @mixin danger-button { $color: lighten($color: #c54130, $amount: 10); $text: #fff6f5; @include button-focus(scale-color($color, $alpha: -95%)); background-color: $color; color: $text; &:hover, &:active, &:focus, &[disabled], &.disabled { background-color: lighten($color: $color, $amount: 10); } &[disabled], &.disabled { cursor: default; } my-global-icon { @include apply-svg-color($text) } } @mixin peertube-button { border: none; font-weight: $font-semibold; font-size: 15px; height: $button-height; line-height: $button-height; border-radius: 3px; text-align: center; padding: 0 17px 0 13px; cursor: pointer; } @mixin peertube-button-link { display: inline-block; @include disable-default-a-behaviour; @include peertube-button; } @mixin peertube-button-outline { display: inline-block; @include disable-default-a-behaviour; @include peertube-button; border: 1px solid; } @mixin button-with-icon($width: 20px, $margin-right: 3px, $top: -1px) { my-global-icon { position: relative; width: $width; margin-right: $margin-right; top: $top; } } @mixin peertube-button-file ($width) { position: relative; overflow: hidden; display: inline-block; width: $width; min-height: 30px; @include peertube-button; input[type=file] { position: absolute; top: 0; right: 0; width: 100%; height: 100%; font-size: 100px; text-align: right; filter: alpha(opacity=0); opacity: 0; outline: none; background: white; cursor: inherit; display: block; } } @mixin icon ($size) { display: inline-block; background-repeat: no-repeat; background-size: contain; width: $size; height: $size; vertical-align: middle; cursor: pointer; } @mixin select-arrow-down { top: 50%; right: calc(0% + 15px); content: " "; height: 0; width: 0; position: absolute; pointer-events: none; border: 5px solid rgba(0, 0, 0, 0); border-top-color: #000; margin-top: -2px; z-index: 100; } @mixin peertube-select-container ($width) { padding: 0; margin: 0; width: $width; border-radius: 3px; color: pvar(--inputForegroundColor); background: pvar(--inputBackgroundColor); position: relative; font-size: 15px; &.disabled { background-color: #E5E5E5; select { cursor: default; } } @media screen and (max-width: $width) { width: 100%; } &:after { @include select-arrow-down; } select { padding: 0 35px 0 12px; width: calc(100% + 2px); position: relative; left: 1px; border: 1px solid #C6C6C6; background: transparent none; appearance: none; cursor: pointer; height: $button-height; text-overflow: ellipsis; color: pvar(--mainForegroundColor); &:focus { outline: none; } &:-moz-focusring { color: transparent; text-shadow: 0 0 0 #000; } option { color: #000; } } } // Thanks: https://codepen.io/triss90/pen/XNEdRe/ @mixin peertube-radio-container { input[type="radio"] { display: none; & + label { font-weight: $font-regular; cursor: pointer; &:before { position: relative; top: -2px; content: ''; background: #fff; border-radius: 100%; border: 1px solid #000; display: inline-block; width: 15px; height: 15px; vertical-align: middle; cursor: pointer; text-align: center; margin-right: 10px; } } &:checked + label:before { background-color: #000; box-shadow: inset 0 0 0 4px #fff; } &:focus + label:before { outline: none; border-color: #000; } } } @mixin peertube-checkbox ($border-width) { opacity: 0; position: absolute; &:focus + span { box-shadow: #{$focus-box-shadow-form} pvar(--mainColorLightest); } & + span { position: relative; width: 18px; min-width: 18px; height: 18px; border: $border-width solid #C6C6C6; border-radius: 3px; vertical-align: middle; cursor: pointer; &:after { content: ''; position: absolute; top: calc(2px - #{$border-width}); left: 5px; width: 5px; height: 12px; opacity: 0; transform: rotate(45deg) scale(0); border-right: 2px solid $bg-color; border-bottom: 2px solid $bg-color; } } &:checked + span { border-color: transparent; background: pvar(--mainColor); animation: jelly 0.6s ease; &:after { opacity: 1; transform: rotate(45deg) scale(1); } } & + span + span { font-size: 15px; font-weight: $font-regular; margin-left: 5px; cursor: pointer; display: inline; } &[disabled] + span, &[disabled] + span + span{ opacity: 0.5; cursor: default; } } @mixin avatar ($size) { object-fit: cover; border-radius: 50%; width: $size; height: $size; min-width: $size; min-height: $size; } @mixin chevron ($size, $border-width) { border-style: solid; border-width: $border-width $border-width 0 0; content: ''; display: inline-block; transform: rotate(-45deg); height: $size; width: $size; } @mixin chevron-right ($size, $border-width) { @include chevron($size, $border-width); left: 0; transform: rotate(45deg); } @mixin chevron-left ($size, $border-width) { @include chevron($size, $border-width); left: 0.25em; transform: rotate(-135deg); } @mixin in-content-small-title { text-transform: uppercase; color: pvar(--mainColor); font-weight: $font-bold; font-size: 13px; } @mixin settings-big-title { text-transform: uppercase; color: pvar(--mainColor); font-weight: $font-bold; font-size: 110%; margin-bottom: 10px; } @mixin actor-owner { @include disable-default-a-behaviour; font-size: 13px; margin-top: 4px; color: pvar(--mainForegroundColor); span:hover { opacity: 0.8; } img { @include avatar(18px); margin-left: 7px; position: relative; top: -2px; } } @mixin sub-menu-with-actor { height: max-content; display: flex; flex-direction: column; align-items: flex-start; .actor { display: flex; margin-top: 20px; margin-bottom: 20px; img { @include avatar(80px); margin-right: 20px; } .actor-info { display: flex; flex-direction: column; justify-content: center; .actor-names { display: flex; align-items: center; flex-wrap: wrap; .actor-display-name { font-size: 23px; font-weight: $font-bold; margin-right: 7px; } .actor-name { position: relative; top: 3px; font-size: 14px; color: $grey-actor-name; } } .actor-lower { grid-area: lower; } .actor-followers { font-size: 15px; } .actor-owner { @include actor-owner; } } } .links { margin-top: 0; margin-bottom: 15px; a { margin-top: 0; margin-bottom: 0; text-transform: uppercase; font-weight: 600; font-size: 110%; @media screen and (max-width: $mobile-view) { font-size: 130%; } } } } @mixin create-button { @include peertube-button-link; @include orange-button; @include button-with-icon(20px, 5px, -1px); } @mixin row-blocks { display: flex; min-height: 130px; padding-bottom: 20px; margin-bottom: 20px; border-bottom: 1px solid #C6C6C6; @media screen and (max-width: 800px) { flex-direction: column; height: auto; align-items: center; } } @mixin dropdown-with-icon-item { padding: 6px 15px; my-global-icon { width: 22px; opacity: .7; margin-right: 10px; position: relative; top: -2px; } } @mixin progressbar { background-color: $grey-background-color; display: flex; height: 1rem; overflow: hidden; font-size: 0.75rem; border-radius: 0.25rem; .progress-bar { color: pvar(--mainBackgroundColor); background-color: pvar(--mainColor); display: flex; flex-direction: column; justify-content: center; text-align: center; white-space: nowrap; transition: width 0.6s ease; &.secondary { background-color: pvar(--secondaryColor); } } } @mixin breadcrumb { display: flex; flex-wrap: wrap; padding: 0.75rem 1rem; margin-bottom: 1rem; list-style: none; background-color: pvar(--submenuColor); border-radius: 0.25rem; .breadcrumb-item { display: flex; a { color: pvar(--mainColor); } & + .breadcrumb-item { padding-left: 0.5rem; &::before { display: inline-block; padding-right: 0.5rem; color: #6c757d; content: "/"; } } &.active { color: #6c757d; } } } @mixin dashboard { display: flex; flex-wrap: wrap; margin: 0 -5px; & > div { box-sizing: border-box; flex: 0 0 percentage(1/3); padding: 0 5px; margin-bottom: 10px; & > a { @include disable-default-a-behaviour; text-decoration: none; color: inherit; display: block; font-size: 18px; &:active, &:focus, &:hover { opacity: .8; } } & > a, & > div { padding: 20px; background: pvar(--submenuColor); border-radius: 4px; box-sizing: border-box; height: 100%; } } .dashboard-num, .dashboard-text { text-align: center; font-size: 130%; line-height: 21px; color: pvar(--mainForegroundColor); line-height: 30px; margin-bottom: 20px; } .dashboard-label { font-size: 90%; color: pvar(--inputPlaceholderColor); text-align: center; } } @mixin ng2-tags { ::ng-deep { .ng2-tag-input { border: none !important; } .ng2-tags-container { display: flex; align-items: center; border: 1px solid #C6C6C6; border-radius: 3px; padding: 5px !important; height: max-content; &:focus-within { box-shadow: #{$focus-box-shadow-form} pvar(--mainColorLightest); } } tag-input-form { input { height: 30px !important; font-size: 12px !important; background-color: pvar(--mainBackgroundColor) !important; color: pvar(--mainForegroundColor) !important; } } tag { background-color: $grey-background-color !important; color: #000 !important; border-radius: 3px !important; font-size: 12px !important; height: 30px !important; line-height: 30px !important; margin: 0 5px 0 0 !important; cursor: default !important; padding: 0 8px 0 10px !important; div { height: 100% !important; } } delete-icon { cursor: pointer !important; height: auto !important; vertical-align: middle !important; padding-left: 6px !important; svg { position: relative; top: -1px; height: auto !important; vertical-align: middle !important; path { fill: pvar(--greyForegroundColor) !important; } } &:hover { transform: none !important; } } } } @mixin divider($color: pvar(--submenuColor), $background: pvar(--mainBackgroundColor)) { width: 95%; border-top: .05rem solid $color; height: .05rem; text-align: center; display: block; position: relative; &[data-content] { margin: .8rem 0; &::after { background: $background; color: $color; content: attr(data-content); display: inline-block; font-size: .7rem; padding: 0 .4rem; transform: translateY(-.65rem); } } } @mixin chip { --chip-radius: 5rem; --chip-padding: .2rem .4rem; $avatar-height: 1.2rem; align-items: center; border-radius: var(--chip-radius); display: inline-flex; font-size: 90%; color: pvar(--mainForegroundColor); height: $avatar-height; line-height: 1rem; margin: .1rem; max-width: 320px; overflow: hidden; padding: var(--chip-padding); text-decoration: none; text-overflow: ellipsis; vertical-align: middle; white-space: nowrap; &.rectangular { --chip-radius: .2rem; --chip-padding: .2rem .3rem; } .avatar { margin-left: -.4rem; margin-right: .2rem; height: $avatar-height; width: $avatar-height; border-radius: 50%; display: inline-block; line-height: 1.25; position: relative; vertical-align: middle; } &.two-lines { $avatar-height: 2rem; height: $avatar-height; .avatar { height: $avatar-height; width: $avatar-height; } div { display: flex; flex-direction: column; height: $avatar-height; margin-left: .1rem; margin-right: .1rem; justify-content: center; } } } @mixin admin-sub-header-responsive ($horizontal-margins) { flex-direction: column; .form-sub-title { margin-right: 0px !important; margin-bottom: 10px; text-align: center; } .admin-sub-nav { display: block; overflow-x: auto; white-space: nowrap; height: 50px; padding: 10px 0; width: calc(100vw - #{$horizontal-margins*2}); a { margin-left: 5px; } } } // applies 16:9 ratio to a child element (using $selector) only using // an immediate's parent size. This allows 16:9 ratio without explicit // dimensions, as width/height cannot be computed from each other. @mixin large-screen-ratio ($selector: 'div') { position: relative; height: 0; width: 100%; padding-top: 56%; #{$selector} { position: absolute; width: 100%; height: 100%; top: 0; @content; } }