import React, { PropTypes } from 'react' import { Motion, spring } from 'react-motion' import { findDOMNode } from 'react-dom' import Window from './Window' class Layout extends React.Component { static propTypes = { location: PropTypes.object, children: PropTypes.node } state = { underlineLeft: 0, underlineWidth: 0, useSpring: false } adjustUnderline = (useSpring = false) => { let itemIndex switch (this.props.location.pathname) { case '/about': itemIndex = 2 break case '/stats': itemIndex = 1 break case '/': default: itemIndex = 0 } const itemNodes = findDOMNode(this).querySelectorAll('.underlist > li') const currentNode = itemNodes[itemIndex] this.setState({ underlineLeft: currentNode.offsetLeft, underlineWidth: currentNode.offsetWidth, useSpring }) } componentDidMount = () => this.adjustUnderline() componentDidUpdate = (prevProps) => { if (prevProps.location.pathname !== this.props.location.pathname) this.adjustUnderline(true) } render = () => { const { underlineLeft, underlineWidth, useSpring } = this.state const style = { left: useSpring ? spring(underlineLeft, { stiffness: 220 }) : underlineLeft, width: useSpring ? spring(underlineWidth) : underlineWidth } return ( <div> <Window onResize={this.adjustUnderline}/> <header> <h1>npmcdn</h1> <nav> <ol className="underlist"> <li><a href="#/">Home</a></li> <li><a href="#/stats">Stats</a></li> <li><a href="#/about">About</a></li> </ol> <Motion defaultStyle={{ left: underlineLeft, width: underlineWidth }} style={style}> {s => ( <div className="underlist-underline" style={{ WebkitTransform: `translate3d(${s.left}px,0,0)`, transform: `translate3d(${s.left}px,0,0)`, width: s.width }} /> )} </Motion> </nav> </header> {this.props.children} </div> ) } } export default Layout