UNPKG

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.

388 lines (341 loc) 14.1 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.SectionDecorator = exports.sectionStyles = exports.sectionButtonStyles = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _Node = _interopRequireDefault(require("./Node")); var _PropTable = _interopRequireDefault(require("./PropTable")); var _infoContent = _interopRequireDefault(require("../utils/info-content")); var _theme = _interopRequireDefault(require("../theme")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var propTypes = { title: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].object]), subtitle: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].object]), info: _propTypes["default"].string, showSource: _propTypes["default"].bool, showPropTables: _propTypes["default"].bool, propTables: _propTypes["default"].arrayOf(_propTypes["default"].func), children: _propTypes["default"].oneOfType([_propTypes["default"].object, _propTypes["default"].array]).isRequired, allowSourceToggling: _propTypes["default"].bool, allowPropTablesToggling: _propTypes["default"].bool, addonInfo: _propTypes["default"].object.isRequired, useTheme: _propTypes["default"].bool }; var defaultProps = { title: '', subtitle: '', info: '', showSource: true, allowSourceToggling: true, showPropTables: false, allowPropTablesToggling: true, useTheme: false }; var sectionButtonStyles = { backgroundColor: 'transparent', border: "1px solid ".concat(_theme["default"].gray), borderRadius: 3, color: _theme["default"].grayDark, cursor: 'pointer', "float": 'right', marginLeft: 5, padding: '5px 10px' }; exports.sectionButtonStyles = sectionButtonStyles; var sectionStyles = { container: { marginBottom: 100 }, header: { marginBottom: 60 }, title: { color: _theme["default"].grayDarkest, fontSize: 18, marginBottom: 10 }, subtitle: { color: _theme["default"].grayDark, fontSize: 14, marginBottom: 20, marginTop: 0 }, buttonContainer: { height: 15 }, button: sectionButtonStyles, 'button-active': _objectSpread({}, sectionButtonStyles, { backgroundColor: _theme["default"].grayLight, borderColor: _theme["default"].grayLight, color: _theme["default"].grayDark }), info: _theme["default"].infoStyle, componentContainer: { marginBottom: 60 }, subsection: { marginBottom: 60 }, subsectionTitle: { color: _theme["default"].grayDark, fontSize: 12, letterSpacing: 2, textTransform: 'uppercase' }, pre: { fontSize: '.88em', fontFamily: 'Menlo, Monaco, "Courier New", monospace', backgroundColor: 'rgb(250, 250, 250)', padding: '0.5rem', lineHeight: '1.5', overflowX: 'scroll' } }; exports.sectionStyles = sectionStyles; var SectionDecorator = /*#__PURE__*/ function () { function SectionDecorator() { (0, _classCallCheck2["default"])(this, SectionDecorator); } (0, _createClass2["default"])(SectionDecorator, null, [{ key: "main", value: function main(header, component, additional, useTheme) { return _react["default"].createElement("div", { style: useTheme ? sectionStyles.container : {}, className: "section-container" }, header, component, additional); } }, { key: "header", value: function header(_header, useTheme) { return _react["default"].createElement("div", { style: useTheme ? sectionStyles.header : {}, className: "section-header" }, _header); } }, { key: "title", value: function title(_title, useTheme) { return _react["default"].createElement("h3", { style: useTheme ? sectionStyles.title : {}, className: "section-title" }, _title); } }, { key: "subtitle", value: function subtitle(_subtitle, useTheme) { return _react["default"].createElement("p", { style: useTheme ? sectionStyles.subtitle : {}, className: "section-subtitle" }, _subtitle); } }, { key: "component", value: function component(_component, useTheme, decorator) { var decoratedComponent = decorator ? decorator(function () { return _component; }) : _component; return _react["default"].createElement("div", { style: useTheme ? sectionStyles.componentContainer : {}, className: "section-component-container" }, decoratedComponent); } }, { key: "additional", value: function additional(_additional, useTheme) { return _react["default"].createElement("div", { style: useTheme ? sectionStyles.additional : {}, className: "section-additional" }, _additional); } }, { key: "sourceCode", value: function sourceCode(_sourceCode, useTheme) { return _react["default"].createElement("div", { style: useTheme ? sectionStyles.subsection : {}, className: "section-subsection" }, _react["default"].createElement("h4", { style: useTheme ? sectionStyles.subsection.title : {}, className: "section-subsection-title" }, "Source"), _react["default"].createElement("pre", { style: useTheme ? sectionStyles.pre : {}, className: "section-pre" }, _sourceCode)); } }, { key: "propTables", value: function propTables(_propTables, useTheme) { return _react["default"].createElement("div", { style: useTheme ? sectionStyles.subsection : {}, className: "section-subsection" }, _react["default"].createElement("h4", { style: useTheme ? sectionStyles.subsection.title : {}, className: "section-subsection-title" }, "PropTypes"), _propTables); } }, { key: "buttons", value: function buttons(_buttons, useTheme) { return _react["default"].createElement("div", { style: useTheme ? sectionStyles.buttonContainer : {}, className: "section-button-container" }, _buttons); } }, { key: "info", value: function info(infoContent, useTheme) { return _react["default"].createElement("div", { style: useTheme ? sectionStyles.subsection : {}, className: "section-subsection" }, _react["default"].createElement("div", { style: useTheme ? sectionStyles.info : {}, className: "section-info" }, infoContent)); } }]); return SectionDecorator; }(); exports.SectionDecorator = SectionDecorator; var Section = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(Section, _Component); function Section(props) { var _this; (0, _classCallCheck2["default"])(this, Section); _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(Section).call(this, props)); _this.state = { isSourceShown: props.showSource, isPropsTableShown: props.showPropTables }; return _this; } (0, _createClass2["default"])(Section, [{ key: "renderSourceCode", value: function renderSourceCode(useTheme) { var _this2 = this; var _this$props = this.props, addonInfo = _this$props.addonInfo, children = _this$props.children; var sourceCode = _react["default"].Children.map(children, function (root, idx) { return _react["default"].createElement(_Node["default"], (0, _extends2["default"])({ key: idx, depth: 0, node: root }, addonInfo, _this2.props)); }); return SectionDecorator.sourceCode(sourceCode, useTheme); } }, { key: "renderPropTables", value: function renderPropTables(useTheme) { var _this$props2 = this.props, children = _this$props2.children, propTables = _this$props2.propTables; var components = new Map(); if (!children) { return null; } if (propTables) { propTables.forEach(function (component) { components.set(component, true); }); } // Depth-first traverse and collect components. function extract(traverseChildren) { if (!traverseChildren) { return; } if (Array.isArray(traverseChildren)) { traverseChildren.forEach(extract); return; } if (traverseChildren.props && traverseChildren.props.children) { extract(traverseChildren.props.children); } if (typeof traverseChildren === 'string' || typeof traverseChildren.type === 'string') { return; } if (traverseChildren.type && !components.has(traverseChildren.type)) { components.set(traverseChildren.type, true); } } // Extract components from children. extract(children); var componentsList = Array.from(components.keys()); componentsList.sort(function (a, b) { return (a.displayName || a.name) > (b.displayName || b.name); }); var newPropTables = componentsList.map(function (component, i) { return _react["default"].createElement("div", { key: i }, _react["default"].createElement("h5", null, "<", component.displayName || component.name, "> Component"), _react["default"].createElement(_PropTable["default"], { component: component, useTheme: useTheme })); }); if (!newPropTables || newPropTables.length === 0) { return null; } return SectionDecorator.propTables(newPropTables, useTheme); } }, { key: "render", value: function render() { var _this3 = this; var _this$props3 = this.props, title = _this$props3.title, subtitle = _this$props3.subtitle, children = _this$props3.children, info = _this$props3.info, allowPropTablesToggling = _this$props3.allowPropTablesToggling, allowSourceToggling = _this$props3.allowSourceToggling, useTheme = _this$props3.useTheme, decorator = _this$props3.decorator; var showButtonsRow = allowPropTablesToggling || allowSourceToggling; var _this$state = this.state, isPropsTableShown = _this$state.isPropsTableShown, isSourceShown = _this$state.isSourceShown; var header = _react["default"].createElement("div", null, title && SectionDecorator.title(title, useTheme), subtitle && SectionDecorator.subtitle(subtitle, useTheme)); var buttons = [allowPropTablesToggling && _react["default"].createElement("button", { type: "button", key: "allowPropTablesToggling", onClick: function onClick() { _this3.setState({ isPropsTableShown: !_this3.state.isPropsTableShown }); }, style: useTheme ? isPropsTableShown ? sectionStyles['button-active'] : sectionStyles.button : isPropsTableShown ? sectionStyles['button-active'] : sectionStyles.button, className: isPropsTableShown ? 'button-active' : 'button' }, isPropsTableShown ? 'Hide' : 'Show', " Props Table"), allowSourceToggling && _react["default"].createElement("button", { type: "button", key: "allowSourceToggling", onClick: function onClick() { _this3.setState({ isSourceShown: !isSourceShown }); }, style: useTheme ? isSourceShown ? sectionStyles['button-active'] : sectionStyles.button : isSourceShown ? sectionStyles['button-active'] : sectionStyles.button, className: isSourceShown ? 'button-active' : 'button' }, isSourceShown ? 'Hide' : 'Show', " Source")]; var additional = _react["default"].createElement("div", null, info && SectionDecorator.info((0, _infoContent["default"])(info), useTheme), showButtonsRow && SectionDecorator.buttons(buttons, useTheme), isSourceShown && this.renderSourceCode(useTheme), isPropsTableShown && this.renderPropTables(useTheme)); return SectionDecorator.main(SectionDecorator.header(header), SectionDecorator.component(children, useTheme, decorator), SectionDecorator.additional(additional), useTheme); } }]); return Section; }(_react.Component); exports["default"] = Section; Section.displayName = 'Section'; Section.propTypes = propTypes; Section.defaultProps = defaultProps;