sforkowany z mirror/soapbox
Merge branch 'next' into locked-profile-header
commit
20c957d907
|
@ -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>
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
/**
|
||||||
|
* MaterialStatus: like a Status, but with gaps and rounded corners.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import StatusContainer from 'soapbox/containers/status_container';
|
||||||
|
|
||||||
|
export default class MaterialStatus extends React.Component {
|
||||||
|
|
||||||
|
static propTypes = {
|
||||||
|
hidden: PropTypes.bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
// Performance: when hidden, don't render the wrapper divs
|
||||||
|
if (this.props.hidden) {
|
||||||
|
return <StatusContainer {...this.props} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='material-status'>
|
||||||
|
<div className='material-status__status'>
|
||||||
|
<StatusContainer {...this.props} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -2,7 +2,14 @@ import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
|
|
||||||
class ProgressCircle extends React.PureComponent {
|
export default class ProgressCircle extends React.PureComponent {
|
||||||
|
|
||||||
|
static propTypes = {
|
||||||
|
progress: PropTypes.number.isRequired,
|
||||||
|
radius: PropTypes.number,
|
||||||
|
stroke: PropTypes.number,
|
||||||
|
title: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
radius: 12,
|
radius: 12,
|
||||||
|
@ -51,12 +58,3 @@ class ProgressCircle extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ProgressCircle.propTypes = {
|
|
||||||
progress: PropTypes.number.isRequired,
|
|
||||||
radius: PropTypes.number,
|
|
||||||
stroke: PropTypes.number,
|
|
||||||
title: PropTypes.text,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default ProgressCircle;
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import React from 'react';
|
||||||
import { FormattedMessage, defineMessages } from 'react-intl';
|
import { FormattedMessage, defineMessages } from 'react-intl';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import StatusContainer from '../containers/status_container';
|
import MaterialStatus from 'soapbox/components/material_status';
|
||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||||
import LoadGap from './load_gap';
|
import LoadGap from './load_gap';
|
||||||
import ScrollableList from './scrollable_list';
|
import ScrollableList from './scrollable_list';
|
||||||
|
@ -117,7 +117,7 @@ export default class StatusList extends ImmutablePureComponent {
|
||||||
onClick={onLoadMore}
|
onClick={onLoadMore}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<StatusContainer
|
<MaterialStatus
|
||||||
key={statusId}
|
key={statusId}
|
||||||
id={statusId}
|
id={statusId}
|
||||||
onMoveUp={this.handleMoveUp}
|
onMoveUp={this.handleMoveUp}
|
||||||
|
@ -132,7 +132,7 @@ export default class StatusList extends ImmutablePureComponent {
|
||||||
|
|
||||||
if (scrollableContent && featuredStatusIds) {
|
if (scrollableContent && featuredStatusIds) {
|
||||||
scrollableContent = featuredStatusIds.map(statusId => (
|
scrollableContent = featuredStatusIds.map(statusId => (
|
||||||
<StatusContainer
|
<MaterialStatus
|
||||||
key={`f-${statusId}`}
|
key={`f-${statusId}`}
|
||||||
id={statusId}
|
id={statusId}
|
||||||
featured
|
featured
|
||||||
|
|
|
@ -231,16 +231,4 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default @injectIntl
|
export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Status));
|
||||||
@connect(makeMapStateToProps, mapDispatchToProps)
|
|
||||||
class StatusContainer extends React.Component {
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div className='status-container'>
|
|
||||||
<Status {...this.props} />
|
|
||||||
</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'>
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import StatusContainer from 'soapbox/containers/status_container';
|
||||||
|
import { OrderedSet as ImmutableOrderedSet } from 'immutable';
|
||||||
|
import classNames from 'classnames';
|
||||||
|
|
||||||
|
const mapStateToProps = (state, { id }) => {
|
||||||
|
return {
|
||||||
|
replyToId: state.getIn(['statuses', id, 'in_reply_to_id']),
|
||||||
|
replyCount: state.getIn(['contexts', 'replies', id], ImmutableOrderedSet()).size,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export default @connect(mapStateToProps)
|
||||||
|
class ThreadStatus extends React.Component {
|
||||||
|
|
||||||
|
static propTypes = {
|
||||||
|
focusedStatusId: PropTypes.string,
|
||||||
|
replyToId: PropTypes.string,
|
||||||
|
replyCount: PropTypes.number,
|
||||||
|
}
|
||||||
|
|
||||||
|
renderConnector() {
|
||||||
|
const { focusedStatusId, replyToId, replyCount } = this.props;
|
||||||
|
|
||||||
|
const isConnectedTop = replyToId && replyToId !== focusedStatusId;
|
||||||
|
const isConnectedBottom = replyCount > 0;
|
||||||
|
const isConnected = isConnectedTop || isConnectedBottom;
|
||||||
|
|
||||||
|
if (!isConnected) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={classNames('thread__connector', {
|
||||||
|
'thread__connector--top': isConnectedTop,
|
||||||
|
'thread__connector--bottom': isConnectedBottom,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className='thread__status'>
|
||||||
|
{this.renderConnector()}
|
||||||
|
<StatusContainer {...this.props} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -37,7 +37,6 @@ import { initMuteModal } from '../../actions/mutes';
|
||||||
import { initReport } from '../../actions/reports';
|
import { initReport } from '../../actions/reports';
|
||||||
import { makeGetStatus } from '../../selectors';
|
import { makeGetStatus } from '../../selectors';
|
||||||
// import ColumnHeader from '../../components/column_header';
|
// import ColumnHeader from '../../components/column_header';
|
||||||
import StatusContainer from '../../containers/status_container';
|
|
||||||
import { openModal } from '../../actions/modal';
|
import { openModal } from '../../actions/modal';
|
||||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||||
|
@ -49,6 +48,7 @@ import { textForScreenReader, defaultMediaVisibility } from '../../components/st
|
||||||
import { getSettings } from 'soapbox/actions/settings';
|
import { getSettings } from 'soapbox/actions/settings';
|
||||||
import { getSoapboxConfig } from 'soapbox/actions/soapbox';
|
import { getSoapboxConfig } from 'soapbox/actions/soapbox';
|
||||||
import { deactivateUserModal, deleteUserModal, deleteStatusModal, toggleStatusSensitivityModal } from 'soapbox/actions/moderation';
|
import { deactivateUserModal, deleteUserModal, deleteStatusModal, toggleStatusSensitivityModal } from 'soapbox/actions/moderation';
|
||||||
|
import ThreadStatus from './components/thread_status';
|
||||||
import SubNavigation from 'soapbox/components/sub_navigation';
|
import SubNavigation from 'soapbox/components/sub_navigation';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
|
@ -471,10 +471,13 @@ class Status extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
renderStatus(id) {
|
renderStatus(id) {
|
||||||
|
const { status } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StatusContainer
|
<ThreadStatus
|
||||||
key={id}
|
key={id}
|
||||||
id={id}
|
id={id}
|
||||||
|
focusedStatusId={status && status.get('id')}
|
||||||
onMoveUp={this.handleMoveUp}
|
onMoveUp={this.handleMoveUp}
|
||||||
onMoveDown={this.handleMoveDown}
|
onMoveDown={this.handleMoveDown}
|
||||||
contextType='thread'
|
contextType='thread'
|
||||||
|
@ -595,11 +598,12 @@ class Status extends ImmutablePureComponent {
|
||||||
/>
|
/>
|
||||||
*/}
|
*/}
|
||||||
|
|
||||||
<div ref={this.setRef} className='detailed-status-container'>
|
<div ref={this.setRef} className='thread'>
|
||||||
{ancestors && (
|
{ancestors && (
|
||||||
<div className='detailed-status__ancestors'>{ancestors}</div>
|
<div className='thread__ancestors'>{ancestors}</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<div className='thread__status thread__status--focused'>
|
||||||
<HotKeys handlers={handlers}>
|
<HotKeys handlers={handlers}>
|
||||||
<div ref={this.setStatusRef} className={classNames('focusable', 'detailed-status__wrapper')} tabIndex='0' aria-label={textForScreenReader(intl, status, false)}>
|
<div ref={this.setStatusRef} className={classNames('focusable', 'detailed-status__wrapper')} tabIndex='0' aria-label={textForScreenReader(intl, status, false)}>
|
||||||
<DetailedStatus
|
<DetailedStatus
|
||||||
|
@ -639,9 +643,10 @@ class Status extends ImmutablePureComponent {
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</HotKeys>
|
</HotKeys>
|
||||||
|
</div>
|
||||||
|
|
||||||
{descendants && (
|
{descendants && (
|
||||||
<div className='detailed-status__descendants'>{descendants}</div>
|
<div className='thread__descendants'>{descendants}</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</Column>
|
</Column>
|
||||||
|
|
|
@ -104,7 +104,7 @@ class ActionButton extends ImmutablePureComponent {
|
||||||
// Follow & Unfollow
|
// Follow & Unfollow
|
||||||
return (<Button
|
return (<Button
|
||||||
disabled={account.getIn(['relationship', 'blocked_by'])}
|
disabled={account.getIn(['relationship', 'blocked_by'])}
|
||||||
className={classNames('follow-button', {
|
className={classNames('button--follow', {
|
||||||
'button--destructive': account.getIn(['relationship', 'following']),
|
'button--destructive': account.getIn(['relationship', 'following']),
|
||||||
})}
|
})}
|
||||||
onClick={this.handleFollow}
|
onClick={this.handleFollow}
|
||||||
|
|
|
@ -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} />
|
||||||
|
|
|
@ -107,8 +107,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -143,7 +143,7 @@ a.button {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.follow-button {
|
.button--follow {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
|
@ -93,7 +93,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.columns-area--mobile {
|
.columns-area {
|
||||||
display: block;
|
display: block;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -126,6 +126,11 @@
|
||||||
|
|
||||||
@media (max-width: 580px) {
|
@media (max-width: 580px) {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
||||||
|
.timeline-compose-block {
|
||||||
|
border-radius: 0;
|
||||||
|
margin-top: 10px; // Make less claustrophobic
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 630px) {
|
@media screen and (min-width: 630px) {
|
||||||
|
@ -340,31 +345,21 @@
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
.columns-area--mobile .column {
|
.columns-area .column {
|
||||||
@include standard-panel;
|
@include standard-panel;
|
||||||
|
|
||||||
@media screen and (max-width: 580px) {
|
&--transparent {
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.columns-area--transparent .column {
|
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
|
|
||||||
.column-back-button {
|
|
||||||
background: transparent;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.account__section-headline {
|
@media screen and (max-width: 580px) {
|
||||||
background: transparent;
|
border-radius: 0;
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-column-indicator,
|
.material-status__status {
|
||||||
.error-column {
|
border-radius: 0;
|
||||||
background: transparent;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -817,26 +812,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 +871,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,8 +111,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.detailed-status__wrapper {
|
.detailed-status__wrapper {
|
||||||
@include standard-panel;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
@ -160,9 +158,31 @@
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Connect the first status to the SubNavigation */
|
.thread {
|
||||||
.detailed-status__ancestors .status-container:first-child .status__wrapper,
|
&__status {
|
||||||
.detailed-status-container > div:first-child .detailed-status__wrapper {
|
position: relative;
|
||||||
border-top-left-radius: 0;
|
}
|
||||||
border-top-right-radius: 0;
|
|
||||||
|
&__connector {
|
||||||
|
background: hsla(var(--primary-text-color_hsl), 0.2);
|
||||||
|
position: absolute;
|
||||||
|
width: 2px;
|
||||||
|
left: 33px;
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
&--bottom {
|
||||||
|
height: calc(100% - 8px - 48px - 14px);
|
||||||
|
top: calc(8px + 48px + 13px);
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 630px) {
|
||||||
|
left: 38px;
|
||||||
|
|
||||||
|
&--bottom {
|
||||||
|
height: calc(100% - 15px - 48px);
|
||||||
|
top: calc(15px + 48px + 9px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,7 +164,7 @@
|
||||||
.media-gallery__file-extension__label {
|
.media-gallery__file-extension__label {
|
||||||
display: block;
|
display: block;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
color: var(--primary-text-color);
|
color: #fff;
|
||||||
background: rgba($base-overlay-background, 0.5);
|
background: rgba($base-overlay-background, 0.5);
|
||||||
bottom: 6px;
|
bottom: 6px;
|
||||||
left: 6px;
|
left: 6px;
|
||||||
|
|
|
@ -126,15 +126,6 @@
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-container {
|
|
||||||
padding-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status__wrapper {
|
|
||||||
@include standard-panel;
|
|
||||||
padding: 15px 0 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status__wrapper--filtered {
|
.status__wrapper--filtered {
|
||||||
color: var(--primary-text-color);
|
color: var(--primary-text-color);
|
||||||
border: 0;
|
border: 0;
|
||||||
|
@ -179,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);
|
||||||
|
@ -719,3 +701,12 @@ a.status-card.compact:hover {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.material-status {
|
||||||
|
padding-bottom: 10px;
|
||||||
|
|
||||||
|
&__status {
|
||||||
|
@include standard-panel;
|
||||||
|
padding: 15px 0 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -194,6 +194,11 @@
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
|
border-radius: 10px;
|
||||||
|
|
||||||
|
@media screen and (max-width: 580px) {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
& > div {
|
& > div {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
|
@ -447,7 +447,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