* docs: Animations * docs: add confetti gun * docs: update basic example on home page * docs(deps): Add stackblitz sdk to deps * chore: update yarn.lock * docs: use vue repl * docs: remove stackblitz sdk * docs: basic repl example * docs: use repl for examples/index.md (basic example) * docs: pass ext to repl * docs: add copy plugin * docs: use import map instead of dynamic imports * docs: use repl for custom node example * docs: hide repl errors * docs: use repl for custom connectionline example * docs: use repl for edges example * docs: exclude repl from ssr * docs: use repl for nested example * docs: use repl for stress example * docs: rename customNode to custom-node * docs: use repl for update-edge example * docs: use repl for update-node example * docs: use repl for validation example * docs: use repl for save-restore example * docs: scale down minimap in repl examples * docs: use repl for dnd example * docs: use repl for empty example * docs: use repl for hidden example * docs: use repl for interaction example * docs: use repl for multi example * docs: add pinia example with stackblitz * docs: update basic example * docs: update examples * docs: remove transition from intro * docs: update features * update: README.md * docs: scope css
108 lines
2.2 KiB
Vue
108 lines
2.2 KiB
Vue
<script lang="ts" setup>
|
|
import { Repl, ReplStore } from '@vue/repl'
|
|
import pkg from '../package.json'
|
|
import '@vue/repl/style.css'
|
|
import { exampleImports } from './examples'
|
|
|
|
const props = defineProps<{ example: keyof typeof exampleImports; mainFile?: string; dependencies?: Record<string, string> }>()
|
|
|
|
let css = `@import 'https://cdn.jsdelivr.net/npm/@braks/vue-flow@${pkg.dependencies['@braks/vue-flow']}/dist/style.css';
|
|
@import 'https://cdn.jsdelivr.net/npm/@braks/vue-flow@${pkg.dependencies['@braks/vue-flow']}/dist/theme-default.css';
|
|
|
|
html,
|
|
body,
|
|
#app {
|
|
margin: 0;
|
|
height: 100%;
|
|
}
|
|
|
|
#app {
|
|
text-transform: uppercase;
|
|
font-family: 'JetBrains Mono', monospace;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
text-align: center;
|
|
color: #2c3e50;
|
|
}
|
|
|
|
.vue-flow__minimap {
|
|
transform: scale(50%)
|
|
transform-origin: bottom right;
|
|
}`
|
|
|
|
const store = new ReplStore({
|
|
showOutput: true,
|
|
outputMode: 'preview',
|
|
})
|
|
|
|
watchEffect(
|
|
() => {
|
|
document.documentElement.style.setProperty('--vh', `${window.innerHeight}px`)
|
|
},
|
|
{ flush: 'post' },
|
|
)
|
|
|
|
const files: any = {}
|
|
const imports = exampleImports[props.example]
|
|
|
|
for (const example of Object.keys(imports)) {
|
|
if (example.includes('css')) {
|
|
css += `${imports[example as keyof typeof imports]}`
|
|
} else {
|
|
files[example] = imports[example as keyof typeof imports]
|
|
}
|
|
}
|
|
|
|
await store.setFiles(
|
|
{
|
|
...files,
|
|
'main.css': css,
|
|
},
|
|
props.mainFile ?? 'App.vue',
|
|
)
|
|
|
|
// pre-set import map
|
|
store.setImportMap({
|
|
imports: {
|
|
'@braks/vue-flow': `${location.origin}/vue-flow.es.js`,
|
|
},
|
|
})
|
|
|
|
store.setVueVersion('3.2.25')
|
|
|
|
const sfcOptions = {
|
|
script: {
|
|
reactivityTransform: true,
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<Repl
|
|
:clear-console="true"
|
|
:auto-resize="true"
|
|
:store="store"
|
|
:show-compile-output="false"
|
|
:show-import-map="false"
|
|
:sfc-options="sfcOptions"
|
|
@keydown.ctrl.s.prevent
|
|
@keydown.meta.s.prevent
|
|
/>
|
|
</template>
|
|
|
|
<style>
|
|
.file-selector {
|
|
@apply scrollbar scrollbar-thin scrollbar-thumb-rounded scrollbar-thumb-green-500 scrollbar-track-black;
|
|
}
|
|
|
|
.vue-repl {
|
|
@apply rounded-lg border-1 border-solid dark:border-gray-200/10 border-gray-200;
|
|
|
|
height: calc(var(--vh) - var(--navbar-height));
|
|
}
|
|
|
|
.msg.err {
|
|
display: none;
|
|
}
|
|
</style>
|