mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-01-14 20:19:34 +01:00
79 lines
1.6 KiB
Vue
79 lines
1.6 KiB
Vue
<script setup lang="ts">
|
|
import { camelCase } from 'scule'
|
|
|
|
const props = 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
|
|
}>()
|
|
|
|
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
|
|
${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 (e) {
|
|
formatted = code.value
|
|
}
|
|
|
|
return parseMarkdown(formatted)
|
|
}, { watch: [code] })
|
|
</script>
|
|
|
|
<template>
|
|
<div class="my-5">
|
|
<div>
|
|
<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>
|