react-storybook-addon-chapters
Version:
React Storybook Chapters addon allows showcasing of multiple components within a story by breaking it down into smaller categories (chapters) and subcategories (sections) for more organizational goodness.
104 lines (91 loc) • 2.62 kB
JSX
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { baseFonts } from '@storybook/components';
import Chapter from './Chapter';
import renderInfoContent from '../utils/info-content';
import theme from '../theme';
const propTypes = {
context: PropTypes.object,
title: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
subtitle: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
info: PropTypes.string,
chapters: PropTypes.arrayOf(PropTypes.object),
addonInfo: PropTypes.object,
sectionOptions: PropTypes.object,
};
const defaultProps = {
context: {},
title: '',
subtitle: '',
info: '',
chapters: [],
};
export const storyStyles = {
story: {
...baseFonts,
},
header: {
marginBottom: 60,
},
title: {
color: theme.grayDarkest,
fontSize: 36,
marginBottom: 10,
},
subtitle: {
color: theme.grayDark,
fontSize: 18,
marginBottom: 20,
marginTop: 0,
},
info: theme.infoStyle,
};
export class StoryDecorator {
static title(title, useTheme) {
return (
<h1 style={useTheme ? storyStyles.title : {}} className="story-title">{title}</h1>
);
}
static subtitle(subtitle, useTheme) {
return (
<span style={useTheme ? storyStyles.subtitle : {}} className="story-subtitle">{subtitle}</span>
);
}
static info(info, useTheme) {
return (
<div style={useTheme ? storyStyles.info : {}} className="story-info">{info}</div>
);
}
static main(header, chapters, useTheme) {
return (
<div style={useTheme ? storyStyles.story : {}} className="story">
<div style={useTheme ? storyStyles.info : {}} className="story-header">{header}</div>
<div className="story-chapters">
{chapters}
</div>
</div>
);
}
}
export default class Story extends Component {
render() {
const {
context, subtitle, title, info, chapters, addonInfo, sectionOptions,
} = this.props;
const { useTheme } = sectionOptions;
const header = (
<div>
{title && StoryDecorator.title(title, useTheme)}
{subtitle && StoryDecorator.subtitle(subtitle, useTheme)}
{info && StoryDecorator.subtitle(renderInfoContent(info), useTheme)}
</div>
);
const renderedChapters = chapters.map((chapter, i) => (
<Chapter key={i} context={context} addonInfo={addonInfo} useTheme={useTheme} {...chapter} />
));
return StoryDecorator.main(header, renderedChapters, useTheme);
}
}
Story.displayName = 'Story';
Story.propTypes = propTypes;
Story.defaultProps = defaultProps;