STYLING COMPONENTS
WHY COMPONENTS ?
Today ➡️ Global stylesheets needed
SCOPED
Today ➡️ Nesting selectors / BEM
REUSABLE
— "import and play" NPM modules
— no conflicts
CSS MODULES !
✨ Styles composition — clear dependencies
✨ Generated class names — true uniqueness
SCOPED
REUSABLE
// index.jsx import './style.less'; const CellEditorContainer = ({ cn = 'CellEditorContainer', ...props }) => ( <div className={`${cn} NotebookCellEditor-container align-items-center`}> <div className='main-controls flex'> </div> </div> );
/* style.less */
.CellEditorContainer { width: 100%; margin-bottom: 24px; padding-left: 16px; .main-controls{ flex-wrap: wrap; align-items: flex-start; } }
CSS MODULES — EXAMPLE
// index.jsx import style from './style.less'; const CellEditorContainer = ({ cn = 'CellEditorContainer', ...props }) => ( <div className={`${cn} ${style.container} align-items-center`}> <div className={`${style.mainControls} flex`}> </div> </div> );
/* style.less */ .container { width: 100%; margin-bottom: 24px; padding-left: 16px; } .mainControls{ flex-wrap: wrap; align-items: flex-start; }
Where do this classes come from ?
CSS MODULES — NO MORE BEM
// index.jsx import style from './style.less'; const CellEditorContainer = ({ cn = 'CellEditorContainer', ...props }) => ( <div className={`${cn} ${style.container}`}> <div className={style.mainControls}> </div> </div> );
/* style.less */ .container { composes: alignItemsCenter from "dogweb/less/components/layout.less"; width: 100%; margin-bottom: 24px; padding-left: 16px; } .mainControls{ composes: flex from "dogweb/less/components/layout.less"; flex-wrap: wrap; align-items: flex-start; }
CSS MODULES — COMPOSITION
// index.jsx import style from './style.less'; const CellEditorContainer = ({ cn = 'CellEditorContainer', ...props }) => ( <div className={`${cn} ${style.container}`}> <div className={style.mainControls}> </div> </div> );
/* style.less */ @import '../../../../../../../../less/components/constants.less'; .container { composes: alignItemsCenter from "dogweb/less/components/layout.less"; color: @blue_base; } .mainControls{ composes: flex from "dogweb/less/components/layout.less"; flex-wrap: wrap; align-items: flex-start; }
two dependencies different resolvers
CSS MODULES — STYLE COMPOSITION
CSS IN JS

REMEMBER JSX ?
// index.jsx import { css } from 'glamor'; import { alignItemsCenter, flex } from 'dogweb/style/layout.js'; import { blue_base } from 'dogweb/style/colors.js'; const container = css(alignItemsCenter, { width: '100%', marginBottom: '24px', paddingLeft: '16px', color: blue_base, }); const mainControls = css(flex, { flexWrap: 'wrap', alignItems: 'flex-start', }); const CellEditorContainer = ({ cn = 'CellEditorContainer', ...props }) => ( <div className={`${cn} ${container}`}> <div className={mainControls} /> </div> );
GLAMOR
// index.jsx import style from './style.js'; const CellEditorContainer = ({ cn = 'CellEditorContainer', ...props }) => ( <div className={`${cn} ${style.container}`}> <div className={style.mainControls} /> </div> );
// style.js import { alignItemsCenter, flex } from 'dogweb/style/layout.js'; import { blue_base } from 'dogweb/style/colors.js'; import { css } from 'glamor'; export default { container: css(alignItemsCenter, { width: '100%', marginBottom: '24px', paddingLeft: '16px', color: blue_base, }), mainControls: css(flex, { flexWrap: 'wrap', alignItems: 'flex-start', }), };
GLAMOR — SEPARATE FILE
// index.jsx import styled from 'styled-components'; import { alignItemsCenter, flex } from 'dogweb/style/layout.js'; import { blue_base } from 'dogweb/style/colors.js'; const Container = styled(alignItemsCenter)` width: 100%; margin-bottom: 24px; padding-left: 16px; color: ${blue_base}; `; const MainControls = styled(flex)` flex-wrap: wrap; align-items: flex-start; `; const CellEditorContainer = ({ cn = 'CellEditorContainer', ...props }) => ( <Container> <MainControls /> </Container> );
STYLED-COMPONENTS
Styling components
By Thibaut Dutartre
Styling components
- 40