Fixes/Changes for 0.27.0 (#2176)

* add Invite to the left nav

* fix: #2154 - only set latest content if we are on page 1 of a channel

* lower priority for channel/date on home page

* add gerbil to 'all caught up' subscription view

* fix: spacing on items in home page scrollable list

* color improvements on homepage for titles/help message

* fix: stroke width for svg inside button

* fix: grid layout on large screens

* i give up - related on the right side always

* fix: hidden claims message spacing

* general spacing improvements

* fix: nsfw file page background

* remove comment
This commit is contained in:
Sean Yesmunt 2019-01-11 11:34:36 -05:00 committed by GitHub
parent e185cdc1d6
commit bed9b1f95f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 255 additions and 236 deletions

View file

@ -155,7 +155,7 @@ class CategoryList extends PureComponent<Props, State> {
if (currentCardVisible && previousCard) { if (currentCardVisible && previousCard) {
const scrollTarget = previousCard.offsetLeft; const scrollTarget = previousCard.offsetLeft;
this.handleScroll(scrollTarget); this.handleScroll(scrollTarget - cards[0].offsetLeft);
break; break;
} }

View file

@ -99,7 +99,9 @@ class FileCard extends React.PureComponent<Props> {
const handleContextMenu = event => { const handleContextMenu = event => {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
openCopyLinkMenu(convertToShareLink(claim.permanent_url), event); if (claim) {
openCopyLinkMenu(convertToShareLink(claim.permanent_url), event);
}
}; };
// We should be able to tab through cards // We should be able to tab through cards
@ -119,11 +121,13 @@ class FileCard extends React.PureComponent<Props> {
<div className="media__title"> <div className="media__title">
<TruncatedText text={title} lines={2} /> <TruncatedText text={title} lines={2} />
</div> </div>
<div className="media__subtitle"> <div className="media__subtext">
{pending ? <div>Pending...</div> : <UriIndicator uri={uri} link />} <div className="media__subtitle">
</div> {pending ? <div>Pending...</div> : <UriIndicator uri={uri} link />}
<div className="media__date"> </div>
<DateTime timeAgo block={height} /> <div className="media__date">
<DateTime timeAgo block={height} />
</div>
</div> </div>
<div className="media__properties"> <div className="media__properties">
<FilePrice hideFree uri={uri} /> <FilePrice hideFree uri={uri} />

View file

@ -1,7 +1,7 @@
// @flow // @flow
import React from 'react'; import React from 'react';
import Button from 'component/button'; import Button from 'component/button';
import { FormField } from 'component/common/form'; import { FormField, FormRow } from 'component/common/form';
import type { Claim } from 'types/claim'; import type { Claim } from 'types/claim';
type Props = { type Props = {
@ -74,48 +74,43 @@ class WalletSendTip extends React.PureComponent<Props, State> {
const { tipAmount, tipError } = this.state; const { tipAmount, tipError } = this.state;
return ( return (
<section className="card__content"> <React.Fragment>
<FormField <FormRow>
autoFocus <FormField
label={ autoFocus
(tipAmount && label={
tipAmount !== 0 && (tipAmount &&
`Tip ${tipAmount.toFixed(8).replace(/\.?0+$/, '')} LBC`) || tipAmount !== 0 &&
__('Amount') `Tip ${tipAmount.toFixed(8).replace(/\.?0+$/, '')} LBC`) ||
} __('Amount')
postfix={__('LBC')} }
className="input--price-amount" postfix={__('LBC')}
error={tipError} className="input--price-amount"
min="0" error={tipError}
step="any" min="0"
type="number" step="any"
placeholder="1.23" type="number"
onChange={event => this.handleSupportPriceChange(event)} placeholder="1.23"
helper={ onChange={event => this.handleSupportPriceChange(event)}
<p> helper={
{__(`This will appear as a tip for "${title}".`)}{' '} <p>
<Button label={__('Learn more')} button="link" href="https://lbry.io/faq/tipping" /> {__(`This will appear as a tip for "${title}".`)}{' '}
</p> <Button label={__('Learn more')} button="link" href="https://lbry.io/faq/tipping" />
} </p>
/> }
/>
</FormRow>
<div className="card__content"> <div className="card__actions">
<div className="card__actions"> <Button
<Button button="primary"
button="primary" label={__('Send')}
label={__('Send')} disabled={isPending || tipError}
disabled={isPending || tipError} onClick={this.handleSendButtonClicked}
onClick={this.handleSendButtonClicked} />
/> <Button button="link" label={__('Cancel')} onClick={onCancel} navigateParams={{ uri }} />
<Button
button="link"
label={__('Cancel')}
onClick={onCancel}
navigateParams={{ uri }}
/>
</div>
</div> </div>
</section> </React.Fragment>
); );
} }
} }

View file

@ -72,7 +72,7 @@ export class Modal extends React.PureComponent<ModalProps> {
<h1 className="card__title">{title}</h1> <h1 className="card__title">{title}</h1>
</header> </header>
)} )}
<div className="card__content">{children}</div> {children}
{type === 'custom' ? null : ( // custom modals define their own buttons {type === 'custom' ? null : ( // custom modals define their own buttons
<div className="card__actions"> <div className="card__actions">
<Button <Button

View file

@ -1,7 +1,7 @@
// @flow // @flow
import React from 'react'; import React from 'react';
import { Modal } from 'modal/modal'; import { Modal } from 'modal/modal';
import { FormField } from 'component/common/form'; import { FormField, FormRow } from 'component/common/form';
type Props = { type Props = {
upload: (string, boolean) => void, upload: (string, boolean) => void,
@ -25,16 +25,21 @@ class ModalConfirmThumbnailUpload extends React.PureComponent<Props> {
return ( return (
<Modal <Modal
isOpen isOpen
title={__('Upload Thumbnail')}
contentLabel={__('Confirm Thumbnail Upload')} contentLabel={__('Confirm Thumbnail Upload')}
type="confirm" type="confirm"
confirmButtonLabel={__('Upload')} confirmButtonLabel={__('Upload')}
onConfirmed={() => this.upload()} onConfirmed={() => this.upload()}
onAborted={closeModal} onAborted={closeModal}
> >
<section className="card__content"> <header className="card__header">
<p>{__('Are you sure you want to upload this thumbnail to spee.ch')}?</p> <h2 className="card__title">{__('More Ways To Get LBRY Credits')}</h2>
<blockquote>{path}</blockquote> <p className="card__subtitle">
{__('Are you sure you want to upload this thumbnail to spee.ch')}?
</p>
</header>
<blockquote>{path}</blockquote>
<FormRow>
<FormField <FormField
type="checkbox" type="checkbox"
name="content_is_mature" name="content_is_mature"
@ -42,7 +47,7 @@ class ModalConfirmThumbnailUpload extends React.PureComponent<Props> {
checked={nsfw} checked={nsfw}
onChange={event => updatePublishForm({ nsfw: event.target.checked })} onChange={event => updatePublishForm({ nsfw: event.target.checked })}
/> />
</section> </FormRow>
</Modal> </Modal>
); );
} }

View file

@ -60,20 +60,21 @@ class ModalRemoveFile extends React.PureComponent<Props, State> {
return ( return (
<Modal <Modal
isOpen isOpen
title={__('Remove File')}
contentLabel={__('Confirm File Remove')} contentLabel={__('Confirm File Remove')}
type="confirm" type="confirm"
confirmButtonLabel={__('Remove')} confirmButtonLabel={__('Remove')}
onConfirmed={() => deleteFile(outpoint, deleteChecked, abandonClaimChecked)} onConfirmed={() => deleteFile(outpoint, deleteChecked, abandonClaimChecked)}
onAborted={closeModal} onAborted={closeModal}
> >
<section className="card__content"> <header className="card__header">
<p> <h2 className="card__title">{__('Remove File')}</h2>
<p className="card__subtitle">
{__("Are you sure you'd like to remove")} <cite>{`"${title}"`}</cite>{' '} {__("Are you sure you'd like to remove")} <cite>{`"${title}"`}</cite>{' '}
{__('from the LBRY app?')} {__('from the LBRY app?')}
</p> </p>
</header>
<FormRow padded> <section className="card__content">
<FormRow>
<FormField <FormField
prefix={__('Also delete this file from my computer')} prefix={__('Also delete this file from my computer')}
type="checkbox" type="checkbox"

View file

@ -15,16 +15,13 @@ const GetCreditsPage = () => (
*/} */}
<section className="card card--section"> <section className="card card--section">
<header className="card__header"> <header className="card__header">
<h2 className="card__title">{__('More ways to get LBRY Credits')}</h2> <h2 className="card__title">{__('More Ways To Get LBRY Credits')}</h2>
</header> <p className="card__subtitle">
<div className="card__content">
<p>
{ {
'LBRY credits can be purchased on exchanges, earned for contributions, for mining, and more.' 'LBRY credits can be purchased on exchanges, earned for contributions, for mining, and more.'
} }
</p> </p>
</div> </header>
<div className="card__content"> <div className="card__content">
<div className="card__actions"> <div className="card__actions">

View file

@ -36,15 +36,6 @@ export default (props: Props) => {
} = props; } = props;
return ( return (
<Fragment> <Fragment>
<HiddenNsfwClaims
uris={subscriptions.reduce((arr, { name, claim_id: claimId }) => {
if (name && claimId) {
arr.push(`lbry://${name}#${claimId}`);
}
return arr;
}, [])}
/>
{hasSubscriptions && ( {hasSubscriptions && (
<section className="card card--section"> <section className="card card--section">
<div className="card__content card--space-between"> <div className="card__content card--space-between">
@ -75,6 +66,15 @@ export default (props: Props) => {
</section> </section>
)} )}
<HiddenNsfwClaims
uris={subscriptions.reduce((arr, { name, claim_id: claimId }) => {
if (name && claimId) {
arr.push(`lbry://${name}#${claimId}`);
}
return arr;
}, [])}
/>
{!hasSubscriptions && ( {!hasSubscriptions && (
<Fragment> <Fragment>
<div className="yrbl-wrap"> <div className="yrbl-wrap">
@ -96,8 +96,8 @@ export default (props: Props) => {
<div className="card__content"> <div className="card__content">
{viewMode === VIEW_ALL && ( {viewMode === VIEW_ALL && (
<Fragment> <Fragment>
<div className="card__title card__title--flex"> <div className="card__title--flex">
{__('Your subscriptions')} <h2 className="card__title">{__('Your subscriptions')}</h2>
{unreadSubscriptions.length > 0 && <MarkAsRead />} {unreadSubscriptions.length > 0 && <MarkAsRead />}
</div> </div>
<FileList hideFilter sortByHeight fileInfos={subscriptions} /> <FileList hideFilter sortByHeight fileInfos={subscriptions} />
@ -131,9 +131,16 @@ export default (props: Props) => {
}) })
) : ( ) : (
<Fragment> <Fragment>
<div className="page__empty"> <div className="yrbl-wrap">
<h3 className="card__title">{__('All caught up!')}</h3> <img
<p className="card__subtitle">{__('You might like the channels below.')}</p> alt="Friendly gerbil"
className="subscriptions__gerbil"
src={Native.imagePath('gerbil-happy.png')}
/>
<div className="card__content">
<h2 className="card__title">{__('All caught up!')}</h2>
<p className="card__subtitle">{__('You might like the channels below.')}</p>
</div>
</div> </div>
<SuggestedSubscriptions /> <SuggestedSubscriptions />
</Fragment> </Fragment>

View file

@ -286,19 +286,23 @@ export function doPurchaseUri(uri, specificCostInfo, shouldRecordViewEvent) {
}; };
} }
export function doFetchClaimsByChannel(uri, page, pageSize) { export function doFetchClaimsByChannel(
uri: string,
page: number = 1,
pageSize: number = PAGE_SIZE
) {
return dispatch => { return dispatch => {
dispatch({ dispatch({
type: ACTIONS.FETCH_CHANNEL_CLAIMS_STARTED, type: ACTIONS.FETCH_CHANNEL_CLAIMS_STARTED,
data: { uri, page }, data: { uri, page },
}); });
Lbry.claim_list_by_channel({ uri, page: page || 1, page_size: pageSize || PAGE_SIZE }).then( Lbry.claim_list_by_channel({ uri, page, page_size: pageSize }).then(result => {
result => { const claimResult = result[uri] || {};
const claimResult = result[uri] || {}; const { claims_in_channel: claimsInChannel, returned_page: returnedPage } = claimResult;
const { claims_in_channel: claimsInChannel, returned_page: returnedPage } = claimResult;
if (claimsInChannel && claimsInChannel.length) { if (claimsInChannel && claimsInChannel.length) {
if (page === 1) {
const latest = claimsInChannel[0]; const latest = claimsInChannel[0];
dispatch( dispatch(
setSubscriptionLatest( setSubscriptionLatest(
@ -316,17 +320,17 @@ export function doFetchClaimsByChannel(uri, page, pageSize) {
) )
); );
} }
dispatch({
type: ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED,
data: {
uri,
claims: claimsInChannel || [],
page: returnedPage || undefined,
},
});
} }
);
dispatch({
type: ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED,
data: {
uri,
claims: claimsInChannel || [],
page: returnedPage || undefined,
},
});
});
}; };
} }

View file

@ -4,26 +4,20 @@ import * as icons from 'constants/icons';
export const selectState = state => state.app || {}; export const selectState = state => state.app || {};
export const selectPlatform = createSelector( export const selectPlatform = createSelector(selectState, state => state.platform);
selectState,
state => state.platform
);
export const selectUpdateUrl = createSelector( export const selectUpdateUrl = createSelector(selectPlatform, platform => {
selectPlatform, switch (platform) {
platform => { case 'darwin':
switch (platform) { return 'https://lbry.io/get/lbry.dmg';
case 'darwin': case 'linux':
return 'https://lbry.io/get/lbry.dmg'; return 'https://lbry.io/get/lbry.deb';
case 'linux': case 'win32':
return 'https://lbry.io/get/lbry.deb'; return 'https://lbry.io/get/lbry.exe';
case 'win32': default:
return 'https://lbry.io/get/lbry.exe'; throw Error('Unknown platform');
default:
throw Error('Unknown platform');
}
} }
); });
export const selectHasClickedComment = createSelector( export const selectHasClickedComment = createSelector(
selectState, selectState,
@ -54,30 +48,18 @@ export const selectUpgradeFilename = createSelector(
} }
); );
export const selectDownloadProgress = createSelector( export const selectDownloadProgress = createSelector(selectState, state => state.downloadProgress);
selectState,
state => state.downloadProgress
);
export const selectDownloadComplete = createSelector( export const selectDownloadComplete = createSelector(
selectState, selectState,
state => state.upgradeDownloadCompleted state => state.upgradeDownloadCompleted
); );
export const selectIsUpgradeSkipped = createSelector( export const selectIsUpgradeSkipped = createSelector(selectState, state => state.isUpgradeSkipped);
selectState,
state => state.isUpgradeSkipped
);
export const selectUpgradeDownloadPath = createSelector( export const selectUpgradeDownloadPath = createSelector(selectState, state => state.downloadPath);
selectState,
state => state.downloadPath
);
export const selectUpgradeDownloadItem = createSelector( export const selectUpgradeDownloadItem = createSelector(selectState, state => state.downloadItem);
selectState,
state => state.downloadItem
);
export const selectAutoUpdateDownloaded = createSelector( export const selectAutoUpdateDownloaded = createSelector(
selectState, selectState,
@ -94,35 +76,23 @@ export const selectDaemonVersionMatched = createSelector(
state => state.daemonVersionMatched state => state.daemonVersionMatched
); );
export const selectSnackBar = createSelector( export const selectSnackBar = createSelector(selectState, state => state.snackBar || {});
selectState,
state => state.snackBar || {}
);
export const selectSnackBarSnacks = createSelector( export const selectSnackBarSnacks = createSelector(
selectSnackBar, selectSnackBar,
snackBar => snackBar.snacks || [] snackBar => snackBar.snacks || []
); );
export const selectBadgeNumber = createSelector( export const selectBadgeNumber = createSelector(selectState, state => state.badgeNumber);
selectState,
state => state.badgeNumber
);
export const selectCurrentLanguage = createSelector( export const selectCurrentLanguage = createSelector(
selectState, selectState,
() => app.i18n.getLocale() || 'en' () => app.i18n.getLocale() || 'en'
); );
export const selectVolume = createSelector( export const selectVolume = createSelector(selectState, state => state.volume);
selectState,
state => state.volume
);
export const selectUpgradeTimer = createSelector( export const selectUpgradeTimer = createSelector(selectState, state => state.checkUpgradeTimer);
selectState,
state => state.checkUpgradeTimer
);
export const selectNavLinks = createSelector( export const selectNavLinks = createSelector(
selectCurrentPage, selectCurrentPage,
@ -134,7 +104,6 @@ export const selectNavLinks = createSelector(
page === 'getcredits' || page === 'getcredits' ||
page === 'rewards' || page === 'rewards' ||
page === 'history' || page === 'history' ||
page === 'invite' ||
page === 'backup'; page === 'backup';
const isMyLbryPage = page => const isMyLbryPage = page =>
@ -198,11 +167,6 @@ export const selectNavLinks = createSelector(
path: '/rewards', path: '/rewards',
active: currentPage === 'rewards', active: currentPage === 'rewards',
}, },
{
label: 'Invites',
path: '/invite',
active: currentPage === 'invite',
},
{ {
label: 'Backup', label: 'Backup',
path: '/backup', path: '/backup',
@ -258,6 +222,12 @@ export const selectNavLinks = createSelector(
path: isCurrentlyMyLbryPage ? '/downloaded' : getActiveSublink('myLbry'), path: isCurrentlyMyLbryPage ? '/downloaded' : getActiveSublink('myLbry'),
active: isMyLbryPage(currentPage), active: isMyLbryPage(currentPage),
}, },
{
label: 'Invite',
// icon: TBD when we add icons back to the side nav
path: '/invite',
active: currentPage === 'invite',
},
{ {
label: 'Publish', label: 'Publish',
icon: icons.UPLOAD, icon: icons.UPLOAD,
@ -283,15 +253,13 @@ export const selectNavLinks = createSelector(
} }
); );
export const selectModal = createSelector( export const selectModal = createSelector(selectState, state => {
selectState, if (!state.modal) {
state => { return null;
if (!state.modal) { }
return null;
}
return { return {
id: state.modal, id: state.modal,
modalProps: state.modalProps, modalProps: state.modalProps,
} };
}) });

View file

@ -3,11 +3,11 @@
position: relative; position: relative;
svg { svg {
stroke-width: 2; stroke-width: 1.5;
width: 1.2rem; width: 1.2rem;
height: 1.2rem; height: 1.2rem;
position: relative; position: relative;
top: 0.2rem; top: 0.1rem;
} }
.btn__label { .btn__label {

View file

@ -44,6 +44,8 @@
// A C T I O N S // A C T I O N S
.card__actions { .card__actions {
font-size: 1.15rem;
> *:not(:last-child) { > *:not(:last-child) {
margin-right: var(--spacing-vertical-large); margin-right: var(--spacing-vertical-large);
} }
@ -193,6 +195,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
.card__title + .btn,
.btn:not(:first-of-type) { .btn:not(:first-of-type) {
margin-left: var(--spacing-vertical-medium); margin-left: var(--spacing-vertical-medium);
} }

View file

@ -19,7 +19,6 @@
background-position: 50% 50%; background-position: 50% 50%;
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: cover; background-size: cover;
max-width: calc(var(--file-max-width) * (16 / 9));
margin: auto; margin: auto;
&:not(.card__media--nsfw) { &:not(.card__media--nsfw) {
@ -38,14 +37,7 @@
.content__embedded { .content__embedded {
@include thumbnail; @include thumbnail;
background-color: #000;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: var(--spacing-vertical-large);
position: relative; position: relative;
width: 100%;
max-height: var(--file-max-width);
video { video {
width: 100%; width: 100%;
@ -70,7 +62,8 @@
width: 100%; width: 100%;
} }
.content__empty--nsfw { .content__empty--nsfw,
.card__media--nsfw {
background-color: $lbry-grape-3; background-color: $lbry-grape-3;
} }
@ -93,14 +86,10 @@
.content__view { .content__view {
width: 100%; width: 100%;
height: 100%; height: 100%;
top: 0;
left: 0;
background-color: #000; background-color: #000;
align-items: center; align-items: center;
display: flex; display: flex;
justify-content: center; justify-content: center;
position: absolute;
iframe { iframe {
width: 100%; width: 100%;

View file

@ -127,7 +127,7 @@
} }
.btn__label { .btn__label {
line-height: 1.8; line-height: 1.4;
padding-left: 0.5rem; padding-left: 0.5rem;
} }

View file

@ -14,22 +14,28 @@
} }
.main--file-page { .main--file-page {
max-width: 1787px;
display: grid; display: grid;
grid-template-areas: grid-template-areas:
'content content' 'content related'
'info related'
'info related'; 'info related';
grid-gap: var(--spacing-vertical-large);
grid-template-rows: auto 1fr;
grid-template-columns: 1fr auto;
@media (min-width: 1470px) { // TODO: Get responsive grid working, to many issues with different thumbnails messing stuff up on small screens with the file taking up the full width
grid-template-areas: // I will conquer this one day
'content related' // grid-template-areas:
'info related' // 'content content'
'info related'; // 'info related';
grid-template-rows: 0fr 1fr; //
} // @media (min-width: 1470px) {
//
// }
.grid-area--content { .grid-area--content {
grid-area: content; grid-area: content;
max-width: var(--file-max-width);
} }
.grid-area--info { .grid-area--info {
grid-area: info; grid-area: info;

View file

@ -213,6 +213,40 @@
@include placeholder; @include placeholder;
} }
// M E D I A
// S U B T E X T
//
// Wrapper around low level media information (date, channel)
//
.media__subtext {
color: rgba($lbry-black, 0.8);
html[data-theme='dark'] & {
color: rgba($lbry-white, 0.7);
}
}
// M E D I A
// S U B T I T L E
.media__subtitle {
font-size: 1rem;
position: relative;
}
.media__subtitle--large {
display: block;
> button {
display: block;
}
}
.media__subtitle__channel {
font-size: 1.25rem;
font-weight: 600;
}
// M E D I A // M E D I A
// I N F O // I N F O
@ -255,7 +289,7 @@
// M E S S A G E // M E S S A G E
.media__message { .media__message {
font-size: 0.9rem; font-size: 1.1rem;
padding: var(--spacing-vertical-medium); padding: var(--spacing-vertical-medium);
white-space: normal; white-space: normal;
} }
@ -264,6 +298,31 @@
background-color: $lbry-yellow-3; background-color: $lbry-yellow-3;
margin: var(--spacing-vertical-medium) var(--spacing-vertical-large); margin: var(--spacing-vertical-medium) var(--spacing-vertical-large);
.btn--link {
// The normal colors we use for .btn--link are too light for the warning background
// This just darkens them a bit and adds an border-bottom so they are easier to see.
$altered-color: mix($lbry-teal-5, $lbry-black, 80%);
$altered-hover-color: mix($lbry-teal-5, $lbry-black, 60%);
&:not(.btn--disabled) {
color: $altered-color;
border-bottom: 1px solid $altered-color;
&:hover {
color: $altered-hover-color;
}
html[data-theme='dark'] & {
color: $altered-color;
border-bottom: 1px solid $altered-color;
&:hover {
color: $altered-hover-color;
}
}
}
}
html[data-theme='dark'] & { html[data-theme='dark'] & {
background-color: $lbry-yellow-4; background-color: $lbry-yellow-4;
color: $lbry-black; color: $lbry-black;
@ -317,27 +376,6 @@
@include placeholder; @include placeholder;
} }
// M E D I A
// S U B T I T L E
.media__subtitle {
font-size: 1rem;
position: relative;
}
.media__subtitle--large {
display: block;
> button {
display: block;
}
}
.media__subtitle__channel {
font-size: 1.25rem;
font-weight: 600;
}
// M E D I A // M E D I A
// T E X T // T E X T
@ -464,11 +502,10 @@
.media-group--list-recommended { .media-group--list-recommended {
border-left: 1px solid $lbry-gray-1; border-left: 1px solid $lbry-gray-1;
float: right;
min-height: 50vh; min-height: 50vh;
overflow: hidden; overflow: hidden;
padding-left: var(--spacing-vertical-large);
width: 30rem; width: 30rem;
padding-left: var(--spacing-vertical-large);
html[data-theme='dark'] & { html[data-theme='dark'] & {
border-color: rgba($lbry-gray-5, 0.2); border-color: rgba($lbry-gray-5, 0.2);
@ -517,6 +554,10 @@
.channel-info__actions { .channel-info__actions {
color: $lbry-white; color: $lbry-white;
} }
.media__subtext {
color: mix($lbry-cyan-5, $lbry-white, 20%);
}
} }
&:not(:first-of-type):not(:last-of-type) { &:not(:first-of-type):not(:last-of-type) {
@ -527,25 +568,16 @@
} }
} }
&:not(:first-of-type) {
.media-group__header-title {
background-image: linear-gradient(to right, $lbry-black 80%, transparent 100%);
}
.channel-info__actions {
color: initial;
}
}
.media-group__header { .media-group__header {
flex-direction: row; flex-direction: row;
padding-left: var(--spacing-vertical-large); padding-left: var(--spacing-vertical-large);
} }
.media-group__header-title { .media-group__header-title {
color: transparent; // color: transparent; // TODO: Add this back for lbryweb, it helps with long titles but was causing issues. A better solution is needed. - Sean
// !exist unprefixed, needs SVG for LBRY web // !exist unprefixed, needs SVG for LBRY web
-webkit-background-clip: text; -webkit-background-clip: text;
background-image: linear-gradient(to right, $lbry-white 80%, transparent 100%);
html[data-theme='dark'] & { html[data-theme='dark'] & {
background-image: linear-gradient( background-image: linear-gradient(
@ -642,6 +674,16 @@
padding-top: var(--spacing-vertical-medium); padding-top: var(--spacing-vertical-medium);
} }
// Handles the margin on the right side of the last item
// Overflow: hidden makes doesn't care if the margin is off the screen, just the content
// Using padding shrinks the last item
&::after {
content: '';
display: inline-block;
width: var(--spacing-vertical-large);
height: 1px;
}
.media-card { .media-card {
cursor: pointer; cursor: pointer;
display: inline-block; display: inline-block;
@ -655,12 +697,6 @@
margin-left: var(--spacing-vertical-large); margin-left: var(--spacing-vertical-large);
} }
&:last-of-type {
// We can't use margin or padding because overlfow: hidden ignores those
// border-right ensures the last item in the scrollable list has some space to the right
border-right: var(--spacing-vertical-large) solid transparent;
}
// May be needed for mobile design // May be needed for mobile design
// @media (max-width: 600px) { // @media (max-width: 600px) {
// width: calc((100% / 3) - 3rem); // width: calc((100% / 3) - 3rem);

View file

@ -25,9 +25,6 @@
background-color: $lbry-white; background-color: $lbry-white;
border: 1px solid $lbry-gray-3; border: 1px solid $lbry-gray-3;
border-radius: 4px; border-radius: 4px;
display: flex;
flex-direction: column;
justify-content: center;
line-height: 1.55; line-height: 1.55;
max-width: var(--modal-width); max-width: var(--modal-width);
overflow: auto; overflow: auto;

View file

@ -10,15 +10,14 @@
width: calc(100% + 4rem); width: calc(100% + 4rem);
} }
.yrbl-wrap { .yrbl-wrap {
align-items: center; align-items: center;
display: flex; display: flex;
justify-content: center; justify-content: center;
vertical-align: middle; vertical-align: middle;
margin-bottom: var(--spacing-vertical-large);
img { img {
height: 500px; height: 300px;
} }
} }

View file

@ -147,15 +147,20 @@ input {
} }
} }
.card {
.help {
margin-bottom: 0;
margin-top: var(--spacing-vertical-large);
}
}
.help { .help {
background-color: rgba($lbry-blue-1, 0.1); background-color: rgba($lbry-blue-1, 0.1);
border-radius: 0.5rem; border-radius: 0.5rem;
color: $lbry-gray-5; color: $lbry-gray-5;
display: block; display: block;
margin-bottom: 1rem;
padding: 1rem; padding: 1rem;
position: relative; margin-bottom: var(--spacing-vertical-large);
top: 1rem;
html[data-theme='dark'] & { html[data-theme='dark'] & {
color: inherit; color: inherit;

View file

@ -18,7 +18,10 @@ $large-breakpoint: 1921px;
--spacing-vertical-medium: calc(2rem / 2); --spacing-vertical-medium: calc(2rem / 2);
--spacing-vertical-large: 2rem; --spacing-vertical-large: 2rem;
--file-max-width: 700px; --file-max-width: 1400px;
// --file-max-height: calc(var(--file-max-height) * 9 / 16);
--file-max-height: 788px;
--video-aspect-ratio: 56.25%; // 9 x 16 --video-aspect-ratio: 56.25%; // 9 x 16
// Text // Text