mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-01-14 20:19:34 +01:00
87 lines
1.8 KiB
Vue
87 lines
1.8 KiB
Vue
<script setup lang="ts">
|
|
import { camelCase } from 'scule'
|
|
|
|
const props = withDefaults(defineProps<{
|
|
name: string
|
|
class?: any
|
|
props?: { [key: string]: any }
|
|
/**
|
|
* Whether to format the code with Prettier
|
|
* @defaultValue false
|
|
*/
|
|
prettier?: boolean
|
|
/**
|
|
* Whether to collapse the code block
|
|
* @defaultValue false
|
|
*/
|
|
collapse?: boolean
|
|
/**
|
|
* Whether to show the preview
|
|
* When `false`, the filename will be shown instead
|
|
* @defaultValue true
|
|
*/
|
|
preview?: boolean
|
|
}>(), {
|
|
preview: true
|
|
})
|
|
|
|
const { $prettier } = useNuxtApp()
|
|
|
|
const camelName = camelCase(props.name)
|
|
|
|
const data = await fetchComponentExample(camelName)
|
|
|
|
const componentProps = reactive({ ...(props.props || {}) })
|
|
|
|
const code = computed(() => {
|
|
let code = ''
|
|
|
|
if (props.collapse) {
|
|
code += `::code-collapse
|
|
`
|
|
}
|
|
|
|
code += `\`\`\`vue${props.preview ? '' : ` [${data.pascalName}.vue]`}
|
|
${data?.code ?? ''}
|
|
\`\`\``
|
|
|
|
if (props.collapse) {
|
|
code += `
|
|
::`
|
|
}
|
|
|
|
return code
|
|
})
|
|
|
|
const { data: ast } = await useAsyncData(`component-example-${camelName}`, async () => {
|
|
if (!props.prettier) {
|
|
return parseMarkdown(code.value)
|
|
}
|
|
|
|
let formatted = ''
|
|
try {
|
|
formatted = await $prettier.format(code.value, {
|
|
trailingComma: 'none',
|
|
semi: false,
|
|
singleQuote: true
|
|
})
|
|
} catch {
|
|
formatted = code.value
|
|
}
|
|
|
|
return parseMarkdown(formatted)
|
|
}, { watch: [code] })
|
|
</script>
|
|
|
|
<template>
|
|
<div class="my-5">
|
|
<div v-if="preview">
|
|
<div class="flex border border-b-0 border-gray-300 dark:border-gray-700 relative p-4 rounded-t-md" :class="[props.class]">
|
|
<component :is="camelName" v-bind="componentProps" />
|
|
</div>
|
|
</div>
|
|
|
|
<MDCRenderer v-if="ast" :body="ast.body" :data="ast.data" class="[&_pre]:!rounded-t-none [&_div.my-5]:!mt-0" />
|
|
</div>
|
|
</template>
|