Опыт разработки кросспроектной библиотеки
компонентов на React.JS
Сергей Перескоков, frontend
Платформa Rambler&Co - кросспроектные сервисы
Какую проблему ты пытаешься решить?
Поддержка React.js
🔞 Соблюдение наших design-guides
Простая установка для webpack/browserify
Желательно через npm/yarn
Поддержка тем (нескольких и в рантайм)
Поддержка модульности (только нужные CSS и JS)
import Button from 'rambler-ui/Button'
class MyComponent extends React.Component {
render() {
return <div><Button>Hello</Button></div>
}
}
Стили создаются в рантайме и добавляются в документ через тег <style> или атрибут style="..."
const Button = styled.button`
border-radius: 3px;
padding: 0.25em 1em;
margin: 0 1em;
background: transparent;
color: palevioletred;
border: 2px solid palevioletred;
${props => props.primary && css`
background: palevioletred;
color: white;
`}
`
render(
<div>
<Button>Normal Button</Button>
<Button primary>Primary Button</Button>
</div>
)
@injectSheet((theme) => ({
container: {
display: 'inline-block',
fontSize: 12,
color: theme.button.fontColor,
background: theme.button.backgroundColor
},
icon: {
paddingRight: 15
}
}))
class Button extends Component {
render() {
const css = this.props.sheet.classes
return <div className={css.container}>
<Icon className={css.icon} />
{this.props.children}
</div>
}
}
render(
<ApplyTheme theme={{button: {fontColor: '#fff', backgroundColor: '#000'}}}>
<Button>Hello<Button>
</ApplyTheme>
)
render(
<div>
<ApplyTheme theme={{button: {fontColor: '#fff', backgroundColor: '#000'}}}>
<ApplyTheme theme={{button: {fontColor: 'yellow'}}}>
<Button>Hello<Button>
</ApplyTheme>
<ApplyTheme theme={{button: {backgroundColor: 'blue'}}}>
<Button>Hello<Button>
</ApplyTheme>
</ApplyTheme>
</div>
)
import React from 'react'
import Avatar from 'rambler-ui/Avatar'
import { ApplyTheme } from 'rambler-ui/theme'
export default function AvatarExample() {
const props = {
style: {
marginLeft: 10
},
src: '//api.adorable.io/avatars/face/eyes4/nose5/mouth7/8e8895/'
}
return (
<div>
<ApplyTheme>
<div>
<div style={{ display: 'inline-block', width: '33%' }}>
Circle
<Avatar {...props} profileType="facebook" />
<Avatar {...props} size={20} />
<Avatar {...props} size={60} />
</div>
</div>
</ApplyTheme>
</div>
)
}
RamblerUI используется в проектах:
Что дальше?
Список ресурсов и баззвордов: