react-codepen-editor
Version:
284 lines (259 loc) • 9.97 kB
JavaScript
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var React = require('react');
var React__default = _interopDefault(React);
var prismjs = require('prismjs');
var uuid = _interopDefault(require('react-uuid'));
var Editor = _interopDefault(require('react-simple-code-editor'));
var bs = require('react-icons/bs');
var styledComponents = require('styled-components');
function _taggedTemplateLiteralLoose(strings, raw) {
if (!raw) {
raw = strings.slice(0);
}
strings.raw = raw;
return strings;
}
var colors = [{
'--text': ['rgb(14,20,27)', 'rgb(245,245,245)']
}, {
'--color-gray-500:': ['hsl(225deg, 7%, 60%)', 'hsl(210deg, 8%, 50%)']
}, {
'--color-gray-600:': ['hsl(225deg, 15%, 50%)', 'hsl(210deg, 12%, 55%)']
}, {
'--prism-base': ['#25414e', '#f8f8f2']
}, {
'--prism-background': ['#eeeff1', '#172028']
}, {
'--prism-comment': ['#aabfc9', '#8292a2']
}, {
'--prism-prolog': ['#aabfc9', '#8292a2']
}, {
'--prism-doctype': ['#aabfc9', '#8292a2']
}, {
'--prism-cdata': ['#39adb5', '#8292a2']
}, {
'--prism-punctuation': ['#39adb5', '#f8f8f2']
}, {
'--prism-namespace': ['#90a4ae', '#f8f8f2']
}, {
'--prism-property': ['#0eb6c2', '#f92672']
}, {
'--prism-tag': ['#e53935', '#ee5f93']
}, {
'--prism-constant': ['#7c4dff', '#f92672']
}, {
'--prism-symbol': ['#7c4dff', '#f92672']
}, {
'--prism-deleted': ['#e53935', '#f92672']
}, {
'--prism-boolean': ['#7c4dff', '#f92672']
}, {
'--prism-number': ['#f76d47', '#ae81ff']
}, {
'--prism-selector': ['#17242c', '#a6e22e']
}, {
'--prism-attr-name': ['#1950c2', '#a6e22e']
}, {
'--prism-string': ['#474545', '#e6db74']
}, {
'--prism-char': ['#39adb5', '#a6e22e']
}, {
'--prism-builtin': ['#39adb5', '#a6e22e']
}, {
'--prism-inserted': ['#39adb5', '#a6e22e']
}, {
'--prism-operator': ['#39adb5', '#f8f8f2']
}, {
'--prism-entity': ['#393566', '#f8f8f2']
}, {
'--prism-url': ['#e53935', '#f8f8f2']
}, {
'--prism-variable': ['#e53935', '#fd971f']
}, {
'--prism-atrule': ['#7c4dff', '#e6db74']
}, {
'--prism-attr-value': ['#3c77b1', '#e6db74']
}, {
'--prism-function': ['#ff7c4d', '#e6db74']
}, {
'--prism-class-name': ['#ca3253', '#e46e86']
}, {
'--prism-keyword': ['#0a14f5', '#66d9ef']
}, {
'--prism-regex': ['#6182b8', '#e90']
}, {
'--prism-important': ['#7c4dff', '#fd971f']
}, {
'--playground-top': ['rgb(223, 223, 223)', 'rgb(32, 40, 48)']
}];
var setTheme = function setTheme(theme) {
colors.forEach(function (value) {
document.documentElement.style.setProperty(Object.keys(value)[0], theme === 'light' ? Object.values(value)[0][0] : Object.values(value)[0][1]);
});
};
var _templateObject;
var CreateDynamicStyles = function CreateDynamicStyles(themeTransitionSpeed, mobileQuery) {
return styledComponents.createGlobalStyle(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["\n .td {\n transition: background-color ", "ms;\n }\n @media screen and (max-width: ", "px) {\n .codepen-display {\n flex-direction: column;\n }\n .codepen-editors {\n width: 100%;\n margin: 0;\n }\n .codepen-textareas {\n margin-bottom: 10px;\n } \n .codepen-results {\n width: 100%;\n padding: 10px 10px 6px 10px;\n box-sizing: border-box;\n }\n .codepen-display {\n height: fit-content !important;\n }\n .codepen-iframe-container {\n height: fit-content;\n padding: 0;\n }\n .codepen-results-title {\n padding: 10px 0px;\n }\n }\n"])), themeTransitionSpeed || 0, mobileQuery || 0);
};
function CodepenEditor(_ref) {
var HTML = _ref.HTML,
CSS = _ref.CSS,
JS = _ref.JS,
initial = _ref.initial,
theme = _ref.theme,
resettable = _ref.resettable,
height = _ref.height,
themeTransitionSpeed = _ref.themeTransitionSpeed,
mobileQuery = _ref.mobileQuery;
var DynamicStyles = CreateDynamicStyles(themeTransitionSpeed, mobileQuery);
var _resettable = resettable !== undefined ? resettable : true;
var _useState = React.useState(HTML || ''),
_HTML = _useState[0],
setHTML = _useState[1];
var _useState2 = React.useState(CSS || ''),
_CSS = _useState2[0],
setCSS = _useState2[1];
var _useState3 = React.useState(JS || ''),
_JS = _useState3[0],
setJS = _useState3[1];
var _useState4 = React.useState(initial || 'HTML'),
selected = _useState4[0],
setSelected = _useState4[1];
var iFrameId = uuid();
var _useState5 = React.useState(null),
iFrame = _useState5[0],
setIFrame = _useState5[1];
React.useEffect(function () {
setTheme(theme);
}, [theme]);
React.useEffect(function () {
if (document) {
var frame = document.getElementById('codepen-iframe-' + iFrameId).contentWindow.document;
setIFrame(frame);
writeInFrame(frame, _HTML, _CSS, _JS);
}
}, []);
var resetIFrame = function resetIFrame() {
var resetButton = document.getElementById('codepen-reset-' + iFrameId);
resetButton.classList.add('codepen-reset-active');
setTimeout(function () {
resetButton.classList.remove('codepen-reset-active');
}, 400);
setHTML(HTML || '');
setCSS(CSS || '');
setJS(JS || '');
writeInFrame(iFrame, HTML, CSS, JS);
checkForUndefined();
};
var checkForUndefined = function checkForUndefined() {
var frame = document.getElementById('codepen-iframe-' + iFrameId).contentWindow.document;
if (frame.body.innerHTML.includes('undefined')) {
frame.body.innerHTML = '';
}
};
var writeInFrame = function writeInFrame(frame, HTML, CSS, JS) {
frame.open();
frame.writeln(HTML + '<style>' + CSS + '</style>' + '<script>' + JS + '</script>');
frame.close();
};
var updateTextArea = function updateTextArea(type, val) {
var tmpHTML = _HTML;
var tmpCSS = _CSS;
var tmpJS = _JS;
if (type === 'HTML') {
setHTML(val);
tmpHTML = val;
} else if (type === 'CSS') {
setCSS(val);
tmpCSS = val;
} else if (type === 'JS') {
setJS(val);
tmpJS = val;
}
writeInFrame(iFrame, tmpHTML, tmpCSS, tmpJS);
};
return /*#__PURE__*/React__default.createElement("div", {
className: "codepen"
}, /*#__PURE__*/React__default.createElement(DynamicStyles, null), /*#__PURE__*/React__default.createElement("div", {
className: "codepen-title-flex td"
}, /*#__PURE__*/React__default.createElement("span", {
className: "codepen-title td"
}, "Code playground"), _resettable && /*#__PURE__*/React__default.createElement(bs.BsArrowCounterclockwise, {
id: 'codepen-reset-' + iFrameId,
title: "Reset code",
onClick: resetIFrame,
className: "codepen-reset",
size: 23
})), /*#__PURE__*/React__default.createElement("div", {
style: {
height: height || '350px'
},
className: "codepen-display td"
}, /*#__PURE__*/React__default.createElement("div", {
className: "codepen-editors"
}, /*#__PURE__*/React__default.createElement("div", {
className: "codepen-editor-picker td"
}, /*#__PURE__*/React__default.createElement("button", {
className: "td " + (selected === 'HTML' ? 'codepen-title-selected ' : ''),
onClick: function onClick() {
return setSelected('HTML');
}
}, "HTML"), /*#__PURE__*/React__default.createElement("button", {
className: "td " + (selected === 'CSS' ? 'codepen-title-selected ' : ''),
onClick: function onClick() {
return setSelected('CSS');
}
}, "CSS"), /*#__PURE__*/React__default.createElement("button", {
className: "td " + (selected === 'JS' ? 'codepen-title-selected ' : ''),
onClick: function onClick() {
return setSelected('JS');
}
}, "JS")), /*#__PURE__*/React__default.createElement("div", {
className: "codepen-textareas td"
}, /*#__PURE__*/React__default.createElement("div", {
className: "codepen-editor td " + (selected === 'CSS' ? '' : 'codepen-editor-inactive')
}, selected === 'CSS' && /*#__PURE__*/React__default.createElement(Editor, {
value: _CSS,
onValueChange: function onValueChange(newVal) {
return updateTextArea('CSS', newVal);
},
highlight: function highlight(code) {
return prismjs.highlight(code, prismjs.languages.css);
}
})), /*#__PURE__*/React__default.createElement("div", {
className: "codepen-editor td " + (selected === 'HTML' ? '' : 'codepen-editor-inactive')
}, selected === 'HTML' && /*#__PURE__*/React__default.createElement(Editor, {
value: _HTML,
onValueChange: function onValueChange(newVal) {
return updateTextArea('HTML', newVal);
},
highlight: function highlight(code) {
return prismjs.highlight(code, prismjs.languages.html, 'html');
}
})), /*#__PURE__*/React__default.createElement("div", {
className: "codepen-editor td " + (selected === 'JS' ? '' : 'codepen-editor-inactive')
}, selected === 'JS' && /*#__PURE__*/React__default.createElement(Editor, {
value: _JS,
onValueChange: function onValueChange(newVal) {
return updateTextArea('JS', newVal);
},
highlight: function highlight(code) {
return prismjs.highlight(code, prismjs.languages.js, 'js');
}
})))), /*#__PURE__*/React__default.createElement("div", {
className: "codepen-results td"
}, /*#__PURE__*/React__default.createElement("div", {
className: "codepen-results-title td"
}, "Results"), /*#__PURE__*/React__default.createElement("div", {
className: "codepen-iframe-container td"
}, /*#__PURE__*/React__default.createElement("iframe", {
scrolling: "yes",
title: "react-codepen-editor",
marginWidth: "0",
marginHeight: "0",
className: "td",
id: 'codepen-iframe-' + iFrameId
})))));
}
module.exports = CodepenEditor;
//# sourceMappingURL=index.js.map