1 of 90

Storybook pour votre design system

Un conte de fées ?

2 of 90

Il était une fois...

3 of 90

Fleur Ettwiller

UX Designer

@fleurettwiller

Michèle Legait

Front-end developer

@mlegait

4 of 90

Design System, où en sommes-nous?

6 décembre 2018

5 of 90

Fleur

Michèle

6 of 90

Quels problèmes aujourd'hui?

Une hétérogénéité au sein de l'entreprise

  • des applications multiples

  • développées par des personnes différentes

  • à des moments différents

7 of 90

Design system

+

guidelines globaux

Component library

+

Sandbox

Styleguide

guidelines

8 of 90

Produit

Communauté

Contributeurs

Champions

Utilisateurs

Sponsors

9 of 90

Process

Client

Concepteurs

(Sketch+

guidelines)

Développeurs

(Code)

DS comité

(Validation)

Application

Design System

10 of 90

Organisation

Equipe transverse

Equipe dédiée

on va plus vite

moins intégré à la vie des équipes

plus de risques de faire un produit fantôme

on couvre plus de besoins

plus de gens sensibilisés

besoin de plus de coordination

contributeurs à temps partiel

11 of 90

Maxime

12 of 90

  • cohérence d'ensemble
  • efficacité
  • référentiel commun
  • identité de marque
  • valeurs d'entreprise

Bénéfices

UX / Produit

13 of 90

Bénéfices

techniques

  • Gain de temps

  • Qualité d'ensemble

  • Maintenabilité

  • Réduction des efforts de QA
  • Réduction de la dette technique

  • Migration simplifiée

14 of 90

Est-ce que c'est pour moi?

Pourquoi pas

Tout à fait!

Certainement

1 appli / 1 techno

plusieurs applis / 1 techno

plusieurs applis / plusieurs technos

15 of 90

Quelques exemples...

16 of 90

  • Pages éditoriales globales
  • Intégration des ressources
  • Guidelines par composant
  • Design token
  • Navigation structurée
  • Progression des tickets
  • Updates / changelog
  • Différentes technos

17 of 90

Euuuh ...

Ma boite n’acceptera jamais de

développer un outil maison pour

toute la partie documentation 😞

18 of 90

Nouvel addon @storybook/addon-docs

Storybook makes it dead simple

to create design systems

04/2019

19 of 90

20 of 90

Un front-end moderne est un assemblage de composants

Un conte de fées ?

21 of 90

Les composants introduisent de nouveaux défis

nouvelles galères

Un (très) grand nombre de

composants

Un (encore plus) grand nombre de

uses cases, situations et états

22 of 90

Storybook provides a sandbox to build UI components in isolation so you can develop hard-to-reach states and edge cases.

A frontend tool for building components faster and easier

23 of 90

Catalogue des composants

Addons

“Sandbox”

24 of 90

Storybook vit à côté de votre application

Application

Utilise les composants

Bibliothèque de composants

Tous les composants UI

Aide à cataloguer et construire les composants

25 of 90

Storybook vit à côté de votre application

> cd components-library

> npx -p @storybook/cli sb init

[...]

> npm run storybook

info @storybook/react v5.2.0

info

info => Loading presets

info => Loading presets

info => Loading custom addons config.

info => Using default Webpack setup.

info => Using base config because react-scripts is not installed.

webpack built 1456fff9d87e56ae7bc3 in 27819ms

╭──────────────────────────╮

│ │

Storybook 5.2.0 started

33 s for manager and 30 s for preview

Local: http://localhost:6006/

On your network: http://172.24.42.4:6006/

│ │

╰──────────────────────────╯

26 of 90

Storybook vit à côté de votre application

Configuration

Stories

import { configure } from '@storybook/react';

// automatically import all files ending in *.stories.js

configure(

require.context('../src', true, /\.stories\.js$/),

module

);

.storybook/config.js

27 of 90

Permet de visualiser les composants de manière isolée

import React from 'react';

import { Button } from './Button';

export default {

title: 'Button',

component: Button,

};

export const primary = () => (

<Button appearance="primary">Primary</Button>

);

export const secondary = () => (

<Button appearance="secondary">Secondary</Button>

);

export const tertiary = () => (

<Button appearance="tertiary">Tertiary</Button>

);

Story

Button.stories.js

28 of 90

Permet d’atteindre des cas d’usages rares

import React from 'react';

import { Button } from './Button';

import { Icon } from './Icon';

export default {

title: 'Button',

component: Button,

};

[...]

export const edgeCase = () => (

<Button appearance="outline"

size="small"

containsIcon

isDisabled>

<Icon icon="link" aria-label="Link" />

Read more

</Button>

);

29 of 90

De nombreux addons pour plus de fonctionnalités

Knobs

Actions

Viewport

Accessibility

+20 disponibles

30 of 90

1ère version stable : 14/09/2019

Docs

Nouvel addon @storybook/addon-docs

31 of 90

C’est parti !!!

32 of 90

React

33 of 90

> npm install @storybook/addon-docs --save-dev

module.exports = ['@storybook/addon-docs/react/preset'];

.storybook/presets.js

1.

2.

Installation du plugin addon-docs

34 of 90

Docs mode

"scripts": {

"storybook": "start-storybook -p 9009 -s public --docs",

"build-storybook": "build-storybook -s public --docs"

},

Nous ne voulons plus de l’onglet Canvas

package.json

35 of 90

Wishlist

#1

Pages éditoriales globales

36 of 90

  • Mise en forme
    • gras / italique
    • lien (externes)
    • titre
    • liste
    • tableau
    • ...
  • Images
  • Liens internes

DOC STATIQUE

37 of 90

38 of 90

39 of 90

import { configure } from '@storybook/react';

// automatically import all files ending in *.stories.js

configure(

require.context('../src', true, /\.stories\.(js|mdx)$/),

module

);

import { Meta } from '@storybook/addon-docs/blocks';

import textStyles1 from '../images/text-styles-1.png';

<Meta title="Get started/Design" />

[...]

## Text styles

Text styles are based on typography rules defined by the [IBM Design Language](https://www.ibm.com/design/lang...).

<img src={textStyles1} alt="Text styles navigation" />

[...]

From the main menu select `Insert → Text Styles → Carbon Design System`

[...]

- The first text style level displays [...]

- The second level shows the [...]

- The third level selects the type color [...]

[...]

Design.stories.mdx

.storybook/config.js

Markdown + JSX

40 of 90

Alors le markdown ok.

Mais il faut déjà que j'ai accès à l'environnement de développement!

Et que j'apprenne à m'en servir... 😅

Euuuh ...

41 of 90

  • Mise en forme
    • gras / italique
    • lien (externes)
    • titre
    • liste
    • tableau
    • ...
  • Images
  • Liens internes

Issue GitHub pour pour faire marcher addon-links et addon-docs ensemble :

https://github.com/storybookjs/storybook/issues/7799

Planifié pour la prochaine release 5.3 🤞

Récapitulons ...

42 of 90

  • Mise en forme plus élaborée que ce que propose Markdown

MISE EN FORME

“AVANCÉE”

43 of 90

44 of 90

45 of 90

Content.stories.mdx

import { CardsGrid, ExampleCard, GRID_GAP_LARGE} from 'design-system-utils';

[...]

<CardsGrid gridGap={GRID_GAP_LARGE}>

<ExampleCard

isCorrect

text="Next, the admin configures access privileges."

caption="Do use active voice when appropriate."

/>

<ExampleCard

text="Next, access privileges are configured by the admin."

caption="Don’t use passive voice when active voice will suffice."

/>

</CardsGrid>

Vous pouvez enrichir la mise en forme avec vos propres composants :

La seule limite,

c’est vous 😉

46 of 90

Wishlist

#2

Intégration des ressources

47 of 90

48 of 90

49 of 90

Resources.stories.mdx

import { CardsGrid, ResourceCard, RESOURCE_TYPE_SKETCH } from 'design-system-utils';

[...]

<CardsGrid>

<ResourceCard

title="White theme"

type={RESOURCE_TYPE_SKETCH}

url="sketch://add-library/cloud/JaVzz"

/>

<ResourceCard

title="Gray 10 theme"

type={RESOURCE_TYPE_SKETCH}

url="sketch://add-library/cloud/Onwv2"

/>

[...]

</CardsGrid>

Il suffit de créer de nouveaux composants :

50 of 90

Wishlist

#3

Guidelines par composants

51 of 90

  • Démos du composant
  • Exemples de code
  • Description des paramètres
  • Guidelines

DOC COMPOSANT

Human touch

52 of 90

53 of 90

54 of 90

55 of 90

DOC AUTOMATIQUE

DOC MANUELLE

“Rien” à faire

  • Commenter les composants
  • Ecrire des stories classiques

Doc statique

+

nouveaux “blocs”

56 of 90

DOC AUTOMATIQUE (DocsPage)

Titre

Sous-titre

Description du composant

Story primaire

(démo + code)

57 of 90

DOC AUTOMATIQUE (DocsPage)

Props

(paramètres du composant)

58 of 90

DOC AUTOMATIQUE (DocsPage)

Autres stories

Libellé

Description

Démo + code

Stories suivantes

59 of 90

DatePicker.js

/**

* Date pickers allow users to select a single or a

* range of dates.

*/

export default class DatePicker extends Component {

[...]

DOC AUTOMATIQUE (DocsPage)

Description du composant

60 of 90

DatePicker.js

DatePicker.propTypes = {

/** `true` to use the short version. */

short: PropTypes.bool,

/** `true` to use the light version. */

light: PropTypes.bool,

/** The date format. */

dateFormat: PropTypes.string,

/** The language locale used to format the

* days of the week, months, and numbers. */

locale: PropTypes.oneOf(['ar', 'at', ...]),

[...]

};

DatePicker.defaultProps = {

short: false,

light: false,

dateFormat: 'm/d/Y',

locale: 'en',

};

DOC AUTOMATIQUE (DocsPage)

Props table

61 of 90

DatePicker.stories.js

export default {

title: 'Components/Date picker',

component: DatePicker,

parameters: {

componentSubtitle: 'Here is a nice subtitle',

},

};

export const primary = () => (

<DatePicker

{...props.datePicker()}

datePickerType="single"

dateFormat={'m/d/Y'}

>

<DatePickerInput {...props.datePickerInput()} />

</DatePicker>

);

DOC AUTOMATIQUE (DocsPage)

Titre

, story primaire

, sous-titre

62 of 90

DatePicker.stories.js

export const simple = () => (

<DatePicker {...props.datePicker()}>

<DatePickerInput

{...props.datePickerInput()} />

</DatePicker>

);

simple.story = {

parameters: {

docs: {

storyDescription: `

**The simple date picker** is a text input without a calendar. [...] The default regex pattern that ships with the simple date picker is \`\d{1,2}/\d{4}\` ('dd/yyyy' for short date [...]

`,

},

},

};

DOC AUTOMATIQUE (DocsPage)

Libellé

, description

, demo + code

63 of 90

DOC MANUELLE (MDX)

DatePicker.stories.mdx

import { Meta, Description, Props, Preview, Story }

from '@storybook/addon-docs/blocks';

import DatePicker from '../../components/DatePicker';

<Meta title="Components/Date picker (MDX)"

component={DatePicker} />

# DatePicker (MDX)

**Here is a nice subtitle**

<Description of="." />

<Preview withToolbar>

<Story id="components-date-picker--primary" />

</Preview>

<Props of="." />

## Stories

### Simple

The simple date picker\*\* is a text input without a calendar...

<Preview>

<Story name="Simple (MDX)">

<DatePicker

id="date-picker"

...

/>

</Story>

</Preview>

64 of 90

DOC AUTOMATIQUE

DOC MANUELLE

  • Démos du composant
  • Exemples de code
  • Description des paramètres
  • Guidelines
  • Démos du composant
  • Exemples de code
  • Description des paramètres
  • Guidelines

Récapitulons ...

65 of 90

Wishlist

#4

Design tokens

66 of 90

  • Groupés par type
  • Nom
  • Rôle
  • Valeur
  • Bonus : Exemple

DESIGN TOKENS

67 of 90

Cette feature n’est pas encore disponible dans addon-docs 😭

MAIS ...

  • On peut construire le tableau manuellement 😢
  • On peut utiliser le plugin storybook-design-token

68 of 90

69 of 90

  • On peut utiliser le plugin storybook-design-token
  • On peut attendre la résolution de cette issue 😐 : https://github.com/storybookjs/storybook/issues/7671
    • L’intégration du plugin ci-dessus dans addon-docs
    • Marche bien mais n’est pas aussi bien intégré 😟

70 of 90

Récapitulons ...

  • Groupés par type
  • Nom
  • Rôle
  • Valeur
  • Bonus : Exemple

71 of 90

Wishlist

#5

Navigation structurée

72 of 90

NAVIGATION

  • Arborescence
  • Ordonnée
  • Bonus : pliable / dépliable

73 of 90

74 of 90

export default {

title: 'Components/Accordion',

component: Accordion,

};

import { configure } from '@storybook/react';

// All stories related to the components

const componentStories = require.context(

'../src/DesignSystem/Components/', true, /\.stories\.(js|mdx)$/);

// We want to force the files to load in a specific order.

const loaderFn = () => [

require('../src/DesignSystem/GetStarted/About.stories.mdx'),

require('../src/DesignSystem/GetStarted/Design.stories.mdx'),

// [...]

// Some magic to load component stories sorted alphabetically

...componentStories.keys().map(filename => componentStories(filename)),

require('../src/DesignSystem/Patterns/Overview.stories.mdx'),

// [...]

];

configure(loaderFn, module);

Accordion.stories.js

.storybook/config.js

Arborescence

ordonnée

75 of 90

Wishlist

#6

Progression des tickets

#7

Updates & changelog

76 of 90

  • Comme d’habitude 😉
    • branches
    • reviews
    • changelog
    • releases
    • ...

RELEASING & VERSIONING

77 of 90

Release

Code source

Design System

"scripts": {

"build-storybook": "build-storybook -s public --docs"

},

package.json

Sketch

Styleguide

Update

Composants

Bibliothèque

à publier sur npm

Storybook

Site statique

à déployer

78 of 90

Wishlist

#8

Différentes technos

79 of 90

  • React
  • Angular
  • Vue
  • Web components
  • ...

MULTI-TECHNOS

80 of 90

Une instance de storybook ne peut gérer qu’une seule techno à la fois.

Main Storybook

addon-docs

Toutes les guidelines

Storybook

classic stories

Storybook

classic stories

Storybook

classic stories

Storybook

classic stories

MAIS …

Il est tout à fait possible d’avoir une instance par techno !

C’est ce que fait

Carbon 😉

...

81 of 90

Demo time !!!

82 of 90

Il était une fois ...

Epilogue

83 of 90

Alors, faire un design system avec Storybook, est-ce uniquement dans les contes de fées?

NON

84 of 90

Storybook c'est top!

  • L'outil répond à la plupart des besoins.

  • Il fait partie de l'environnement de travail habituel des développeurs.

  • Une forte communauté le soutien.

  • De belles perspectives d'évolution à venir.

85 of 90

Démarrer avec un pilote

  • Est-ce qu'on pourra réutiliser des composants de ce pilote ?

  • Est-ce possible à réaliser dans le temps imparti ?

  • Est-ce faisable techniquement ?

  • Est-ce que j'ai du soutien pour lancer ce produit ?

  • Est-ce que ce pilote est vendeur et donne envie d'utiliser un design system ?

Les questions à se poser

86 of 90

Mais gardons en tête...

  • Un design system est un organisme vivant.

  • Qui vit grâce à des sponsors, une communauté et un process intégré.

  • Tous les contributeurs doivent avoir accès à l'environnement de développement.

  • L'open source favorise son adoption

87 of 90

THANK YOU

Questions ?

88 of 90

RESSOURCES

89 of 90

DESIGN SYSTEMS

90 of 90

CREDITS

Template des Slides : https://slidesmania.com/taylor-free-template-powerpoint-google-slides/

Illustrations : https://www.freepik.com/brgfx

Icônes : https://www.flaticon.com/

Polices utilisées : Montserrat and Dancing Script