Loëck Vézien
7 years ago
committed by
GitHub
6 changed files with 131 additions and 8 deletions
@ -0,0 +1,122 @@ |
|||||
|
// @flow
|
||||
|
|
||||
|
import React, { PureComponent } from 'react' |
||||
|
import reduce from 'lodash/fp/reduce' |
||||
|
import flow from 'lodash/fp/flow' |
||||
|
import filter from 'lodash/fp/filter' |
||||
|
import sortBy from 'lodash/fp/sortBy' |
||||
|
import styled from 'styled-components' |
||||
|
import color from 'color' |
||||
|
|
||||
|
import Box from 'components/base/Box' |
||||
|
|
||||
|
import theme from 'styles/theme' |
||||
|
|
||||
|
type HslColor = { |
||||
|
color: Array<number>, |
||||
|
} |
||||
|
|
||||
|
type ColorType = { |
||||
|
name: string, |
||||
|
val: string, |
||||
|
color: { |
||||
|
isDark: () => boolean, |
||||
|
hsl: () => HslColor, |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
const transform = flow( |
||||
|
reduce.convert({ cap: false })((acc, cur, key) => { |
||||
|
const c = color(cur) |
||||
|
return [ |
||||
|
...acc, |
||||
|
{ |
||||
|
name: key, |
||||
|
val: cur, |
||||
|
color: c, |
||||
|
isDark: c.isDark(), |
||||
|
}, |
||||
|
] |
||||
|
}, []), |
||||
|
filter(el => el.name !== 'transparent'), |
||||
|
sortBy(el => el.color.hsl().color[2]), |
||||
|
) |
||||
|
|
||||
|
const colors: Array<ColorType> = transform(theme.colors) |
||||
|
|
||||
|
const Container = styled(Box).attrs({ |
||||
|
bg: 'night', |
||||
|
p: 1, |
||||
|
color: 'white', |
||||
|
fontSize: 0, |
||||
|
})` |
||||
|
position: fixed; |
||||
|
bottom: 0; |
||||
|
right: 0; |
||||
|
z-index: 1; |
||||
|
border-top-left-radius: 3px; |
||||
|
transition: ease-in-out transform 300ms; |
||||
|
transform: translate3d(0, ${p => (p.isOpened ? '0' : '100%')}, 0); |
||||
|
` |
||||
|
|
||||
|
const Handle = styled(Box).attrs({ |
||||
|
bg: 'night', |
||||
|
})` |
||||
|
cursor: pointer; |
||||
|
padding: 3px 8px 3px 8px; |
||||
|
position: absolute; |
||||
|
bottom: 100%; |
||||
|
right: 5px; |
||||
|
border-top-left-radius: 3px; |
||||
|
border-top-right-radius: 3px; |
||||
|
` |
||||
|
|
||||
|
const Colors = styled(Box).attrs({ |
||||
|
horizontal: true, |
||||
|
align: 'flex-start', |
||||
|
})` |
||||
|
flex-wrap: wrap; |
||||
|
width: 416px; |
||||
|
` |
||||
|
|
||||
|
const Cl = styled(Box).attrs({ |
||||
|
align: 'center', |
||||
|
justify: 'center', |
||||
|
p: 2, |
||||
|
})` |
||||
|
border: 2px solid white; |
||||
|
margin: 2px; |
||||
|
width: 100px; |
||||
|
user-select: text; |
||||
|
cursor: text; |
||||
|
` |
||||
|
|
||||
|
const Color = ({ color }: { color: ColorType }) => ( |
||||
|
<Cl bg={color.val} color={color.isDark ? 'white' : 'night'}> |
||||
|
{color.name} |
||||
|
</Cl> |
||||
|
) |
||||
|
|
||||
|
type State = { |
||||
|
isOpened: boolean, |
||||
|
} |
||||
|
|
||||
|
class DevToolbar extends PureComponent<any, State> { |
||||
|
state = { |
||||
|
isOpened: false, |
||||
|
} |
||||
|
|
||||
|
handleToggle = () => this.setState({ isOpened: !this.state.isOpened }) |
||||
|
|
||||
|
render() { |
||||
|
const { isOpened } = this.state |
||||
|
return ( |
||||
|
<Container isOpened={isOpened}> |
||||
|
<Handle onClick={this.handleToggle}>{'DEV'}</Handle> |
||||
|
<Colors>{colors.map(color => <Color key={color.name} color={color} />)}</Colors> |
||||
|
</Container> |
||||
|
) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
export default DevToolbar |
Loading…
Reference in new issue