kopia lustrzana https://gitlab.com/soapbox-pub/soapbox
Column: consolidate column components, refactor transparency, get rid of .column-area--mobile, wtf
rodzic
4b92dbc93d
commit
b6704991d2
|
@ -6,18 +6,20 @@ export default class Column extends React.PureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
className: PropTypes.string,
|
className: PropTypes.string,
|
||||||
|
transparent: PropTypes.bool,
|
||||||
children: PropTypes.node,
|
children: PropTypes.node,
|
||||||
label: PropTypes.string,
|
label: PropTypes.string,
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { className, label, children } = this.props;
|
const { className, label, children, transparent, ...rest } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
role='region'
|
role='region'
|
||||||
aria-label={label}
|
aria-label={label}
|
||||||
className={classNames('column', className)}
|
className={classNames('column', className, { 'column--transparent': transparent })}
|
||||||
|
{...rest}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -177,7 +177,7 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Column showBackBtn={false}>
|
<Column transparent>
|
||||||
<div className='account__section-headline'>
|
<div className='account__section-headline'>
|
||||||
<NavLink exact to={`/@${accountUsername}`}>
|
<NavLink exact to={`/@${accountUsername}`}>
|
||||||
<FormattedMessage id='account.posts' defaultMessage='Posts' />
|
<FormattedMessage id='account.posts' defaultMessage='Posts' />
|
||||||
|
|
|
@ -55,7 +55,7 @@ class Bookmarks extends ImmutablePureComponent {
|
||||||
const emptyMessage = <FormattedMessage id='empty_column.bookmarks' defaultMessage="You don't have any bookmarks yet. When you add one, it will show up here." />;
|
const emptyMessage = <FormattedMessage id='empty_column.bookmarks' defaultMessage="You don't have any bookmarks yet. When you add one, it will show up here." />;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Column icon='bookmark' heading={intl.formatMessage(messages.heading)} backBtnSlim>
|
<Column heading={intl.formatMessage(messages.heading)} transparent>
|
||||||
<StatusList
|
<StatusList
|
||||||
trackScroll={!pinned}
|
trackScroll={!pinned}
|
||||||
statusIds={statusIds}
|
statusIds={statusIds}
|
||||||
|
|
|
@ -73,7 +73,7 @@ class CommunityTimeline extends React.PureComponent {
|
||||||
const { intl, onlyMedia, timelineId } = this.props;
|
const { intl, onlyMedia, timelineId } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Column label={intl.formatMessage(messages.title)}>
|
<Column label={intl.formatMessage(messages.title)} transparent>
|
||||||
<SubNavigation message={intl.formatMessage(messages.title)} />
|
<SubNavigation message={intl.formatMessage(messages.title)} />
|
||||||
<StatusListContainer
|
<StatusListContainer
|
||||||
scrollKey={`${timelineId}_timeline`}
|
scrollKey={`${timelineId}_timeline`}
|
||||||
|
|
|
@ -48,7 +48,7 @@ class DirectTimeline extends React.PureComponent {
|
||||||
const { intl, hasUnread } = this.props;
|
const { intl, hasUnread } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Column label={intl.formatMessage(messages.title)}>
|
<Column label={intl.formatMessage(messages.title)} transparent>
|
||||||
<ColumnHeader
|
<ColumnHeader
|
||||||
icon='envelope'
|
icon='envelope'
|
||||||
active={hasUnread}
|
active={hasUnread}
|
||||||
|
|
|
@ -98,7 +98,7 @@ class HomeTimeline extends React.PureComponent {
|
||||||
const { done } = this.state;
|
const { done } = this.state;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Column label={intl.formatMessage(messages.title)}>
|
<Column label={intl.formatMessage(messages.title)} transparent>
|
||||||
{(features.suggestions && isEmpty && !isLoading && !done) ? (
|
{(features.suggestions && isEmpty && !isLoading && !done) ? (
|
||||||
<BundleContainer fetchComponent={FollowRecommendationsContainer}>
|
<BundleContainer fetchComponent={FollowRecommendationsContainer}>
|
||||||
{Component => <Component onDone={this.handleDone} />}
|
{Component => <Component onDone={this.handleDone} />}
|
||||||
|
|
|
@ -97,7 +97,7 @@ class CommunityTimeline extends React.PureComponent {
|
||||||
const { intl, onlyMedia, timelineId, siteTitle, showExplanationBox, explanationBoxExpanded } = this.props;
|
const { intl, onlyMedia, timelineId, siteTitle, showExplanationBox, explanationBoxExpanded } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Column label={intl.formatMessage(messages.title)}>
|
<Column label={intl.formatMessage(messages.title)} transparent>
|
||||||
<SubNavigation message={intl.formatMessage(messages.title)} />
|
<SubNavigation message={intl.formatMessage(messages.title)} />
|
||||||
<PinnedHostsPicker />
|
<PinnedHostsPicker />
|
||||||
{showExplanationBox && <div className='explanation-box'>
|
{showExplanationBox && <div className='explanation-box'>
|
||||||
|
|
|
@ -85,7 +85,7 @@ class RemoteTimeline extends React.PureComponent {
|
||||||
const { intl, hasUnread, onlyMedia, timelineId, instance, pinned } = this.props;
|
const { intl, hasUnread, onlyMedia, timelineId, instance, pinned } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Column label={intl.formatMessage(messages.title)}>
|
<Column label={intl.formatMessage(messages.title)} transparent>
|
||||||
<HomeColumnHeader activeItem='fediverse' active={hasUnread} />
|
<HomeColumnHeader activeItem='fediverse' active={hasUnread} />
|
||||||
<PinnedHostsPicker host={instance} />
|
<PinnedHostsPicker host={instance} />
|
||||||
{!pinned && <div className='timeline-filter-message'>
|
{!pinned && <div className='timeline-filter-message'>
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ColumnHeader from './column_header';
|
import ColumnHeader from './column_header';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
import Column from 'soapbox/components/column';
|
||||||
import ColumnBackButton from '../../../components/column_back_button_slim';
|
import ColumnBackButton from '../../../components/column_back_button_slim';
|
||||||
import DropdownMenu from 'soapbox/containers/dropdown_menu_container';
|
import DropdownMenu from 'soapbox/containers/dropdown_menu_container';
|
||||||
|
|
||||||
// Yes, there are 3 types of columns at this point, but this one is better, I swear
|
// Yes, there are 3 types of columns at this point, but this one is better, I swear
|
||||||
export default class Column extends React.PureComponent {
|
export default class BetterColumn extends React.PureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
heading: PropTypes.string,
|
heading: PropTypes.string,
|
||||||
|
@ -16,11 +17,11 @@ export default class Column extends React.PureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { heading, icon, children, active, menu } = this.props;
|
const { heading, icon, children, active, menu, ...rest } = this.props;
|
||||||
const columnHeaderId = heading && heading.replace(/ /g, '-');
|
const columnHeaderId = heading && heading.replace(/ /g, '-');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div role='region' aria-labelledby={columnHeaderId} className='column column--better'>
|
<Column aria-labelledby={columnHeaderId} className='column--better' {...rest}>
|
||||||
<div className='column__top'>
|
<div className='column__top'>
|
||||||
{heading && <ColumnHeader icon={icon} active={active} type={heading} columnHeaderId={columnHeaderId} />}
|
{heading && <ColumnHeader icon={icon} active={active} type={heading} columnHeaderId={columnHeaderId} />}
|
||||||
{menu && (
|
{menu && (
|
||||||
|
@ -31,7 +32,7 @@ export default class Column extends React.PureComponent {
|
||||||
<ColumnBackButton />
|
<ColumnBackButton />
|
||||||
</div>
|
</div>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</Column>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ColumnHeader from './column_header';
|
import ColumnHeader from './column_header';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
import Column from 'soapbox/components/column';
|
||||||
|
|
||||||
export default class Column extends React.PureComponent {
|
export default class UIColumn extends React.PureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
heading: PropTypes.string,
|
heading: PropTypes.string,
|
||||||
|
@ -17,14 +18,14 @@ export default class Column extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { heading, icon, children, active, showBackBtn } = this.props;
|
const { heading, icon, children, active, showBackBtn, ...rest } = this.props;
|
||||||
const columnHeaderId = heading && heading.replace(/ /g, '-');
|
const columnHeaderId = heading && heading.replace(/ /g, '-');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div role='region' aria-labelledby={columnHeaderId} className='column'>
|
<Column aria-labelledby={columnHeaderId} {...rest}>
|
||||||
{heading && <ColumnHeader icon={icon} active={active} type={heading} columnHeaderId={columnHeaderId} showBackBtn={showBackBtn} />}
|
{heading && <ColumnHeader icon={icon} active={active} type={heading} columnHeaderId={columnHeaderId} showBackBtn={showBackBtn} />}
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</Column>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ class ColumnsArea extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='columns-area__panels__main'>
|
<div className='columns-area__panels__main'>
|
||||||
<div className='columns-area columns-area--mobile'>
|
<div className='columns-area'>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -27,7 +27,7 @@ class AdminPage extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='columns-area__panels__main'>
|
<div className='columns-area__panels__main'>
|
||||||
<div className='columns-area columns-area--mobile'>
|
<div className='columns-area'>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -45,7 +45,7 @@ class DefaultPage extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='columns-area__panels__main'>
|
<div className='columns-area__panels__main'>
|
||||||
<div className='columns-area columns-area--mobile'>
|
<div className='columns-area'>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -16,7 +16,7 @@ export default class DefaultPage extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='columns-area__panels__main'>
|
<div className='columns-area__panels__main'>
|
||||||
<div className='columns-area columns-area--mobile'>
|
<div className='columns-area'>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -54,7 +54,7 @@ class GroupPage extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='columns-area__panels__main'>
|
<div className='columns-area__panels__main'>
|
||||||
<div className='columns-area columns-area--mobile'>
|
<div className='columns-area'>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -39,7 +39,7 @@ class GroupsPage extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='columns-area__panels__main'>
|
<div className='columns-area__panels__main'>
|
||||||
<div className='columns-area columns-area--mobile'>
|
<div className='columns-area'>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -67,8 +67,8 @@ class HomePage extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='columns-area__panels__main columns-area__panels__main--transparent'>
|
<div className='columns-area__panels__main'>
|
||||||
<div className='columns-area columns-area--mobile columns-area--transparent'>
|
<div className='columns-area'>
|
||||||
{me && <div className='timeline-compose-block' ref={this.composeBlock}>
|
{me && <div className='timeline-compose-block' ref={this.composeBlock}>
|
||||||
<Link className='timeline-compose-block__avatar' to={`/@${acct}`}>
|
<Link className='timeline-compose-block__avatar' to={`/@${acct}`}>
|
||||||
<Avatar account={account} size={46} />
|
<Avatar account={account} size={46} />
|
||||||
|
|
|
@ -98,8 +98,8 @@ class ProfilePage extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='columns-area__panels__main columns-area__panels__main--transparent'>
|
<div className='columns-area__panels__main'>
|
||||||
<div className='columns-area columns-area--mobile columns-area--transparent'>
|
<div className='columns-area'>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -48,7 +48,7 @@ class RemoteInstancePage extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='columns-area__panels__main'>
|
<div className='columns-area__panels__main'>
|
||||||
<div className='columns-area columns-area--mobile'>
|
<div className='columns-area'>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -45,8 +45,8 @@ class StatusPage extends ImmutablePureComponent {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='columns-area__panels__main columns-area__panels__main--transparent'>
|
<div className='columns-area__panels__main'>
|
||||||
<div className='columns-area columns-area--mobile columns-area--transparent'>
|
<div className='columns-area'>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -463,10 +463,6 @@ a .account__avatar {
|
||||||
}
|
}
|
||||||
|
|
||||||
.account__section-headline {
|
.account__section-headline {
|
||||||
background: var(--foreground-color);
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
|
|
||||||
button,
|
button,
|
||||||
a {
|
a {
|
||||||
flex: none;
|
flex: none;
|
||||||
|
|
|
@ -366,7 +366,7 @@
|
||||||
max-width: none;
|
max-width: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.columns-area--mobile .column {
|
.columns-area .column {
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.columns-area--mobile {
|
.columns-area {
|
||||||
display: block;
|
display: block;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -340,34 +340,20 @@
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
.columns-area--mobile .column {
|
.columns-area .column {
|
||||||
@include standard-panel;
|
@include standard-panel;
|
||||||
|
|
||||||
|
&--transparent {
|
||||||
|
background: transparent;
|
||||||
|
border-radius: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 580px) {
|
@media screen and (max-width: 580px) {
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.columns-area--transparent .column {
|
|
||||||
background: transparent;
|
|
||||||
border-radius: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
|
|
||||||
.column-back-button {
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.account__section-headline {
|
|
||||||
background: transparent;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-column-indicator,
|
|
||||||
.error-column {
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.column-header__wrapper {
|
.column-header__wrapper {
|
||||||
position: relative;
|
position: relative;
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
|
@ -817,26 +803,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.columns-area--transparent .follow-recommendations-container {
|
|
||||||
@include standard-panel;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Let transparent columns extend the full width of the screen
|
|
||||||
@media screen and (max-width: 450px) {
|
|
||||||
.columns-area__panels__main--transparent {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.columns-area--transparent {
|
|
||||||
.status__wrapper,
|
|
||||||
.detailed-status__wrapper,
|
|
||||||
.timeline-compose-block,
|
|
||||||
.follow-recommendations-container {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.column-title {
|
.column-title {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 40px;
|
padding: 40px;
|
||||||
|
@ -896,3 +862,21 @@
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make MaterialStatus flush against SubNavigation
|
||||||
|
.sub-navigation ~ .slist .item-list > article:first-child .material-status__status {
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display background for loading indicator
|
||||||
|
.column--transparent {
|
||||||
|
.slist__append {
|
||||||
|
@include standard-panel;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sub-navigation ~ .slist .slist__append {
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -111,7 +111,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.detailed-status__wrapper {
|
.detailed-status__wrapper {
|
||||||
@include standard-panel;
|
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
@ -159,19 +158,3 @@
|
||||||
float: left;
|
float: left;
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.thread {
|
|
||||||
// Don't display gaps between statuses in a thread
|
|
||||||
.status-container {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status__wrapper {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detailed-status__wrapper {
|
|
||||||
border-radius: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -170,15 +170,6 @@
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.status-direct:not(.read) {
|
|
||||||
background: var(--brand-color--med);
|
|
||||||
border-bottom-color: var(--brand-color--med);
|
|
||||||
|
|
||||||
.status__content a {
|
|
||||||
color: var(--brand-color--hicontrast);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.light {
|
&.light {
|
||||||
.status__relative-time {
|
.status__relative-time {
|
||||||
color: var(--primary-text-color--faint);
|
color: var(--primary-text-color--faint);
|
||||||
|
|
|
@ -443,7 +443,6 @@
|
||||||
&__append {
|
&__append {
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
position: relative;
|
position: relative;
|
||||||
min-height: 120px;
|
|
||||||
padding: 30px 15px;
|
padding: 30px 15px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue