UNPKG

@evg-b/evg-tools

Version:

EVG-TOOLS, tools for doc EVG-UI.

187 lines (170 loc) 5.38 kB
import _extends from '@babel/runtime/helpers/extends'; import _slicedToArray from '@babel/runtime/helpers/slicedToArray'; import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties'; import React, { useRef, useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import { withStyles, IconButton, Tooltip, Loader, Scroll } from '@evg-b/evg-ui'; import classNames from 'classnames'; import { Code } from '@evg-b/evg-icons'; import { PrismLight } from 'react-syntax-highlighter'; import jsx from 'react-syntax-highlighter/dist/esm/languages/prism/jsx'; import SyntaxStyle from 'react-syntax-highlighter/dist/esm/styles/prism/okaidia'; PrismLight.registerLanguage('jsx', jsx); var styles = { base: { overflow: 'hidden', display: 'flex', flexDirection: 'column', width: '100%', borderRadius: '10px', border: '1px solid rgba(0,0,0,.1)' }, header: { height: '80px', display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '0 20px', fontSize: '1rem' }, headerLeft: {}, headerRight: { fontSize: '1rem' }, body: { backgroundColor: 'rgba(0,0,0,.05)' }, panelDemo: { display: 'flex', justifyContent: 'center', padding: '20px' }, panelCode: { // userSelect: 'auto', width: '100%', backgroundColor: '#272822' }, styleCodeFix: { display: 'inline-block' } }; var CodeExample = /*#__PURE__*/React.forwardRef(function CodeExample(props, ref) { var classes = props.classes; props.className; props.children; var title = props.title, demo = props.demo, snippet = props.snippet; props.language; var otherProps = _objectWithoutProperties(props, ["classes", "className", "children", "title", "demo", "snippet", "language"]); var CodeExample_ref = useRef(); CodeExample_ref = ref || CodeExample_ref; var observer = useRef(); var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), openCode = _useState2[0], setOpenCode = _useState2[1]; var _useState3 = useState(false), _useState4 = _slicedToArray(_useState3, 2), mountNode = _useState4[0], setMountNode = _useState4[1]; var Syntax_ref = useRef(); var btnCode_ref = useRef(); var snippetPanel = function snippetPanel(snippet) { return /*#__PURE__*/React.createElement("div", { className: classNames(classes.panelCode) }, /*#__PURE__*/React.createElement(Scroll, { autoHide: false, style: { maxHeight: 600 }, ref: Syntax_ref, color: "#FFFFFF" }, /*#__PURE__*/React.createElement(PrismLight, { className: classes.styleCodeFix, language: "jsx", style: SyntaxStyle, customStyle: { margin: 0, fontSize: '.8em' } }, snippet.trim()))); }; useEffect(function () { if (!observer.current) { observer.current = new IntersectionObserver(function (_ref) { var _ref2 = _slicedToArray(_ref, 1), entries = _ref2[0]; entries.isIntersecting ? setMountNode(true) : null; }); observer.current.observe(CodeExample_ref.current); } return function () { return observer.current.disconnect(); }; }, []); return /*#__PURE__*/React.createElement("div", _extends({ className: classes.base, ref: CodeExample_ref }, otherProps), /*#__PURE__*/React.createElement("div", { className: classes.header }, /*#__PURE__*/React.createElement("div", { className: classes.headerLeft }, title), /*#__PURE__*/React.createElement("div", { className: classes.headerRight }, /*#__PURE__*/React.createElement(IconButton, { ref: btnCode_ref, onClick: function onClick() { return setOpenCode(function (prev) { return !prev; }); }, color: openCode ? 'primary' : 'default' }, /*#__PURE__*/React.createElement(Code, null)), /*#__PURE__*/React.createElement(Tooltip, { target: btnCode_ref }, openCode ? 'hide code' : 'show code'))), /*#__PURE__*/React.createElement("div", { className: classes.body }, /*#__PURE__*/React.createElement("div", { className: classes.panelDemo }, mountNode ? demo : /*#__PURE__*/React.createElement(Loader, { color: "primary" }))), openCode && snippetPanel(snippet)); }); CodeExample.propTypes = { /** * Это контент между открывающим и закрывающим тегом компонента. */ children: PropTypes.node, /** * Объект содержит jss стили компонента. */ classes: PropTypes.object, /** * Чтобы указать CSS классы, используйте этот атрибут. */ className: PropTypes.string, /** * title демки. */ title: PropTypes.string, /** * Демка с компонентом. */ demo: PropTypes.node, /** * Исходный код компонента в в виде текста. */ snippet: PropTypes.string, /** * Язык разметки для react-syntax-highlighter. */ language: PropTypes.string }; CodeExample.defaultProps = { title: 'Title', snippet: '', language: 'jsx' }; CodeExample.displayName = 'CodeExampleEVG'; var CodeExample$1 = withStyles(styles)(CodeExample); export default CodeExample$1;