CSSinJS
Qu'est ce que le
Cela reste du CSS
Avant tout
Mais publié différemment
import { css, cx } from 'emotion'
const color = 'white'
render(
  <div
    className={css`
      padding: 32px;
      background-color: hotpink;
      font-size: 24px;
      border-radius: 4px;
      &:hover {
        color: ${color};
      }
    `}
  >
    Hover to change color.
  </div>
)De retour en 1990 ?
<div style="margin:30px;">
  <font size="16" color="red"> 
    Ok boomer !  
  </font> 
</div>Séparer la forme du fond ?
Pourquoi "CSSinJS" ?
Cela ne revient pas à utiliser l'attribut style="" ?
oui et non...
import { css, cx } from 'emotion'
const color = 'white'
render(
  <div
    className={css`
      padding: 32px;
      background-color: hotpink;
      font-size: 24px;
      border-radius: 4px;
      &:hover {
        color: ${color};
      }
    `}
  >
    Hover to change color.
  </div>
)<div class="css-1h3ivcl">Hover to change color.</div>
Quel sont les avantages
Par rapport au *.css
Les choses ne se mélangent pas
Portée limitée par défaut
.article {
    border: solid 1px grey;
    padding: 20px;
    color: black;
    background: #FFF;
    box-shadow: 0px 0px 2px rgba(0, 0, 0.2);
}😈 Cet inconvénient peut être limité avec une bonne rigueur de nommage
.article_c287ryX {
    border: solid 1px grey;
    padding: 20px;
    color: black;
    background: #FFF;
    box-shadow: 0px 0px 2px rgba(0, 0, 0.2);
}Comportement plus prévisible
Plus de cascade
<button class="btn background-blue">
    Ceci est un bouton
</button>😈 Cet inconvénient peut être limité avec une bonne rigueur dans l'organisation des classes
const Styles = {
  Button: {
    background: COLORS.red,
    padding: 10
  }
}
function MonComposant ({children}) {
  return <button css={{...Styles.button, background: COLORS.blue}}>
	{children}
  </button>
}Simplification de l'optimisation
Suppression du code "mort"
Un composant non chargé = style non chargé ;)
😿 Des solutions existent mais leur portée est limitée
On peut profiter de l'écosystème JavaScript
C'est du JavaScript
const Styles = {
  Button: {
    background: opacity(COLORS.red),
    padding: 10,
    position: absolute,
    ...inset(0),
    [screen('small')]: {
        padding: 5
    }
  }
}On groupe par fonction, tout est au même endroit
Librairie de composant
function MonComposant ({children}) {
  return <Card depth={2}>
      <Box padding={2}>
        <Title level={2}>Titre de la carte</Title>
        <Text>Une petite description de test pour voir</Text>
        <Button variant="primary">Voir plus de détails</Button>
      </Box>
    </Card>
}Des solutions qui apportent aussi des problèmes
Les inconvénients
Ce n'est pas une solution miracle
Il faut bien décomposer
function MauvaisComposant () {
  return <Box flex color="primary" p={10} shadow="shadow1" bold alignItems="center" typo="heading2">
    Cet élément fait trop de chose
  </Box>
}function MeilleurComposant () {
  return <Card padding={2} depth={1}>
    <Flex center>
    	<Text variant="heading2">Ceci est un text</Text>
    </Flex>
  </Card>
}Pas de standard
Il faut choisir un outil
- JSS
 - Emotion
 - styled-components
 - Aphrodite
 - cxs
 - yocss
 - linaria
 - Radium
 - Styletron
 - ...
 
Couplage fort avec le framework front-end
Beaucoup dépendent de react
Le CSS ne peut pas être mis en cache
Pour le rendu côté serveur
Difficile à inspecter & éditer
Il faut adapter les outils
Comment se comportent les navigateurs ?
Les performances ?
Pour conclure