Initial commit

This commit is contained in:
Evgeny Kochetkov 2017-01-14 18:40:12 +03:00
commit 39c2c3c8b6
12 changed files with 467 additions and 0 deletions

3
.babelrc Normal file
View File

@ -0,0 +1,3 @@
{
"presets": ["es2015", "stage-2", "react"]
}

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.idea
node_modules

1
.npmignore Normal file
View File

@ -0,0 +1 @@
.babelrc

3
.storybook/addons.js Normal file
View File

@ -0,0 +1,3 @@
import '@kadira/storybook/addons';
import '../src/register';

11
.storybook/config.js Normal file
View File

@ -0,0 +1,11 @@
import { configure, setAddon } from '@kadira/storybook'
import staticMarkup from '../src/'
setAddon(staticMarkup) // to use addWithStaticMarkup method
const req = require.context('../example', true, /.story.js$/)
configure(() => {
req.keys().forEach((filename) => req(filename))
}, module)

66
README.md Normal file
View File

@ -0,0 +1,66 @@
# Static Markup addon for [React Storybook](https://github.com/storybooks/react-storybook)
Displays a panel with an "html version" of a story, as suggested in [this](https://github.com/storybooks/react-storybook/issues/617) thread.
### [Live demo](https://evgenykochetkov.github.io/react-storybook-addon-static-markup/)
## Installation
Install the package:
```sh
npm i -D react-storybook-addon-static-markup
```
Then set the addon in your `.storybook/config.js`:
```js
import { configure, setAddon } from '@kadira/storybook'
import staticMarkup from 'react-storybook-addon-static-markup'
setAddon(staticMarkup)
configure(() => {
// ...
}, module)
```
...and register it in your `.storybook/addons.js`:
```js
import '@kadira/storybook/addons';
import 'react-storybook-addon-static-markup/register';
```
## Usage
```js
import React from 'react';
import { storiesOf } from '@kadira/storybook';
import { ShowStaticMarkup } from '../src'
storiesOf('Usage examples', module)
.add(
'with HOC',
() => (
<ShowStaticMarkup>
<button className="foo bar baz">
hello!
</button>
</ShowStaticMarkup>
)
)
.addWithStaticMarkup(
'with a "shortcut" method',
() => (
<div className="foo">
hello
<button className="btn primary">
world!
</button>
</div>
)
)
```

View File

@ -0,0 +1,27 @@
import React from 'react';
import { storiesOf } from '@kadira/storybook';
import { ShowStaticMarkup } from '../src'
storiesOf('Usage examples', module)
.add(
'with HOC',
() => (
<ShowStaticMarkup>
<button className="foo bar baz">
hello!
</button>
</ShowStaticMarkup>
)
)
.addWithStaticMarkup(
'with a "shortcut" method',
() => (
<div className="foo">
hello
<button className="btn primary">
world!
</button>
</div>
)
)

77
index.js Normal file
View File

@ -0,0 +1,77 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ShowStaticMarkup = undefined;
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _storybookAddons = require('@kadira/storybook-addons');
var _storybookAddons2 = _interopRequireDefault(_storybookAddons);
var _server = require('react-dom/server');
var _server2 = _interopRequireDefault(_server);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var ShowStaticMarkup = exports.ShowStaticMarkup = function (_React$Component) {
(0, _inherits3.default)(ShowStaticMarkup, _React$Component);
function ShowStaticMarkup() {
(0, _classCallCheck3.default)(this, ShowStaticMarkup);
return (0, _possibleConstructorReturn3.default)(this, (ShowStaticMarkup.__proto__ || (0, _getPrototypeOf2.default)(ShowStaticMarkup)).apply(this, arguments));
}
(0, _createClass3.default)(ShowStaticMarkup, [{
key: 'render',
value: function render() {
var children = this.props.children;
var markup = _server2.default.renderToStaticMarkup(children);
var channel = _storybookAddons2.default.getChannel();
channel.emit('evgenykochetkov/static-markup/show-markup', markup);
return children;
}
}]);
return ShowStaticMarkup;
}(_react2.default.Component);
exports.default = {
addWithStaticMarkup: function addWithStaticMarkup(storyName, story) {
this.add(storyName, function () {
return _react2.default.createElement(
ShowStaticMarkup,
null,
story()
);
});
}
};

46
package.json Normal file
View File

@ -0,0 +1,46 @@
{
"name": "react-storybook-addon-static-markup",
"version": "0.0.1",
"description": "",
"main": "index.js",
"scripts": {
"storybook": "start-storybook -p 9001 -c .storybook",
"deploy-storybook": "storybook-to-ghpages",
"transpile": "babel --plugins \"transform-runtime\" ./src --out-dir ."
},
"keywords": [
"react",
"storybook",
"react-storybook",
"addon",
"plugin"
],
"author": "Evgeny Kochetkov",
"repository": {
"type": "git",
"url": "https://github.com/evgenykochetkov/react-storybook-addon-static-markup.git"
},
"license": "ISC",
"devDependencies": {
"@kadira/storybook": "^2.33.1",
"@kadira/storybook-deployer": "^1.2.0",
"babel-cli": "^6.18.0",
"babel-core": "^6.18.2",
"babel-plugin-transform-runtime": "^6.15.0",
"babel-polyfill": "^6.16.0",
"babel-preset-es2015": "^6.18.0",
"babel-preset-react": "^6.16.0",
"babel-preset-stage-2": "^6.18.0",
"react": "^15.4.1",
"react-dom": "^15.4.1"
},
"dependencies": {
},
"peerDependencies": {
"react": "^0.14.7 || ^15.0.0",
"react-dom": "^0.14.7 || ^15.0.0"
},
"engines": {
"npm": "^3.0.0"
}
}

132
register.js Normal file
View File

@ -0,0 +1,132 @@
'use strict';
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _storybookAddons = require('@kadira/storybook-addons');
var _storybookAddons2 = _interopRequireDefault(_storybookAddons);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var styles = {
markupPanel: {
margin: 10,
fontFamily: 'monospace',
whiteSpace: 'pre',
fontSize: 14,
color: '#444',
width: '100%',
overflow: 'auto'
}
};
var StaticMarkup = function (_React$Component) {
(0, _inherits3.default)(StaticMarkup, _React$Component);
function StaticMarkup() {
var _ref;
(0, _classCallCheck3.default)(this, StaticMarkup);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var _this = (0, _possibleConstructorReturn3.default)(this, (_ref = StaticMarkup.__proto__ || (0, _getPrototypeOf2.default)(StaticMarkup)).call.apply(_ref, [this].concat(args)));
_this.state = {
markup: ''
};
_this.onShowStaticMarkup = _this.onShowStaticMarkup.bind(_this);
return _this;
}
(0, _createClass3.default)(StaticMarkup, [{
key: 'onShowStaticMarkup',
value: function onShowStaticMarkup(markup) {
this.setState({ markup: markup });
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
var _this2 = this;
var _props = this.props,
channel = _props.channel,
api = _props.api;
channel.on('evgenykochetkov/static-markup/show-markup', this.onShowStaticMarkup);
// Clear the current state on every story change.
this.stopListeningOnStory = api.onStory(function () {
_this2.onShowStaticMarkup('');
});
}
}, {
key: 'render',
value: function render() {
var markup = this.state.markup;
return _react2.default.createElement(
'div',
{ style: styles.markupPanel },
markup
);
}
// This is some cleanup tasks when the StaticMarkup panel is unmounting.
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
if (this.stopListeningOnStory) {
this.stopListeningOnStory();
}
this.unmounted = true;
var _props2 = this.props,
channel = _props2.channel,
api = _props2.api;
channel.removeListener('evgenykochetkov/static-markup/show-markup', this.onShowStaticMarkup);
}
}]);
return StaticMarkup;
}(_react2.default.Component);
// Register the addon with a unique name.
_storybookAddons2.default.register('evgenykochetkov/static-markup', function (api) {
// Also need to set a unique name to the panel.
_storybookAddons2.default.addPanel('evgenykochetkov/static-markup/panel', {
title: 'Static Markup',
render: function render() {
return _react2.default.createElement(StaticMarkup, { channel: _storybookAddons2.default.getChannel(), api: api });
}
});
});

27
src/index.js Normal file
View File

@ -0,0 +1,27 @@
import React from 'react'
import addons from '@kadira/storybook-addons';
import ReactDOMServer from 'react-dom/server'
export class ShowStaticMarkup extends React.Component {
render() {
const { children } = this.props;
const markup = ReactDOMServer.renderToStaticMarkup(children)
const channel = addons.getChannel();
channel.emit('evgenykochetkov/static-markup/show-markup', markup);
return children;
}
}
export default {
addWithStaticMarkup (storyName, story) {
this.add(storyName, () => (
<ShowStaticMarkup>
{ story() }
</ShowStaticMarkup>
))
}
}

72
src/register.js Normal file
View File

@ -0,0 +1,72 @@
import React from 'react';
import addons from '@kadira/storybook-addons';
const styles = {
markupPanel: {
margin: 10,
fontFamily: 'monospace',
whiteSpace: 'pre',
fontSize: 14,
color: '#444',
width: '100%',
overflow: 'auto',
}
};
class StaticMarkup extends React.Component {
constructor(...args) {
super(...args);
this.state = {
markup: ''
};
this.onShowStaticMarkup = this.onShowStaticMarkup.bind(this);
}
onShowStaticMarkup(markup) {
this.setState({markup});
}
componentDidMount() {
const { channel, api } = this.props;
channel.on('evgenykochetkov/static-markup/show-markup', this.onShowStaticMarkup);
// Clear the current state on every story change.
this.stopListeningOnStory = api.onStory(() => {
this.onShowStaticMarkup('');
});
}
render() {
const { markup } = this.state;
return (
<div style={styles.markupPanel}>
{ markup }
</div>
);
}
// This is some cleanup tasks when the StaticMarkup panel is unmounting.
componentWillUnmount() {
if(this.stopListeningOnStory) {
this.stopListeningOnStory();
}
this.unmounted = true;
const { channel, api } = this.props;
channel.removeListener('evgenykochetkov/static-markup/show-markup', this.onShowStaticMarkup);
}
}
// Register the addon with a unique name.
addons.register('evgenykochetkov/static-markup', (api) => {
// Also need to set a unique name to the panel.
addons.addPanel('evgenykochetkov/static-markup/panel', {
title: 'Static Markup',
render: () => (
<StaticMarkup channel={addons.getChannel()} api={api}/>
),
})
})