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' : '')
}