vuejs/theme

Vue Docs REPL implementation via SFC Playground

kiaking opened this issue ยท 5 comments

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...? ๐Ÿ‘€

@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

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>
```

Yes I did, in a crude kind of way:

  • iframe
  • encode code in base64 and append to url
  • use some CSS for positioning

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

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" />

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

  • import examples .vue files as raw strings
  • collect them in a map object
  • provide them to the app, inject them in the SFC slide layout (the one linked above)

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