mirror of
https://github.com/pengzhanbo/vuepress-theme-plume.git
synced 2026-04-23 10:58:13 +08:00
64 lines
1.4 KiB
Vue
64 lines
1.4 KiB
Vue
<script setup lang="ts">
|
|
import type { ReplitTokenMeta } from '../../shared/index.js'
|
|
import { useDarkMode } from '@vuepress/helper/client'
|
|
import { computed, ref } from 'vue'
|
|
import Loading from './icons/Loading.vue'
|
|
|
|
defineOptions({
|
|
inheritAttrs: false,
|
|
})
|
|
|
|
const { source, theme, width, height: h, title } = defineProps<ReplitTokenMeta>()
|
|
|
|
// magic height
|
|
const height = ref('47px')
|
|
const loaded = ref(false)
|
|
|
|
const REPLIT_LINK = 'https://replit.com/'
|
|
|
|
const isDark = useDarkMode()
|
|
|
|
const link = computed(() => {
|
|
const url = new URL(`/${source}`, REPLIT_LINK)
|
|
url.searchParams.set('embed', 'true')
|
|
|
|
const themeMode = theme || (isDark.value ? 'dark' : 'light')
|
|
url.searchParams.set('theme', themeMode)
|
|
|
|
return url.toString()
|
|
})
|
|
|
|
function onload() {
|
|
loaded.value = true
|
|
height.value = h || '450px'
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<ClientOnly>
|
|
<iframe
|
|
class="replit-iframe-wrapper"
|
|
:src="link"
|
|
:title="title || 'Replit'"
|
|
:style="{ width, height }"
|
|
v-bind="$attrs"
|
|
allowtransparency="true"
|
|
allowfullscree="true"
|
|
@load="onload"
|
|
/>
|
|
<Loading v-if="!loaded" />
|
|
</ClientOnly>
|
|
</template>
|
|
|
|
<style>
|
|
.replit-iframe-wrapper {
|
|
width: 100%;
|
|
margin: 16px auto;
|
|
border: none;
|
|
border-top: 1px solid var(--vp-c-divider);
|
|
border-bottom-right-radius: 8px;
|
|
border-bottom-left-radius: 8px;
|
|
transition: border 0.25s;
|
|
}
|
|
</style>
|