vuejs / theme

VitePress theme for vuejs.org.
MIT License
245 stars 88 forks source link

Vue Docs REPL implementation via SFC Playground #30

Open kiaking opened 3 years ago

kiaking commented 3 years ago

The plan is to enable REPL on the docs via SFC Playground instead of codepen (initial idea from Evan).

Now, how can we embed SFC Playground...? 👀

kiaking commented 3 years ago

@LinusBorg I heard you were able to embed SFC Playground into Slidev 👀 Is it true? If so, can same technique applied to VitePress as well?

antfu commented 3 years ago

I think this will do:

<iframe src="https://sfc.vuejs.org/#eyJBcHAudnVlIjoiPHRlbXBsYXRlPlxuXHRIaSBLaWEgOilcbjwvdGVtcGxhdGU+In0=" />

Ideally we could have some custom syntax to extend the markdown and transform to the iframe with corresponding hash via a simple Vite plugin. Like

```vue {repl}
<template>
  <h1>{{ msg }}</h1>
</template>

<script setup>
const msg = 'Hello World!'
</script>
```
LinusBorg commented 3 years ago

Yes I did, in a crude kind of way:

https://github.com/LinusBorg/slidev-theme-vuetiful/blob/main/layouts/sfc.vue

The most hackish part is using negative margins to move the playground's header out of the way. We could instead add a URL parameter to the playground to have it render without the header and other cruft we don't want while embedding.

Also, a simple iframe might not be what we cant in the docs as it won't be able to adjust hight-wise to the different examples

kiaking commented 3 years ago

Oh cool, seems like embedding is quite straight forward.

We could instead add a URL parameter to the playground to have it render without the header and other cruft we don't want while embedding.

This is definitely great idea 👍

Also, a simple iframe might not be what we cant in the docs as it won't be able to adjust hight-wise to the different examples.

Hm. We can adjust the iframe height by css right...? So maybe import component and set height via props might work? 🤔

<SFCPlayground height="320px" />
LinusBorg commented 3 years ago

Oh, btw, here's how I imported the src snippets in slidev - might be able to do this differently in vitepress:

https://github.com/LinusBorg/slidev-theme-vuetiful/blob/main/setup/main.ts