Remove unused assets (#18541)
Before Width: | Height: | Size: 34 KiB |
@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.41507 232.00976"><path d="M211.80683 139.0875c-3.1825 16.36625-28.4925 34.2775-57.5625 37.74875-15.16 1.80875-30.0825 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.3925 27.9425 21.115.7225 39.91625-5.20625 39.91625-5.20625l.86875 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23183 213.82 1.40558 165.31125.20808 116.09125c-.36375-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67058 3.45375 78.20308.2425 107.86433 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.97625 14.7525 32.97625 65.0825 0 0 .4125 37.13375-4.6 62.915" fill="#3088d4"/><path d="M65.68743 96.45938c0 9.01375-7.3075 16.32125-16.3225 16.32125-9.01375 0-16.32-7.3075-16.32-16.32125 0-9.01375 7.30625-16.3225 16.32-16.3225 9.015 0 16.3225 7.30875 16.3225 16.3225M124.52893 96.45938c0 9.01375-7.30875 16.32125-16.3225 16.32125-9.01375 0-16.32125-7.3075-16.32125-16.32125 0-9.01375 7.3075-16.3225 16.32125-16.3225 9.01375 0 16.3225 7.30875 16.3225 16.3225M183.36933 96.45938c0 9.01375-7.3075 16.32125-16.32125 16.32125-9.01375 0-16.32125-7.3075-16.32125-16.32125 0-9.01375 7.3075-16.3225 16.32125-16.3225 9.01375 0 16.32125 7.30875 16.32125 16.3225" fill="#fff"/></svg>
|
|
Before Width: | Height: | Size: 1.3 KiB |
@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.4144 232.00976"><path d="M107.86523 0C78.203984.2425 49.672422 3.4535937 33.044922 11.089844c0 0-32.97656262 14.752031-32.97656262 65.082031 0 11.525-.224375 25.306175.140625 39.919925 1.19750002 49.22 9.02375002 97.72843 54.53124962 109.77343 20.9825 5.55375 38.99711 6.71547 53.505856 5.91797 26.31125-1.45875 41.08203-9.38867 41.08203-9.38867l-.86914-19.08984s-18.80171 5.92758-39.91796 5.20508c-20.921254-.7175-43.006879-2.25516-46.390629-27.94141-.3125-2.25625-.46875-4.66938-.46875-7.20313 0 0 20.536953 5.0204 46.564449 6.21289 15.915.73001 30.8393-.93343 45.99805-2.74218 29.07-3.47125 54.38125-21.3818 57.5625-37.74805 5.0125-25.78125 4.59961-62.916015 4.59961-62.916015 0-50.33-32.97461-65.082031-32.97461-65.082031C166.80539 3.4535938 138.255.2425 108.59375 0h-.72852zM74.296875 39.326172c12.355 0 21.710234 4.749297 27.896485 14.248047l6.01367 10.080078 6.01563-10.080078c6.185-9.49875 15.54023-14.248047 27.89648-14.248047 10.6775 0 19.28156 3.753672 25.85156 11.076172 6.36875 7.3225 9.53907 17.218828 9.53907 29.673828v60.941408h-24.14454V81.869141c0-12.46875-5.24453-18.798829-15.73828-18.798829-11.6025 0-17.41797 7.508516-17.41797 22.353516v32.375002H96.207031V85.423828c0-14.845-5.815468-22.353515-17.417969-22.353516-10.49375 0-15.740234 6.330079-15.740234 18.798829v59.148439H38.904297V80.076172c0-12.455 3.171016-22.351328 9.541015-29.673828 6.568751-7.3225 15.172813-11.076172 25.851563-11.076172z" fill="#000"/></svg>
|
|
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 27 KiB |
@ -1,197 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import ReactSwipeableViews from 'react-swipeable-views';
|
|
||||||
import classNames from 'classnames';
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
import { FormattedMessage } from 'react-intl';
|
|
||||||
import { closeOnboarding } from '../../actions/onboarding';
|
|
||||||
import screenHello from '../../../images/screen_hello.svg';
|
|
||||||
import screenFederation from '../../../images/screen_federation.svg';
|
|
||||||
import screenInteractions from '../../../images/screen_interactions.svg';
|
|
||||||
import logoTransparent from '../../../images/logo_transparent.svg';
|
|
||||||
import { disableSwiping } from 'mastodon/initial_state';
|
|
||||||
|
|
||||||
const FrameWelcome = ({ domain, onNext }) => (
|
|
||||||
<div className='introduction__frame'>
|
|
||||||
<div className='introduction__illustration' style={{ background: `url(${logoTransparent}) no-repeat center center / auto 80%` }}>
|
|
||||||
<img src={screenHello} alt='' />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='introduction__text introduction__text--centered'>
|
|
||||||
<h3><FormattedMessage id='introduction.welcome.headline' defaultMessage='First steps' /></h3>
|
|
||||||
<p><FormattedMessage id='introduction.welcome.text' defaultMessage="Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name." values={{ domain: <code>{domain}</code> }} /></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='introduction__action'>
|
|
||||||
<button className='button' onClick={onNext}><FormattedMessage id='introduction.welcome.action' defaultMessage="Let's go!" /></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
||||||
FrameWelcome.propTypes = {
|
|
||||||
domain: PropTypes.string.isRequired,
|
|
||||||
onNext: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
const FrameFederation = ({ onNext }) => (
|
|
||||||
<div className='introduction__frame'>
|
|
||||||
<div className='introduction__illustration'>
|
|
||||||
<img src={screenFederation} alt='' />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='introduction__text introduction__text--columnized'>
|
|
||||||
<div>
|
|
||||||
<h3><FormattedMessage id='introduction.federation.home.headline' defaultMessage='Home' /></h3>
|
|
||||||
<p><FormattedMessage id='introduction.federation.home.text' defaultMessage='Posts from people you follow will appear in your home feed. You can follow anyone on any server!' /></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<h3><FormattedMessage id='introduction.federation.local.headline' defaultMessage='Local' /></h3>
|
|
||||||
<p><FormattedMessage id='introduction.federation.local.text' defaultMessage='Public posts from people on the same server as you will appear in the local timeline.' /></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<h3><FormattedMessage id='introduction.federation.federated.headline' defaultMessage='Federated' /></h3>
|
|
||||||
<p><FormattedMessage id='introduction.federation.federated.text' defaultMessage='Public posts from other servers of the fediverse will appear in the federated timeline.' /></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='introduction__action'>
|
|
||||||
<button className='button' onClick={onNext}><FormattedMessage id='introduction.federation.action' defaultMessage='Next' /></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
||||||
FrameFederation.propTypes = {
|
|
||||||
onNext: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
const FrameInteractions = ({ onNext }) => (
|
|
||||||
<div className='introduction__frame'>
|
|
||||||
<div className='introduction__illustration'>
|
|
||||||
<img src={screenInteractions} alt='' />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='introduction__text introduction__text--columnized'>
|
|
||||||
<div>
|
|
||||||
<h3><FormattedMessage id='introduction.interactions.reply.headline' defaultMessage='Reply' /></h3>
|
|
||||||
<p><FormattedMessage id='introduction.interactions.reply.text' defaultMessage="You can reply to other people's and your own toots, which will chain them together in a conversation." /></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<h3><FormattedMessage id='introduction.interactions.reblog.headline' defaultMessage='Boost' /></h3>
|
|
||||||
<p><FormattedMessage id='introduction.interactions.reblog.text' defaultMessage="You can share other people's toots with your followers by boosting them." /></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<h3><FormattedMessage id='introduction.interactions.favourite.headline' defaultMessage='Favourite' /></h3>
|
|
||||||
<p><FormattedMessage id='introduction.interactions.favourite.text' defaultMessage='You can save a toot for later, and let the author know that you liked it, by favouriting it.' /></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='introduction__action'>
|
|
||||||
<button className='button' onClick={onNext}><FormattedMessage id='introduction.interactions.action' defaultMessage='Finish toot-orial!' /></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
||||||
FrameInteractions.propTypes = {
|
|
||||||
onNext: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default @connect(state => ({ domain: state.getIn(['meta', 'domain']) }))
|
|
||||||
class Introduction extends React.PureComponent {
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
domain: PropTypes.string.isRequired,
|
|
||||||
dispatch: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
state = {
|
|
||||||
currentIndex: 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
componentWillMount () {
|
|
||||||
this.pages = [
|
|
||||||
<FrameWelcome domain={this.props.domain} onNext={this.handleNext} />,
|
|
||||||
<FrameFederation onNext={this.handleNext} />,
|
|
||||||
<FrameInteractions onNext={this.handleFinish} />,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
window.addEventListener('keyup', this.handleKeyUp);
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillUnmount() {
|
|
||||||
window.addEventListener('keyup', this.handleKeyUp);
|
|
||||||
}
|
|
||||||
|
|
||||||
handleDot = (e) => {
|
|
||||||
const i = Number(e.currentTarget.getAttribute('data-index'));
|
|
||||||
e.preventDefault();
|
|
||||||
this.setState({ currentIndex: i });
|
|
||||||
}
|
|
||||||
|
|
||||||
handlePrev = () => {
|
|
||||||
this.setState(({ currentIndex }) => ({
|
|
||||||
currentIndex: Math.max(0, currentIndex - 1),
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleNext = () => {
|
|
||||||
const { pages } = this;
|
|
||||||
|
|
||||||
this.setState(({ currentIndex }) => ({
|
|
||||||
currentIndex: Math.min(currentIndex + 1, pages.length - 1),
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleSwipe = (index) => {
|
|
||||||
this.setState({ currentIndex: index });
|
|
||||||
}
|
|
||||||
|
|
||||||
handleFinish = () => {
|
|
||||||
this.props.dispatch(closeOnboarding());
|
|
||||||
}
|
|
||||||
|
|
||||||
handleKeyUp = ({ key }) => {
|
|
||||||
switch (key) {
|
|
||||||
case 'ArrowLeft':
|
|
||||||
this.handlePrev();
|
|
||||||
break;
|
|
||||||
case 'ArrowRight':
|
|
||||||
this.handleNext();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
render () {
|
|
||||||
const { currentIndex } = this.state;
|
|
||||||
const { pages } = this;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className='introduction'>
|
|
||||||
<ReactSwipeableViews index={currentIndex} onChangeIndex={this.handleSwipe} disabled={disableSwiping} className='introduction__pager'>
|
|
||||||
{pages.map((page, i) => (
|
|
||||||
<div key={i} className={classNames('introduction__frame-wrapper', { 'active': i === currentIndex })}>{page}</div>
|
|
||||||
))}
|
|
||||||
</ReactSwipeableViews>
|
|
||||||
|
|
||||||
<div className='introduction__dots'>
|
|
||||||
{pages.map((_, i) => (
|
|
||||||
<div
|
|
||||||
key={`dot-${i}`}
|
|
||||||
role='button'
|
|
||||||
tabIndex='0'
|
|
||||||
data-index={i}
|
|
||||||
onClick={this.handleDot}
|
|
||||||
className={classNames('introduction__dot', { active: i === currentIndex })}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -17,7 +17,6 @@
|
|||||||
@import 'mastodon/boost';
|
@import 'mastodon/boost';
|
||||||
@import 'mastodon/components';
|
@import 'mastodon/components';
|
||||||
@import 'mastodon/polls';
|
@import 'mastodon/polls';
|
||||||
@import 'mastodon/introduction';
|
|
||||||
@import 'mastodon/modal';
|
@import 'mastodon/modal';
|
||||||
@import 'mastodon/emoji_picker';
|
@import 'mastodon/emoji_picker';
|
||||||
@import 'mastodon/about';
|
@import 'mastodon/about';
|
||||||
|
@ -1,154 +0,0 @@
|
|||||||
.introduction {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
height: 100vh;
|
|
||||||
background: $ui-base-color;
|
|
||||||
|
|
||||||
@media screen and (max-width: 920px) {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__pager {
|
|
||||||
background: darken($ui-base-color, 8%);
|
|
||||||
box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__pager,
|
|
||||||
&__frame {
|
|
||||||
border-radius: 10px;
|
|
||||||
width: 50vw;
|
|
||||||
min-width: 920px;
|
|
||||||
|
|
||||||
@media screen and (max-width: 920px) {
|
|
||||||
min-width: 0;
|
|
||||||
width: 100%;
|
|
||||||
border-radius: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&__frame-wrapper {
|
|
||||||
opacity: 0;
|
|
||||||
transition: opacity 500ms linear;
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
opacity: 1;
|
|
||||||
transition: opacity 50ms linear;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&__frame {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__illustration {
|
|
||||||
height: 50vh;
|
|
||||||
|
|
||||||
@media screen and (max-width: 630px) {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
object-fit: cover;
|
|
||||||
display: block;
|
|
||||||
margin: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&__text {
|
|
||||||
border-top: 2px solid $ui-highlight-color;
|
|
||||||
|
|
||||||
&--columnized {
|
|
||||||
display: flex;
|
|
||||||
|
|
||||||
& > div {
|
|
||||||
flex: 1 1 33.33%;
|
|
||||||
text-align: center;
|
|
||||||
padding: 25px;
|
|
||||||
padding-bottom: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 630px) {
|
|
||||||
display: block;
|
|
||||||
padding: 15px 0;
|
|
||||||
padding-bottom: 20px;
|
|
||||||
|
|
||||||
& > div {
|
|
||||||
padding: 10px 25px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
font-size: 24px;
|
|
||||||
line-height: 1.5;
|
|
||||||
font-weight: 700;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 24px;
|
|
||||||
font-weight: 400;
|
|
||||||
color: $darker-text-color;
|
|
||||||
|
|
||||||
code {
|
|
||||||
display: inline-block;
|
|
||||||
background: darken($ui-base-color, 8%);
|
|
||||||
font-size: 15px;
|
|
||||||
border: 1px solid lighten($ui-base-color, 8%);
|
|
||||||
border-radius: 2px;
|
|
||||||
padding: 1px 3px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&--centered {
|
|
||||||
padding: 25px;
|
|
||||||
padding-bottom: 30px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&__dots {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
padding: 25px;
|
|
||||||
|
|
||||||
@media screen and (max-width: 630px) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&__dot {
|
|
||||||
width: 14px;
|
|
||||||
height: 14px;
|
|
||||||
border-radius: 14px;
|
|
||||||
border: 1px solid $ui-highlight-color;
|
|
||||||
background: transparent;
|
|
||||||
margin: 0 3px;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: lighten($ui-base-color, 8%);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
cursor: default;
|
|
||||||
background: $ui-highlight-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&__action {
|
|
||||||
padding: 25px;
|
|
||||||
padding-top: 0;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
}
|
|