dev-novel
dev-novel is a clone of the well known storybook.js. It allows you to browse through example of a library. It's less complete than Storybook but works with every JS library, it's not linked to React components exclusively.
![preview](https://github.com/algolia/dev-novel/raw/HEAD/./demo.gif)
Getting started
Installation
Since the project is still private, you will need to clone and build dev-novel by yourself in order to use it in your project:
$ git clone git@github.com:algolia/dev-novel.git
$ cd dev-novel && yarn && yarn link
Then in your project you simply run:
You will also need to provide your own build system, we are not providing an minified/unified build for the moment. So use either webpack, rollup or browserify to start your dev environment.
Usage
- First define your stories:
import { storiesOf } from 'dev-novel'
storiesOf('My first story')
.add('Hello world', (container: HTMLDivElement) => {
const title = document.createElement('h1')
title.innerText = 'Hello world'
container.appendChild(title)
})
- You can add initializers / disposers that runs before and after your story:
This can be useful when you need to provide globals for your story, for instance depending onto another library.
import { registerInitializer, registerDisposer, storiesOf } from 'dev-novel'
registerInitializer(() => {
window._appState = {
user: {
firstName: 'Max',
lastName: 'Tyler'
}
}
})
registerDisposer(() => {
window._appState = undefined
delete window._appState
})
storiesOf('User profile')
.add('Display user fullname', (container: HTMLDivElement) => {
const span = document.createElement('span')
span.innerText = `${window._appState.user.firstName} ${window._appState.user.lastName}`
container.appendChild(span)
})
- Finally start dev-novel UI and open your page:
import { start, storiesOf } from 'dev-novel'
[...]
start({
openAllStories?: boolean
})
Use the ActionLogger
With actions, you can inspect events and log them directly into the page. This is pretty neat when you are manually testing your components.
import { action, registerDisposer, storiesOf } from 'dev-novel'
const eventDisposers = []
registerDisposer(() => { eventDisposers.forEach(disposer => disposer()) })
storiesOf('Button')
.add('click', container => {
const handler = action('button-click')
const button = document.createElement('button')
button.innerText = 'Click me!'
button.addEventListener('click', handler, false)
const disposer = () => button.removeEventListener('click', handler, false)
eventDisposers.push(disposer)
container.appendChild(button)
})
![preview-action-logger](https://github.com/algolia/dev-novel/raw/HEAD/./preview-action-logger.gif)
TODO