import React from 'react';
import PropTypes from 'prop-types';
+import { createPortal } from 'react-dom';
import classNames from 'classnames';
import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
import Icon from 'mastodon/components/icon';
showBackButton: PropTypes.bool,
children: PropTypes.node,
pinned: PropTypes.bool,
+ placeholder: PropTypes.bool,
onPin: PropTypes.func,
onMove: PropTypes.func,
onClick: PropTypes.func,
}
render () {
- const { title, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage } } = this.props;
+ const { title, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, placeholder } = this.props;
const { collapsed, animating } = this.state;
const wrapperClassName = classNames('column-header__wrapper', {
const hasTitle = icon && title;
- return (
+ const component = (
<div className={wrapperClassName}>
<h1 className={buttonClassName}>
{hasTitle && (
</div>
</div>
);
+
+ if (multiColumn || placeholder) {
+ return component;
+ } else {
+ return createPortal(component, document.getElementById('tabs-bar__portal'));
+ }
}
}
descendantsIds: ImmutablePropTypes.list,
intl: PropTypes.object.isRequired,
askReplyConfirmation: PropTypes.bool,
+ multiColumn: PropTypes.bool,
domain: PropTypes.string.isRequired,
};
render () {
let ancestors, descendants;
- const { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain } = this.props;
+ const { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain, multiColumn } = this.props;
const { fullscreen } = this.state;
if (status === null) {
return (
<Column>
- <ColumnBackButton />
+ <ColumnBackButton multiColumn={multiColumn} />
<MissingIndicator />
</Column>
);
<Column label={intl.formatMessage(messages.detailedStatus)}>
<ColumnHeader
showBackButton
+ multiColumn={multiColumn}
extraButton={(
<button className='column-header__button' title={intl.formatMessage(status.get('hidden') ? messages.revealAll : messages.hideAll)} aria-label={intl.formatMessage(status.get('hidden') ? messages.revealAll : messages.hideAll)} onClick={this.handleToggleAll} aria-pressed={status.get('hidden') ? 'false' : 'true'}><Icon id={status.get('hidden') ? 'eye-slash' : 'eye'} /></button>
)}
let { title, icon } = this.props;
return (
<Column>
- <ColumnHeader icon={icon} title={title} multiColumn={false} focusable={false} />
+ <ColumnHeader icon={icon} title={title} multiColumn={false} focusable={false} placeholder />
<div className='scrollable' />
</Column>
);
const { intl: { formatMessage } } = this.props;
return (
- <nav className='tabs-bar' ref={this.setRef}>
- {links.map(link => React.cloneElement(link, { key: link.props.to, onClick: this.handleClick, 'aria-label': formatMessage({ id: link.props['data-preview-title-id'] }) }))}
- </nav>
+ <div className='tabs-bar__wrapper'>
+ <nav className='tabs-bar' ref={this.setRef}>
+ {links.map(link => React.cloneElement(link, { key: link.props.to, onClick: this.handleClick, 'aria-label': formatMessage({ id: link.props['data-preview-title-id'] }) }))}
+ </nav>
+
+ <div id='tabs-bar__portal' />
+ </div>
);
}
&.layout-single-column {
height: auto;
- min-height: 100%;
+ min-height: 100vh;
overflow-y: scroll;
}
}
}
+.tabs-bar__wrapper {
+ background: darken($ui-base-color, 8%);
+ position: sticky;
+ top: 0;
+ z-index: 2;
+ padding-top: 0;
+
+ @media screen and (min-width: $no-gap-breakpoint) {
+ padding-top: 10px;
+ }
+
+ .tabs-bar {
+ margin-bottom: 0;
+
+ @media screen and (min-width: $no-gap-breakpoint) {
+ margin-bottom: 10px;
+ }
+ }
+}
+
.react-swipeable-view-container {
&,
.columns-area,
background: lighten($ui-base-color, 8%);
flex: 0 0 auto;
overflow-y: auto;
- position: sticky;
- top: 0;
- z-index: 3;
}
.tabs-bar__link {
padding: 0;
}
+ //.column {
+ // margin-top: 0;
+
+ // @media screen and (min-width: $no-gap-breakpoint) {
+ // margin-top: 10px;
+ // }
+ //}
+
.autosuggest-textarea__textarea {
font-size: 16px;
}
@media screen and (min-width: $no-gap-breakpoint) {
padding: 10px 0;
+ padding-top: 0;
}
@media screen and (min-width: 630px) {
@media screen and (min-width: $no-gap-breakpoint) {
.tabs-bar {
- margin: 10px auto;
- margin-bottom: 0;
width: 100%;
}
.react-swipeable-view-container .columns-area--mobile {
- height: calc(100% - 20px) !important;
+ height: calc(100% - 10px) !important;
}
.getting-started__wrapper,