├── .browserslistrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── LICENSE ├── README.md ├── babel.config.js ├── build └── rollup.config.js ├── dev ├── demo.vue ├── serve.js └── serve.vue ├── dist ├── vue-live-demo.esm.js ├── vue-live-demo.min.js └── vue-live-demo.ssr.js ├── docs ├── css │ ├── app.d2debdf5.css │ └── chunk-vendors.80b6bb14.css ├── index.html └── js │ ├── app.59141d7f.js │ ├── app.59141d7f.js.map │ ├── chunk-vendors.2b114182.js │ └── chunk-vendors.2b114182.js.map ├── package-lock.json ├── package.json ├── src ├── VueLiveDemo.vue ├── VueLiveEditor.vue ├── VueLivePreview.vue └── entry.js └── vue.config.js /.browserslistrc: -------------------------------------------------------------------------------- 1 | current node 2 | last 2 versions and > 2% 3 | ie > 10 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_size = 2 7 | indent_style = space 8 | end_of_line = lf 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | *.js.map 4 | *.d.ts 5 | .yarn 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | firelayer-debug.log* 12 | .cache 13 | .DS_Store 14 | Thumbs.db 15 | docs 16 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: [ 4 | '@indielayer/eslint-config-vue' 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | .cache 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020, Indielayer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | Indielayer 3 | 4 | 5 | > Building digital products and empowering online companies 6 | 7 |
8 | 9 | # Vue Live Demo - SFC Editor 10 | 11 | [![npm (scoped with tag)](https://flat.badgen.net/npm/v/@indielayer/vue-live-demo)](https://npmjs.com/package/@indielayer/vue-live-demo) 12 | [![npm](https://flat.badgen.net/npm/dt/@indielayer/vue-live-demo)](https://npmjs.com/package/@indielayer/vue-live-demo) 13 | 14 | Vue Live Demo used on Indielayer 15 | 16 | DEMO - [https://indielayer.github.io/vue-live-demo/](https://indielayer.github.io/vue-live-demo/) 17 | 18 | ## Getting Started 19 | 20 | Do you want to add to your own projects? There you go: 21 | 22 | 1. Add this package to your dependencies 23 | 24 | ```bash 25 | $ npm i @indielayer/vue-live-demo 26 | # or 27 | $ yarn add @indielayer/vue-live-demo 28 | ``` 29 | 30 | 2. Usage: 31 | 32 | ```html 33 | 44 | 45 | 67 | ``` 68 | 69 | ### Missing features - TODO 70 | 71 | - `import` other scripts in the Single File Component 72 | 73 | 74 | ## License 75 | 76 | [MIT license](https://github.com/indielayer/vue-live-demo/blob/master/LICENSE) - Indielayer 77 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | const devPresets = ['@vue/babel-preset-app'] 2 | const buildPresets = ['@babel/preset-env'] 3 | 4 | module.exports = { 5 | presets: (process.env.NODE_ENV === 'development' ? devPresets : buildPresets) 6 | } 7 | -------------------------------------------------------------------------------- /build/rollup.config.js: -------------------------------------------------------------------------------- 1 | // rollup.config.js 2 | import fs from 'fs' 3 | import path from 'path' 4 | import vue from 'rollup-plugin-vue' 5 | import alias from '@rollup/plugin-alias' 6 | import commonjs from '@rollup/plugin-commonjs' 7 | import replace from '@rollup/plugin-replace' 8 | import babel from 'rollup-plugin-babel' 9 | import { terser } from 'rollup-plugin-terser' 10 | import minimist from 'minimist' 11 | 12 | // Get browserslist config and remove ie from es build targets 13 | const esbrowserslist = fs.readFileSync('./.browserslistrc') 14 | .toString() 15 | .split('\n') 16 | .filter((entry) => entry && entry.substring(0, 2) !== 'ie') 17 | 18 | const argv = minimist(process.argv.slice(2)) 19 | 20 | const projectRoot = path.resolve(__dirname, '..') 21 | 22 | const baseConfig = { 23 | input: 'src/entry.js', 24 | plugins: { 25 | preVue: [ 26 | alias({ 27 | resolve: ['.js', '.jsx', '.ts', '.tsx', '.vue'], 28 | entries: { 29 | '@': path.resolve(projectRoot, 'src') 30 | } 31 | }) 32 | ], 33 | replace: { 34 | 'process.env.NODE_ENV': JSON.stringify('production'), 35 | 'process.env.ES_BUILD': JSON.stringify('false') 36 | }, 37 | vue: { 38 | css: true, 39 | template: { 40 | isProduction: true 41 | } 42 | }, 43 | babel: { 44 | exclude: 'node_modules/**', 45 | extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'] 46 | } 47 | } 48 | } 49 | 50 | // ESM/UMD/IIFE shared settings: externals 51 | // Refer to https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency 52 | const external = [ 53 | // list external dependencies, exactly the way it is written in the import statement. 54 | // eg. 'jquery' 55 | 'vue', 56 | 'vue-template-compiler/browser', 57 | 'codemirror', 58 | '@emmetio/codemirror-plugin', 59 | 'codemirror/lib/codemirror.css', 60 | 'codemirror/theme/monokai.css', 61 | 'codemirror/addon/selection/active-line', 62 | 'codemirror/addon/edit/matchbrackets', 63 | 'codemirror/mode/vue/vue', 64 | 'lodash/debounce' 65 | ] 66 | 67 | // UMD/IIFE shared settings: output.globals 68 | // Refer to https://rollupjs.org/guide/en#output-globals for details 69 | const globals = { 70 | // Provide global variable names to replace your external imports 71 | // eg. jquery: '$' 72 | vue: 'Vue', 73 | 'lodash/debounce': 'debounce', 74 | 'codemirror': 'CodeMirror', 75 | '@emmetio/codemirror-plugin': 'emmet', 76 | 'vue-template-compiler/browser': 'browser' 77 | } 78 | 79 | // Customize configs for individual targets 80 | const buildFormats = [] 81 | 82 | if (!argv.format || argv.format === 'es') { 83 | const esConfig = { 84 | ...baseConfig, 85 | external, 86 | output: { 87 | file: 'dist/vue-live-demo.esm.js', 88 | format: 'esm', 89 | exports: 'named' 90 | }, 91 | plugins: [ 92 | replace({ 93 | ...baseConfig.plugins.replace, 94 | 'process.env.ES_BUILD': JSON.stringify('true') 95 | }), 96 | ...baseConfig.plugins.preVue, 97 | vue(baseConfig.plugins.vue), 98 | babel({ 99 | ...baseConfig.plugins.babel, 100 | presets: [ 101 | [ 102 | '@babel/preset-env', 103 | { 104 | targets: esbrowserslist 105 | } 106 | ] 107 | ] 108 | }), 109 | commonjs() 110 | ] 111 | } 112 | 113 | buildFormats.push(esConfig) 114 | } 115 | 116 | if (!argv.format || argv.format === 'cjs') { 117 | const umdConfig = { 118 | ...baseConfig, 119 | external, 120 | output: { 121 | compact: true, 122 | file: 'dist/vue-live-demo.ssr.js', 123 | format: 'cjs', 124 | name: 'VueLiveDemo', 125 | exports: 'named', 126 | globals 127 | }, 128 | plugins: [ 129 | replace(baseConfig.plugins.replace), 130 | ...baseConfig.plugins.preVue, 131 | vue({ 132 | ...baseConfig.plugins.vue, 133 | template: { 134 | ...baseConfig.plugins.vue.template, 135 | optimizeSSR: true 136 | } 137 | }), 138 | babel(baseConfig.plugins.babel), 139 | commonjs() 140 | ] 141 | } 142 | 143 | buildFormats.push(umdConfig) 144 | } 145 | 146 | if (!argv.format || argv.format === 'iife') { 147 | const unpkgConfig = { 148 | ...baseConfig, 149 | external, 150 | output: { 151 | compact: true, 152 | file: 'dist/vue-live-demo.min.js', 153 | format: 'iife', 154 | name: 'VueLiveDemo', 155 | exports: 'named', 156 | globals 157 | }, 158 | plugins: [ 159 | replace(baseConfig.plugins.replace), 160 | ...baseConfig.plugins.preVue, 161 | vue(baseConfig.plugins.vue), 162 | babel(baseConfig.plugins.babel), 163 | commonjs(), 164 | terser({ 165 | output: { 166 | ecma: 5 167 | } 168 | }) 169 | ] 170 | } 171 | 172 | buildFormats.push(unpkgConfig) 173 | } 174 | 175 | // Export config 176 | export default buildFormats 177 | -------------------------------------------------------------------------------- /dev/demo.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | 22 | 31 | -------------------------------------------------------------------------------- /dev/serve.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Dev from './serve.vue' 3 | 4 | Vue.config.productionTip = false 5 | 6 | new Vue({ 7 | render: (h) => h(Dev) 8 | }).$mount('#app') 9 | -------------------------------------------------------------------------------- /dev/serve.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 31 | 32 | 51 | -------------------------------------------------------------------------------- /dist/vue-live-demo.esm.js: -------------------------------------------------------------------------------- 1 | import CodeMirror from 'codemirror'; 2 | import emmet from '@emmetio/codemirror-plugin'; 3 | import 'codemirror/lib/codemirror.css'; 4 | import 'codemirror/theme/monokai.css'; 5 | import 'codemirror/addon/selection/active-line'; 6 | import 'codemirror/addon/edit/matchbrackets'; 7 | import 'codemirror/mode/vue/vue'; 8 | import debounce from 'lodash/debounce'; 9 | import { parseComponent, compile } from 'vue-template-compiler/browser'; 10 | 11 | // 12 | emmet(CodeMirror); 13 | var script = { 14 | props: { 15 | code: { 16 | type: String, 17 | default: '' 18 | } 19 | }, 20 | 21 | data() { 22 | return { 23 | editor: null, 24 | copyLabel: 'Copy', 25 | originalCode: this.code 26 | }; 27 | }, 28 | 29 | mounted() { 30 | this.editor = CodeMirror.fromTextArea(this.$refs.textarea, { 31 | mode: 'vue', 32 | theme: 'monokai', 33 | value: '', 34 | lineNumbers: true, 35 | lineWrapping: true, 36 | tabSize: 2, 37 | autofocus: false, 38 | line: true, 39 | styleActiveLine: true, 40 | matchBrackets: true, 41 | extraKeys: { 42 | Tab: 'emmetExpandAbbreviation', 43 | Enter: 'emmetInsertLineBreak' 44 | } 45 | }); 46 | this.editor.on('change', debounce(() => { 47 | this.$emit('change', this.editor.getValue()); 48 | }, 400)); 49 | this.editor.setValue(this.code); 50 | }, 51 | 52 | methods: { 53 | copyCode() { 54 | const el = document.createElement('textarea'); 55 | el.value = this.editor.getValue(); 56 | document.body.appendChild(el); 57 | el.select(); 58 | document.execCommand('copy'); 59 | document.body.removeChild(el); 60 | this.copyLabel = 'Copied!'; 61 | setTimeout(() => { 62 | this.copyLabel = 'Copy'; 63 | }, 3000); 64 | }, 65 | 66 | resetCode() { 67 | this.editor.setValue(this.originalCode); 68 | this.$emit('change', this.editor.getValue()); 69 | } 70 | 71 | } 72 | }; 73 | 74 | function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) { 75 | if (typeof shadowMode !== 'boolean') { 76 | createInjectorSSR = createInjector; 77 | createInjector = shadowMode; 78 | shadowMode = false; 79 | } 80 | // Vue.extend constructor export interop. 81 | const options = typeof script === 'function' ? script.options : script; 82 | // render functions 83 | if (template && template.render) { 84 | options.render = template.render; 85 | options.staticRenderFns = template.staticRenderFns; 86 | options._compiled = true; 87 | // functional template 88 | if (isFunctionalTemplate) { 89 | options.functional = true; 90 | } 91 | } 92 | // scopedId 93 | if (scopeId) { 94 | options._scopeId = scopeId; 95 | } 96 | let hook; 97 | if (moduleIdentifier) { 98 | // server build 99 | hook = function (context) { 100 | // 2.3 injection 101 | context = 102 | context || // cached call 103 | (this.$vnode && this.$vnode.ssrContext) || // stateful 104 | (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext); // functional 105 | // 2.2 with runInNewContext: true 106 | if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { 107 | context = __VUE_SSR_CONTEXT__; 108 | } 109 | // inject component styles 110 | if (style) { 111 | style.call(this, createInjectorSSR(context)); 112 | } 113 | // register component module identifier for async chunk inference 114 | if (context && context._registeredComponents) { 115 | context._registeredComponents.add(moduleIdentifier); 116 | } 117 | }; 118 | // used by ssr in case component is cached and beforeCreate 119 | // never gets called 120 | options._ssrRegister = hook; 121 | } 122 | else if (style) { 123 | hook = shadowMode 124 | ? function (context) { 125 | style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot)); 126 | } 127 | : function (context) { 128 | style.call(this, createInjector(context)); 129 | }; 130 | } 131 | if (hook) { 132 | if (options.functional) { 133 | // register for functional component in vue file 134 | const originalRender = options.render; 135 | options.render = function renderWithStyleInjection(h, context) { 136 | hook.call(context); 137 | return originalRender(h, context); 138 | }; 139 | } 140 | else { 141 | // inject component registration as beforeCreate hook 142 | const existing = options.beforeCreate; 143 | options.beforeCreate = existing ? [].concat(existing, hook) : [hook]; 144 | } 145 | } 146 | return script; 147 | } 148 | 149 | const isOldIE = typeof navigator !== 'undefined' && 150 | /msie [6-9]\\b/.test(navigator.userAgent.toLowerCase()); 151 | function createInjector(context) { 152 | return (id, style) => addStyle(id, style); 153 | } 154 | let HEAD; 155 | const styles = {}; 156 | function addStyle(id, css) { 157 | const group = isOldIE ? css.media || 'default' : id; 158 | const style = styles[group] || (styles[group] = { ids: new Set(), styles: [] }); 159 | if (!style.ids.has(id)) { 160 | style.ids.add(id); 161 | let code = css.source; 162 | if (css.map) { 163 | // https://developer.chrome.com/devtools/docs/javascript-debugging 164 | // this makes source maps inside style tags work properly in Chrome 165 | code += '\n/*# sourceURL=' + css.map.sources[0] + ' */'; 166 | // http://stackoverflow.com/a/26603875 167 | code += 168 | '\n/*# sourceMappingURL=data:application/json;base64,' + 169 | btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) + 170 | ' */'; 171 | } 172 | if (!style.element) { 173 | style.element = document.createElement('style'); 174 | style.element.type = 'text/css'; 175 | if (css.media) 176 | style.element.setAttribute('media', css.media); 177 | if (HEAD === undefined) { 178 | HEAD = document.head || document.getElementsByTagName('head')[0]; 179 | } 180 | HEAD.appendChild(style.element); 181 | } 182 | if ('styleSheet' in style.element) { 183 | style.styles.push(code); 184 | style.element.styleSheet.cssText = style.styles 185 | .filter(Boolean) 186 | .join('\n'); 187 | } 188 | else { 189 | const index = style.ids.size - 1; 190 | const textNode = document.createTextNode(code); 191 | const nodes = style.element.childNodes; 192 | if (nodes[index]) 193 | style.element.removeChild(nodes[index]); 194 | if (nodes.length) 195 | style.element.insertBefore(textNode, nodes[index]); 196 | else 197 | style.element.appendChild(textNode); 198 | } 199 | } 200 | } 201 | 202 | /* script */ 203 | const __vue_script__ = script; 204 | /* template */ 205 | 206 | var __vue_render__ = function () { 207 | var _vm = this; 208 | 209 | var _h = _vm.$createElement; 210 | 211 | var _c = _vm._self._c || _h; 212 | 213 | return _c('div', { 214 | staticClass: "editor" 215 | }, [_c('div', { 216 | staticClass: "editor-actions" 217 | }, [_c('button', { 218 | staticClass: "btn-reset", 219 | on: { 220 | "click": _vm.resetCode 221 | } 222 | }, [_vm._v("Reset")]), _vm._v(" "), _c('button', { 223 | on: { 224 | "click": _vm.copyCode 225 | } 226 | }, [_vm._v(_vm._s(_vm.copyLabel))])]), _vm._v(" "), _c('textarea', { 227 | ref: "textarea" 228 | })]); 229 | }; 230 | 231 | var __vue_staticRenderFns__ = []; 232 | /* style */ 233 | 234 | const __vue_inject_styles__ = function (inject) { 235 | if (!inject) return; 236 | inject("data-v-754b1f23_0", { 237 | source: ".CodeMirror{font-family:Consolas,Monaco,\"Andale Mono\",\"Ubuntu Mono\",monospace;font-size:.875rem;font-weight:700;border-radius:6px;background-color:#101c23;flex:1}.CodeMirror-gutters{background-color:#101c23}.CodeMirror-activeline-background{background-color:#050a0d}.CodeMirror-scroll{padding:8px}", 238 | map: undefined, 239 | media: undefined 240 | }), inject("data-v-754b1f23_1", { 241 | source: ".editor[data-v-754b1f23]{position:relative;border-radius:6px;width:100%;display:flex;flex-direction:column}.editor-actions[data-v-754b1f23]{position:absolute;top:-34px;right:0}button[data-v-754b1f23]{text-transform:none;color:#fff;cursor:pointer;border-style:none;height:44px;min-width:78px;padding:0 20px;transition:all .2s;font-size:.875rem;font-weight:700;border-radius:6px;background-color:#282824;margin-left:8px}button[data-v-754b1f23]:focus{outline:0}button[data-v-754b1f23]:hover{transform:translateY(-14px)}button[data-v-754b1f23]:active{transform:translateY(-24px)}.btn-reset[data-v-754b1f23]{background-color:#4a4a45}", 242 | map: undefined, 243 | media: undefined 244 | }); 245 | }; 246 | /* scoped */ 247 | 248 | 249 | const __vue_scope_id__ = "data-v-754b1f23"; 250 | /* module identifier */ 251 | 252 | const __vue_module_identifier__ = undefined; 253 | /* functional template */ 254 | 255 | const __vue_is_functional_template__ = false; 256 | /* style inject SSR */ 257 | 258 | /* style inject shadow dom */ 259 | 260 | const __vue_component__ = /*#__PURE__*/normalizeComponent({ 261 | render: __vue_render__, 262 | staticRenderFns: __vue_staticRenderFns__ 263 | }, __vue_inject_styles__, __vue_script__, __vue_scope_id__, __vue_is_functional_template__, __vue_module_identifier__, false, createInjector, undefined, undefined); 264 | 265 | // 266 | var script$1 = { 267 | errorCaptured(err) { 268 | this.handleError(err); 269 | }, 270 | 271 | props: { 272 | code: { 273 | type: String, 274 | required: true 275 | }, 276 | components: { 277 | type: Object, 278 | default: () => ({}) 279 | } 280 | }, 281 | 282 | data() { 283 | return { 284 | scope: this.generateScope(), 285 | previewedComponent: undefined, 286 | iteration: 0, 287 | error: false 288 | }; 289 | }, 290 | 291 | watch: { 292 | code(value) { 293 | this.renderComponent(value.trim()); 294 | } 295 | 296 | }, 297 | 298 | created() { 299 | this.renderComponent(this.code.trim()); 300 | }, 301 | 302 | methods: { 303 | generateScope() { 304 | return 'v-xxxxxxxx'.replace(/[xy]/g, c => { 305 | const r = Math.random() * 16 | 0; 306 | const v = c === 'x' ? r : r & 0x3 | 0x8; 307 | return v.toString(16); 308 | }); 309 | }, 310 | 311 | scopeStyle(style) { 312 | return style.trim().replace(/(^|\})\s*([^{]+)/g, (m, g1, g2) => { 313 | return g1 ? `${g1} .${this.scope} ${g2}` : `.${this.scope} ${g2}`; 314 | }); 315 | }, 316 | 317 | handleError(e) { 318 | this.error = e.message; 319 | }, 320 | 321 | renderComponent(code) { 322 | let appComponent = {}; 323 | 324 | try { 325 | const parsed = parseComponent(code); 326 | appComponent = { 327 | template: parsed.template ? parsed.template.content : code 328 | }; 329 | 330 | if (parsed.script) { 331 | let { 332 | content 333 | } = parsed.script; // ignore all imports 334 | 335 | content = content.replace(/^import.*$/m, ''); // ignore components property 336 | 337 | content = content.replace(/components:\s?{[\s\S]*?},?/, ''); // eslint-disable-next-line no-eval 338 | 339 | const componentScript = eval(`(function() { ${content.replace('export default', 'return')} })`); // const componentScript = new Function(parsed.script.content.replace('export default', 'return')) 340 | 341 | const componentProperties = componentScript(); // check data() for return object 342 | 343 | if (componentProperties && componentProperties.data && typeof componentProperties.data() !== 'object') componentProperties.data = undefined; 344 | appComponent = Object.assign({ 345 | template: parsed.template.content 346 | }, componentProperties); 347 | } 348 | 349 | if (parsed.styles && parsed.styles.length > 0) { 350 | const styles = parsed.styles.map(s => s.content).join(' '); 351 | 352 | if (!this.elStyle) { 353 | const head = document.head || document.getElementsByTagName('head')[0]; 354 | this.elStyle = document.createElement('style'); 355 | this.elStyle.type = 'text/css'; 356 | head.appendChild(this.elStyle); 357 | } 358 | 359 | this.elStyle.innerHTML = this.scopeStyle(styles); 360 | } 361 | 362 | const { 363 | render, 364 | staticRenderFns 365 | } = compile(appComponent.template); // eslint-disable-next-line no-new-func 366 | 367 | appComponent.render = new Function(render); // eslint-disable-next-line no-new-func 368 | 369 | appComponent.staticRenderFns = staticRenderFns.map(s => new Function(s)); 370 | } catch (e) { 371 | this.handleError(e); 372 | return; 373 | } 374 | 375 | appComponent.components = this.components; 376 | 377 | if (appComponent.template || appComponent.render) { 378 | this.previewedComponent = appComponent; 379 | this.iteration = this.iteration + 1; 380 | this.error = false; 381 | } else { 382 | this.handleError({ 383 | message: 'No template or render function specified' 384 | }); 385 | } 386 | } 387 | 388 | } 389 | }; 390 | 391 | /* script */ 392 | const __vue_script__$1 = script$1; 393 | /* template */ 394 | 395 | var __vue_render__$1 = function () { 396 | var _vm = this; 397 | 398 | var _h = _vm.$createElement; 399 | 400 | var _c = _vm._self._c || _h; 401 | 402 | return _vm.error ? _c('pre', { 403 | class: _vm.$style.error 404 | }, [_vm._v(_vm._s(_vm.error))]) : _vm.previewedComponent ? _c(_vm.previewedComponent, { 405 | key: _vm.iteration, 406 | tag: "component", 407 | class: _vm.scope 408 | }) : _vm._e(); 409 | }; 410 | 411 | var __vue_staticRenderFns__$1 = []; 412 | /* style */ 413 | 414 | const __vue_inject_styles__$1 = function (inject) { 415 | if (!inject) return; 416 | inject("data-v-602b2eea_0", { 417 | source: ".src-error-fOY1{font-family:Consolas,Monaco,\"Andale Mono\",\"Ubuntu Mono\",monospace;font-size:.875rem;color:red;text-align:left;font-weight:700;overflow:auto;white-space:pre-wrap}", 418 | map: undefined, 419 | media: undefined 420 | }); 421 | Object.defineProperty(this, "$style", { 422 | value: { 423 | "error": "src-error-fOY1" 424 | } 425 | }); 426 | }; 427 | /* scoped */ 428 | 429 | 430 | const __vue_scope_id__$1 = undefined; 431 | /* module identifier */ 432 | 433 | const __vue_module_identifier__$1 = undefined; 434 | /* functional template */ 435 | 436 | const __vue_is_functional_template__$1 = false; 437 | /* style inject SSR */ 438 | 439 | /* style inject shadow dom */ 440 | 441 | const __vue_component__$1 = /*#__PURE__*/normalizeComponent({ 442 | render: __vue_render__$1, 443 | staticRenderFns: __vue_staticRenderFns__$1 444 | }, __vue_inject_styles__$1, __vue_script__$1, __vue_scope_id__$1, __vue_is_functional_template__$1, __vue_module_identifier__$1, false, createInjector, undefined, undefined); 445 | 446 | // 447 | var script$2 = { 448 | components: { 449 | VueLiveEditor: __vue_component__, 450 | VueLivePreview: __vue_component__$1 451 | }, 452 | props: { 453 | code: { 454 | type: String, 455 | default: '' 456 | }, 457 | showCode: { 458 | type: Boolean, 459 | default: false 460 | }, 461 | components: { 462 | type: Object, 463 | default: () => ({}) 464 | } 465 | }, 466 | 467 | data() { 468 | return { 469 | previewCode: this.code 470 | }; 471 | } 472 | 473 | }; 474 | 475 | /* script */ 476 | const __vue_script__$2 = script$2; 477 | /* template */ 478 | 479 | var __vue_render__$2 = function () { 480 | var _vm = this; 481 | 482 | var _h = _vm.$createElement; 483 | 484 | var _c = _vm._self._c || _h; 485 | 486 | return _c('div', { 487 | staticClass: "editor-layout" 488 | }, [_c('div', { 489 | staticClass: "editor-preview", 490 | class: { 491 | 'editor-layout-col': _vm.showCode 492 | } 493 | }, [_c('vue-live-preview', { 494 | attrs: { 495 | "code": _vm.previewCode, 496 | "components": _vm.components 497 | } 498 | })], 1), _vm._v(" "), _vm.showCode ? _c('div', { 499 | staticClass: "editor-layout-col editor-code" 500 | }, [_c('vue-live-editor', { 501 | attrs: { 502 | "code": _vm.previewCode 503 | }, 504 | on: { 505 | "change": function (c) { 506 | return _vm.previewCode = c; 507 | } 508 | } 509 | })], 1) : _vm._e()]); 510 | }; 511 | 512 | var __vue_staticRenderFns__$2 = []; 513 | /* style */ 514 | 515 | const __vue_inject_styles__$2 = function (inject) { 516 | if (!inject) return; 517 | inject("data-v-6154bfcc_0", { 518 | source: ".editor-layout[data-v-6154bfcc]{display:flex;width:100%;min-width:0;max-width:100%;flex-direction:column}.editor-preview[data-v-6154bfcc]{width:100%;max-width:100%}.editor-code[data-v-6154bfcc]{margin-top:42px;display:flex}@media (min-width:960px){.editor-layout[data-v-6154bfcc]{flex-direction:row}.editor-layout-col[data-v-6154bfcc]{width:50%;max-width:50%}.editor-code[data-v-6154bfcc]{margin-top:0;margin-left:14px;margin-right:2px}}", 519 | map: undefined, 520 | media: undefined 521 | }); 522 | }; 523 | /* scoped */ 524 | 525 | 526 | const __vue_scope_id__$2 = "data-v-6154bfcc"; 527 | /* module identifier */ 528 | 529 | const __vue_module_identifier__$2 = undefined; 530 | /* functional template */ 531 | 532 | const __vue_is_functional_template__$2 = false; 533 | /* style inject SSR */ 534 | 535 | /* style inject shadow dom */ 536 | 537 | const __vue_component__$2 = /*#__PURE__*/normalizeComponent({ 538 | render: __vue_render__$2, 539 | staticRenderFns: __vue_staticRenderFns__$2 540 | }, __vue_inject_styles__$2, __vue_script__$2, __vue_scope_id__$2, __vue_is_functional_template__$2, __vue_module_identifier__$2, false, createInjector, undefined, undefined); 541 | 542 | // Import vue component 543 | 544 | const install = function installVueLiveDemo(Vue) { 545 | if (install.installed) return; 546 | install.installed = true; 547 | Vue.component('VueLiveDemo', __vue_component__$2); 548 | }; // Create module definition for Vue.use() 549 | // to be registered via Vue.use() as well as Vue.component() 550 | 551 | 552 | __vue_component__$2.install = install; // Export component by default 553 | // also be used as directives, etc. - eg. import { RollupDemoDirective } from 'rollup-demo'; 554 | // export const RollupDemoDirective = component; 555 | 556 | export default __vue_component__$2; 557 | -------------------------------------------------------------------------------- /dist/vue-live-demo.min.js: -------------------------------------------------------------------------------- 1 | var VueLiveDemo=function(exports,CodeMirror,emmet,codemirror_css,monokai_css,activeLine,matchbrackets,vue,debounce,browser){"use strict";CodeMirror=CodeMirror&&Object.prototype.hasOwnProperty.call(CodeMirror,"default")?CodeMirror.default:CodeMirror,emmet=emmet&&Object.prototype.hasOwnProperty.call(emmet,"default")?emmet.default:emmet,debounce=debounce&&Object.prototype.hasOwnProperty.call(debounce,"default")?debounce.default:debounce,emmet(CodeMirror);var script={props:{code:{type:String,default:""}},data:function(){return{editor:null,copyLabel:"Copy",originalCode:this.code}},mounted:function(){var e=this;this.editor=CodeMirror.fromTextArea(this.$refs.textarea,{mode:"vue",theme:"monokai",value:"",lineNumbers:!0,lineWrapping:!0,tabSize:2,autofocus:!1,line:!0,styleActiveLine:!0,matchBrackets:!0,extraKeys:{Tab:"emmetExpandAbbreviation",Enter:"emmetInsertLineBreak"}}),this.editor.on("change",debounce((function(){e.$emit("change",e.editor.getValue())}),400)),this.editor.setValue(this.code)},methods:{copyCode:function(){var e=this,t=document.createElement("textarea");t.value=this.editor.getValue(),document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t),this.copyLabel="Copied!",setTimeout((function(){e.copyLabel="Copy"}),3e3)},resetCode:function(){this.editor.setValue(this.originalCode),this.$emit("change",this.editor.getValue())}}};function normalizeComponent(e,t,o,n,r,i,a,s,c,d){"boolean"!=typeof a&&(c=s,s=a,a=!1);const _="function"==typeof o?o.options:o;let l;if(e&&e.render&&(_.render=e.render,_.staticRenderFns=e.staticRenderFns,_._compiled=!0,r&&(_.functional=!0)),n&&(_._scopeId=n),i?(l=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),t&&t.call(this,c(e)),e&&e._registeredComponents&&e._registeredComponents.add(i)},_._ssrRegister=l):t&&(l=a?function(e){t.call(this,d(e,this.$root.$options.shadowRoot))}:function(e){t.call(this,s(e))}),l)if(_.functional){const e=_.render;_.render=function(t,o){return l.call(o),e(t,o)}}else{const e=_.beforeCreate;_.beforeCreate=e?[].concat(e,l):[l]}return o}const isOldIE="undefined"!=typeof navigator&&/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());function createInjector(e){return(e,t)=>addStyle(e,t)}let HEAD;const styles={};function addStyle(e,t){const o=isOldIE?t.media||"default":e,n=styles[o]||(styles[o]={ids:new Set,styles:[]});if(!n.ids.has(e)){n.ids.add(e);let o=t.source;if(t.map&&(o+="\n/*# sourceURL="+t.map.sources[0]+" */",o+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(t.map))))+" */"),n.element||(n.element=document.createElement("style"),n.element.type="text/css",t.media&&n.element.setAttribute("media",t.media),void 0===HEAD&&(HEAD=document.head||document.getElementsByTagName("head")[0]),HEAD.appendChild(n.element)),"styleSheet"in n.element)n.styles.push(o),n.element.styleSheet.cssText=n.styles.filter(Boolean).join("\n");else{const e=n.ids.size-1,t=document.createTextNode(o),r=n.element.childNodes;r[e]&&n.element.removeChild(r[e]),r.length?n.element.insertBefore(t,r[e]):n.element.appendChild(t)}}}var __vue_script__=script,__vue_render__=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"editor"},[o("div",{staticClass:"editor-actions"},[o("button",{staticClass:"btn-reset",on:{click:e.resetCode}},[e._v("Reset")]),e._v(" "),o("button",{on:{click:e.copyCode}},[e._v(e._s(e.copyLabel))])]),e._v(" "),o("textarea",{ref:"textarea"})])},__vue_staticRenderFns__=[],__vue_inject_styles__=function(e){e&&(e("data-v-754b1f23_0",{source:'.CodeMirror{font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:.875rem;font-weight:700;border-radius:6px;background-color:#101c23;flex:1}.CodeMirror-gutters{background-color:#101c23}.CodeMirror-activeline-background{background-color:#050a0d}.CodeMirror-scroll{padding:8px}',map:void 0,media:void 0}),e("data-v-754b1f23_1",{source:".editor[data-v-754b1f23]{position:relative;border-radius:6px;width:100%;display:flex;flex-direction:column}.editor-actions[data-v-754b1f23]{position:absolute;top:-34px;right:0}button[data-v-754b1f23]{text-transform:none;color:#fff;cursor:pointer;border-style:none;height:44px;min-width:78px;padding:0 20px;transition:all .2s;font-size:.875rem;font-weight:700;border-radius:6px;background-color:#282824;margin-left:8px}button[data-v-754b1f23]:focus{outline:0}button[data-v-754b1f23]:hover{transform:translateY(-14px)}button[data-v-754b1f23]:active{transform:translateY(-24px)}.btn-reset[data-v-754b1f23]{background-color:#4a4a45}",map:void 0,media:void 0}))},__vue_scope_id__="data-v-754b1f23",__vue_module_identifier__=void 0,__vue_is_functional_template__=!1,__vue_component__=normalizeComponent({render:__vue_render__,staticRenderFns:__vue_staticRenderFns__},__vue_inject_styles__,__vue_script__,__vue_scope_id__,__vue_is_functional_template__,__vue_module_identifier__,!1,createInjector,void 0,void 0);function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var script$1={errorCaptured:function(e){this.handleError(e)},props:{code:{type:String,required:!0},components:{type:Object,default:function(){return{}}}},data:function(){return{scope:this.generateScope(),previewedComponent:void 0,iteration:0,error:!1}},watch:{code:function(e){this.renderComponent(e.trim())}},created:function(){this.renderComponent(this.code.trim())},methods:{generateScope:function(){return"v-xxxxxxxx".replace(/[xy]/g,(function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}))},scopeStyle:function(e){var t=this;return e.trim().replace(/(^|\})\s*([^{]+)/g,(function(e,o,n){return o?"".concat(o," .").concat(t.scope," ").concat(n):".".concat(t.scope," ").concat(n)}))},handleError:function(e){this.error=e.message},renderComponent:function renderComponent(code){var appComponent={};try{var parsed=browser.parseComponent(code);if(appComponent={template:parsed.template?parsed.template.content:code},parsed.script){var content=parsed.script.content;content=content.replace(/^import.*$/m,""),content=content.replace(/components:\s?{[\s\S]*?},?/,"");var componentScript=eval("(function() { ".concat(content.replace("export default","return")," })")),componentProperties=componentScript();componentProperties&&componentProperties.data&&"object"!==_typeof(componentProperties.data())&&(componentProperties.data=void 0),appComponent=Object.assign({template:parsed.template.content},componentProperties)}if(parsed.styles&&parsed.styles.length>0){var styles=parsed.styles.map((function(e){return e.content})).join(" ");if(!this.elStyle){var head=document.head||document.getElementsByTagName("head")[0];this.elStyle=document.createElement("style"),this.elStyle.type="text/css",head.appendChild(this.elStyle)}this.elStyle.innerHTML=this.scopeStyle(styles)}var _compile=browser.compile(appComponent.template),render=_compile.render,staticRenderFns=_compile.staticRenderFns;appComponent.render=new Function(render),appComponent.staticRenderFns=staticRenderFns.map((function(e){return new Function(e)}))}catch(e){return void this.handleError(e)}appComponent.components=this.components,appComponent.template||appComponent.render?(this.previewedComponent=appComponent,this.iteration=this.iteration+1,this.error=!1):this.handleError({message:"No template or render function specified"})}}},__vue_script__$1=script$1,__vue_render__$1=function(){var e=this,t=e.$createElement,o=e._self._c||t;return e.error?o("pre",{class:e.$style.error},[e._v(e._s(e.error))]):e.previewedComponent?o(e.previewedComponent,{key:e.iteration,tag:"component",class:e.scope}):e._e()},__vue_staticRenderFns__$1=[],__vue_inject_styles__$1=function(e){e&&(e("data-v-602b2eea_0",{source:'.src-error-fOY1{font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:.875rem;color:red;text-align:left;font-weight:700;overflow:auto;white-space:pre-wrap}',map:void 0,media:void 0}),Object.defineProperty(this,"$style",{value:{error:"src-error-fOY1"}}))},__vue_scope_id__$1=void 0,__vue_module_identifier__$1=void 0,__vue_is_functional_template__$1=!1,__vue_component__$1=normalizeComponent({render:__vue_render__$1,staticRenderFns:__vue_staticRenderFns__$1},__vue_inject_styles__$1,__vue_script__$1,__vue_scope_id__$1,__vue_is_functional_template__$1,__vue_module_identifier__$1,!1,createInjector,void 0,void 0),script$2={components:{VueLiveEditor:__vue_component__,VueLivePreview:__vue_component__$1},props:{code:{type:String,default:""},showCode:{type:Boolean,default:!1},components:{type:Object,default:function(){return{}}}},data:function(){return{previewCode:this.code}}},__vue_script__$2=script$2,__vue_render__$2=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"editor-layout"},[o("div",{staticClass:"editor-preview",class:{"editor-layout-col":e.showCode}},[o("vue-live-preview",{attrs:{code:e.previewCode,components:e.components}})],1),e._v(" "),e.showCode?o("div",{staticClass:"editor-layout-col editor-code"},[o("vue-live-editor",{attrs:{code:e.previewCode},on:{change:function(t){return e.previewCode=t}}})],1):e._e()])},__vue_staticRenderFns__$2=[],__vue_inject_styles__$2=function(e){e&&e("data-v-6154bfcc_0",{source:".editor-layout[data-v-6154bfcc]{display:flex;width:100%;min-width:0;max-width:100%;flex-direction:column}.editor-preview[data-v-6154bfcc]{width:100%;max-width:100%}.editor-code[data-v-6154bfcc]{margin-top:42px;display:flex}@media (min-width:960px){.editor-layout[data-v-6154bfcc]{flex-direction:row}.editor-layout-col[data-v-6154bfcc]{width:50%;max-width:50%}.editor-code[data-v-6154bfcc]{margin-top:0;margin-left:14px;margin-right:2px}}",map:void 0,media:void 0})},__vue_scope_id__$2="data-v-6154bfcc",__vue_module_identifier__$2=void 0,__vue_is_functional_template__$2=!1,__vue_component__$2=normalizeComponent({render:__vue_render__$2,staticRenderFns:__vue_staticRenderFns__$2},__vue_inject_styles__$2,__vue_script__$2,__vue_scope_id__$2,__vue_is_functional_template__$2,__vue_module_identifier__$2,!1,createInjector,void 0,void 0),install=function(e){install.installed||(install.installed=!0,e.component("VueLiveDemo",__vue_component__$2))},plugin={install:install},GlobalVue=null;return"undefined"!=typeof window?GlobalVue=window.Vue:"undefined"!=typeof global&&(GlobalVue=global.Vue),GlobalVue&&GlobalVue.use(plugin),__vue_component__$2.install=install,exports.default=__vue_component__$2,exports}({},CodeMirror,emmet,null,null,null,null,null,debounce,browser); -------------------------------------------------------------------------------- /dist/vue-live-demo.ssr.js: -------------------------------------------------------------------------------- 1 | 'use strict';Object.defineProperty(exports,'__esModule',{value:true});function _interopDefault(e){return(e&&(typeof e==='object')&&'default'in e)?e['default']:e}var CodeMirror=_interopDefault(require('codemirror')),emmet=_interopDefault(require('@emmetio/codemirror-plugin'));require('codemirror/lib/codemirror.css'),require('codemirror/theme/monokai.css'),require('codemirror/addon/selection/active-line'),require('codemirror/addon/edit/matchbrackets'),require('codemirror/mode/vue/vue');var debounce=_interopDefault(require('lodash/debounce')),browser=require('vue-template-compiler/browser');// 2 | emmet(CodeMirror); 3 | var script = { 4 | props: { 5 | code: { 6 | type: String, 7 | default: '' 8 | } 9 | }, 10 | data: function data() { 11 | return { 12 | editor: null, 13 | copyLabel: 'Copy', 14 | originalCode: this.code 15 | }; 16 | }, 17 | mounted: function mounted() { 18 | var _this = this; 19 | 20 | this.editor = CodeMirror.fromTextArea(this.$refs.textarea, { 21 | mode: 'vue', 22 | theme: 'monokai', 23 | value: '', 24 | lineNumbers: true, 25 | lineWrapping: true, 26 | tabSize: 2, 27 | autofocus: false, 28 | line: true, 29 | styleActiveLine: true, 30 | matchBrackets: true, 31 | extraKeys: { 32 | Tab: 'emmetExpandAbbreviation', 33 | Enter: 'emmetInsertLineBreak' 34 | } 35 | }); 36 | this.editor.on('change', debounce(function () { 37 | _this.$emit('change', _this.editor.getValue()); 38 | }, 400)); 39 | this.editor.setValue(this.code); 40 | }, 41 | methods: { 42 | copyCode: function copyCode() { 43 | var _this2 = this; 44 | 45 | var el = document.createElement('textarea'); 46 | el.value = this.editor.getValue(); 47 | document.body.appendChild(el); 48 | el.select(); 49 | document.execCommand('copy'); 50 | document.body.removeChild(el); 51 | this.copyLabel = 'Copied!'; 52 | setTimeout(function () { 53 | _this2.copyLabel = 'Copy'; 54 | }, 3000); 55 | }, 56 | resetCode: function resetCode() { 57 | this.editor.setValue(this.originalCode); 58 | this.$emit('change', this.editor.getValue()); 59 | } 60 | } 61 | };function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) { 62 | if (typeof shadowMode !== 'boolean') { 63 | createInjectorSSR = createInjector; 64 | createInjector = shadowMode; 65 | shadowMode = false; 66 | } 67 | // Vue.extend constructor export interop. 68 | const options = typeof script === 'function' ? script.options : script; 69 | // render functions 70 | if (template && template.render) { 71 | options.render = template.render; 72 | options.staticRenderFns = template.staticRenderFns; 73 | options._compiled = true; 74 | // functional template 75 | if (isFunctionalTemplate) { 76 | options.functional = true; 77 | } 78 | } 79 | // scopedId 80 | if (scopeId) { 81 | options._scopeId = scopeId; 82 | } 83 | let hook; 84 | if (moduleIdentifier) { 85 | // server build 86 | hook = function (context) { 87 | // 2.3 injection 88 | context = 89 | context || // cached call 90 | (this.$vnode && this.$vnode.ssrContext) || // stateful 91 | (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext); // functional 92 | // 2.2 with runInNewContext: true 93 | if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { 94 | context = __VUE_SSR_CONTEXT__; 95 | } 96 | // inject component styles 97 | if (style) { 98 | style.call(this, createInjectorSSR(context)); 99 | } 100 | // register component module identifier for async chunk inference 101 | if (context && context._registeredComponents) { 102 | context._registeredComponents.add(moduleIdentifier); 103 | } 104 | }; 105 | // used by ssr in case component is cached and beforeCreate 106 | // never gets called 107 | options._ssrRegister = hook; 108 | } 109 | else if (style) { 110 | hook = shadowMode 111 | ? function (context) { 112 | style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot)); 113 | } 114 | : function (context) { 115 | style.call(this, createInjector(context)); 116 | }; 117 | } 118 | if (hook) { 119 | if (options.functional) { 120 | // register for functional component in vue file 121 | const originalRender = options.render; 122 | options.render = function renderWithStyleInjection(h, context) { 123 | hook.call(context); 124 | return originalRender(h, context); 125 | }; 126 | } 127 | else { 128 | // inject component registration as beforeCreate hook 129 | const existing = options.beforeCreate; 130 | options.beforeCreate = existing ? [].concat(existing, hook) : [hook]; 131 | } 132 | } 133 | return script; 134 | }function createInjectorSSR(context) { 135 | if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { 136 | context = __VUE_SSR_CONTEXT__; 137 | } 138 | if (!context) 139 | return () => { }; 140 | if (!('styles' in context)) { 141 | context._styles = context._styles || {}; 142 | Object.defineProperty(context, 'styles', { 143 | enumerable: true, 144 | get: () => context._renderStyles(context._styles) 145 | }); 146 | context._renderStyles = context._renderStyles || renderStyles; 147 | } 148 | return (id, style) => addStyle(id, style, context); 149 | } 150 | function addStyle(id, css, context) { 151 | const group = css.media || 'default' ; 152 | const style = context._styles[group] || (context._styles[group] = { ids: [], css: '' }); 153 | if (!style.ids.includes(id)) { 154 | style.media = css.media; 155 | style.ids.push(id); 156 | let code = css.source; 157 | style.css += code + '\n'; 158 | } 159 | } 160 | function renderStyles(styles) { 161 | let css = ''; 162 | for (const key in styles) { 163 | const style = styles[key]; 164 | css += 165 | ''; 172 | } 173 | return css; 174 | }/* script */ 175 | var __vue_script__ = script; 176 | /* template */ 177 | 178 | var __vue_render__ = function __vue_render__() { 179 | var _vm = this; 180 | 181 | var _h = _vm.$createElement; 182 | 183 | var _c = _vm._self._c || _h; 184 | 185 | return _c('div', { 186 | staticClass: "editor" 187 | }, [_vm._ssrNode("
")]); 188 | }; 189 | 190 | var __vue_staticRenderFns__ = []; 191 | /* style */ 192 | 193 | var __vue_inject_styles__ = function __vue_inject_styles__(inject) { 194 | if (!inject) return; 195 | inject("data-v-754b1f23_0", { 196 | source: ".CodeMirror{font-family:Consolas,Monaco,\"Andale Mono\",\"Ubuntu Mono\",monospace;font-size:.875rem;font-weight:700;border-radius:6px;background-color:#101c23;flex:1}.CodeMirror-gutters{background-color:#101c23}.CodeMirror-activeline-background{background-color:#050a0d}.CodeMirror-scroll{padding:8px}", 197 | map: undefined, 198 | media: undefined 199 | }), inject("data-v-754b1f23_1", { 200 | source: ".editor[data-v-754b1f23]{position:relative;border-radius:6px;width:100%;display:flex;flex-direction:column}.editor-actions[data-v-754b1f23]{position:absolute;top:-34px;right:0}button[data-v-754b1f23]{text-transform:none;color:#fff;cursor:pointer;border-style:none;height:44px;min-width:78px;padding:0 20px;transition:all .2s;font-size:.875rem;font-weight:700;border-radius:6px;background-color:#282824;margin-left:8px}button[data-v-754b1f23]:focus{outline:0}button[data-v-754b1f23]:hover{transform:translateY(-14px)}button[data-v-754b1f23]:active{transform:translateY(-24px)}.btn-reset[data-v-754b1f23]{background-color:#4a4a45}", 201 | map: undefined, 202 | media: undefined 203 | }); 204 | }; 205 | /* scoped */ 206 | 207 | 208 | var __vue_scope_id__ = "data-v-754b1f23"; 209 | /* module identifier */ 210 | 211 | var __vue_module_identifier__ = "data-v-754b1f23"; 212 | /* functional template */ 213 | 214 | var __vue_is_functional_template__ = false; 215 | /* style inject shadow dom */ 216 | 217 | var __vue_component__ = /*#__PURE__*/normalizeComponent({ 218 | render: __vue_render__, 219 | staticRenderFns: __vue_staticRenderFns__ 220 | }, __vue_inject_styles__, __vue_script__, __vue_scope_id__, __vue_is_functional_template__, __vue_module_identifier__, false, undefined, createInjectorSSR, undefined);function _typeof(obj) { 221 | "@babel/helpers - typeof"; 222 | 223 | if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { 224 | _typeof = function (obj) { 225 | return typeof obj; 226 | }; 227 | } else { 228 | _typeof = function (obj) { 229 | return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; 230 | }; 231 | } 232 | 233 | return _typeof(obj); 234 | }var script$1 = { 235 | errorCaptured: function errorCaptured(err) { 236 | this.handleError(err); 237 | }, 238 | props: { 239 | code: { 240 | type: String, 241 | required: true 242 | }, 243 | components: { 244 | type: Object, 245 | default: function _default() { 246 | return {}; 247 | } 248 | } 249 | }, 250 | data: function data() { 251 | return { 252 | scope: this.generateScope(), 253 | previewedComponent: undefined, 254 | iteration: 0, 255 | error: false 256 | }; 257 | }, 258 | watch: { 259 | code: function code(value) { 260 | this.renderComponent(value.trim()); 261 | } 262 | }, 263 | created: function created() { 264 | this.renderComponent(this.code.trim()); 265 | }, 266 | methods: { 267 | generateScope: function generateScope() { 268 | return 'v-xxxxxxxx'.replace(/[xy]/g, function (c) { 269 | var r = Math.random() * 16 | 0; 270 | var v = c === 'x' ? r : r & 0x3 | 0x8; 271 | return v.toString(16); 272 | }); 273 | }, 274 | scopeStyle: function scopeStyle(style) { 275 | var _this = this; 276 | 277 | return style.trim().replace(/(^|\})\s*([^{]+)/g, function (m, g1, g2) { 278 | return g1 ? "".concat(g1, " .").concat(_this.scope, " ").concat(g2) : ".".concat(_this.scope, " ").concat(g2); 279 | }); 280 | }, 281 | handleError: function handleError(e) { 282 | this.error = e.message; 283 | }, 284 | renderComponent: function renderComponent(code) { 285 | var appComponent = {}; 286 | 287 | try { 288 | var parsed = browser.parseComponent(code); 289 | appComponent = { 290 | template: parsed.template ? parsed.template.content : code 291 | }; 292 | 293 | if (parsed.script) { 294 | var content = parsed.script.content; // ignore all imports 295 | 296 | content = content.replace(/^import.*$/m, ''); // ignore components property 297 | 298 | content = content.replace(/components:\s?{[\s\S]*?},?/, ''); // eslint-disable-next-line no-eval 299 | 300 | var componentScript = eval("(function() { ".concat(content.replace('export default', 'return'), " })")); // const componentScript = new Function(parsed.script.content.replace('export default', 'return')) 301 | 302 | var componentProperties = componentScript(); // check data() for return object 303 | 304 | if (componentProperties && componentProperties.data && _typeof(componentProperties.data()) !== 'object') componentProperties.data = undefined; 305 | appComponent = Object.assign({ 306 | template: parsed.template.content 307 | }, componentProperties); 308 | } 309 | 310 | if (parsed.styles && parsed.styles.length > 0) { 311 | var styles = parsed.styles.map(function (s) { 312 | return s.content; 313 | }).join(' '); 314 | 315 | if (!this.elStyle) { 316 | var head = document.head || document.getElementsByTagName('head')[0]; 317 | this.elStyle = document.createElement('style'); 318 | this.elStyle.type = 'text/css'; 319 | head.appendChild(this.elStyle); 320 | } 321 | 322 | this.elStyle.innerHTML = this.scopeStyle(styles); 323 | } 324 | 325 | var _compile = browser.compile(appComponent.template), 326 | render = _compile.render, 327 | staticRenderFns = _compile.staticRenderFns; // eslint-disable-next-line no-new-func 328 | 329 | 330 | appComponent.render = new Function(render); // eslint-disable-next-line no-new-func 331 | 332 | appComponent.staticRenderFns = staticRenderFns.map(function (s) { 333 | return new Function(s); 334 | }); 335 | } catch (e) { 336 | this.handleError(e); 337 | return; 338 | } 339 | 340 | appComponent.components = this.components; 341 | 342 | if (appComponent.template || appComponent.render) { 343 | this.previewedComponent = appComponent; 344 | this.iteration = this.iteration + 1; 345 | this.error = false; 346 | } else { 347 | this.handleError({ 348 | message: 'No template or render function specified' 349 | }); 350 | } 351 | } 352 | } 353 | };/* script */ 354 | var __vue_script__$1 = script$1; 355 | /* template */ 356 | 357 | var __vue_render__$1 = function __vue_render__() { 358 | var _vm = this; 359 | 360 | var _h = _vm.$createElement; 361 | 362 | var _c = _vm._self._c || _h; 363 | 364 | return _vm.error ? _c('pre', { 365 | class: _vm.$style.error 366 | }, [_vm._ssrNode(_vm._ssrEscape(_vm._s(_vm.error)))], 2) : _vm.previewedComponent ? _c(_vm.previewedComponent, { 367 | key: _vm.iteration, 368 | tag: "component", 369 | class: _vm.scope 370 | }) : _vm._e(); 371 | }; 372 | 373 | var __vue_staticRenderFns__$1 = []; 374 | /* style */ 375 | 376 | var __vue_inject_styles__$1 = function __vue_inject_styles__(inject) { 377 | if (!inject) return; 378 | inject("data-v-602b2eea_0", { 379 | source: ".src-error-fOY1{font-family:Consolas,Monaco,\"Andale Mono\",\"Ubuntu Mono\",monospace;font-size:.875rem;color:red;text-align:left;font-weight:700;overflow:auto;white-space:pre-wrap}", 380 | map: undefined, 381 | media: undefined 382 | }); 383 | Object.defineProperty(this, "$style", { 384 | value: { 385 | "error": "src-error-fOY1" 386 | } 387 | }); 388 | }; 389 | /* scoped */ 390 | 391 | 392 | var __vue_scope_id__$1 = undefined; 393 | /* module identifier */ 394 | 395 | var __vue_module_identifier__$1 = "data-v-602b2eea"; 396 | /* functional template */ 397 | 398 | var __vue_is_functional_template__$1 = false; 399 | /* style inject shadow dom */ 400 | 401 | var __vue_component__$1 = /*#__PURE__*/normalizeComponent({ 402 | render: __vue_render__$1, 403 | staticRenderFns: __vue_staticRenderFns__$1 404 | }, __vue_inject_styles__$1, __vue_script__$1, __vue_scope_id__$1, __vue_is_functional_template__$1, __vue_module_identifier__$1, false, undefined, createInjectorSSR, undefined);// 405 | var script$2 = { 406 | components: { 407 | VueLiveEditor: __vue_component__, 408 | VueLivePreview: __vue_component__$1 409 | }, 410 | props: { 411 | code: { 412 | type: String, 413 | default: '' 414 | }, 415 | showCode: { 416 | type: Boolean, 417 | default: false 418 | }, 419 | components: { 420 | type: Object, 421 | default: function _default() { 422 | return {}; 423 | } 424 | } 425 | }, 426 | data: function data() { 427 | return { 428 | previewCode: this.code 429 | }; 430 | } 431 | };/* script */ 432 | var __vue_script__$2 = script$2; 433 | /* template */ 434 | 435 | var __vue_render__$2 = function __vue_render__() { 436 | var _vm = this; 437 | 438 | var _h = _vm.$createElement; 439 | 440 | var _c = _vm._self._c || _h; 441 | 442 | return _c('div', { 443 | staticClass: "editor-layout" 444 | }, [_vm._ssrNode("", "", [_c('vue-live-preview', { 447 | attrs: { 448 | "code": _vm.previewCode, 449 | "components": _vm.components 450 | } 451 | })], 1), _vm._ssrNode(" "), _vm.showCode ? _vm._ssrNode("
", "
", [_c('vue-live-editor', { 452 | attrs: { 453 | "code": _vm.previewCode 454 | }, 455 | on: { 456 | "change": function change(c) { 457 | return _vm.previewCode = c; 458 | } 459 | } 460 | })], 1) : _vm._e()], 2); 461 | }; 462 | 463 | var __vue_staticRenderFns__$2 = []; 464 | /* style */ 465 | 466 | var __vue_inject_styles__$2 = function __vue_inject_styles__(inject) { 467 | if (!inject) return; 468 | inject("data-v-6154bfcc_0", { 469 | source: ".editor-layout[data-v-6154bfcc]{display:flex;width:100%;min-width:0;max-width:100%;flex-direction:column}.editor-preview[data-v-6154bfcc]{width:100%;max-width:100%}.editor-code[data-v-6154bfcc]{margin-top:42px;display:flex}@media (min-width:960px){.editor-layout[data-v-6154bfcc]{flex-direction:row}.editor-layout-col[data-v-6154bfcc]{width:50%;max-width:50%}.editor-code[data-v-6154bfcc]{margin-top:0;margin-left:14px;margin-right:2px}}", 470 | map: undefined, 471 | media: undefined 472 | }); 473 | }; 474 | /* scoped */ 475 | 476 | 477 | var __vue_scope_id__$2 = "data-v-6154bfcc"; 478 | /* module identifier */ 479 | 480 | var __vue_module_identifier__$2 = "data-v-6154bfcc"; 481 | /* functional template */ 482 | 483 | var __vue_is_functional_template__$2 = false; 484 | /* style inject shadow dom */ 485 | 486 | var __vue_component__$2 = /*#__PURE__*/normalizeComponent({ 487 | render: __vue_render__$2, 488 | staticRenderFns: __vue_staticRenderFns__$2 489 | }, __vue_inject_styles__$2, __vue_script__$2, __vue_scope_id__$2, __vue_is_functional_template__$2, __vue_module_identifier__$2, false, undefined, createInjectorSSR, undefined);// Import vue component 490 | 491 | var install = function installVueLiveDemo(Vue) { 492 | if (install.installed) return; 493 | install.installed = true; 494 | Vue.component('VueLiveDemo', __vue_component__$2); 495 | }; // Create module definition for Vue.use() 496 | 497 | 498 | var plugin = { 499 | install: install 500 | }; // To auto-install on non-es builds, when vue is found 501 | // eslint-disable-next-line no-redeclare 502 | 503 | /* global window, global */ 504 | 505 | { 506 | var GlobalVue = null; 507 | 508 | if (typeof window !== 'undefined') { 509 | GlobalVue = window.Vue; 510 | } else if (typeof global !== 'undefined') { 511 | GlobalVue = global.Vue; 512 | } 513 | 514 | if (GlobalVue) { 515 | GlobalVue.use(plugin); 516 | } 517 | } // Inject install function into component - allows component 518 | // to be registered via Vue.use() as well as Vue.component() 519 | 520 | 521 | __vue_component__$2.install = install; // Export component by default 522 | // also be used as directives, etc. - eg. import { RollupDemoDirective } from 'rollup-demo'; 523 | // export const RollupDemoDirective = component; 524 | exports.default=__vue_component__$2; -------------------------------------------------------------------------------- /docs/css/app.d2debdf5.css: -------------------------------------------------------------------------------- 1 | .CodeMirror{font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:.875rem;font-weight:700;border-radius:6px;flex:1}.CodeMirror,.CodeMirror-gutters{background-color:#101c23}.CodeMirror-activeline-background{background-color:#050a0d}.CodeMirror-scroll{padding:8px}.editor[data-v-0bc6ff90]{position:relative;border-radius:6px;width:100%;display:flex;flex-direction:column}.editor-actions[data-v-0bc6ff90]{position:absolute;top:-34px;right:0}button[data-v-0bc6ff90]{text-transform:none;color:#fff;cursor:pointer;border-style:none;height:44px;min-width:78px;padding:0 20px;transition:all .2s;font-size:.875rem;font-weight:700;border-radius:6px;background-color:#282824;margin-left:8px}button[data-v-0bc6ff90]:focus{outline:none}button[data-v-0bc6ff90]:hover{transform:translateY(-14px)}button[data-v-0bc6ff90]:active{transform:translateY(-24px)}.btn-reset[data-v-0bc6ff90]{background-color:#4a4a45}.VueLivePreview_error_fOY1Q{font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:.875rem;color:red;text-align:left;font-weight:700;overflow:auto;white-space:pre-wrap}.editor-layout[data-v-ce415dbe]{display:flex;width:100%;min-width:0;max-width:100%;flex-direction:column}.editor-preview[data-v-ce415dbe]{width:100%;max-width:100%}.editor-code[data-v-ce415dbe]{margin-top:42px;display:flex}@media (min-width:960px){.editor-layout[data-v-ce415dbe]{flex-direction:row}.editor-layout-col[data-v-ce415dbe]{width:50%;max-width:50%}.editor-code[data-v-ce415dbe]{margin-top:0;margin-left:14px;margin-right:2px}}#app{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}.wrapper{max-width:1200px;margin:auto}.demo{margin-top:100px}.CodeMirror{height:500px} -------------------------------------------------------------------------------- /docs/css/chunk-vendors.80b6bb14.css: -------------------------------------------------------------------------------- 1 | .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-50px;margin-right:-50px;padding-bottom:50px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:50px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-50px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:none}.cm-s-monokai.CodeMirror{background:#272822;color:#f8f8f2}.cm-s-monokai div.CodeMirror-selected{background:#49483e}.cm-s-monokai .CodeMirror-line::selection,.cm-s-monokai .CodeMirror-line>span::selection,.cm-s-monokai .CodeMirror-line>span>span::selection{background:rgba(73,72,62,.99)}.cm-s-monokai .CodeMirror-line::-moz-selection,.cm-s-monokai .CodeMirror-line>span::-moz-selection,.cm-s-monokai .CodeMirror-line>span>span::-moz-selection{background:rgba(73,72,62,.99)}.cm-s-monokai .CodeMirror-gutters{background:#272822;border-right:0}.cm-s-monokai .CodeMirror-guttermarker{color:#fff}.cm-s-monokai .CodeMirror-guttermarker-subtle,.cm-s-monokai .CodeMirror-linenumber{color:#d0d0d0}.cm-s-monokai .CodeMirror-cursor{border-left:1px solid #f8f8f0}.cm-s-monokai span.cm-comment{color:#75715e}.cm-s-monokai span.cm-atom,.cm-s-monokai span.cm-number{color:#ae81ff}.cm-s-monokai span.cm-comment.cm-attribute{color:#97b757}.cm-s-monokai span.cm-comment.cm-def{color:#bc9262}.cm-s-monokai span.cm-comment.cm-tag{color:#bc6283}.cm-s-monokai span.cm-comment.cm-type{color:#5998a6}.cm-s-monokai span.cm-attribute,.cm-s-monokai span.cm-property{color:#a6e22e}.cm-s-monokai span.cm-keyword{color:#f92672}.cm-s-monokai span.cm-builtin{color:#66d9ef}.cm-s-monokai span.cm-string{color:#e6db74}.cm-s-monokai span.cm-variable{color:#f8f8f2}.cm-s-monokai span.cm-variable-2{color:#9effff}.cm-s-monokai span.cm-type,.cm-s-monokai span.cm-variable-3{color:#66d9ef}.cm-s-monokai span.cm-def{color:#fd971f}.cm-s-monokai span.cm-bracket{color:#f8f8f2}.cm-s-monokai span.cm-tag{color:#f92672}.cm-s-monokai span.cm-header,.cm-s-monokai span.cm-link{color:#ae81ff}.cm-s-monokai span.cm-error{background:#f92672;color:#f8f8f0}.cm-s-monokai .CodeMirror-activeline-background{background:#373831}.cm-s-monokai .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important} -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | Vue App
-------------------------------------------------------------------------------- /docs/js/app.59141d7f.js: -------------------------------------------------------------------------------- 1 | (function(e){function t(t){for(var o,a,c=t[0],s=t[1],p=t[2],u=0,d=[];u0){var styles=parsed.styles.map((function(e){return e.content})).join(" ");if(!this.elStyle){var head=document.head||document.getElementsByTagName("head")[0];this.elStyle=document.createElement("style"),this.elStyle.type="text/css",head.appendChild(this.elStyle)}this.elStyle.innerHTML=this.scopeStyle(styles)}var _compile=Object(vue_template_compiler_browser__WEBPACK_IMPORTED_MODULE_0__["compile"])(appComponent.template),render=_compile.render,staticRenderFns=_compile.staticRenderFns;appComponent.render=new Function(render),appComponent.staticRenderFns=staticRenderFns.map((function(e){return new Function(e)}))}catch(e){return void this.handleError(e)}appComponent.components=this.components,appComponent.template||appComponent.render?(this.previewedComponent=appComponent,this.iteration=this.iteration+1,this.error=!1):this.handleError({message:"No template or render function specified"})}}}},"74c6":function(e,t,n){},8524:function(e,t,n){},"8c94":function(e,t,n){"use strict";n.r(t);var o=n("2b0e"),r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"app"}},[n("div",{staticClass:"wrapper"},[n("h1",[e._v("Vue Live Demo")]),n("p",[e._v("A component for live editing Vue single file components in the browser with real time preview.")]),n("a",{attrs:{href:"https://github.com/indielayer/vue-live-demo"}},[e._v("https://github.com/indielayer/vue-live-demo")]),n("vue-live-demo",{staticClass:"demo",attrs:{code:e.code,"show-code":e.showCode}})],1)])},i=[],a=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"editor-layout"},[n("div",{staticClass:"editor-preview",class:{"editor-layout-col":e.showCode}},[n("vue-live-preview",{attrs:{code:e.previewCode,components:e.components}})],1),e.showCode?n("div",{staticClass:"editor-layout-col editor-code"},[n("vue-live-editor",{attrs:{code:e.previewCode},on:{change:function(t){return e.previewCode=t}}})],1):e._e()])},c=[],s=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"editor"},[n("div",{staticClass:"editor-actions"},[n("button",{staticClass:"btn-reset",on:{click:e.resetCode}},[e._v("Reset")]),n("button",{on:{click:e.copyCode}},[e._v(e._s(e.copyLabel))])]),n("textarea",{ref:"textarea"})])},p=[],l=n("56b3"),u=n.n(l),d=n("49e7"),m=(n("a7be"),n("7a7a"),n("31c5"),n("8c33"),n("693d"),n("b047")),f=n.n(m);Object(d["a"])(u.a);var _={props:{code:{type:String,default:""}},data:function(){return{editor:null,copyLabel:"Copy",originalCode:this.code}},mounted:function(){var e=this;this.editor=u.a.fromTextArea(this.$refs.textarea,{mode:"vue",theme:"monokai",value:"",lineNumbers:!0,lineWrapping:!0,tabSize:2,autofocus:!1,line:!0,styleActiveLine:!0,matchBrackets:!0,extraKeys:{Tab:"emmetExpandAbbreviation",Enter:"emmetInsertLineBreak"}}),this.editor.on("change",f()((function(){e.$emit("change",e.editor.getValue())}),400)),this.editor.setValue(this.code)},methods:{copyCode:function(){var e=this,t=document.createElement("textarea");t.value=this.editor.getValue(),document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t),this.copyLabel="Copied!",setTimeout((function(){e.copyLabel="Copy"}),3e3)},resetCode:function(){this.editor.setValue(this.originalCode),this.$emit("change",this.editor.getValue())}}},v=_,h=(n("c939"),n("29e9"),n("2877")),y=Object(h["a"])(v,s,p,!1,null,"0bc6ff90",null),b=y.exports,C=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.error?n("pre",{class:e.$style.error},[e._v(e._s(e.error))]):e.previewedComponent?n(e.previewedComponent,{key:e.iteration,tag:"component",class:e.scope}):e._e()},w=[],g=n("3c93"),x=g["a"],O=n("ae13");function E(e){this["$style"]=O["default"].locals||O["default"]}var S=Object(h["a"])(x,C,w,!1,E,null,null),P=S.exports,j={components:{VueLiveEditor:b,VueLivePreview:P},props:{code:{type:String,default:""},showCode:{type:Boolean,default:!1},components:{type:Object,default:function(){return{}}}},data:function(){return{previewCode:this.code}}},L=j,M=(n("ea1e"),Object(h["a"])(L,a,c,!1,null,"ce415dbe",null)),k=M.exports,D="\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('div',{staticClass:\"wrapper\"},[_c('h1',[_vm._v(\"Vue Live Demo\")]),_c('p',[_vm._v(\"A component for live editing Vue single file components in the browser with real time preview.\")]),_c('a',{attrs:{\"href\":\"https://github.com/indielayer/vue-live-demo\"}},[_vm._v(\"https://github.com/indielayer/vue-live-demo\")]),_c('vue-live-demo',{staticClass:\"demo\",attrs:{\"code\":_vm.code,\"show-code\":_vm.showCode}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"editor-layout\"},[_c('div',{staticClass:\"editor-preview\",class:{ 'editor-layout-col': _vm.showCode }},[_c('vue-live-preview',{attrs:{\"code\":_vm.previewCode,\"components\":_vm.components}})],1),(_vm.showCode)?_c('div',{staticClass:\"editor-layout-col editor-code\"},[_c('vue-live-editor',{attrs:{\"code\":_vm.previewCode},on:{\"change\":function (c) { return _vm.previewCode = c; }}})],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"editor\"},[_c('div',{staticClass:\"editor-actions\"},[_c('button',{staticClass:\"btn-reset\",on:{\"click\":_vm.resetCode}},[_vm._v(\"Reset\")]),_c('button',{on:{\"click\":_vm.copyCode}},[_vm._v(_vm._s(_vm.copyLabel))])]),_c('textarea',{ref:\"textarea\"})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLiveEditor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLiveEditor.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VueLiveEditor.vue?vue&type=template&id=0bc6ff90&scoped=true&\"\nimport script from \"./VueLiveEditor.vue?vue&type=script&lang=js&\"\nexport * from \"./VueLiveEditor.vue?vue&type=script&lang=js&\"\nimport style0 from \"./VueLiveEditor.vue?vue&type=style&index=0&lang=css&\"\nimport style1 from \"./VueLiveEditor.vue?vue&type=style&index=1&id=0bc6ff90&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0bc6ff90\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.error)?_c('pre',{class:_vm.$style.error},[_vm._v(_vm._s(_vm.error))]):(_vm.previewedComponent)?_c(_vm.previewedComponent,{key:_vm.iteration,tag:\"component\",class:_vm.scope}):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLivePreview.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLivePreview.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VueLivePreview.vue?vue&type=template&id=2f3bb233&\"\nimport script from \"./VueLivePreview.vue?vue&type=script&lang=js&\"\nexport * from \"./VueLivePreview.vue?vue&type=script&lang=js&\"\nimport style0 from \"./VueLivePreview.vue?vue&type=style&index=0&module=true&lang=css&\"\n\n\n\n\nfunction injectStyles (context) {\n \n this[\"$style\"] = (style0.locals || style0)\n\n}\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n injectStyles,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLiveDemo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLiveDemo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VueLiveDemo.vue?vue&type=template&id=ce415dbe&scoped=true&\"\nimport script from \"./VueLiveDemo.vue?vue&type=script&lang=js&\"\nexport * from \"./VueLiveDemo.vue?vue&type=script&lang=js&\"\nimport style0 from \"./VueLiveDemo.vue?vue&type=style&index=0&id=ce415dbe&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"ce415dbe\",\n null\n \n)\n\nexport default component.exports","export default \"\\n\\n\\n\\n\\n\";","\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./serve.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./serve.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./serve.vue?vue&type=template&id=148db0ef&\"\nimport script from \"./serve.vue?vue&type=script&lang=js&\"\nexport * from \"./serve.vue?vue&type=script&lang=js&\"\nimport style0 from \"./serve.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport Dev from './serve.vue'\n\nVue.config.productionTip = false\n\nnew Vue({\n render: (h) => h(Dev)\n}).$mount('#app')\n","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-0-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-0-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-0-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLivePreview.vue?vue&type=style&index=0&module=true&lang=css&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-0-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-0-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-0-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLivePreview.vue?vue&type=style&index=0&module=true&lang=css&\"","// extracted by mini-css-extract-plugin\nmodule.exports = {\"error\":\"VueLivePreview_error_fOY1Q\"};","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLiveEditor.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLiveEditor.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./serve.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./serve.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLiveDemo.vue?vue&type=style&index=0&id=ce415dbe&scoped=true&lang=css&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./VueLiveDemo.vue?vue&type=style&index=0&id=ce415dbe&scoped=true&lang=css&\""],"sourceRoot":""} -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@indielayer/vue-live-demo", 3 | "version": "1.1.2", 4 | "description": "A component for live editing Vue single file components in the browser with real time preview.", 5 | "keywords": [ 6 | "vue", 7 | "live", 8 | "code", 9 | "preview", 10 | "sfc", 11 | "browser", 12 | "editor", 13 | "vue live editor" 14 | ], 15 | "main": "dist/vue-live-demo.ssr.js", 16 | "browser": "dist/vue-live-demo.esm.js", 17 | "module": "dist/vue-live-demo.esm.js", 18 | "unpkg": "dist/vue-live-demo.min.js", 19 | "files": [ 20 | "dist/*", 21 | "src/**/*.vue" 22 | ], 23 | "scripts": { 24 | "dev": "npm run serve", 25 | "docs": "vue-cli-service build dev/serve.js --dest docs", 26 | "serve": "vue-cli-service serve dev/serve.js", 27 | "build": "cross-env NODE_ENV=production rollup --config build/rollup.config.js", 28 | "build:ssr": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format cjs", 29 | "build:es": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format es", 30 | "build:unpkg": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format iife", 31 | "lint": "eslint --cache --cache-location=.cache/eslint --ignore-path .eslintignore --ext .js,.jsx,.ts,.tsx,.mjs,.vue --report-unused-disable-directives ." 32 | }, 33 | "dependencies": { 34 | "@emmetio/codemirror-plugin": "^1.1.2", 35 | "codemirror": "^5.54.0", 36 | "lodash": "^4.17.15", 37 | "vue-template-compiler": "^2.6.11" 38 | }, 39 | "devDependencies": { 40 | "@babel/core": "^7.9.0", 41 | "@babel/preset-env": "^7.9.5", 42 | "@indielayer/eslint-config-vue": "^1.0.0", 43 | "@rollup/plugin-alias": "^2.2.0", 44 | "@rollup/plugin-commonjs": "^11.1.0", 45 | "@rollup/plugin-replace": "^2.3.2", 46 | "@vue/cli-plugin-babel": "^4.3.1", 47 | "@vue/cli-service": "^4.3.1", 48 | "cross-env": "^7.0.2", 49 | "eslint": "^7.18.0", 50 | "minimist": "^1.2.5", 51 | "raw-loader": "^4.0.1", 52 | "rollup": "^2.7.3", 53 | "rollup-plugin-babel": "^4.4.0", 54 | "rollup-plugin-terser": "^7.0.0", 55 | "rollup-plugin-vue": "^5.1.6", 56 | "vue": "^2.6.11", 57 | "vue-template-compiler": "^2.6.11" 58 | }, 59 | "peerDependencies": { 60 | "vue": "^2.6.11" 61 | }, 62 | "resolutions": { 63 | "prosemirror-model": "1.9.1" 64 | }, 65 | "engines": { 66 | "node": ">=10" 67 | }, 68 | "publishConfig": { 69 | "access": "public" 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/VueLiveDemo.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 42 | 43 | 79 | -------------------------------------------------------------------------------- /src/VueLiveEditor.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 86 | 87 | 109 | 110 | 157 | -------------------------------------------------------------------------------- /src/VueLivePreview.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 133 | 134 | 145 | -------------------------------------------------------------------------------- /src/entry.js: -------------------------------------------------------------------------------- 1 | // Import vue component 2 | import component from '@/VueLiveDemo.vue' 3 | 4 | // install function executed by Vue.use() 5 | const install = function installVueLiveDemo(Vue) { 6 | if (install.installed) return 7 | install.installed = true 8 | Vue.component('VueLiveDemo', component) 9 | } 10 | 11 | // Create module definition for Vue.use() 12 | const plugin = { 13 | install 14 | } 15 | 16 | // To auto-install on non-es builds, when vue is found 17 | // eslint-disable-next-line no-redeclare 18 | /* global window, global */ 19 | if ('false' === process.env.ES_BUILD) { 20 | let GlobalVue = null 21 | 22 | if (typeof window !== 'undefined') { 23 | GlobalVue = window.Vue 24 | } else if (typeof global !== 'undefined') { 25 | GlobalVue = global.Vue 26 | } 27 | if (GlobalVue) { 28 | GlobalVue.use(plugin) 29 | } 30 | } 31 | 32 | // Inject install function into component - allows component 33 | // to be registered via Vue.use() as well as Vue.component() 34 | component.install = install 35 | 36 | // Export component by default 37 | export default component 38 | 39 | // It's possible to expose named exports when writing components that can 40 | // also be used as directives, etc. - eg. import { RollupDemoDirective } from 'rollup-demo'; 41 | // export const RollupDemoDirective = component; 42 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | publicPath: process.env.NODE_ENV === 'production' 3 | ? '/vue-live-demo/' 4 | : '/' 5 | } --------------------------------------------------------------------------------