import 'glightbox/dist/css/glightbox.css' import { scrollbarWidth } from '@xobotyi/scrollbar-width' import { watch, type App, } from 'vue' import type { Router } from 'vitepress' export const glightboxSymbol = Symbol('glightbox') export async function createZoom(app: App, router: Router) { if (import.meta.env.SSR) { return } const GLightbox = await import('glightbox') const lightbox = GLightbox.default({ openEffect: 'fade', closeEffect: 'fade', zoomable: true, skin: 'white', svg: { close: '', next: '', prev: '', }, }) lightbox.reload = () => { const elements = Array.from(document.querySelectorAll('.vp-doc img')) .map((element, index) => { const target = element.parentElement instanceof HTMLAnchorElement ? element.parentElement : element target.addEventListener('click', (e) => { e.preventDefault() lightbox.openAt(index) }) const href = target.getAttribute(target instanceof HTMLAnchorElement ? 'href' : 'src') const title = element.getAttribute('alt') return { href, title, type: 'image', } }) lightbox.setElements(elements) } const scrollWidth = scrollbarWidth() lightbox.on('open', () => updateFixedElements(scrollWidth)) lightbox.on('close', () => updateFixedElements()) app.provide(glightboxSymbol, lightbox) watch( () => router.route.data.relativePath, () => setTimeout(() => { lightbox.reload() }), { immediate: true } ) } function updateFixedElements(scrollWidth?: number) { document.documentElement.style.setProperty('--scrollbar-width', scrollWidth ? scrollWidth + 'px' : '') }