parent
							
								
									547a5bac9d
								
							
						
					
					
						commit
						3a929dbedd
					
				
					 2 changed files with 96 additions and 46 deletions
				
			
		| 
						 | 
				
			
			@ -1,6 +1,4 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
import Motion from '../features/ui/util/optional_motion';
 | 
			
		||||
import spring from 'react-motion/lib/spring';
 | 
			
		||||
import PropTypes from 'prop-types';
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
import Icon from 'mastodon/components/icon';
 | 
			
		||||
| 
						 | 
				
			
			@ -37,6 +35,21 @@ export default class IconButton extends React.PureComponent {
 | 
			
		|||
    tabIndex: '0',
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  state = {
 | 
			
		||||
    activate: false,
 | 
			
		||||
    deactivate: false,
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  componentWillReceiveProps (nextProps) {
 | 
			
		||||
    if (!nextProps.animate) return;
 | 
			
		||||
 | 
			
		||||
    if (this.props.active && !nextProps.active) {
 | 
			
		||||
      this.setState({ activate: false, deactivate: true });
 | 
			
		||||
    } else if (!this.props.active && nextProps.active) {
 | 
			
		||||
      this.setState({ activate: true, deactivate: false });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  handleClick = (e) =>  {
 | 
			
		||||
    e.preventDefault();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -75,7 +88,6 @@ export default class IconButton extends React.PureComponent {
 | 
			
		|||
 | 
			
		||||
    const {
 | 
			
		||||
      active,
 | 
			
		||||
      animate,
 | 
			
		||||
      className,
 | 
			
		||||
      disabled,
 | 
			
		||||
      expanded,
 | 
			
		||||
| 
						 | 
				
			
			@ -87,16 +99,20 @@ export default class IconButton extends React.PureComponent {
 | 
			
		|||
      title,
 | 
			
		||||
    } = this.props;
 | 
			
		||||
 | 
			
		||||
    const {
 | 
			
		||||
      activate,
 | 
			
		||||
      deactivate,
 | 
			
		||||
    } = this.state;
 | 
			
		||||
 | 
			
		||||
    const classes = classNames(className, 'icon-button', {
 | 
			
		||||
      active,
 | 
			
		||||
      disabled,
 | 
			
		||||
      inverted,
 | 
			
		||||
      activate,
 | 
			
		||||
      deactivate,
 | 
			
		||||
      overlayed: overlay,
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (!animate) {
 | 
			
		||||
      // Perf optimization: avoid unnecessary <Motion> components unless
 | 
			
		||||
      // we actually need to animate.
 | 
			
		||||
    return (
 | 
			
		||||
      <button
 | 
			
		||||
        aria-label={title}
 | 
			
		||||
| 
						 | 
				
			
			@ -117,28 +133,4 @@ export default class IconButton extends React.PureComponent {
 | 
			
		|||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      <Motion defaultStyle={{ rotate: active ? -360 : 0 }} style={{ rotate: animate ? spring(active ? -360 : 0, { stiffness: 120, damping: 7 }) : 0 }}>
 | 
			
		||||
        {({ rotate }) => (
 | 
			
		||||
          <button
 | 
			
		||||
            aria-label={title}
 | 
			
		||||
            aria-pressed={pressed}
 | 
			
		||||
            aria-expanded={expanded}
 | 
			
		||||
            title={title}
 | 
			
		||||
            className={classes}
 | 
			
		||||
            onClick={this.handleClick}
 | 
			
		||||
            onMouseDown={this.handleMouseDown}
 | 
			
		||||
            onKeyDown={this.handleKeyDown}
 | 
			
		||||
            onKeyPress={this.handleKeyPress}
 | 
			
		||||
            style={style}
 | 
			
		||||
            tabIndex={tabIndex}
 | 
			
		||||
            disabled={disabled}
 | 
			
		||||
          >
 | 
			
		||||
            <Icon id={icon} style={{ transform: `rotate(${rotate}deg)` }} fixedWidth aria-hidden='true' />
 | 
			
		||||
          </button>
 | 
			
		||||
        )}
 | 
			
		||||
      </Motion>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1591,6 +1591,20 @@ a.account__display-name {
 | 
			
		|||
  color: $gold-star;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no-reduce-motion .icon-button.star-icon {
 | 
			
		||||
  &.activate {
 | 
			
		||||
    & > .fa-star {
 | 
			
		||||
      animation: spring-rotate-in 1s linear;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.deactivate {
 | 
			
		||||
    & > .fa-star {
 | 
			
		||||
      animation: spring-rotate-out 1s linear;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification__display-name {
 | 
			
		||||
  color: inherit;
 | 
			
		||||
  font-weight: 500;
 | 
			
		||||
| 
						 | 
				
			
			@ -3373,6 +3387,50 @@ a.status-card.compact:hover {
 | 
			
		|||
  animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@keyframes spring-rotate-in {
 | 
			
		||||
  0% {
 | 
			
		||||
    transform: rotate(0deg);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  30% {
 | 
			
		||||
    transform: rotate(-484.8deg);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  60% {
 | 
			
		||||
    transform: rotate(-316.7deg);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  90% {
 | 
			
		||||
    transform: rotate(-375deg);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  100% {
 | 
			
		||||
    transform: rotate(-360deg);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@keyframes spring-rotate-out {
 | 
			
		||||
  0% {
 | 
			
		||||
    transform: rotate(-360deg);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  30% {
 | 
			
		||||
    transform: rotate(124.8deg);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  60% {
 | 
			
		||||
    transform: rotate(-43.27deg);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  90% {
 | 
			
		||||
    transform: rotate(15deg);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  100% {
 | 
			
		||||
    transform: rotate(0deg);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@keyframes loader-figure {
 | 
			
		||||
  0% {
 | 
			
		||||
    width: 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue