97 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Vue
		
	
	
<script lang="ts" setup>
 | 
						|
import {
 | 
						|
  computed,
 | 
						|
  nextTick,
 | 
						|
  onBeforeUnmount,
 | 
						|
  onMounted,
 | 
						|
  ref,
 | 
						|
  watch,
 | 
						|
} from 'vue';
 | 
						|
 | 
						|
// import { useAntdDesignTokens } from '@vben/hooks';
 | 
						|
// import { initPreferences } from '@vben/preferences';
 | 
						|
import { ConfigProvider, theme } from 'ant-design-vue';
 | 
						|
import mediumZoom from 'medium-zoom';
 | 
						|
import { useRoute } from 'vitepress';
 | 
						|
import DefaultTheme from 'vitepress/theme';
 | 
						|
 | 
						|
const { Layout } = DefaultTheme;
 | 
						|
const route = useRoute();
 | 
						|
// const { tokens } = useAntdDesignTokens();
 | 
						|
 | 
						|
const initZoom = () => {
 | 
						|
  // mediumZoom('[data-zoomable]', { background: 'var(--vp-c-bg)' });
 | 
						|
  mediumZoom('.VPContent img', { background: 'var(--vp-c-bg)' });
 | 
						|
};
 | 
						|
 | 
						|
const isDark = ref(true);
 | 
						|
 | 
						|
watch(
 | 
						|
  () => route.path,
 | 
						|
  () => nextTick(() => initZoom()),
 | 
						|
);
 | 
						|
 | 
						|
// initPreferences({
 | 
						|
//   namespace: 'docs',
 | 
						|
// });
 | 
						|
 | 
						|
onMounted(() => {
 | 
						|
  initZoom();
 | 
						|
});
 | 
						|
 | 
						|
// 使用该函数
 | 
						|
const observer = watchDarkModeChange((dark) => {
 | 
						|
  isDark.value = dark;
 | 
						|
});
 | 
						|
 | 
						|
onBeforeUnmount(() => {
 | 
						|
  observer?.disconnect();
 | 
						|
});
 | 
						|
 | 
						|
function watchDarkModeChange(callback: (isDark: boolean) => void) {
 | 
						|
  if (typeof window === 'undefined') {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  const htmlElement = document.documentElement;
 | 
						|
 | 
						|
  const observer = new MutationObserver(() => {
 | 
						|
    const isDark = htmlElement.classList.contains('dark');
 | 
						|
    callback(isDark);
 | 
						|
  });
 | 
						|
 | 
						|
  observer.observe(htmlElement, {
 | 
						|
    attributeFilter: ['class'],
 | 
						|
    attributes: true,
 | 
						|
  });
 | 
						|
 | 
						|
  const initialIsDark = htmlElement.classList.contains('dark');
 | 
						|
  callback(initialIsDark);
 | 
						|
 | 
						|
  return observer;
 | 
						|
}
 | 
						|
 | 
						|
const tokenTheme = computed(() => {
 | 
						|
  const algorithm = isDark.value
 | 
						|
    ? [theme.darkAlgorithm]
 | 
						|
    : [theme.defaultAlgorithm];
 | 
						|
 | 
						|
  return {
 | 
						|
    algorithm,
 | 
						|
    // token: tokens,
 | 
						|
  };
 | 
						|
});
 | 
						|
</script>
 | 
						|
 | 
						|
<template>
 | 
						|
  <ConfigProvider :theme="tokenTheme">
 | 
						|
    <Layout />
 | 
						|
  </ConfigProvider>
 | 
						|
</template>
 | 
						|
 | 
						|
<style>
 | 
						|
.medium-zoom-overlay,
 | 
						|
.medium-zoom-image--opened {
 | 
						|
  z-index: 2147483647;
 | 
						|
}
 | 
						|
</style>
 |