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

Un nouvel outil, pour de nouveaux besoins