mirror of https://github.com/FreeTubeApp/FreeTube
441 lines
8.4 KiB
SCSS
441 lines
8.4 KiB
SCSS
$thumbnail-overlay-opacity: 0.85;
|
|
$watched-transition-duration: 0.5s;
|
|
|
|
@mixin is-result {
|
|
@at-root {
|
|
.result#{&} {
|
|
@content;
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin is-watch-playlist-item {
|
|
@at-root {
|
|
.watchPlaylistItem#{&} {
|
|
@content;
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin is-recommendation {
|
|
@at-root {
|
|
.recommendation#{&} {
|
|
@content;
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin is-sidebar-item {
|
|
@at-root {
|
|
.watchPlaylistItem#{&},
|
|
.recommendation#{&} {
|
|
@content;
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin low-contrast-when-watched($col) {
|
|
color: $col;
|
|
|
|
@at-root {
|
|
.watched &,
|
|
.watched#{&} {
|
|
color: var(--tertiary-text-color);
|
|
transition-duration: $watched-transition-duration;
|
|
}
|
|
.watched:hover &,
|
|
.watched:hover#{&} {
|
|
color: $col;
|
|
transition-duration: $watched-transition-duration;
|
|
}
|
|
}
|
|
}
|
|
|
|
.ft-list-item {
|
|
padding: 6px;
|
|
|
|
&.watched {
|
|
@include low-contrast-when-watched(var(--primary-text-color));
|
|
|
|
background-color: var(--bg-color);
|
|
|
|
.thumbnailImage {
|
|
opacity: 0.3;
|
|
transition: opacity $watched-transition-duration;
|
|
}
|
|
|
|
&:hover .thumbnailImage,
|
|
&:focus .thumbnailImage {
|
|
opacity: 1;
|
|
transition-duration: $watched-transition-duration;
|
|
}
|
|
}
|
|
|
|
.videoThumbnail {
|
|
display: grid;
|
|
|
|
.thumbnailLink,
|
|
.videoWatched,
|
|
.videoDuration,
|
|
.externalPlayerIcon,
|
|
.playlistIcons,
|
|
.watchedProgressBar,
|
|
.videoCountContainer,
|
|
.background,
|
|
.inner {
|
|
grid-column: 1;
|
|
grid-row: 1;
|
|
user-select: none;
|
|
-webkit-user-select: none;
|
|
}
|
|
|
|
.thumbnailLink {
|
|
display: flex;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.thumbnailImage {
|
|
@include is-sidebar-item {
|
|
block-size: 75px;
|
|
}
|
|
|
|
@include is-recommendation {
|
|
block-size: auto;
|
|
inline-size: 163px;
|
|
}
|
|
}
|
|
|
|
.videoWatched {
|
|
align-self: flex-start;
|
|
background-color: var(--bg-color);
|
|
color: var(--primary-text-color);
|
|
justify-self: start;
|
|
opacity: $thumbnail-overlay-opacity;
|
|
padding: 2px;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.videoDuration {
|
|
align-self: flex-end;
|
|
background-color: var(--card-bg-color);
|
|
border-radius: 5px;
|
|
color: var(--primary-text-color);
|
|
font-size: 15px;
|
|
justify-self: end;
|
|
line-height: 1.2;
|
|
margin-block: 0 4px;
|
|
margin-inline: 0 4px;
|
|
opacity: $thumbnail-overlay-opacity;
|
|
padding-block: 3px;
|
|
padding-inline: 4px;
|
|
pointer-events: none;
|
|
|
|
@include is-watch-playlist-item {
|
|
font-size: 12px;
|
|
}
|
|
|
|
&.live {
|
|
background-color: #f22;
|
|
color: #fff;
|
|
}
|
|
}
|
|
|
|
.externalPlayerIcon {
|
|
align-self: flex-end;
|
|
font-size: 17px;
|
|
justify-self: start;
|
|
margin-block-end: 4px;
|
|
margin-inline-start: 4px;
|
|
}
|
|
|
|
.playlistIcons {
|
|
justify-self: end;
|
|
margin-inline-end: 3px;
|
|
margin-block-start: 3px;
|
|
|
|
display: grid;
|
|
grid-auto-flow: column;
|
|
justify-content: flex-end;
|
|
block-size: fit-content;
|
|
}
|
|
.quickBookmarkVideoIcon,
|
|
.addToPlaylistIcon,
|
|
.trashIcon,
|
|
.upArrowIcon,
|
|
.downArrowIcon {
|
|
font-size: 17px;
|
|
}
|
|
|
|
.watchedProgressBar {
|
|
align-self: flex-end;
|
|
background-color: var(--primary-color);
|
|
block-size: 2px;
|
|
justify-self: stretch;
|
|
z-index: 2;
|
|
}
|
|
|
|
.videoCountContainer {
|
|
align-self: stretch;
|
|
display: grid;
|
|
font-size: 20px;
|
|
justify-self: end;
|
|
inline-size: 60px;
|
|
pointer-events: none;
|
|
|
|
.background {
|
|
background-color: var(--bg-color);
|
|
opacity: 0.9;
|
|
}
|
|
|
|
.inner {
|
|
align-items: center;
|
|
color: var(--primary-text-color);
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
z-index: 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
.channelThumbnail {
|
|
display: flex;
|
|
justify-content: center;
|
|
|
|
.channelThumbnailLink {
|
|
inline-size: 100%;
|
|
text-align: center;
|
|
|
|
.channelImage {
|
|
border-radius: 50%;
|
|
block-size: 130px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.info {
|
|
align-content: flex-start;
|
|
display: grid;
|
|
flex: 1;
|
|
min-inline-size: 10em;
|
|
grid-template:
|
|
'title optionsExternalButton' auto
|
|
'infoLine optionsExternalButton' auto
|
|
'description description' auto / 1fr auto;
|
|
|
|
.optionsButton {
|
|
grid-area: optionsExternalButton;
|
|
}
|
|
|
|
.externalPlayerButton {
|
|
grid-area: optionsExternalButton;
|
|
}
|
|
|
|
.title {
|
|
@include low-contrast-when-watched(var(--primary-text-color));
|
|
|
|
font-size: 20px;
|
|
grid-area: title;
|
|
text-decoration: none;
|
|
word-break: break-word;
|
|
word-wrap: break-word;
|
|
|
|
@include is-sidebar-item {
|
|
font-size: 15px;
|
|
}
|
|
}
|
|
|
|
.infoLine {
|
|
font-size: 14px;
|
|
grid-area: infoLine;
|
|
margin-block-start: 5px;
|
|
overflow-wrap: anywhere;
|
|
text-align: start;
|
|
|
|
@include is-sidebar-item {
|
|
font-size: 12px;
|
|
}
|
|
|
|
& {
|
|
@include low-contrast-when-watched(var(--secondary-text-color));
|
|
}
|
|
|
|
.channelName {
|
|
@include low-contrast-when-watched(var(--secondary-text-color));
|
|
}
|
|
}
|
|
|
|
.description {
|
|
@include low-contrast-when-watched(var(--secondary-text-color));
|
|
|
|
font-size: 14px;
|
|
grid-area: description;
|
|
max-block-size: 50px;
|
|
overflow-y: hidden;
|
|
}
|
|
}
|
|
|
|
&.list {
|
|
align-items: flex-start;
|
|
display: flex;
|
|
|
|
@include is-sidebar-item {
|
|
.videoThumbnail {
|
|
margin-inline-end: 10px;
|
|
}
|
|
}
|
|
|
|
&.result {
|
|
.videoThumbnail,
|
|
.channelThumbnailLink,
|
|
.thumbnailLink,
|
|
.thumbnailImage {
|
|
inline-size: 336px;
|
|
max-inline-size: 25vw;
|
|
|
|
@media only screen and (max-width: 680px) {
|
|
max-inline-size: 30vw;
|
|
}
|
|
}
|
|
|
|
.channelImage {
|
|
max-inline-size: 25vw;
|
|
max-block-size: 25vw;
|
|
|
|
@media only screen and (max-width: 680px) {
|
|
max-inline-size: 30vw;
|
|
max-block-size: 30vw;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
.videoThumbnail,
|
|
.channelThumbnail {
|
|
margin-inline-end: 20px;
|
|
}
|
|
|
|
.info .description {
|
|
margin-inline-end: 10px;
|
|
}
|
|
}
|
|
|
|
&.grid {
|
|
display: flex;
|
|
flex-direction: column;
|
|
min-block-size: 230px;
|
|
padding-block-end: 20px;
|
|
box-sizing: border-box;
|
|
block-size: 100%;
|
|
|
|
.videoThumbnail,
|
|
.channelThumbnail {
|
|
margin-block-end: 12px;
|
|
|
|
.thumbnailImage {
|
|
// Ensure placeholder image displayed at same aspect ratio as most other images
|
|
aspect-ratio: 16/9;
|
|
}
|
|
}
|
|
|
|
.thumbnailImage,
|
|
.channelThumbnail {
|
|
inline-size: 100%;
|
|
}
|
|
|
|
.title {
|
|
font-size: 18px;
|
|
}
|
|
|
|
.infoLine {
|
|
font-size: 13px;
|
|
margin-block-start: 8px;
|
|
}
|
|
}
|
|
|
|
.playlistIcons,
|
|
.externalPlayerIcon {
|
|
opacity: $thumbnail-overlay-opacity;
|
|
}
|
|
|
|
@media (hover: hover) {
|
|
&:hover .quickBookmarkVideoIcon:not(.alwaysVisible),
|
|
.quickBookmarkVideoIcon.bookmarked:not(.alwaysVisible),
|
|
&:hover .addToPlaylistIcon:not(.alwaysVisible),
|
|
&:hover .externalPlayerIcon,
|
|
&:has(:focus-visible) .addToPlaylistIcon:not(.alwaysVisible),
|
|
&:has(:focus-visible) .quickBookmarkVideoIcon:not(.alwaysVisible),
|
|
&:has(:focus-visible) .externalPlayerIcon {
|
|
opacity: $thumbnail-overlay-opacity;
|
|
}
|
|
|
|
&:hover .optionsButton,
|
|
&:has(:focus-visible) .optionsButton {
|
|
opacity: 1;
|
|
}
|
|
|
|
.quickBookmarkVideoIcon:not(.alwaysVisible),
|
|
.addToPlaylistIcon:not(.alwaysVisible),
|
|
.externalPlayerIcon,
|
|
.optionsButton {
|
|
opacity: 0;
|
|
transition: visibility 0s, opacity 0.2s linear;
|
|
}
|
|
}
|
|
}
|
|
|
|
.ft-list-channel {
|
|
.infoAndSubscribe {
|
|
display: flex;
|
|
flex-flow: row wrap;
|
|
justify-content: center;
|
|
inline-size: 100%;
|
|
}
|
|
|
|
&.grid {
|
|
align-items: center;
|
|
text-align: center;
|
|
|
|
.infoAndSubscribe {
|
|
flex-flow: column wrap;
|
|
align-items: center;
|
|
|
|
.info {
|
|
margin-block-end: 12px;
|
|
|
|
.infoLine {
|
|
text-align: center;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
&.list {
|
|
.infoAndSubscribe {
|
|
flex-flow: row wrap;
|
|
justify-content: center;
|
|
|
|
.channelSubscribeButton {
|
|
margin-block: auto;
|
|
margin-inline: 7px;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.videoWatched,
|
|
.live,
|
|
.upcoming {
|
|
text-transform: uppercase;
|
|
user-select: none;
|
|
-webkit-user-select: none;
|
|
}
|
|
|
|
// we use h3 for semantic reasons but don't want to keep the h3 style
|
|
.h3Title {
|
|
margin-block-start: inherit;
|
|
margin-block-end: inherit;
|
|
font-size: inherit;
|
|
font-weight: inherit;
|
|
}
|