Compare commits

..

9 Commits

Author SHA1 Message Date
kibigo!
276432790a Introducing: Mastodon GO! 2017-11-04 05:48:42 -07:00
Ondřej Hruška
516eeeb43d option to add title to <Button>, use for toot buttons (#197) 2017-10-24 19:08:07 +02:00
David Yip
664c9aa708 Merge pull request #196 from glitch-soc/fix-imports
Added app/javascript for imports
2017-10-23 23:34:43 -05:00
kibigo!
119d477c8b Added app/javascript for imports 2017-10-23 20:22:48 -07:00
David Yip
4f01e6e8d5 Merge remote-tracking branch 'origin/master' into gs-master 2017-10-22 22:57:41 -05:00
Marcin Mikołajczak
fdb0848e08 i18n: Update Polish Translation (#5494) 2017-10-22 08:34:39 +09:00
Ondřej Hruška
d589dd7cd0 Compose buttons bar redesign + generalize dropdown (#194)
* Generalize compose dropdown for re-use

* wip stuffs

* new tootbox look and removed old doodle button files

* use the house icon for ...
2017-10-21 20:24:53 +02:00
Nolan Lawson
8392ddbf87 Remove unnecessary translateZ(0) when doing scale() (#5473) 2017-10-19 18:27:55 +02:00
masarakki
049381b284 remove-duplicated-jest-config (#5465) 2017-10-19 13:51:38 +02:00
14 changed files with 72 additions and 47 deletions

View File

@@ -29,6 +29,11 @@ settings:
import/ignore: import/ignore:
- node_modules - node_modules
- \\.(css|scss|json)$ - \\.(css|scss|json)$
import/resolver:
node:
moduleDirectory:
- node_modules
- app/javascript
rules: rules:
brace-style: warn brace-style: warn

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "app/javascript/themes/mastodon-go"]
path = app/javascript/themes/mastodon-go
url = https://github.com/marrus-sh/mastodon-go

2
Vagrantfile vendored
View File

@@ -83,7 +83,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.provider :virtualbox do |vb| config.vm.provider :virtualbox do |vb|
vb.name = "mastodon" vb.name = "mastodon"
vb.customize ["modifyvm", :id, "--memory", "2048"] vb.customize ["modifyvm", :id, "--memory", "4096"]
# Disable VirtualBox DNS proxy to skip long-delay IPv6 resolutions. # Disable VirtualBox DNS proxy to skip long-delay IPv6 resolutions.
# https://github.com/mitchellh/vagrant/issues/1172 # https://github.com/mitchellh/vagrant/issues/1172

View File

@@ -112,3 +112,19 @@ exports[`<Button /> renders the props.text instead of children 1`] = `
foo foo
</button> </button>
`; `;
exports[`<Button /> renders title if props.title is given 1`] = `
<button
className="button"
disabled={undefined}
onClick={[Function]}
style={
Object {
"height": "36px",
"lineHeight": "36px",
"padding": "0 16px",
}
}
title="foo"
/>
`;

View File

@@ -72,4 +72,11 @@ describe('<Button />', () => {
expect(tree).toMatchSnapshot(); expect(tree).toMatchSnapshot();
}); });
it('renders title if props.title is given', () => {
const component = renderer.create(<Button title='foo' />);
const tree = component.toJSON();
expect(tree).toMatchSnapshot();
});
}); });

View File

@@ -14,6 +14,7 @@ export default class Button extends React.PureComponent {
className: PropTypes.string, className: PropTypes.string,
style: PropTypes.object, style: PropTypes.object,
children: PropTypes.node, children: PropTypes.node,
title: PropTypes.string,
}; };
static defaultProps = { static defaultProps = {
@@ -35,26 +36,26 @@ export default class Button extends React.PureComponent {
} }
render () { render () {
const style = { let attrs = {
className: classNames('button', this.props.className, {
'button-secondary': this.props.secondary,
'button--block': this.props.block,
}),
disabled: this.props.disabled,
onClick: this.handleClick,
ref: this.setRef,
style: {
padding: `0 ${this.props.size / 2.25}px`, padding: `0 ${this.props.size / 2.25}px`,
height: `${this.props.size}px`, height: `${this.props.size}px`,
lineHeight: `${this.props.size}px`, lineHeight: `${this.props.size}px`,
...this.props.style, ...this.props.style,
},
}; };
const className = classNames('button', this.props.className, { if (this.props.title) attrs.title = this.props.title;
'button-secondary': this.props.secondary,
'button--block': this.props.block,
});
return ( return (
<button <button {...attrs}>
className={className}
disabled={this.props.disabled}
onClick={this.handleClick}
ref={this.setRef}
style={style}
>
{this.props.text || this.props.children} {this.props.text || this.props.children}
</button> </button>
); );

View File

@@ -164,6 +164,8 @@ export default class ComposeForm extends ImmutablePureComponent {
let publishText = ''; let publishText = '';
let publishText2 = ''; let publishText2 = '';
let title = '';
let title2 = '';
const privacyIcons = { const privacyIcons = {
none: '', none: '',
@@ -173,7 +175,10 @@ export default class ComposeForm extends ImmutablePureComponent {
direct: 'envelope', direct: 'envelope',
}; };
title = `${intl.formatMessage(messages.publish)}: ${intl.formatMessage({ id: `privacy.${this.props.privacy}.short` })}`;
if (showSideArm) { if (showSideArm) {
// Enhanced behavior with dual toot buttons
publishText = ( publishText = (
<span> <span>
{ {
@@ -185,13 +190,15 @@ export default class ComposeForm extends ImmutablePureComponent {
</span> </span>
); );
title2 = `${intl.formatMessage(messages.publish)}: ${intl.formatMessage({ id: `privacy.${secondaryVisibility}.short` })}`;
publishText2 = ( publishText2 = (
<i <i
className={`fa fa-${privacyIcons[secondaryVisibility]}`} className={`fa fa-${privacyIcons[secondaryVisibility]}`}
aria-label={`${intl.formatMessage(messages.publish)}: ${intl.formatMessage({ id: `privacy.${secondaryVisibility}.short` })}`} aria-label={title2}
/> />
); );
} else { } else {
// Original vanilla behavior - no icon if public or unlisted
if (this.props.privacy === 'private' || this.props.privacy === 'direct') { if (this.props.privacy === 'private' || this.props.privacy === 'direct') {
publishText = <span className='compose-form__publish-private'><i className='fa fa-lock' /> {intl.formatMessage(messages.publish)}</span>; publishText = <span className='compose-form__publish-private'><i className='fa fa-lock' /> {intl.formatMessage(messages.publish)}</span>;
} else { } else {
@@ -256,6 +263,7 @@ export default class ComposeForm extends ImmutablePureComponent {
<Button <Button
className='compose-form__publish__side-arm' className='compose-form__publish__side-arm'
text={publishText2} text={publishText2}
title={title2}
onClick={this.handleSubmit2} onClick={this.handleSubmit2}
disabled={submitDisabled} disabled={submitDisabled}
/> : '' /> : ''
@@ -263,6 +271,7 @@ export default class ComposeForm extends ImmutablePureComponent {
<Button <Button
className='compose-form__publish__primary' className='compose-form__publish__primary'
text={publishText} text={publishText}
title={title}
onClick={this.handleSubmit} onClick={this.handleSubmit}
disabled={submitDisabled} disabled={submitDisabled}
/> />

View File

@@ -68,7 +68,7 @@ export default class Upload extends ImmutablePureComponent {
<div className='compose-form__upload' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> <div className='compose-form__upload' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}> <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}>
{({ scale }) => ( {({ scale }) => (
<div className='compose-form__upload-thumbnail' style={{ transform: `translateZ(0) scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})` }}> <div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})` }}>
<IconButton icon='times' title={intl.formatMessage(messages.undo)} size={36} onClick={this.handleUndoClick} /> <IconButton icon='times' title={intl.formatMessage(messages.undo)} size={36} onClick={this.handleUndoClick} />
<div className={classNames('compose-form__upload-description', { active })}> <div className={classNames('compose-form__upload-description', { active })}>

View File

@@ -47,7 +47,7 @@ class SensitiveButton extends React.PureComponent {
'compose-form__sensitive-button--visible': visible, 'compose-form__sensitive-button--visible': visible,
}); });
return ( return (
<div className={className} style={{ transform: `translateZ(0) scale(${scale})` }}> <div className={className} style={{ transform: `scale(${scale})` }}>
<IconButton <IconButton
className='compose-form__sensitive-button__icon' className='compose-form__sensitive-button__icon'
title={intl.formatMessage(messages.title)} title={intl.formatMessage(messages.title)}

View File

@@ -40,7 +40,7 @@ export default class UploadArea extends React.PureComponent {
{({ backgroundOpacity, backgroundScale }) => {({ backgroundOpacity, backgroundScale }) =>
<div className='upload-area' style={{ visibility: active ? 'visible' : 'hidden', opacity: backgroundOpacity }}> <div className='upload-area' style={{ visibility: active ? 'visible' : 'hidden', opacity: backgroundOpacity }}>
<div className='upload-area__drop'> <div className='upload-area__drop'>
<div className='upload-area__background' style={{ transform: `translateZ(0) scale(${backgroundScale})` }} /> <div className='upload-area__background' style={{ transform: `scale(${backgroundScale})` }} />
<div className='upload-area__content'><FormattedMessage id='upload_area.title' defaultMessage='Drag & drop to upload' /></div> <div className='upload-area__content'><FormattedMessage id='upload_area.title' defaultMessage='Drag & drop to upload' /></div>
</div> </div>
</div> </div>

View File

@@ -159,11 +159,11 @@
"privacy.public.short": "Publiczny", "privacy.public.short": "Publiczny",
"privacy.unlisted.long": "Niewidoczny na publicznych osiach czasu", "privacy.unlisted.long": "Niewidoczny na publicznych osiach czasu",
"privacy.unlisted.short": "Niewidoczny", "privacy.unlisted.short": "Niewidoczny",
"relative_time.days": "{number}d", "relative_time.days": "{number} dni",
"relative_time.hours": "{number}h", "relative_time.hours": "{number} godz.",
"relative_time.just_now": "now", "relative_time.just_now": "teraz",
"relative_time.minutes": "{number}m", "relative_time.minutes": "{number} min.",
"relative_time.seconds": "{number}s", "relative_time.seconds": "{number} s.",
"reply_indicator.cancel": "Anuluj", "reply_indicator.cancel": "Anuluj",
"report.placeholder": "Dodatkowe komentarze", "report.placeholder": "Dodatkowe komentarze",
"report.submit": "Wyślij", "report.submit": "Wyślij",

View File

@@ -3402,21 +3402,21 @@ button.icon-button.active i.fa-retweet {
} }
.fa-search { .fa-search {
transform: translateZ(0) rotate(90deg); transform: rotate(90deg);
&.active { &.active {
pointer-events: none; pointer-events: none;
transform: translateZ(0) rotate(0deg); transform: rotate(0deg);
} }
} }
.fa-times-circle { .fa-times-circle {
top: 11px; top: 11px;
transform: translateZ(0) rotate(0deg); transform: rotate(0deg);
cursor: pointer; cursor: pointer;
&.active { &.active {
transform: translateZ(0) rotate(90deg); transform: rotate(90deg);
} }
&:hover { &:hover {

View File

@@ -135,22 +135,5 @@
}, },
"optionalDependencies": { "optionalDependencies": {
"fsevents": "*" "fsevents": "*"
},
"jest": {
"projects": [
"<rootDir>/app/javascript/mastodon"
],
"testPathIgnorePatterns": [
"<rootDir>/node_modules/",
"<rootDir>/vendor/",
"<rootDir>/config/",
"<rootDir>/log/",
"<rootDir>/public/",
"<rootDir>/tmp/"
],
"setupFiles": [
"raf/polyfill"
],
"setupTestFrameworkScriptFile": "<rootDir>/app/javascript/mastodon/test_setup.js"
} }
} }