| 1 | import type { SlideRoute } from '@slidev/types' |
| 2 | import type { TransitionGroupProps } from 'vue' |
| 3 | import { configs } from '../env' |
| 4 | |
| 5 | const transitionResolveMap: Record<string, string | undefined> = { |
| 6 | 'slide-left': 'slide-left | slide-right', |
| 7 | 'slide-right': 'slide-right | slide-left', |
| 8 | 'slide-up': 'slide-up | slide-down', |
| 9 | 'slide-down': 'slide-down | slide-up', |
| 10 | } |
| 11 | |
| 12 | export function resolveTransition(transition?: string | TransitionGroupProps, isBackward = false): TransitionGroupProps | undefined { |
| 13 | if (!transition) |
| 14 | return undefined |
| 15 | if (typeof transition === 'string') { |
| 16 | transition = { |
| 17 | name: transition, |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | if (!transition.name) |
| 22 | return undefined |
| 23 | |
| 24 | let name = transition.name.includes('|') |
| 25 | ? transition.name |
| 26 | : (transitionResolveMap[transition.name] || transition.name) |
| 27 | |
| 28 | if (name.includes('|')) { |
| 29 | const [forward, backward] = name.split('|').map(i => i.trim()) |
| 30 | name = isBackward ? backward : forward |
| 31 | } |
| 32 | |
| 33 | if (!name) |
| 34 | return undefined |
| 35 | |
| 36 | return { |
| 37 | ...transition, |
| 38 | name, |
| 39 | } |
| 40 | } |
| 41 | |
| 42 | export function getCurrentTransition(direction: number, currentRoute?: SlideRoute, prevRoute?: SlideRoute) { |
| 43 | let transition = direction > 0 |
| 44 | ? prevRoute?.meta?.transition |
| 45 | : currentRoute?.meta?.transition |
| 46 | if (!transition) |
| 47 | transition = configs.transition || undefined |
| 48 | |
| 49 | return resolveTransition(transition, direction < 0) |
| 50 | } |
| 51 |