11<script setup lang="ts">
22import { ShikiCachedRenderer } from ' shiki-stream/vue'
3- import { createHighlighter } from ' shiki'
43import { computed , onMounted , ref , watch } from ' vue'
54import { textContent } from ' minimark'
6-
7- // Singleton highlighter instance shared across all code blocks
8- let highlighterInstance: any = null
9- let highlighterPromise: Promise <any > | null = null
10-
11- async function getHighlighter() {
12- if (highlighterInstance ) {
13- return highlighterInstance
14- }
15-
16- if (! highlighterPromise ) {
17- highlighterPromise = createHighlighter ({
18- themes: [' material-theme-lighter' , ' material-theme-palenight' , ' github-dark' , ' github-light' ],
19- langs: [' javascript' , ' typescript' , ' vue' , ' html' , ' css' , ' json' , ' markdown' , ' bash' , ' tsx' , ' shell' , ' text' ],
20- }).then ((hl ) => {
21- highlighterInstance = hl
22- return hl
23- })
24- }
25-
26- return highlighterPromise
27- }
5+ import { getHighlighter } from ' ../../../utils/shiki-highlighter'
286
297const props = withDefaults (defineProps <{
308 // @eslint-disable-next-line vue/prop-name-casing
@@ -37,7 +15,7 @@ const props = withDefaults(defineProps<{
3715 fallbackWithHeaderClass? : string
3816 shikiStyle? : Record <string , string >
3917}>(), {
40- theme: ' github-dark ' ,
18+ theme: ' material-theme-palenight ' ,
4119 containerClass: ' my-4' ,
4220 fallbackClass: ' bg-neutral-100 dark:bg-neutral-800 text-neutral-800 dark:text-neutral-200 p-4 rounded-lg overflow-x-auto border border-neutral-300 dark:border-neutral-700' ,
4321 fallbackWithHeaderClass: ' bg-neutral-100 dark:bg-neutral-800 text-neutral-800 dark:text-neutral-200 p-4 pt-12 rounded-lg overflow-x-auto m-0 border border-neutral-300 dark:border-neutral-700' ,
@@ -100,7 +78,10 @@ async function copyCode() {
10078
10179// Load highlighter on mount
10280onMounted (() => {
103- getHighlighter ()
81+ getHighlighter ({
82+ themes: { light: ' material-theme-palenight' , dark: ' material-theme-lighter' },
83+ languages: [' javascript' , ' typescript' , ' vue' , ' html' , ' css' , ' json' , ' markdown' , ' bash' , ' jsx' , ' tsx' , ' shell' ],
84+ })
10485 .then ((hl ) => {
10586 highlighter .value = hl
10687 isLoading .value = false
@@ -175,7 +156,7 @@ onMounted(() => {
175156 <!-- Loading state -->
176157 <pre
177158 v-if =" isLoading"
178- class =" bg-neutral-100 dark:bg-neutral-800 rounded-lg pt-16 p-4 border border-neutral-300 dark:border-neutral-700"
159+ class =" bg-neutral-100 dark:bg-neutral-800 rounded-lg pt-12 p-4 border border-neutral-300 dark:border-neutral-700"
179160 ><code >{{ codeContent }}</code ></pre >
180161
181162 <!-- Shiki renderer -->
@@ -185,8 +166,8 @@ onMounted(() => {
185166 :highlighter =" highlighter "
186167 :code =" codeContent "
187168 :lang =" language || ' text' "
188- :theme =" theme || ' github-dark ' "
189- class="shiki-container bg-neutral-100 dark:bg-neutral-800 rounded-lg pt-16 p-4 border border-neutral-300 dark:border-neutral-700 "
169+ :theme =" theme || ' material-theme-palenight ' "
170+ class="shiki-container bg-neutral-100 dark:bg-neutral-800 rounded-l overflow-x-auto pt-12 p-4 border border-neutral-300 dark:border-neutral-700 "
190171 :style =" shikiStyle "
191172 />
192173
0 commit comments