add rest of channel content to the side of the file viewer

This commit is contained in:
Sean Yesmunt 2018-07-24 20:50:04 -04:00
parent ee5922a8ba
commit 95fee660ad
23 changed files with 322 additions and 175 deletions

View file

@ -38,6 +38,7 @@
"import/prefer-default-export": 0, "import/prefer-default-export": 0,
"no-return-assign": 0, "no-return-assign": 0,
"react/require-default-props": 0, "react/require-default-props": 0,
"react/jsx-closing-tag-location": 0 "react/jsx-closing-tag-location": 0,
"jsx-a11y/no-noninteractive-element-to-interactive-role": 0
} }
} }

2
.gitignore vendored
View file

@ -5,4 +5,4 @@
yarn-error.log yarn-error.log
package-lock.json package-lock.json
.idea/ .idea/
/build/daemon.ver /build/daemon*

View file

@ -11,9 +11,10 @@ type Props = {
showPlus: boolean, showPlus: boolean,
isEstimate?: boolean, isEstimate?: boolean,
large?: boolean, large?: boolean,
plain?: boolean, showLBC?: boolean,
fee?: boolean, fee?: boolean,
noStyle?: boolean, inheritStyle?: boolean,
filePage?: boolean,
}; };
class CreditAmount extends React.PureComponent<Props> { class CreditAmount extends React.PureComponent<Props> {
@ -22,6 +23,7 @@ class CreditAmount extends React.PureComponent<Props> {
showFree: false, showFree: false,
showFullPrice: false, showFullPrice: false,
showPlus: false, showPlus: false,
showLBC: true,
}; };
render() { render() {
@ -33,9 +35,10 @@ class CreditAmount extends React.PureComponent<Props> {
showPlus, showPlus,
large, large,
isEstimate, isEstimate,
plain,
noStyle,
fee, fee,
showLBC,
inheritStyle,
filePage,
} = this.props; } = this.props;
const minimumRenderableAmount = 10 ** (-1 * precision); const minimumRenderableAmount = 10 ** (-1 * precision);
@ -62,7 +65,7 @@ class CreditAmount extends React.PureComponent<Props> {
amountText = `+${amountText}`; amountText = `+${amountText}`;
} }
if (!plain) { if (showLBC) {
amountText = `${amountText} ${__('LBC')}`; amountText = `${amountText} ${__('LBC')}`;
} }
@ -78,8 +81,8 @@ class CreditAmount extends React.PureComponent<Props> {
'credit-amount--free': !large && isFree, 'credit-amount--free': !large && isFree,
'credit-amount--cost': !large && !isFree, 'credit-amount--cost': !large && !isFree,
'credit-amount--large': large, 'credit-amount--large': large,
'credit-amount--plain': plain, 'credit-amount--inherit': inheritStyle,
'credit-amount--no-style': noStyle, 'credit-amount--file-page': filePage,
})} })}
> >
{amountText} {amountText}

View file

@ -4,7 +4,7 @@ import ReactDOMServer from 'react-dom/server';
import classnames from 'classnames'; import classnames from 'classnames';
import MarkdownPreview from 'component/common/markdown-preview'; import MarkdownPreview from 'component/common/markdown-preview';
import SimpleMDE from 'react-simplemde-editor'; import SimpleMDE from 'react-simplemde-editor';
import 'simplemde/dist/simplemde.min.css'; import 'simplemde/dist/simplemde.min.css'; // eslint-disable-line import/no-extraneous-dependencies
import Toggle from 'react-toggle'; import Toggle from 'react-toggle';
import { openEditorMenu } from 'util/contextMenu'; import { openEditorMenu } from 'util/contextMenu';
@ -24,6 +24,7 @@ type Props = {
stretch?: boolean, stretch?: boolean,
affixClass?: string, // class applied to prefix/postfix label affixClass?: string, // class applied to prefix/postfix label
useToggle?: boolean, useToggle?: boolean,
noPadding?: boolean,
}; };
export class FormField extends React.PureComponent<Props> { export class FormField extends React.PureComponent<Props> {
@ -41,6 +42,7 @@ export class FormField extends React.PureComponent<Props> {
stretch, stretch,
affixClass, affixClass,
useToggle, useToggle,
noPadding,
...inputProps ...inputProps
} = this.props; } = this.props;
@ -108,6 +110,7 @@ export class FormField extends React.PureComponent<Props> {
<div <div
className={classnames('form-field__input', { className={classnames('form-field__input', {
'form-field--auto-height': type === 'markdown', 'form-field--auto-height': type === 'markdown',
'form-field--no-padding': noPadding,
})} })}
> >
{prefix && ( {prefix && (

View file

@ -92,7 +92,7 @@ class FileCard extends React.PureComponent<Props> {
onContextMenu={handleContextMenu} onContextMenu={handleContextMenu}
> >
<CardMedia thumbnail={thumbnail} /> <CardMedia thumbnail={thumbnail} />
<div className="card-media__internal-links">{showPrice && <FilePrice uri={uri} />}</div> <div className="card-media__internal-links" />
<div className="card__title-identity"> <div className="card__title-identity">
<div className="card__title--small"> <div className="card__title--small">
<TruncatedText lines={3}>{title}</TruncatedText> <TruncatedText lines={3}>{title}</TruncatedText>
@ -103,13 +103,12 @@ class FileCard extends React.PureComponent<Props> {
) : ( ) : (
<React.Fragment> <React.Fragment>
<UriIndicator uri={uri} link /> <UriIndicator uri={uri} link />
<div>
{isRewardContent && <Icon iconColor="red" icon={icons.FEATURED} />} {isRewardContent && <Icon iconColor="red" icon={icons.FEATURED} />}
{fileInfo && <Icon icon={icons.LOCAL} />} {fileInfo && <Icon icon={icons.LOCAL} />}
</div>
</React.Fragment> </React.Fragment>
)} )}
</div> </div>
{showPrice && <FilePrice uri={uri} />}
</div> </div>
</section> </section>
); );

View file

@ -9,6 +9,7 @@ type Props = {
uri: string, uri: string,
fetching: boolean, fetching: boolean,
claim: ?{}, claim: ?{},
filePage?: boolean,
}; };
class FilePrice extends React.PureComponent<Props> { class FilePrice extends React.PureComponent<Props> {
@ -33,13 +34,14 @@ class FilePrice extends React.PureComponent<Props> {
}; };
render() { render() {
const { costInfo, showFullPrice } = this.props; const { costInfo, showFullPrice, filePage } = this.props;
return costInfo ? ( return costInfo ? (
<CreditAmount <CreditAmount
showFree
filePage={filePage}
amount={costInfo.cost} amount={costInfo.cost}
isEstimate={!costInfo.includesData} isEstimate={!costInfo.includesData}
showFree
showFullPrice={showFullPrice} showFullPrice={showFullPrice}
/> />
) : null; ) : null;

View file

@ -11,7 +11,6 @@ import classnames from 'classnames';
import FilePrice from 'component/filePrice'; import FilePrice from 'component/filePrice';
type Props = { type Props = {
fullWidth: boolean, // removes the max-width css
showUri: boolean, showUri: boolean,
showLocal: boolean, showLocal: boolean,
obscureNsfw: boolean, obscureNsfw: boolean,
@ -28,13 +27,15 @@ type Props = {
updatePublishForm: ({}) => void, updatePublishForm: ({}) => void,
hideNoResult: boolean, // don't show the tile if there is no claim at this uri hideNoResult: boolean, // don't show the tile if there is no claim at this uri
displayHiddenMessage?: boolean, displayHiddenMessage?: boolean,
displayDescription?: boolean,
small?: boolean,
}; };
class FileTile extends React.PureComponent<Props> { class FileTile extends React.PureComponent<Props> {
static defaultProps = { static defaultProps = {
showUri: false, showUri: false,
showLocal: false, showLocal: false,
fullWidth: false, displayDescription: true,
}; };
componentDidMount() { componentDidMount() {
@ -57,13 +58,14 @@ class FileTile extends React.PureComponent<Props> {
showUri, showUri,
obscureNsfw, obscureNsfw,
claimIsMine, claimIsMine,
fullWidth,
showLocal, showLocal,
isDownloaded, isDownloaded,
clearPublish, clearPublish,
updatePublishForm, updatePublishForm,
hideNoResult, hideNoResult,
displayHiddenMessage, displayHiddenMessage,
displayDescription,
small,
} = this.props; } = this.props;
const shouldHide = !claimIsMine && obscureNsfw && metadata && metadata.nsfw; const shouldHide = !claimIsMine && obscureNsfw && metadata && metadata.nsfw;
@ -96,7 +98,7 @@ class FileTile extends React.PureComponent<Props> {
return !name && hideNoResult ? null : ( return !name && hideNoResult ? null : (
<section <section
className={classnames('file-tile card--link', { className={classnames('file-tile card--link', {
'file-tile--fullwidth': fullWidth, 'file-tile--small': small,
})} })}
onClick={onClick} onClick={onClick}
onKeyUp={onClick} onKeyUp={onClick}
@ -108,20 +110,29 @@ class FileTile extends React.PureComponent<Props> {
{isResolvingUri && <div className="card__title--small">{__('Loading...')}</div>} {isResolvingUri && <div className="card__title--small">{__('Loading...')}</div>}
{!isResolvingUri && ( {!isResolvingUri && (
<React.Fragment> <React.Fragment>
<div className="card__title--small card__title--file"> <div className={small ? 'card__title--x-small' : 'card__title--file'}>
<TruncatedText lines={2}>{title || name}</TruncatedText> <TruncatedText lines={3}>{title || name}</TruncatedText>
</div> </div>
<div className="card__subtitle"> <div
className={classnames('card__subtitle', {
'card__subtitle--x-small': small,
})}
>
{showUri ? uri : channel || __('Anonymous')} {showUri ? uri : channel || __('Anonymous')}
{isRewardContent && <Icon icon={icons.FEATURED} />} {isRewardContent && <Icon icon={icons.FEATURED} />}
{showLocal && isDownloaded && <Icon icon={icons.LOCAL} />} {showLocal && isDownloaded && <Icon icon={icons.LOCAL} />}
</div> </div>
<FilePrice uri={uri} />
{displayDescription && (
<div className="card__subtext card__subtext--small"> <div className="card__subtext card__subtext--small">
<TruncatedText lines={3}>{description}</TruncatedText> <TruncatedText lines={3}>{description}</TruncatedText>
</div> </div>
<div className="card__subtitle-price"> )}
<FilePrice uri={uri} /> {
</div> // <div className="card__subtitle-price">
//
// </div>
}
{!name && ( {!name && (
<React.Fragment> <React.Fragment>
{__('This location is unused.')}{' '} {__('This location is unused.')}{' '}

View file

@ -12,6 +12,7 @@ type Props = {
noPadding: ?boolean, noPadding: ?boolean,
extraPadding: ?boolean, extraPadding: ?boolean,
notContained: ?boolean, // No max-width, but keep the padding notContained: ?boolean, // No max-width, but keep the padding
forContent: ?boolean,
loading: ?boolean, loading: ?boolean,
}; };
@ -71,15 +72,24 @@ class Page extends React.PureComponent<Props, State> {
loaderTimeout: ?TimeoutID; loaderTimeout: ?TimeoutID;
render() { render() {
const { pageTitle, children, noPadding, extraPadding, notContained, loading } = this.props; const {
pageTitle,
children,
noPadding,
extraPadding,
notContained,
loading,
forContent,
} = this.props;
const { showLoader } = this.state; const { showLoader } = this.state;
return ( return (
<main <main
className={classnames('main', { className={classnames('main', {
'main--contained': !notContained && !noPadding && !extraPadding, 'main--contained': !notContained && !noPadding && !extraPadding && !forContent,
'main--no-padding': noPadding, 'main--no-padding': noPadding,
'main--extra-padding': extraPadding, 'main--extra-padding': extraPadding,
'main--for-content': forContent,
})} })}
> >
{pageTitle && ( {pageTitle && (

View file

@ -0,0 +1,21 @@
import { connect } from 'react-redux';
import { doFetchClaimsByChannel } from 'redux/actions/content';
import {
makeSelectClaimsInChannelForCurrentPage,
makeSelectFetchingChannelClaims,
} from 'lbry-redux';
import RecommendedVideos from './view';
const select = (state, props) => ({
claimsInChannel: makeSelectClaimsInChannelForCurrentPage(props.channelUri)(state),
fetching: makeSelectFetchingChannelClaims(props.channelUri)(state),
});
const perform = dispatch => ({
fetchClaims: (uri, page) => dispatch(doFetchClaimsByChannel(uri, page)),
});
export default connect(
select,
perform
)(RecommendedVideos);

View file

@ -0,0 +1,54 @@
// @flow
import React from 'react';
import FileTile from 'component/fileTile';
import { FormRow, FormField } from 'component/common/form';
import ToolTip from 'component/common/tooltip';
import type { Claim } from 'types/claim';
type Props = {
channelUri: ?string,
claimsInChannel: ?Array<Claim>,
fetching: boolean,
fetchClaims: (string, number) => void,
};
export default class RecommendedVideos extends React.PureComponent<Props> {
componentDidMount() {
const { channelUri, fetchClaims, claimsInChannel } = this.props;
if (!claimsInChannel) {
fetchClaims(channelUri, 1);
}
}
render() {
const { claimsInChannel, fetching } = this.props;
return (
<div className="card__list--recommended">
<FormRow alignRight>
<ToolTip onComponent body={__('Automatically download and play free content.')}>
<FormField
useToggle
noPadding
name="autoplay"
type="checkbox"
prefix={__('Autoplay')}
checked={false}
onChange={() => {}}
/>
</ToolTip>
</FormRow>
{fetching && <div>Loading</div>}
{claimsInChannel &&
claimsInChannel.map(({ permanent_url: permanentUrl }) => (
<FileTile
small
displayDescription={false}
key={permanentUrl}
uri={`lbry://${permanentUrl}`}
/>
))}
</div>
);
}
}

View file

@ -31,7 +31,7 @@ class RewardSummary extends React.Component<Props> {
<React.Fragment> <React.Fragment>
{__('You have')} {__('You have')}
&nbsp; &nbsp;
<CreditAmount noStyle amount={unclaimedRewardAmount} precision={8} /> <CreditAmount inheritStyle amount={unclaimedRewardAmount} precision={8} />
&nbsp; &nbsp;
{__('in unclaimed rewards')}. {__('in unclaimed rewards')}.
</React.Fragment> </React.Fragment>

View file

@ -6,8 +6,8 @@ import DateTime from 'component/dateTime';
import Button from 'component/button'; import Button from 'component/button';
import { buildURI } from 'lbry-redux'; import { buildURI } from 'lbry-redux';
import * as txnTypes from 'constants/transaction_types'; import * as txnTypes from 'constants/transaction_types';
import type { Transaction } from '../view';
import * as ICONS from 'constants/icons'; import * as ICONS from 'constants/icons';
import type { Transaction } from '../view';
type Props = { type Props = {
transaction: Transaction, transaction: Transaction,
@ -25,12 +25,6 @@ class TransactionListItem extends React.PureComponent<Props> {
(this: any).abandonClaim = this.abandonClaim.bind(this); (this: any).abandonClaim = this.abandonClaim.bind(this);
} }
abandonClaim() {
const { txid, nout } = this.props.transaction;
this.props.revokeClaim(txid, nout);
}
getLink(type: string) { getLink(type: string) {
if (type === txnTypes.TIP) { if (type === txnTypes.TIP) {
return <Button icon={ICONS.UNLOCK} onClick={this.abandonClaim} title={__('Unlock Tip')} />; return <Button icon={ICONS.UNLOCK} onClick={this.abandonClaim} title={__('Unlock Tip')} />;
@ -38,10 +32,14 @@ class TransactionListItem extends React.PureComponent<Props> {
return <Button icon={ICONS.TRASH} onClick={this.abandonClaim} title={__('Abandon Claim')} />; return <Button icon={ICONS.TRASH} onClick={this.abandonClaim} title={__('Abandon Claim')} />;
} }
capitalize(string: string) { abandonClaim() {
return string.charAt(0).toUpperCase() + string.slice(1); const { txid, nout } = this.props.transaction;
this.props.revokeClaim(txid, nout);
} }
capitalize = (string: string) => string.charAt(0).toUpperCase() + string.slice(1);
render() { render() {
const { reward, transaction, isRevokeable } = this.props; const { reward, transaction, isRevokeable } = this.props;
const { amount, claim_id: claimId, claim_name: name, date, fee, txid, type } = transaction; const { amount, claim_id: claimId, claim_name: name, date, fee, txid, type } = transaction;
@ -55,12 +53,12 @@ class TransactionListItem extends React.PureComponent<Props> {
return ( return (
<tr> <tr>
<td> <td>
<CreditAmount amount={amount} plain noStyle showPlus precision={8} /> <CreditAmount inheritStyle showPlus amount={amount} precision={8} />
<br /> <br />
{fee !== 0 && ( {fee !== 0 && (
<span className="table__item-label"> <span className="table__item-label">
<CreditAmount plain noStyle fee amount={fee} precision={8} /> <CreditAmount inheritStyle fee amount={fee} precision={8} />
</span> </span>
)} )}
</td> </td>

View file

@ -18,7 +18,7 @@ export default (props: Props) => {
<Button <Button
icon={icons.GLOBE} icon={icons.GLOBE}
button="alt" button="alt"
label={__('View on Web')} label={__('Share')}
href={`http://spee.ch/${speechURL}`} href={`http://spee.ch/${speechURL}`}
/> />
) : null; ) : null;

View file

@ -14,14 +14,12 @@ import Button from 'component/button';
import SubscribeButton from 'component/subscribeButton'; import SubscribeButton from 'component/subscribeButton';
import ViewOnWebButton from 'component/viewOnWebButton'; import ViewOnWebButton from 'component/viewOnWebButton';
import Page from 'component/page'; import Page from 'component/page';
import * as settings from 'constants/settings';
import type { Claim } from 'types/claim'; import type { Claim } from 'types/claim';
import type { Subscription } from 'types/subscription'; import type { Subscription } from 'types/subscription';
import FileDownloadLink from 'component/fileDownloadLink'; import FileDownloadLink from 'component/fileDownloadLink';
import classnames from 'classnames'; import classnames from 'classnames';
import { FormField, FormRow } from 'component/common/form';
import ToolTip from 'component/common/tooltip';
import getMediaType from 'util/getMediaType'; import getMediaType from 'util/getMediaType';
import RecommendedVideos from 'component/recommendedVideos';
type Props = { type Props = {
claim: Claim, claim: Claim,
@ -37,14 +35,12 @@ type Props = {
rewardedContentClaimIds: Array<string>, rewardedContentClaimIds: Array<string>,
obscureNsfw: boolean, obscureNsfw: boolean,
claimIsMine: boolean, claimIsMine: boolean,
autoplay: boolean,
costInfo: ?{}, costInfo: ?{},
navigate: (string, ?{}) => void, navigate: (string, ?{}) => void,
openModal: ({ id: string }, { uri: string }) => void, openModal: ({ id: string }, { uri: string }) => void,
fetchFileInfo: string => void, fetchFileInfo: string => void,
fetchCostInfo: string => void, fetchCostInfo: string => void,
prepareEdit: ({}, string) => void, prepareEdit: ({}, string) => void,
setClientSetting: (string, boolean | string) => void,
checkSubscription: ({ channelName: string, uri: string }) => void, checkSubscription: ({ channelName: string, uri: string }) => void,
subscriptions: Array<Subscription>, subscriptions: Array<Subscription>,
}; };
@ -62,12 +58,6 @@ class FilePage extends React.Component<Props> {
'application', 'application',
]; ];
constructor(props: Props) {
super(props);
(this: any).onAutoplayChange = this.onAutoplayChange.bind(this);
}
componentDidMount() { componentDidMount() {
const { uri, fileInfo, fetchFileInfo, fetchCostInfo } = this.props; const { uri, fileInfo, fetchFileInfo, fetchCostInfo } = this.props;
@ -88,10 +78,6 @@ class FilePage extends React.Component<Props> {
} }
} }
onAutoplayChange(event: SyntheticInputEvent<*>) {
this.props.setClientSetting(settings.AUTOPLAY, event.target.checked);
}
checkSubscription = (props: Props) => { checkSubscription = (props: Props) => {
if (props.subscriptions.find(sub => sub.channelName === props.claim.channel_name)) { if (props.subscriptions.find(sub => sub.channelName === props.claim.channel_name)) {
props.checkSubscription({ props.checkSubscription({
@ -119,7 +105,6 @@ class FilePage extends React.Component<Props> {
claimIsMine, claimIsMine,
prepareEdit, prepareEdit,
navigate, navigate,
autoplay,
costInfo, costInfo,
fileInfo, fileInfo,
} = this.props; } = this.props;
@ -160,16 +145,9 @@ class FilePage extends React.Component<Props> {
} }
return ( return (
<Page extraPadding> <Page forContent>
{!claim || !metadata ? ( <section className="content__wrapper">
<section> {showFile && <FileViewer className="content__embedded" uri={uri} mediaType={mediaType} />}
<span className="empty">{__('Empty claim or metadata info.')}</span>
</section>
) : (
<section className="card">
{showFile && (
<FileViewer className="content__embedded" uri={uri} mediaType={mediaType} />
)}
{!showFile && {!showFile &&
(thumbnail ? ( (thumbnail ? (
<Thumbnail shouldObscure={shouldObscureThumbnail} src={thumbnail} /> <Thumbnail shouldObscure={shouldObscureThumbnail} src={thumbnail} />
@ -184,14 +162,13 @@ class FilePage extends React.Component<Props> {
</div> </div>
</div> </div>
))} ))}
<div className="card__content"> <div className="card__content">
<div className="card__title-identity--file"> <div className="card__title-identity--file">
<h1 className="card__title card__title--file">{title}</h1> <h1 className="card__title card__title--file">{title}</h1>
<div className="card__title-identity-icons"> <div className="card__title-identity-icons">
{isRewardContent && ( {isRewardContent && <Icon iconColor="red" tooltip="bottom" icon={icons.FEATURED} />}
<Icon iconColor="red" tooltip="bottom" icon={icons.FEATURED} /> <FilePrice filePage uri={normalizeURI(uri)} />
)}
<FilePrice uri={normalizeURI(uri)} />
</div> </div>
</div> </div>
<span className="card__subtitle card__subtitle--file"> <span className="card__subtitle card__subtitle--file">
@ -235,24 +212,14 @@ class FilePage extends React.Component<Props> {
<FileActions uri={uri} claimId={claim.claim_id} /> <FileActions uri={uri} claimId={claim.claim_id} />
</div> </div>
</div> </div>
<FormRow padded>
<ToolTip onComponent body={__('Automatically download and play free content.')}>
<FormField
useToggle
name="autoplay"
type="checkbox"
postfix={__('Autoplay')}
checked={autoplay}
onChange={this.onAutoplayChange}
/>
</ToolTip>
</FormRow>
</div>
<div className="card__content--extra-padding"> <div className="card__content--extra-padding">
<FileDetails uri={uri} /> <FileDetails uri={uri} />
</div> </div>
</div>
</section>
<section>
<RecommendedVideos uri={uri} channelUri={`lbry://${subscriptionUri}`} />
</section> </section>
)}
</Page> </Page>
); );
} }

View file

@ -73,7 +73,7 @@ class SearchPage extends React.PureComponent<Props> {
<Icon icon={icons.HELP} /> <Icon icon={icons.HELP} />
</ToolTip> </ToolTip>
</div> </div>
<FileTile fullWidth showUri displayHiddenMessage uri={normalizeURI(query)} /> <FileTile showUri displayHiddenMessage uri={normalizeURI(query)} />
</React.Fragment> </React.Fragment>
)} )}
<FileListSearch query={query} /> <FileListSearch query={query} />

View file

@ -203,6 +203,11 @@ p {
padding-right: 100px; padding-right: 100px;
} }
.main--for-content {
padding: $spacing-width * 2/3;
display: flex;
}
.page__header { .page__header {
padding: $spacing-vertical * 2/3; padding: $spacing-vertical * 2/3;
padding-bottom: 0; padding-bottom: 0;
@ -263,30 +268,47 @@ p {
} }
.credit-amount--free { .credit-amount--free {
color: var(--color-secondary);
&.credit-amount--file-page {
color: var(--color-dark-blue); color: var(--color-dark-blue);
background-color: var(--color-secondary); background-color: var(--color-secondary);
}
} }
.credit-amount--cost { .credit-amount--cost {
color: var(--color-yellow);
&.credit-amount--file-page {
color: var(--color-black); color: var(--color-black);
background-color: var(--color-yellow); background-color: var(--color-yellow);
}
} }
.credit-amount--plain { .credit-amount--inherit {
background-color: inherit; background-color: inherit;
color: inherit; color: inherit;
font-weight: inherit; font-weight: inherit;
font-size: inherit; font-size: inherit;
font-family: 'metropolis-medium';
padding: 0;
} }
.credit-amount.credit-amount--no-style { // .credit-amount--plain {
padding: 0; // background-color: inherit;
font-size: inherit; // color: inherit;
font-weight: inherit; // font-weight: inherit;
color: inherit; // font-size: inherit;
background-color: transparent; // }
font-family: 'metropolis-medium';
} // .credit-amount.credit-amount--no-style {
// padding: 0;
// font-size: inherit;
// font-weight: inherit;
// color: inherit;
// background-color: transparent;
// font-family: 'metropolis-medium';
// }
.divider__horizontal { .divider__horizontal {
border-top: var(--color-divider); border-top: var(--color-divider);

View file

@ -9,7 +9,7 @@ $large-breakpoint: 1921px;
:root { :root {
/* Widths & spacings */ /* Widths & spacings */
--side-nav-width: 220px; --side-nav-width: 190px;
--side-nav-width-m: 240px; --side-nav-width-m: 240px;
--side-nav-width-l: 320px; --side-nav-width-l: 320px;
--font-size-subtext-multiple: 0.92; --font-size-subtext-multiple: 0.92;

View file

@ -114,13 +114,17 @@
.card__title--small { .card__title--small {
font-size: 14px; font-size: 14px;
line-height: 18px; line-height: 18px;
padding-top: $spacing-vertical / 3;
@media only screen and (min-width: $large-breakpoint) { @media only screen and (min-width: $large-breakpoint) {
font-size: 16px; font-size: 16px;
} }
} }
.card__title--x-small {
font-size: 12px;
line-height: 12px;
}
.card__title--file { .card__title--file {
font-family: 'metropolis-bold'; font-family: 'metropolis-bold';
font-size: 28px; font-size: 28px;
@ -135,20 +139,27 @@
font-size: 14px; font-size: 14px;
font-family: 'metropolis-medium'; font-family: 'metropolis-medium';
color: var(--card-text-color); color: var(--card-text-color);
display: flex;
align-items: center;
.icon { .icon {
margin-top: $spacing-vertical * 1/6; margin: 0 0 0 $spacing-vertical * 1/3;
&:not(:first-of-type) {
margin: 0 $spacing-vertical * 1/3;
}
} }
} }
.card__subtitle--x-small {
font-size: 12px;
}
.card__subtitle-price { .card__subtitle-price {
padding-top: $spacing-vertical * 1/3; padding-top: $spacing-vertical * 1/3;
} }
.card__title--small + .card__subtitle,
.card__title--x-small + .card__subtitle {
padding-top: $spacing-vertical * 1/3;
}
.card__meta { .card__meta {
color: var(--color-help); color: var(--color-help);
font-size: 14px; font-size: 14px;
@ -189,6 +200,11 @@
margin-top: $spacing-vertical * 2/3; margin-top: $spacing-vertical * 2/3;
} }
.card__content--columns {
display: flex;
padding: 0;
}
.card__content--extra-padding { .card__content--extra-padding {
margin-top: $spacing-vertical * 3/2; margin-top: $spacing-vertical * 3/2;
} }
@ -312,7 +328,11 @@
.card-row__scroll-btns { .card-row__scroll-btns {
display: flex; display: flex;
padding-right: $spacing-width * 1/3;
@media (min-width: $medium-breakpoint) {
padding-right: $spacing-width; padding-right: $spacing-width;
}
} }
.card-row__scrollhouse { .card-row__scrollhouse {
@ -401,6 +421,13 @@
} }
} }
.card__list--recommended {
padding-left: $spacing-width;
.card {
display: block;
}
}
.card__success-msg { .card__success-msg {
border-left: 2px solid var(--success-msg-border); border-left: 2px solid var(--success-msg-border);
color: var(--success-msg-color); color: var(--success-msg-color);

View file

@ -1,7 +1,13 @@
.content__wrapper {
width: 740px;
}
.content__embedded { .content__embedded {
background-color: var(--color-black); background-color: var(--color-black);
width: 100%; width: 100%;
padding-top: var(--video-aspect-ratio); padding-top: var(--video-aspect-ratio);
padding-left: 36px;
padding-right: 36px;
position: relative; position: relative;
display: flex; display: flex;
align-items: center; align-items: center;
@ -119,3 +125,8 @@ img {
max-height: 100%; max-height: 100%;
max-width: 100%; max-width: 100%;
} }
.content__info {
padding-left: 24px;
width: 920px;
}

View file

@ -22,11 +22,13 @@
.file-tile { .file-tile {
display: flex; display: flex;
margin-top: $spacing-vertical; margin-top: $spacing-vertical * 1/3;
.card__media { .card__media {
height: var(--file-tile--media-height); // height: var(--file-tile--media-height);
flex: 0 0 var(--file-tile--media-width); // flex: 0 0 var(--file-tile--media-width);
height: 60px;
flex: 0 0 100px;
} }
.card__subtitle { .card__subtitle {
@ -34,8 +36,7 @@
} }
} }
.file-tile--fullwidth { .file-tile--small {
max-width: none;
} }
.file-tile__info { .file-tile__info {

View file

@ -51,6 +51,10 @@
width: 100%; width: 100%;
} }
.form-field__input.form-field--no-padding {
padding: 0;
}
.form-field__input { .form-field__input {
display: flex; display: flex;
padding-top: $spacing-vertical / 3; padding-top: $spacing-vertical / 3;
@ -71,6 +75,10 @@
width: 400px; width: 400px;
} }
input.input--toggle {
padding: 0;
}
&.form-field--auto-height { &.form-field--auto-height {
height: auto; height: auto;
} }

View file

@ -6,9 +6,13 @@
z-index: 1; z-index: 1;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
padding: 0 $spacing-width; padding: 0 $spacing-width * 1/3;
background-color: var(--color-bg); background-color: var(--color-bg);
box-shadow: var(--box-shadow-header); box-shadow: var(--box-shadow-header);
@media (min-width: $medium-breakpoint) {
padding: 0 $spacing-width;
}
} }
.header__navigation { .header__navigation {

View file

@ -1,7 +1,7 @@
.nav { .nav {
width: var(--side-nav-width); width: var(--side-nav-width);
background-color: var(--nav-bg-color); background-color: var(--nav-bg-color);
padding: $spacing-width; padding: $spacing-width * 1/3;
color: var(--nav-color); color: var(--nav-color);
hr { hr {
@ -11,8 +11,13 @@
margin: $spacing-vertical $spacing-vertical * 2/3; margin: $spacing-vertical $spacing-vertical * 2/3;
} }
@media (min-width: $medium-breakpoint) {
padding-left: $spacing-width;
width: calc(var(--side-nav-width) * 1.2);
}
@media (min-width: $large-breakpoint) { @media (min-width: $large-breakpoint) {
width: calc(var(--side-nav-width) * 1.1); width: calc(var(--side-nav-width) * 1.4);
} }
} }