@@ -25,7 +25,7 @@ export interface ProsePreSlots {
2525 </script >
2626
2727<script setup lang="ts">
28- import { computed } from ' vue'
28+ import { computed , ref } from ' vue'
2929import { useClipboard } from ' @vueuse/core'
3030import { useAppConfig } from ' #imports'
3131import { useComponentUI } from ' ../../composables/useComponentUI'
@@ -41,9 +41,16 @@ const { t } = useLocale()
4141const { copy, copied } = useClipboard ()
4242const appConfig = useAppConfig () as ProsePre [' AppConfig' ]
4343const uiProp = useComponentUI (' prose.pre' , props )
44+ const preTemplateRef = ref <HTMLElement | null >()
4445
4546// eslint-disable-next-line vue/no-dupe-keys
4647const ui = computed (() => tv ({ extend: tv (theme ), ... (appConfig .ui ?.prose ?.pre || {}) })())
48+
49+ function copyCode() {
50+ const code = props .code ?? preTemplateRef .value ?.textContent ?? ' '
51+
52+ copy (code )
53+ }
4754 </script >
4855
4956<template >
@@ -62,9 +69,9 @@ const ui = computed(() => tv({ extend: tv(theme), ...(appConfig.ui?.prose?.pre |
6269 :aria-label =" t('prose.pre.copy')"
6370 :class =" ui.copy({ class: uiProp?.copy })"
6471 tabindex =" -1"
65- @click =" copy(props.code || '') "
72+ @click =" copyCode "
6673 />
6774
68- <pre :class =" ui.base({ class: [uiProp?.base, props.class] })" v-bind =" $attrs" ><slot /></pre >
75+ <pre ref = " preTemplateRef " :class =" ui.base({ class: [uiProp?.base, props.class] })" v-bind =" $attrs" ><slot /></pre >
6976 </div >
7077</template >
0 commit comments