| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- <script setup lang="ts">
- import Header from './Header.vue'
- import { Repl, ReplStore } from '@vue/repl'
- import { ref, watchEffect } from 'vue'
- const setVH = () => {
- document.documentElement.style.setProperty('--vh', window.innerHeight + `px`)
- }
- window.addEventListener('resize', setVH)
- setVH()
- const useDevMode = ref(false)
- const useSSRMode = ref(false)
- let hash = location.hash.slice(1)
- if (hash.startsWith('__DEV__')) {
- hash = hash.slice(7)
- useDevMode.value = true
- }
- if (hash.startsWith('__SSR__')) {
- hash = hash.slice(7)
- useSSRMode.value = true
- }
- const store = new ReplStore({
- serializedState: hash,
- defaultVueRuntimeURL: import.meta.env.PROD
- ? `${location.origin}/vue.runtime.esm-browser.js`
- : `${location.origin}/src/vue-dev-proxy`,
- defaultVueServerRendererURL: import.meta.env.PROD
- ? `${location.origin}/server-renderer.esm-browser.js`
- : `${location.origin}/src/vue-server-renderer-dev-proxy`
- })
- // enable experimental features
- const sfcOptions = {
- script: {
- inlineTemplate: !useDevMode.value,
- reactivityTransform: true
- }
- }
- // persist state
- watchEffect(() => {
- const newHash = store
- .serialize()
- .replace(/^#/, useSSRMode.value ? `#__SSR__` : `#`)
- .replace(/^#/, useDevMode.value ? `#__DEV__` : `#`)
- history.replaceState({}, '', newHash)
- })
- function toggleDevMode() {
- const dev = (useDevMode.value = !useDevMode.value)
- sfcOptions.script.inlineTemplate = !dev
- store.setFiles(store.getFiles())
- }
- function toggleSSR() {
- useSSRMode.value = !useSSRMode.value
- store.setFiles(store.getFiles())
- }
- </script>
- <template>
- <Header
- :store="store"
- :dev="useDevMode"
- :ssr="useSSRMode"
- @toggle-dev="toggleDevMode"
- @toggle-ssr="toggleSSR"
- />
- <Repl
- @keydown.ctrl.s.prevent
- @keydown.meta.s.prevent
- :ssr="useSSRMode"
- :store="store"
- :showCompileOutput="true"
- :autoResize="true"
- :sfcOptions="sfcOptions"
- :clearConsole="false"
- />
- </template>
- <style>
- .dark {
- color-scheme: dark;
- }
- body {
- font-size: 13px;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
- Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
- margin: 0;
- --base: #444;
- --nav-height: 50px;
- }
- .vue-repl {
- height: calc(var(--vh) - var(--nav-height));
- }
- button {
- border: none;
- outline: none;
- cursor: pointer;
- margin: 0;
- background-color: transparent;
- }
- </style>
|