SlideShare a Scribd company logo
.css__in--react {
will-change: transform;
}
CSS IN React
Joe Seifi
Eventbrite
CSS in React - Will Change Transform
@BODY fo(fa=he,si=18)
@P co(nu=3,wi=80)
(BODY fontSize=normal
BGColor=white
FGColor=black
(H1 fontSize=largest
BGColor=red
FGColor=white)
)
h1.font.size = 24pt 100%
h2.font.size = 20pt 40%
*LI.prebreak: 0.5
*LI.postbreak: 0.5
*OL.LI.label: 1
*OL*OL.LI.label: A
(element H1
(make paragraph
font-size: 14pt
font-weight: 'bold))
(style a
(block #f) ; format as inline phrase
(color blue) ; in blue if youโ€™ve got it
(click (follow (attval 'href))) ; and on click, follow url
LI {
VertPos: Top = LeftSib . Actual Bottom;
}
A {
if (getAttribute(self, "href") != "") then
fgColor = "blue";
underlineNumber = 1;
endif
}
tags.H1.color = "blue";
tags.p.fontSize = "14pt";
with (tags.H3) {
color = "green";
}
classes.punk.all.color = "#00FF00"
ids.z098y.letterSpacing = "0.3em"
RRP
@BODY fo(fa=he,si=18)
@P co(nu=3,wi=80)
PWP
(BODY fontSize=normal
BGColor=white
FGColor=black
(H1 fontSize=largest
BGColor=red
FGColor=white)
)
CHSS
h1.font.size = 24pt 100%
h2.font.size = 20pt 40%
RRP
*LI.prebreak: 0.5
*LI.postbreak: 0.5
*OL.LI.label: 1
*OL*OL.LI.label: A
DSSSL
(element H1
(make paragraph
font-size: 14pt
font-weight: 'bold))
RRP
(style a
(block #f) ; format as inline phrase
(color blue) ; in blue if youโ€™ve got it
(click (follow (attval 'href))) ; and on click, follow url
PSL
LI {
VertPos: Top = LeftSib . Actual Bottom;
}
A {
if (getAttribute(self, "href") != "") then
fgColor = "blue";
underlineNumber = 1;
endif
}
JSSS
tags.H1.color = "blue";
tags.p.fontSize = "14pt";
with (tags.H3) {
color = "green";
}
classes.punk.all.color = "#00FF00"
ids.z098y.letterSpacing = "0.3em"
Pre-CSS
1993-1996
My first website ~ 1997
CSS in React - Will Change Transform
CSS in React - Will Change Transform
JavaScript MVC Components
๐Ÿ’„!11
CSS Modular CSS CSS in JS
OOCSS
SMACS
SUIT
BEM
ATOMIC
๐Ÿ’„
CSS in React - Will Change Transform
Super Powers
of CSS in React
- Automation
- Sharable
- Adaptable
- Scalable
- Maintainable
Giving up Control,
actually gives you more
control and new
Super Powers
Automation
Managing CSS Classnames
There are only
2 hard problems in
Computer Science:
cache invalidation &
naming things
Phil Karlton from Netscape
B__E--M > 0__1--0
regular css imports
.btn {
color: #fff;
background: pink;โ€จ
}
button.css
import './button.css'
css-modules
import styles from './button.css'
.btn {
color: #fff;
background: pink;โ€จ
}
button.css
css-modules
import styles from './button.css'
console.log(styles)
> {
โ€œbtn": "button_btn_2Yt"
}
.btn {
color: #fff;
background: pink;โ€จ
}
button.css
import React from 'react'
import CSSModules from โ€˜react-css-modules'
import styles from โ€˜./button.cssโ€™
@CSSModules(styles)
const Button = ({ children }) =>
<button styleName=โ€œbtnโ€>
{children}
</button>
React CSS Modules
Buy
.btn {
color: #fff;
background: pink;โ€จ
}
button.css
React CSS Modules
.btn {
color: #fff;
background: pink;โ€จ
}
.button_btn_2Yt {
color: #fff;
background-color: pink;
}
<button class="button_btn_2Yt">
Buy
</button>
browser
import React from 'react'
import CSSModules from โ€˜react-css-modules'
import styles from โ€˜./button.cssโ€™
@CSSModules(styles)
const Button = ({ children }) =>
<button styleName=โ€œbtnโ€>
{children}
</button>
// render
<Button>Buy</Button>
button.css
Buy
DeCSS
.Button {
color: #fff;
background: orange;
}
import React from 'react'
import { Button } from './Button.css'
Button.css
DeCSS
.Button {
color: #fff;
background: orange;
}
import React from 'react'
import { Button } from './Button.css'
const MyButton = ({ children }) => (
<Button tag="button">
{children}
</Button>
)
// render
<MyButton>Buy</MyButton>
Button.css
DeCSS
.Button {
color: #fff;
background: orange;
}
.button_Button_2V6 {
color: #fff;
background: orange;
}
<button class="button_Button_2V6">
Buy
</button>
browser
import React from 'react'
import { Button } from './Button.css'
const MyButton = ({ children }) => (
<Button tag="button">
{children}
</Button>
)
// render
<MyButton>Buy</MyButton>
Button.css
Buy
CSS in React - Will Change Transform
Sharable
CSS in React - Will Change Transform
Bootstrap Nation
122K
2nd largest project on Github
React classNames
<button id="btn">โ€จ
Buyโ€จ
</button>
Buy
HTML
<button id="btn">โ€จ
Buyโ€จ
</button>
$("#btn").click(() => {
// take moneyโ€จ
}
Buy
HTML JavaScript
<button id="btn">โ€จ
Buyโ€จ
</button>
$("#btn").click(() => {
// take moneyโ€จ
}
Buy
HTML JavaScript
<Button onClick="this.takeMoney">โ€จ
Buyโ€จ
</Button>
HTML in JavaScript
Buy
<Button onClick="this.takeMoney">โ€จ
Buyโ€จ
</Button>
HTML in JavaScript
Buy
<button className="btn">โ€จ
Buyโ€จ
</button>
.btn {
color: #fff;
background-color: pink;
}
Buy
HTML CSS
classNames > Components
.glue_to_ui { /** **/ }
Styled Components
Buy
import React from 'react'
import styled from 'styled-components'
Styled Components
Buy
import React from 'react'
import styled from 'styled-components'
const Button = styled.button`
color: #fff;
background-color: pink;
`
Styled Components
Buy
import React from 'react'
import styled from 'styled-components'
const Button = styled.button`
color: #fff;
background-color: pink;
` .ctyFSz {
color: #fff;
background-color: pink;
}
.sc-bdVaJa {
}
<button class="sc-bdVaJa ctyFSzโ€>
Buy
</button>
browser
Buy
// render
<Button>Buy</Button>
Styled Components
Buy
43
// shared-lib
export const Shared = ({ className }) => (
<div className={ className }>Sharing is caring!</div>
)
// our-app
import styled from 'styled-components'
import { Shared } from 'shared-lib'
Styled Components
Buy
44
// shared-lib
export const Shared = ({ className }) => (
<div className={ className }>Sharing is caring!</div>
)
// our-app
import styled from 'styled-components'
import { Shared } from 'shared-lib'
const Wrapped = styled(Shared)`color: pink;`
Styled Components
Buy
45
// shared-lib
export const Shared = ({ className }) => (
<div className={ className }>Sharing is caring!</div>
)
// our-app
import styled from 'styled-components'
import { Shared } from 'shared-lib'
const Wrapped = styled(Shared)`color: pink;`
<Shared />
Sharing is caring!
<Wrapped />
Sharing is caring!
JSON vs CSS
Glamorous
Buy
import React from โ€˜react'
import glamorous from 'glamorous'
Glamorous
Buy
import React from โ€˜react'
import glamorous from 'glamorous'
const Button = glamorous.button({
color: '#fff',
backgroundColor: 'pink'
})
Glamorous
Buy
import React from โ€˜react'
import glamorous from 'glamorous'
const Button = glamorous.button({
color: '#fff',
backgroundColor: 'pink'
}) .css-glamorous-button--1yceljy,
[data-css-glamorous-button--1yceljy] {
color: #fff;
background-color: pink;
}
<button
class="css-glamorous-button--1yceljy">
Button
</button>
browser
Buy
// render
<Button>Buy</Button>
Emotion
Buy
50
import { css } from 'emotion'
const base = css({
fontWeight: 600
})
const child = css`
${base};
color: pink;
background-color: black;
`
<p className={ child }>
Inheriting base styles
</p>
Inheriting base styles
CSS in React - Will Change Transform
Adaptable
53
Styled System
Buy
54
import styled from 'styled-components'
import { width } from 'styled-system'
const Box = styled.div`${width}`
const responsiveWidths = [ 1, 1/2, 1/4 ]
const App = () => (
<Box width={ responsiveWidths }>
100% below smallest breakpoint
50% from next breakpoint up
25% from next breakpoint up
</Box>
)
Styling Layout
Styled System
55
Adapt Styles to App State
Styling State
Styled Components
Buy
56
<Password />
Enter Password
import styled from 'styled-components'
const Input = styled.input`padding: 5px;`
const Password = Input.extend.attrs({
placeholder: 'Enter Passwordโ€™
})
`
border-color: black;
`
<Input />
Styling State
Styled Components
Buy
57
<Password />
Enter Password
import styled from 'styled-components'
const Input = styled.input`padding: 5px;`
const Password = Input.extend.attrs({
placeholder: 'Enter Passwordโ€™
})
`
border-color: ${props => props.error ? 'red' : 'black'};
`
<Password error />
Enter Password
<Input />
DeCSS
.Button {
color: #fff;
background: orange;
}
.Button-danger {
background: red;
}
import React from 'react'
import { Button } from './Button.css'
const MyButton = ({ children, danger }) => (
<Button tag=โ€œbutton" danger={ danger }>
{children}
</Button>
)
Button.css
DeCSS
.Button {
color: #fff;
background: orange;
}
.Button-danger {
background: red;
}
import React from 'react'
import { Button } from './Button.css'
const MyButton = ({ children, danger }) => (
<Button tag=โ€œbutton" danger={ danger }>
{children}
</Button>
)
Button.css
module: {
rules: [
{
test: /.css$/,
use: [
'style-loader',
'decss-loader/react',
'css-loader?modules
]
},
]
}
webpack.config
DeCSS
.Button {
color: #fff;
background: orange;
}
.Button-danger {
background: red;
}
import React from 'react'
import { Button } from './Button.css'
const MyButton = ({ children, danger }) => (
<Button tag="button" danger={ danger }>
{children}
</Button>
)
// render
<MyButton danger>Buy</MyButton>
Button.css
.button_Button_2V6 {
color: #fff;
background: orange;
}
.button_Button-danger_2nt {
background: red;
}
<button class="button_Button-danger_2nt
button_Button_2V6">
Buy
</button>
browser
Buy
Buy
61
Styling Elements
Global Styling
// Emotion
// set color of nav globally
const MyNav = styled(Nav)`
:global(.nav) {
color: pink;
}
`
// set box-sizing on all HTML elements
import { injectGlobal } from 'emotion'
injectGlobal`
* {
box-sizing: border-box;
}
`
/* CSS Modules */
// set color of nav globally
:global .nav {
color: pink;
}
CSS in React - Will Change Transform
Maintainable
dealing with
Dead & Unused CSS
Example Scenario
Buy
65
import './input.css'
const C1 = () => <input className="c1" />
const C2 = () => <input className="c2" />
input.css
.c1 {
padding: 1em;
}
.c2 {
padding: 2em
}
Buy
66
import './input.css'
const C1 = () => <input className="c1" />
const C2 = () => <input className="c2" />
const App = () => <div><C1 /><C2 /></div>
<style type="text/css">
.c1 {
padding: 1em;
}
.c2 {
padding: 2em
}
</style>
input.css
browser
Example Scenario
.c1 {
padding: 1em;
}
.c2 {
padding: 2em
}
Stop Using <C2 />
Buy
67
import './input.css'
const C1 = () => <input className="c1" />
const C2 = () => <input className="c2" />
const App = () => <div><C1 /></div>
.c1 {
padding: 1em;
}
.c2 {
padding: 2em
}
input.css
<style type="text/css">
.c1 {
padding: 1em;
}
.c2 {
padding: 2em
}
</style>
browser
Unused CSS
Buy
68
import './input.css'
const C1 = () => <input className="c1" />
const C2 = () => <input className="c2" />
const App = () => <div><C1 /></div>
input.css
<style type="text/css">
.c1 {
padding: 1em;
}
.c2 {
padding: 2em
}
</style>
browser
.c1 {
padding: 1em;
}
.c2 {
padding: 2em
}
Delete <C2 />
Buy
69
import './input.css'
const C1 = () => <input className="c1" />
const App = () => <div><C1 /></div>
input.css
<style type="text/css">
.c1 {
padding: 1em;
}
.c2 {
padding: 2em
}
</style>
browser
.c1 {
padding: 1em;
}
.c2 {
padding: 2em
}
Dead CSS
Buy
70
import './input.css'
const C1 = () => <input className="c1" />
const App = () => <div><C1 /></div>
input.css
<style type="text/css">
.c1 {
padding: 1em;
}
.c2 {
padding: 2em
}
</style>
browser
.c1 {
padding: 1em;
}
.c2 {
padding: 2em
}
Buy
71
import styled from 'react-emotion'
const C1 = styled.input`padding: 1em`
const C2 = styled.input`padding: 2em`
const App = () => <div><C1 /><C2 /></div>
<style type="text/css" data-emotion="">
.css-1ylegpj-C1 {
padding:1em;
}
.css-12zs2me-C2 {
padding:2em;
}
</style>
App.js
browser
using
Styled Components
Buy
72
import styled from 'react-emotion'
const C1 = styled.input`padding: 1em`
const C2 = styled.input`padding: 2em`
const App = () => <div><C1 /></div>
<style type="text/css" data-emotion="">
.css-1ylegpj-C1 {
padding:1em;
}
</style>
browser
thereโ€™s
No Unused / Dead CSS
Buy
73
import styled from 'react-emotion'
const C1 = styled.input`padding: 1em`
const C2 = styled.input`padding: 2em`
const App = () => <div><C1 /></div>
<style type="text/css" data-emotion="">
.css-1ylegpj-C1 {
padding:1em;
}
</style>
browser
automatic
Critical CSS
74
testing styles using
Snapshots
Buy
75
import React from 'react'
import styled from 'styled-components'
import renderer from 'react-test-renderer'
import 'jest-styled-components'
const Button = styled.button`color: pink;`
testing styles using
Snapshots
Buy
76
import React from 'react'
import styled from 'styled-components'
import renderer from 'react-test-renderer'
import 'jest-styled-components'
const Button = styled.button`color: pink;`
test('Button renders correctly', () => {
const button = renderer.create(<Button />).toJSON()
expect(button).toMatchSnapshot()
expect(button).toHaveStyleRule('color', 'pink')
})
testing styles using
Snapshots
Buy
77
import React from 'react'
import styled from 'styled-components'
import renderer from 'react-test-renderer'
import 'jest-styled-components'
const Button = styled.button`color: pink;`
test('Button renders correctly', () => {
const button = renderer.create(<Button />).toJSON()
expect(button).toMatchSnapshot()
expect(button).toHaveStyleRule('color', 'pink')
})
testing styles using
Snapshots
Buy
78
import React from 'react'
import styled from 'styled-components'
import renderer from 'react-test-renderer'
import 'jest-styled-components'
const Button = styled.button`color: pink;`
test('Button renders correctly', () => {
const button = renderer.create(<Button />).toJSON()
expect(button).toMatchSnapshot()
expect(button).toHaveStyleRule('color', 'pink')
})
testing styles using
Snapshots
exports[`Button renders correctly 1`] = `
.c0 {
color: pink;
}
<button
className="c0"
/>
`;
Button.spec.js.snap
Buy
79
import React from 'react'
import styled from 'styled-components'
import renderer from 'react-test-renderer'
import 'jest-styled-components'
const Button = styled.button`color: pink;`
test('Button renders correctly', () => {
const button = renderer.create(<Button />).toJSON()
expect(button).toMatchSnapshot()
expect(button).toHaveStyleRule('color', 'pink')
})
jest --watch
testing styles using
Snapshots
CSS in React - Will Change Transform
Scaleable
82
Server Side Rendering
CSS in JS
Buy
83
import React from 'react'
import { renderStylesToString } from 'emotion-server'
import { renderToString } from 'react-dom/server
import App from './App'
const html = renderStylesToString(renderToString(<App />))
Server Side Rendering
Buy
84
import React from 'react'
import { renderStylesToString } from 'emotion-server'
import { renderToString } from 'react-dom/server
import App from './App'
const html = renderStylesToString(renderToString(<App />))
<!DOCTYPE html>
<html lang="en">
<body><div id="root"><main data-reactroot=""><div><style data-emotion-
css="66u5jz">.css-66u5jz{padding:1em;}</style><input class="css-66u5jz e1c3ej80"/><style
data-emotion-css="186egwm">.css-186egwm{padding:2em;}</style><input class="css-186egwm
e1c3ej81"/></div></main></div>
<script type="text/javascript" src="/runtime.js"></script><script type="text/javascript"
src="/vendors~main.js"></script><script type="text/javascript" src="/main.js"></script></
body>
</html>
browser
Server Side Rendering
Buy
85
import React from 'react'
import { renderStylesToString } from 'emotion-server'
import { renderToString } from 'react-dom/server
import App from './App'
const html = renderStylesToString(renderToString(<App />))
<!DOCTYPE html>
<html lang="en">
<body><div id="root"><main data-reactroot=""><div><style data-emotion-
css="66u5jz">.css-66u5jz{padding:1em;}</style><input class="css-66u5jz e1c3ej80"/><style
data-emotion-css="186egwm">.css-186egwm{padding:2em;}</style><input class="css-186egwm
e1c3ej81"/></div></main></div>
<script type="text/javascript" src="/runtime.js"></script><script type="text/javascript"
src="/vendors~main.js"></script><script type="text/javascript" src="/main.js"></script></
body>
</html>
browser
Server Side Rendering
Buy
86
import React from 'react'
import { renderStylesToString } from 'emotion-server'
import { renderToString } from 'react-dom/server
import App from './App'
const html = renderStylesToString(renderToString(<App />))
<!DOCTYPE html>
<html lang="en">
<body><div id="root"><main data-reactroot=""><div><style data-emotion-
css="66u5jz">.css-66u5jz{padding:1em;}</style><input class="css-66u5jz e1c3ej80"/><style
data-emotion-css="186egwm">.css-186egwm{padding:2em;}</style><input class="css-186egwm
e1c3ej81"/></div></main></div>
<script type="text/javascript" src="/runtime.js"></script><script type="text/javascript"
src="/vendors~main.js"></script><script type="text/javascript" src="/main.js"></script></
body>
</html>
browser
Server Side Rendering
87
Right To Left Support
CSS in JS
CSS & i18n
Right to Left
88
import rtlCSSJS from 'rtl-css-js'
const styles = {
marginLeft: '50px',
borderLeft: '10px solid black',
background: 'linear-gradient(to left, pink, orange)'
}
const rtl = rtlCSSJS(styles)
console.log(JSON.stringify(rtl, null, ' '))
> {
"marginRight": "2em",
"borderRight": "10px solid black",
"background": "linear-gradient(to right, pink, orange)"
}
CSS & i18n
Right to Left
89
import rtlCSSJS from 'rtl-css-js'
const styles = {
marginLeft: '50px',
borderLeft: '10px solid black',
background: 'linear-gradient(to left, pink, orange)'
}
const rtl = rtlCSSJS(styles)
console.log(JSON.stringify(rtl, null, ' '))
>
{
"marginRight": "2em",
"borderRight": "10px solid black",
"background": "linear-gradient(to right, pink, orange)"
}
Themes
creating
Themes
91
import glamorous, { ThemeProvider } from 'glamorous'
const dark = { color: โ€˜pinkโ€™, background: โ€˜blackโ€™ }
const light = { color: โ€˜blackโ€™, background: โ€˜grayโ€™ }
const Box = glamorous.div(({ theme }) => ({
color: theme.color, background: theme.background;
}))
creating
Themes
92
import glamorous, { ThemeProvider } from 'glamorous'
const dark = { color: โ€˜pinkโ€™, background: โ€˜blackโ€™ }
const light = { color: โ€˜blackโ€™, background: โ€˜grayโ€™ }
const Box = glamorous.div(({ theme }) => ({
color: theme.color, background: theme.background;
}))
export default class App extends Component {
render () {
return(
<ThemeProvider theme={ dark }>
<Box>Theme color</Box>
</ThemeProvider>
)
}
}
creating
Themes
93
import glamorous, { ThemeProvider } from 'glamorous'
const dark = { color: โ€˜pinkโ€™, background: โ€˜blackโ€™ }
const light = { color: โ€˜blackโ€™, background: โ€˜grayโ€™ }
const Box = glamorous.div(({ theme }) => ({
color: theme.color, background: theme.background;
}))
export default class App extends Component {
render () {
return(
<ThemeProvider theme={ dark }>
<Box>Theme color</Box>
</ThemeProvider>
)
}
}
Theme color
creating
Themes
94
import glamorous, { ThemeProvider } from 'glamorous'
const dark = { color: โ€˜pinkโ€™, background: โ€˜blackโ€™ }
const light = { color: โ€˜blackโ€™, background: โ€˜grayโ€™ }
const Box = glamorous.div(({ theme }) => ({
color: theme.color, background: theme.background;
}))
export default class App extends Component {
render () {
return(
<ThemeProvider theme={ light }>
<Box>Theme color</Box>
</ThemeProvider>
)
}
}
Theme color
React Native
CSS in React - Will Change Transform
CSS in React - Will Change Transform
Kent C. Dodds
@kentcdodds
Mark Dalgleish
@markdalgleish
Oleg Isonen
@oleg008
Michele Bertoli
@MicheleBertoli
Tom Raviv
@RavivTom
Bruce Lawson
@brucel
Sunil Pai
@threepointone
Sultan Tarimo
@thysultan
Kye Hohenberger
@tkh44
Patrick Arminio
@patrick91
Phil Pluckthun
@_philpl
Max Stoiber
@mxstbr
Glen Maddern
@glenmaddern
Superpowers CSS in JS LeadersFrameworks
Styled Components
Emotion
Glamorous
Styled System
Glamor
React CSS Modules
Automation
Shareable
Adaptable
Scaleable
Maintainable
Joe Seifi
@joeseifi http://seifi.org https://github.com/joeshub/css-in-react
Christopher Chedeau
@vjeux
DeCSS
Ad

Recommended

2013-06-25 - HTML5 & JavaScript Security
2013-06-25 - HTML5 & JavaScript Security
Johannes Hoppe
ย 
Phoenix for laravel developers
Phoenix for laravel developers
Luiz Messias
ย 
Symfony 4 Workshop - Limenius
Symfony 4 Workshop - Limenius
Ignacio Martรญn
ย 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBenelux
Michelangelo van Dam
ย 
QA for PHP projects
QA for PHP projects
Michelangelo van Dam
ย 
Unit testing with zend framework tek11
Unit testing with zend framework tek11
Michelangelo van Dam
ย 
Zero to SOLID
Zero to SOLID
Vic Metcalfe
ย 
Zf2 how arrays will save your project
Zf2 how arrays will save your project
Michelangelo van Dam
ย 
Curso Symfony - Clase 2
Curso Symfony - Clase 2
Javier Eguiluz
ย 
Data Validation models
Data Validation models
Marcin Czarnecki
ย 
$.Template
$.Template
Dave Furfero
ย 
A dive into Symfony 4
A dive into Symfony 4
Michele Orselli
ย 
Curso Symfony - Clase 4
Curso Symfony - Clase 4
Javier Eguiluz
ย 
Writing DSLs with Parslet - Wicked Good Ruby Conf
Writing DSLs with Parslet - Wicked Good Ruby Conf
Jason Garber
ย 
Wordpress plugin development from Scratch
Wordpress plugin development from Scratch
Ocaka Alfred
ย 
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Ivan Chepurnyi
ย 
Monoids, Store, and Dependency Injection - Abstractions for Spark Streaming Jobs
Monoids, Store, and Dependency Injection - Abstractions for Spark Streaming Jobs
Ryan Weald
ย 
Componentization css angular
Componentization css angular
David Amend
ย 
Google App Engine in 40 minutes (the absolute essentials)
Google App Engine in 40 minutes (the absolute essentials)
Python Ireland
ย 
Os Harris
Os Harris
oscon2007
ย 
Unit testing zend framework apps
Unit testing zend framework apps
Michelangelo van Dam
ย 
Working With The Symfony Admin Generator
Working With The Symfony Admin Generator
John Cleveley
ย 
Leveraging Symfony2 Forms
Leveraging Symfony2 Forms
Bernhard Schussek
ย 
Django quickstart
Django quickstart
Marconi Moreto
ย 
What's new in Rails 2?
What's new in Rails 2?
brynary
ย 
A Phing fairy tale - ConFoo13
A Phing fairy tale - ConFoo13
Stephan Hochdรถrfer
ย 
Demystifying Hooks, Actions & Filters - WordCamp Belfast 2018
Demystifying Hooks, Actions & Filters - WordCamp Belfast 2018
Damien Carbery
ย 
Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13
Stephan Hochdรถrfer
ย 
Building a theming system with React - Matteo Ronchi - Codemotion Amsterdam 2017
Building a theming system with React - Matteo Ronchi - Codemotion Amsterdam 2017
Codemotion
ย 
Front-End Methodologies
Front-End Methodologies
Arash Manteghi
ย 

More Related Content

What's hot (20)

Curso Symfony - Clase 2
Curso Symfony - Clase 2
Javier Eguiluz
ย 
Data Validation models
Data Validation models
Marcin Czarnecki
ย 
$.Template
$.Template
Dave Furfero
ย 
A dive into Symfony 4
A dive into Symfony 4
Michele Orselli
ย 
Curso Symfony - Clase 4
Curso Symfony - Clase 4
Javier Eguiluz
ย 
Writing DSLs with Parslet - Wicked Good Ruby Conf
Writing DSLs with Parslet - Wicked Good Ruby Conf
Jason Garber
ย 
Wordpress plugin development from Scratch
Wordpress plugin development from Scratch
Ocaka Alfred
ย 
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Ivan Chepurnyi
ย 
Monoids, Store, and Dependency Injection - Abstractions for Spark Streaming Jobs
Monoids, Store, and Dependency Injection - Abstractions for Spark Streaming Jobs
Ryan Weald
ย 
Componentization css angular
Componentization css angular
David Amend
ย 
Google App Engine in 40 minutes (the absolute essentials)
Google App Engine in 40 minutes (the absolute essentials)
Python Ireland
ย 
Os Harris
Os Harris
oscon2007
ย 
Unit testing zend framework apps
Unit testing zend framework apps
Michelangelo van Dam
ย 
Working With The Symfony Admin Generator
Working With The Symfony Admin Generator
John Cleveley
ย 
Leveraging Symfony2 Forms
Leveraging Symfony2 Forms
Bernhard Schussek
ย 
Django quickstart
Django quickstart
Marconi Moreto
ย 
What's new in Rails 2?
What's new in Rails 2?
brynary
ย 
A Phing fairy tale - ConFoo13
A Phing fairy tale - ConFoo13
Stephan Hochdรถrfer
ย 
Demystifying Hooks, Actions & Filters - WordCamp Belfast 2018
Demystifying Hooks, Actions & Filters - WordCamp Belfast 2018
Damien Carbery
ย 
Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13
Stephan Hochdรถrfer
ย 
Curso Symfony - Clase 2
Curso Symfony - Clase 2
Javier Eguiluz
ย 
Data Validation models
Data Validation models
Marcin Czarnecki
ย 
$.Template
$.Template
Dave Furfero
ย 
A dive into Symfony 4
A dive into Symfony 4
Michele Orselli
ย 
Curso Symfony - Clase 4
Curso Symfony - Clase 4
Javier Eguiluz
ย 
Writing DSLs with Parslet - Wicked Good Ruby Conf
Writing DSLs with Parslet - Wicked Good Ruby Conf
Jason Garber
ย 
Wordpress plugin development from Scratch
Wordpress plugin development from Scratch
Ocaka Alfred
ย 
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Ivan Chepurnyi
ย 
Monoids, Store, and Dependency Injection - Abstractions for Spark Streaming Jobs
Monoids, Store, and Dependency Injection - Abstractions for Spark Streaming Jobs
Ryan Weald
ย 
Componentization css angular
Componentization css angular
David Amend
ย 
Google App Engine in 40 minutes (the absolute essentials)
Google App Engine in 40 minutes (the absolute essentials)
Python Ireland
ย 
Os Harris
Os Harris
oscon2007
ย 
Unit testing zend framework apps
Unit testing zend framework apps
Michelangelo van Dam
ย 
Working With The Symfony Admin Generator
Working With The Symfony Admin Generator
John Cleveley
ย 
Leveraging Symfony2 Forms
Leveraging Symfony2 Forms
Bernhard Schussek
ย 
Django quickstart
Django quickstart
Marconi Moreto
ย 
What's new in Rails 2?
What's new in Rails 2?
brynary
ย 
Demystifying Hooks, Actions & Filters - WordCamp Belfast 2018
Demystifying Hooks, Actions & Filters - WordCamp Belfast 2018
Damien Carbery
ย 
Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13
Stephan Hochdรถrfer
ย 

Similar to CSS in React - Will Change Transform (20)

Building a theming system with React - Matteo Ronchi - Codemotion Amsterdam 2017
Building a theming system with React - Matteo Ronchi - Codemotion Amsterdam 2017
Codemotion
ย 
Front-End Methodologies
Front-End Methodologies
Arash Manteghi
ย 
Worth the hype - styled components
Worth the hype - styled components
kathrinholzmann
ย 
Building a theming system with React - Matteo Ronchi - Codemotion Rome 2017
Building a theming system with React - Matteo Ronchi - Codemotion Rome 2017
Codemotion
ย 
The road to &lt;๏’…> styled-components: CSS in component-based systems by Max S...
The road to &lt;๏’…> styled-components: CSS in component-based systems by Max S...
React London 2017
ย 
Radoslav Stankov - React Refactoring Patterns
Radoslav Stankov - React Refactoring Patterns
OdessaJS Conf
ย 
Styling components with JavaScript
Styling components with JavaScript
bensmithett
ย 
Liberarsi dai framework con i Web Component.pptx
Liberarsi dai framework con i Web Component.pptx
Massimo Artizzu
ย 
Introduction to css part1
Introduction to css part1
Khem Puthea
ย 
Styling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS Edition
bensmithett
ย 
Joan Leon | Houdini, programando en CSS | Codemotion Madrid 2018
Joan Leon | Houdini, programando en CSS | Codemotion Madrid 2018
Codemotion
ย 
CSS in React
CSS in React
Joe Seifi
ย 
Getting Better at CSS
Getting Better at CSS
selfteachme
ย 
Getting Better at CSS
Getting Better at CSS
selfteachme
ย 
Introduction to CSS and all properties.pptx
Introduction to CSS and all properties.pptx
Neelotpal Dey
ย 
Wrangling the CSS Beast with Sass
Wrangling the CSS Beast with Sass
Rob Friesel
ย 
CSS in React - The Good, The Bad, and The Ugly
CSS in React - The Good, The Bad, and The Ugly
Joe Seifi
ย 
Big Design Conference: CSS3
Big Design Conference: CSS3
Wynn Netherland
ย 
Accelerated Stylesheets
Accelerated Stylesheets
Wynn Netherland
ย 
Doing More With Less
Doing More With Less
David Engel
ย 
Building a theming system with React - Matteo Ronchi - Codemotion Amsterdam 2017
Building a theming system with React - Matteo Ronchi - Codemotion Amsterdam 2017
Codemotion
ย 
Front-End Methodologies
Front-End Methodologies
Arash Manteghi
ย 
Worth the hype - styled components
Worth the hype - styled components
kathrinholzmann
ย 
Building a theming system with React - Matteo Ronchi - Codemotion Rome 2017
Building a theming system with React - Matteo Ronchi - Codemotion Rome 2017
Codemotion
ย 
The road to &lt;๏’…> styled-components: CSS in component-based systems by Max S...
The road to &lt;๏’…> styled-components: CSS in component-based systems by Max S...
React London 2017
ย 
Radoslav Stankov - React Refactoring Patterns
Radoslav Stankov - React Refactoring Patterns
OdessaJS Conf
ย 
Styling components with JavaScript
Styling components with JavaScript
bensmithett
ย 
Liberarsi dai framework con i Web Component.pptx
Liberarsi dai framework con i Web Component.pptx
Massimo Artizzu
ย 
Introduction to css part1
Introduction to css part1
Khem Puthea
ย 
Styling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS Edition
bensmithett
ย 
Joan Leon | Houdini, programando en CSS | Codemotion Madrid 2018
Joan Leon | Houdini, programando en CSS | Codemotion Madrid 2018
Codemotion
ย 
CSS in React
CSS in React
Joe Seifi
ย 
Getting Better at CSS
Getting Better at CSS
selfteachme
ย 
Getting Better at CSS
Getting Better at CSS
selfteachme
ย 
Introduction to CSS and all properties.pptx
Introduction to CSS and all properties.pptx
Neelotpal Dey
ย 
Wrangling the CSS Beast with Sass
Wrangling the CSS Beast with Sass
Rob Friesel
ย 
CSS in React - The Good, The Bad, and The Ugly
CSS in React - The Good, The Bad, and The Ugly
Joe Seifi
ย 
Big Design Conference: CSS3
Big Design Conference: CSS3
Wynn Netherland
ย 
Accelerated Stylesheets
Accelerated Stylesheets
Wynn Netherland
ย 
Doing More With Less
Doing More With Less
David Engel
ย 
Ad

Recently uploaded (20)

Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Puppy jhon
ย 
June Patch Tuesday
June Patch Tuesday
Ivanti
ย 
Powering Multi-Page Web Applications Using Flow Apps and FME Data Streaming
Powering Multi-Page Web Applications Using Flow Apps and FME Data Streaming
Safe Software
ย 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
ย 
cnc-processing-centers-centateq-p-110-en.pdf
cnc-processing-centers-centateq-p-110-en.pdf
AmirStern2
ย 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
ย 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
ย 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
ย 
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Alliance
ย 
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
Fwdays
ย 
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
ย 
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
Safe Software
ย 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
ย 
PyCon SG 25 - Firecracker Made Easy with Python.pdf
PyCon SG 25 - Firecracker Made Easy with Python.pdf
Muhammad Yuga Nugraha
ย 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
ย 
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
ย 
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Safe Software
ย 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
ย 
9-1-1 Addressing: End-to-End Automation Using FME
9-1-1 Addressing: End-to-End Automation Using FME
Safe Software
ย 
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance
ย 
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Puppy jhon
ย 
June Patch Tuesday
June Patch Tuesday
Ivanti
ย 
Powering Multi-Page Web Applications Using Flow Apps and FME Data Streaming
Powering Multi-Page Web Applications Using Flow Apps and FME Data Streaming
Safe Software
ย 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
ย 
cnc-processing-centers-centateq-p-110-en.pdf
cnc-processing-centers-centateq-p-110-en.pdf
AmirStern2
ย 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
ย 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
ย 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
ย 
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Alliance
ย 
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
Fwdays
ย 
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
ย 
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
Safe Software
ย 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
ย 
PyCon SG 25 - Firecracker Made Easy with Python.pdf
PyCon SG 25 - Firecracker Made Easy with Python.pdf
Muhammad Yuga Nugraha
ย 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
ย 
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
ย 
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Safe Software
ย 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
ย 
9-1-1 Addressing: End-to-End Automation Using FME
9-1-1 Addressing: End-to-End Automation Using FME
Safe Software
ย 
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance
ย 
Ad

CSS in React - Will Change Transform

  • 6. @BODY fo(fa=he,si=18) @P co(nu=3,wi=80) (BODY fontSize=normal BGColor=white FGColor=black (H1 fontSize=largest BGColor=red FGColor=white) ) h1.font.size = 24pt 100% h2.font.size = 20pt 40% *LI.prebreak: 0.5 *LI.postbreak: 0.5 *OL.LI.label: 1 *OL*OL.LI.label: A (element H1 (make paragraph font-size: 14pt font-weight: 'bold)) (style a (block #f) ; format as inline phrase (color blue) ; in blue if youโ€™ve got it (click (follow (attval 'href))) ; and on click, follow url LI { VertPos: Top = LeftSib . Actual Bottom; } A { if (getAttribute(self, "href") != "") then fgColor = "blue"; underlineNumber = 1; endif } tags.H1.color = "blue"; tags.p.fontSize = "14pt"; with (tags.H3) { color = "green"; } classes.punk.all.color = "#00FF00" ids.z098y.letterSpacing = "0.3em"
  • 7. RRP @BODY fo(fa=he,si=18) @P co(nu=3,wi=80) PWP (BODY fontSize=normal BGColor=white FGColor=black (H1 fontSize=largest BGColor=red FGColor=white) ) CHSS h1.font.size = 24pt 100% h2.font.size = 20pt 40% RRP *LI.prebreak: 0.5 *LI.postbreak: 0.5 *OL.LI.label: 1 *OL*OL.LI.label: A DSSSL (element H1 (make paragraph font-size: 14pt font-weight: 'bold)) RRP (style a (block #f) ; format as inline phrase (color blue) ; in blue if youโ€™ve got it (click (follow (attval 'href))) ; and on click, follow url PSL LI { VertPos: Top = LeftSib . Actual Bottom; } A { if (getAttribute(self, "href") != "") then fgColor = "blue"; underlineNumber = 1; endif } JSSS tags.H1.color = "blue"; tags.p.fontSize = "14pt"; with (tags.H3) { color = "green"; } classes.punk.all.color = "#00FF00" ids.z098y.letterSpacing = "0.3em" Pre-CSS 1993-1996
  • 12. CSS Modular CSS CSS in JS OOCSS SMACS SUIT BEM ATOMIC ๐Ÿ’„
  • 14. Super Powers of CSS in React - Automation - Sharable - Adaptable - Scalable - Maintainable
  • 15. Giving up Control, actually gives you more control and new Super Powers
  • 18. There are only 2 hard problems in Computer Science: cache invalidation & naming things Phil Karlton from Netscape
  • 20. regular css imports .btn { color: #fff; background: pink;โ€จ } button.css import './button.css'
  • 21. css-modules import styles from './button.css' .btn { color: #fff; background: pink;โ€จ } button.css
  • 22. css-modules import styles from './button.css' console.log(styles) > { โ€œbtn": "button_btn_2Yt" } .btn { color: #fff; background: pink;โ€จ } button.css
  • 23. import React from 'react' import CSSModules from โ€˜react-css-modules' import styles from โ€˜./button.cssโ€™ @CSSModules(styles) const Button = ({ children }) => <button styleName=โ€œbtnโ€> {children} </button> React CSS Modules Buy .btn { color: #fff; background: pink;โ€จ } button.css
  • 24. React CSS Modules .btn { color: #fff; background: pink;โ€จ } .button_btn_2Yt { color: #fff; background-color: pink; } <button class="button_btn_2Yt"> Buy </button> browser import React from 'react' import CSSModules from โ€˜react-css-modules' import styles from โ€˜./button.cssโ€™ @CSSModules(styles) const Button = ({ children }) => <button styleName=โ€œbtnโ€> {children} </button> // render <Button>Buy</Button> button.css Buy
  • 25. DeCSS .Button { color: #fff; background: orange; } import React from 'react' import { Button } from './Button.css' Button.css
  • 26. DeCSS .Button { color: #fff; background: orange; } import React from 'react' import { Button } from './Button.css' const MyButton = ({ children }) => ( <Button tag="button"> {children} </Button> ) // render <MyButton>Buy</MyButton> Button.css
  • 27. DeCSS .Button { color: #fff; background: orange; } .button_Button_2V6 { color: #fff; background: orange; } <button class="button_Button_2V6"> Buy </button> browser import React from 'react' import { Button } from './Button.css' const MyButton = ({ children }) => ( <Button tag="button"> {children} </Button> ) // render <MyButton>Buy</MyButton> Button.css Buy
  • 34. <button id="btn">โ€จ Buyโ€จ </button> $("#btn").click(() => { // take moneyโ€จ } Buy HTML JavaScript
  • 35. <button id="btn">โ€จ Buyโ€จ </button> $("#btn").click(() => { // take moneyโ€จ } Buy HTML JavaScript
  • 38. <button className="btn">โ€จ Buyโ€จ </button> .btn { color: #fff; background-color: pink; } Buy HTML CSS
  • 40. Styled Components Buy import React from 'react' import styled from 'styled-components'
  • 41. Styled Components Buy import React from 'react' import styled from 'styled-components' const Button = styled.button` color: #fff; background-color: pink; `
  • 42. Styled Components Buy import React from 'react' import styled from 'styled-components' const Button = styled.button` color: #fff; background-color: pink; ` .ctyFSz { color: #fff; background-color: pink; } .sc-bdVaJa { } <button class="sc-bdVaJa ctyFSzโ€> Buy </button> browser Buy // render <Button>Buy</Button>
  • 43. Styled Components Buy 43 // shared-lib export const Shared = ({ className }) => ( <div className={ className }>Sharing is caring!</div> ) // our-app import styled from 'styled-components' import { Shared } from 'shared-lib'
  • 44. Styled Components Buy 44 // shared-lib export const Shared = ({ className }) => ( <div className={ className }>Sharing is caring!</div> ) // our-app import styled from 'styled-components' import { Shared } from 'shared-lib' const Wrapped = styled(Shared)`color: pink;`
  • 45. Styled Components Buy 45 // shared-lib export const Shared = ({ className }) => ( <div className={ className }>Sharing is caring!</div> ) // our-app import styled from 'styled-components' import { Shared } from 'shared-lib' const Wrapped = styled(Shared)`color: pink;` <Shared /> Sharing is caring! <Wrapped /> Sharing is caring!
  • 47. Glamorous Buy import React from โ€˜react' import glamorous from 'glamorous'
  • 48. Glamorous Buy import React from โ€˜react' import glamorous from 'glamorous' const Button = glamorous.button({ color: '#fff', backgroundColor: 'pink' })
  • 49. Glamorous Buy import React from โ€˜react' import glamorous from 'glamorous' const Button = glamorous.button({ color: '#fff', backgroundColor: 'pink' }) .css-glamorous-button--1yceljy, [data-css-glamorous-button--1yceljy] { color: #fff; background-color: pink; } <button class="css-glamorous-button--1yceljy"> Button </button> browser Buy // render <Button>Buy</Button>
  • 50. Emotion Buy 50 import { css } from 'emotion' const base = css({ fontWeight: 600 }) const child = css` ${base}; color: pink; background-color: black; ` <p className={ child }> Inheriting base styles </p> Inheriting base styles
  • 54. Buy 54 import styled from 'styled-components' import { width } from 'styled-system' const Box = styled.div`${width}` const responsiveWidths = [ 1, 1/2, 1/4 ] const App = () => ( <Box width={ responsiveWidths }> 100% below smallest breakpoint 50% from next breakpoint up 25% from next breakpoint up </Box> ) Styling Layout Styled System
  • 55. 55 Adapt Styles to App State
  • 56. Styling State Styled Components Buy 56 <Password /> Enter Password import styled from 'styled-components' const Input = styled.input`padding: 5px;` const Password = Input.extend.attrs({ placeholder: 'Enter Passwordโ€™ }) ` border-color: black; ` <Input />
  • 57. Styling State Styled Components Buy 57 <Password /> Enter Password import styled from 'styled-components' const Input = styled.input`padding: 5px;` const Password = Input.extend.attrs({ placeholder: 'Enter Passwordโ€™ }) ` border-color: ${props => props.error ? 'red' : 'black'}; ` <Password error /> Enter Password <Input />
  • 58. DeCSS .Button { color: #fff; background: orange; } .Button-danger { background: red; } import React from 'react' import { Button } from './Button.css' const MyButton = ({ children, danger }) => ( <Button tag=โ€œbutton" danger={ danger }> {children} </Button> ) Button.css
  • 59. DeCSS .Button { color: #fff; background: orange; } .Button-danger { background: red; } import React from 'react' import { Button } from './Button.css' const MyButton = ({ children, danger }) => ( <Button tag=โ€œbutton" danger={ danger }> {children} </Button> ) Button.css module: { rules: [ { test: /.css$/, use: [ 'style-loader', 'decss-loader/react', 'css-loader?modules ] }, ] } webpack.config
  • 60. DeCSS .Button { color: #fff; background: orange; } .Button-danger { background: red; } import React from 'react' import { Button } from './Button.css' const MyButton = ({ children, danger }) => ( <Button tag="button" danger={ danger }> {children} </Button> ) // render <MyButton danger>Buy</MyButton> Button.css .button_Button_2V6 { color: #fff; background: orange; } .button_Button-danger_2nt { background: red; } <button class="button_Button-danger_2nt button_Button_2V6"> Buy </button> browser Buy
  • 61. Buy 61 Styling Elements Global Styling // Emotion // set color of nav globally const MyNav = styled(Nav)` :global(.nav) { color: pink; } ` // set box-sizing on all HTML elements import { injectGlobal } from 'emotion' injectGlobal` * { box-sizing: border-box; } ` /* CSS Modules */ // set color of nav globally :global .nav { color: pink; }
  • 64. dealing with Dead & Unused CSS
  • 65. Example Scenario Buy 65 import './input.css' const C1 = () => <input className="c1" /> const C2 = () => <input className="c2" /> input.css .c1 { padding: 1em; } .c2 { padding: 2em }
  • 66. Buy 66 import './input.css' const C1 = () => <input className="c1" /> const C2 = () => <input className="c2" /> const App = () => <div><C1 /><C2 /></div> <style type="text/css"> .c1 { padding: 1em; } .c2 { padding: 2em } </style> input.css browser Example Scenario .c1 { padding: 1em; } .c2 { padding: 2em }
  • 67. Stop Using <C2 /> Buy 67 import './input.css' const C1 = () => <input className="c1" /> const C2 = () => <input className="c2" /> const App = () => <div><C1 /></div> .c1 { padding: 1em; } .c2 { padding: 2em } input.css <style type="text/css"> .c1 { padding: 1em; } .c2 { padding: 2em } </style> browser
  • 68. Unused CSS Buy 68 import './input.css' const C1 = () => <input className="c1" /> const C2 = () => <input className="c2" /> const App = () => <div><C1 /></div> input.css <style type="text/css"> .c1 { padding: 1em; } .c2 { padding: 2em } </style> browser .c1 { padding: 1em; } .c2 { padding: 2em }
  • 69. Delete <C2 /> Buy 69 import './input.css' const C1 = () => <input className="c1" /> const App = () => <div><C1 /></div> input.css <style type="text/css"> .c1 { padding: 1em; } .c2 { padding: 2em } </style> browser .c1 { padding: 1em; } .c2 { padding: 2em }
  • 70. Dead CSS Buy 70 import './input.css' const C1 = () => <input className="c1" /> const App = () => <div><C1 /></div> input.css <style type="text/css"> .c1 { padding: 1em; } .c2 { padding: 2em } </style> browser .c1 { padding: 1em; } .c2 { padding: 2em }
  • 71. Buy 71 import styled from 'react-emotion' const C1 = styled.input`padding: 1em` const C2 = styled.input`padding: 2em` const App = () => <div><C1 /><C2 /></div> <style type="text/css" data-emotion=""> .css-1ylegpj-C1 { padding:1em; } .css-12zs2me-C2 { padding:2em; } </style> App.js browser using Styled Components
  • 72. Buy 72 import styled from 'react-emotion' const C1 = styled.input`padding: 1em` const C2 = styled.input`padding: 2em` const App = () => <div><C1 /></div> <style type="text/css" data-emotion=""> .css-1ylegpj-C1 { padding:1em; } </style> browser thereโ€™s No Unused / Dead CSS
  • 73. Buy 73 import styled from 'react-emotion' const C1 = styled.input`padding: 1em` const C2 = styled.input`padding: 2em` const App = () => <div><C1 /></div> <style type="text/css" data-emotion=""> .css-1ylegpj-C1 { padding:1em; } </style> browser automatic Critical CSS
  • 75. Buy 75 import React from 'react' import styled from 'styled-components' import renderer from 'react-test-renderer' import 'jest-styled-components' const Button = styled.button`color: pink;` testing styles using Snapshots
  • 76. Buy 76 import React from 'react' import styled from 'styled-components' import renderer from 'react-test-renderer' import 'jest-styled-components' const Button = styled.button`color: pink;` test('Button renders correctly', () => { const button = renderer.create(<Button />).toJSON() expect(button).toMatchSnapshot() expect(button).toHaveStyleRule('color', 'pink') }) testing styles using Snapshots
  • 77. Buy 77 import React from 'react' import styled from 'styled-components' import renderer from 'react-test-renderer' import 'jest-styled-components' const Button = styled.button`color: pink;` test('Button renders correctly', () => { const button = renderer.create(<Button />).toJSON() expect(button).toMatchSnapshot() expect(button).toHaveStyleRule('color', 'pink') }) testing styles using Snapshots
  • 78. Buy 78 import React from 'react' import styled from 'styled-components' import renderer from 'react-test-renderer' import 'jest-styled-components' const Button = styled.button`color: pink;` test('Button renders correctly', () => { const button = renderer.create(<Button />).toJSON() expect(button).toMatchSnapshot() expect(button).toHaveStyleRule('color', 'pink') }) testing styles using Snapshots exports[`Button renders correctly 1`] = ` .c0 { color: pink; } <button className="c0" /> `; Button.spec.js.snap
  • 79. Buy 79 import React from 'react' import styled from 'styled-components' import renderer from 'react-test-renderer' import 'jest-styled-components' const Button = styled.button`color: pink;` test('Button renders correctly', () => { const button = renderer.create(<Button />).toJSON() expect(button).toMatchSnapshot() expect(button).toHaveStyleRule('color', 'pink') }) jest --watch testing styles using Snapshots
  • 83. Buy 83 import React from 'react' import { renderStylesToString } from 'emotion-server' import { renderToString } from 'react-dom/server import App from './App' const html = renderStylesToString(renderToString(<App />)) Server Side Rendering
  • 84. Buy 84 import React from 'react' import { renderStylesToString } from 'emotion-server' import { renderToString } from 'react-dom/server import App from './App' const html = renderStylesToString(renderToString(<App />)) <!DOCTYPE html> <html lang="en"> <body><div id="root"><main data-reactroot=""><div><style data-emotion- css="66u5jz">.css-66u5jz{padding:1em;}</style><input class="css-66u5jz e1c3ej80"/><style data-emotion-css="186egwm">.css-186egwm{padding:2em;}</style><input class="css-186egwm e1c3ej81"/></div></main></div> <script type="text/javascript" src="/runtime.js"></script><script type="text/javascript" src="/vendors~main.js"></script><script type="text/javascript" src="/main.js"></script></ body> </html> browser Server Side Rendering
  • 85. Buy 85 import React from 'react' import { renderStylesToString } from 'emotion-server' import { renderToString } from 'react-dom/server import App from './App' const html = renderStylesToString(renderToString(<App />)) <!DOCTYPE html> <html lang="en"> <body><div id="root"><main data-reactroot=""><div><style data-emotion- css="66u5jz">.css-66u5jz{padding:1em;}</style><input class="css-66u5jz e1c3ej80"/><style data-emotion-css="186egwm">.css-186egwm{padding:2em;}</style><input class="css-186egwm e1c3ej81"/></div></main></div> <script type="text/javascript" src="/runtime.js"></script><script type="text/javascript" src="/vendors~main.js"></script><script type="text/javascript" src="/main.js"></script></ body> </html> browser Server Side Rendering
  • 86. Buy 86 import React from 'react' import { renderStylesToString } from 'emotion-server' import { renderToString } from 'react-dom/server import App from './App' const html = renderStylesToString(renderToString(<App />)) <!DOCTYPE html> <html lang="en"> <body><div id="root"><main data-reactroot=""><div><style data-emotion- css="66u5jz">.css-66u5jz{padding:1em;}</style><input class="css-66u5jz e1c3ej80"/><style data-emotion-css="186egwm">.css-186egwm{padding:2em;}</style><input class="css-186egwm e1c3ej81"/></div></main></div> <script type="text/javascript" src="/runtime.js"></script><script type="text/javascript" src="/vendors~main.js"></script><script type="text/javascript" src="/main.js"></script></ body> </html> browser Server Side Rendering
  • 87. 87 Right To Left Support CSS in JS
  • 88. CSS & i18n Right to Left 88 import rtlCSSJS from 'rtl-css-js' const styles = { marginLeft: '50px', borderLeft: '10px solid black', background: 'linear-gradient(to left, pink, orange)' } const rtl = rtlCSSJS(styles) console.log(JSON.stringify(rtl, null, ' ')) > { "marginRight": "2em", "borderRight": "10px solid black", "background": "linear-gradient(to right, pink, orange)" }
  • 89. CSS & i18n Right to Left 89 import rtlCSSJS from 'rtl-css-js' const styles = { marginLeft: '50px', borderLeft: '10px solid black', background: 'linear-gradient(to left, pink, orange)' } const rtl = rtlCSSJS(styles) console.log(JSON.stringify(rtl, null, ' ')) > { "marginRight": "2em", "borderRight": "10px solid black", "background": "linear-gradient(to right, pink, orange)" }
  • 91. creating Themes 91 import glamorous, { ThemeProvider } from 'glamorous' const dark = { color: โ€˜pinkโ€™, background: โ€˜blackโ€™ } const light = { color: โ€˜blackโ€™, background: โ€˜grayโ€™ } const Box = glamorous.div(({ theme }) => ({ color: theme.color, background: theme.background; }))
  • 92. creating Themes 92 import glamorous, { ThemeProvider } from 'glamorous' const dark = { color: โ€˜pinkโ€™, background: โ€˜blackโ€™ } const light = { color: โ€˜blackโ€™, background: โ€˜grayโ€™ } const Box = glamorous.div(({ theme }) => ({ color: theme.color, background: theme.background; })) export default class App extends Component { render () { return( <ThemeProvider theme={ dark }> <Box>Theme color</Box> </ThemeProvider> ) } }
  • 93. creating Themes 93 import glamorous, { ThemeProvider } from 'glamorous' const dark = { color: โ€˜pinkโ€™, background: โ€˜blackโ€™ } const light = { color: โ€˜blackโ€™, background: โ€˜grayโ€™ } const Box = glamorous.div(({ theme }) => ({ color: theme.color, background: theme.background; })) export default class App extends Component { render () { return( <ThemeProvider theme={ dark }> <Box>Theme color</Box> </ThemeProvider> ) } } Theme color
  • 94. creating Themes 94 import glamorous, { ThemeProvider } from 'glamorous' const dark = { color: โ€˜pinkโ€™, background: โ€˜blackโ€™ } const light = { color: โ€˜blackโ€™, background: โ€˜grayโ€™ } const Box = glamorous.div(({ theme }) => ({ color: theme.color, background: theme.background; })) export default class App extends Component { render () { return( <ThemeProvider theme={ light }> <Box>Theme color</Box> </ThemeProvider> ) } } Theme color
  • 98. Kent C. Dodds @kentcdodds Mark Dalgleish @markdalgleish Oleg Isonen @oleg008 Michele Bertoli @MicheleBertoli Tom Raviv @RavivTom Bruce Lawson @brucel Sunil Pai @threepointone Sultan Tarimo @thysultan Kye Hohenberger @tkh44 Patrick Arminio @patrick91 Phil Pluckthun @_philpl Max Stoiber @mxstbr Glen Maddern @glenmaddern Superpowers CSS in JS LeadersFrameworks Styled Components Emotion Glamorous Styled System Glamor React CSS Modules Automation Shareable Adaptable Scaleable Maintainable Joe Seifi @joeseifi http://seifi.org https://github.com/joeshub/css-in-react Christopher Chedeau @vjeux DeCSS