41 lines
1.2 KiB
TypeScript
Raw Normal View History

2026-05-31 13:21:13 +02:00
import type { SlideRoute } from '@slidev/types'
import { slides } from '#slidev/slides'
import { computed, watch, watchEffect } from 'vue'
import { useNav } from '../composables/useNav'
import { useSlideContext } from '../context'
export { slides }
export function getSlide(no: number | string) {
return slides.value.find(
s => (s.no === +no || s.meta.slide?.frontmatter.routeAlias === no),
)
}
export function getSlidePath(
route: SlideRoute | number | string,
presenter: boolean,
exporting: boolean = false,
) {
if (typeof route === 'number' || typeof route === 'string')
route = getSlide(route)!
const no = route.meta.slide?.frontmatter.routeAlias ?? route.no
return exporting ? `/export/${no}` : presenter ? `/presenter/${no}` : `/${no}`
}
export function useIsSlideActive() {
const { $page } = useSlideContext()
const { currentSlideNo } = useNav()
return computed(() => $page.value === currentSlideNo.value)
}
export function onSlideEnter(cb: () => void) {
const isActive = useIsSlideActive()
watchEffect(() => isActive.value && cb())
}
export function onSlideLeave(cb: () => void) {
const isActive = useIsSlideActive()
watch(isActive, () => !isActive.value && cb())
}