|
| 1 | +import React, { createElement } from 'react' |
| 2 | +import Highlight, { defaultProps } from 'prism-react-renderer' |
| 3 | +import './styles.css' |
| 4 | + |
| 5 | +import addons, { types } from '@storybook/addons' |
| 6 | + |
| 7 | +const ADDON_ID = 'show-vue-markup' |
| 8 | +const PANEL_ID = `${ADDON_ID}/panel` |
| 9 | +export const EVENT_ID = `${ADDON_ID}/markup` |
| 10 | + |
| 11 | +class MarkupPanel extends React.Component { |
| 12 | + state = { markup: '' } |
| 13 | + |
| 14 | + componentDidMount () { |
| 15 | + const { channel } = this.props |
| 16 | + |
| 17 | + channel.on(EVENT_ID, this.onStoryChange) |
| 18 | + } |
| 19 | + |
| 20 | + componentWillUnmount () { |
| 21 | + const { channel } = this.props |
| 22 | + |
| 23 | + channel.off(EVENT_ID, this.onStoryChange) |
| 24 | + } |
| 25 | + |
| 26 | + onStoryChange = ({ markup }) => { |
| 27 | + this.setState({ markup }) |
| 28 | + } |
| 29 | + |
| 30 | + render () { |
| 31 | + const { markup } = this.state |
| 32 | + const { active } = this.props |
| 33 | + |
| 34 | + return active ? createElement(Highlight, { |
| 35 | + ...defaultProps, |
| 36 | + code: markup, |
| 37 | + language: 'html', |
| 38 | + children: ({ className, style, tokens, getLineProps, getTokenProps }) => { |
| 39 | + return createElement('pre', { |
| 40 | + className, |
| 41 | + style, |
| 42 | + }, tokens.map((line, i) => createElement('div', { |
| 43 | + ...getLineProps({ line, key: i }), |
| 44 | + }, line.map((token, key) => createElement('span', { |
| 45 | + ...getTokenProps({ token, key }), |
| 46 | + }))))) |
| 47 | + }, |
| 48 | + }) : null |
| 49 | + } |
| 50 | +} |
| 51 | + |
| 52 | +addons.register(ADDON_ID, () => { |
| 53 | + const channel = addons.getChannel() |
| 54 | + |
| 55 | + addons.add(PANEL_ID, { |
| 56 | + type: types.PANEL, |
| 57 | + title: 'Markup', |
| 58 | + render: ({ active, key }) => createElement(MarkupPanel, { active, key, channel }), |
| 59 | + }) |
| 60 | +}) |
0 commit comments