Skip to content

Commit abf9a1b

Browse files
kamuiiiiikermanx
andauthored
fix: view transition in Presenter mode (#1363)
Co-authored-by: _Kerman <kermanx@qq.com>
1 parent 83a966b commit abf9a1b

File tree

8 files changed

+76
-67
lines changed

8 files changed

+76
-67
lines changed

packages/client/composables/useViewTransition.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ref } from 'vue'
22
import { useRouter } from 'vue-router'
3+
import { getSlide } from '../logic/nav'
34

45
export function useViewTransition() {
56
const router = useRouter()
@@ -11,13 +12,15 @@ export function useViewTransition() {
1112
const supportViewTransition = typeof document !== 'undefined' && 'startViewTransition' in document
1213

1314
router.beforeResolve((to, from) => {
14-
const fromNo = from.meta.slide?.no
15-
const toNo = to.meta.slide?.no
15+
const fromMeta = getSlide(from.params.no as string)?.meta
16+
const toMeta = getSlide(to.params.no as string)?.meta
17+
const fromNo = fromMeta?.slide?.no
18+
const toNo = toMeta?.slide?.no
1619
if (
1720
!(
1821
fromNo !== undefined && toNo !== undefined && (
19-
(from.meta.transition === 'view-transition' && fromNo < toNo)
20-
|| (to.meta.transition === 'view-transition' && toNo < fromNo)
22+
(fromMeta?.transition === 'view-transition' && fromNo < toNo)
23+
|| (toMeta?.transition === 'view-transition' && toNo < fromNo)
2124
)
2225
)
2326
) {

packages/client/internals/PrintSlideClick.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { injectionSlidevContext } from '../constants'
55
import { configs, slideHeight, slideWidth } from '../env'
66
import { getSlideClass } from '../utils'
77
import type { SlidevContextNav } from '../composables/useNav'
8-
import SlideWrapper from './SlideWrapper'
8+
import SlideWrapper from './SlideWrapper.vue'
99
1010
import GlobalTop from '#slidev/global-components/top'
1111
import GlobalBottom from '#slidev/global-components/bottom'

packages/client/internals/QuickOverview.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { useFixedClicks } from '../composables/useClicks'
88
import { getSlideClass } from '../utils'
99
import { CLICKS_MAX } from '../constants'
1010
import SlideContainer from './SlideContainer.vue'
11-
import SlideWrapper from './SlideWrapper'
11+
import SlideWrapper from './SlideWrapper.vue'
1212
import DrawingPreview from './DrawingPreview.vue'
1313
import IconButton from './IconButton.vue'
1414

packages/client/internals/SlideWrapper.ts

Lines changed: 0 additions & 58 deletions
This file was deleted.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<script setup lang="ts">
2+
import { computed, defineAsyncComponent, ref, toRef } from 'vue'
3+
import type { PropType } from 'vue'
4+
import { provideLocal } from '@vueuse/core'
5+
import type { ClicksContext, RenderContext, SlideRoute } from '@slidev/types'
6+
import { injectionActive, injectionClicksContext, injectionCurrentPage, injectionRenderContext, injectionRoute } from '../constants'
7+
import SlideLoading from './SlideLoading.vue'
8+
9+
const props = defineProps({
10+
clicksContext: {
11+
type: Object as PropType<ClicksContext>,
12+
required: true,
13+
},
14+
renderContext: {
15+
type: String as PropType<RenderContext>,
16+
default: 'slide',
17+
},
18+
active: {
19+
type: Boolean,
20+
default: false,
21+
},
22+
is: {
23+
required: true,
24+
},
25+
route: {
26+
type: Object as PropType<SlideRoute>,
27+
required: true,
28+
},
29+
})
30+
31+
provideLocal(injectionRoute, props.route)
32+
provideLocal(injectionCurrentPage, ref(props.route.no))
33+
provideLocal(injectionRenderContext, ref(props.renderContext as RenderContext))
34+
provideLocal(injectionActive, toRef(props, 'active'))
35+
provideLocal(injectionClicksContext, toRef(props, 'clicksContext'))
36+
37+
const style = computed(() => {
38+
const zoom = props.route.meta?.slide?.frontmatter.zoom ?? 1
39+
return zoom === 1
40+
? undefined
41+
: {
42+
width: `${100 / zoom}%`,
43+
height: `${100 / zoom}%`,
44+
transformOrigin: 'top left',
45+
transform: `scale(${zoom})`,
46+
}
47+
})
48+
49+
const SlideComponent = defineAsyncComponent({
50+
loader: (props.is as any),
51+
delay: 300,
52+
loadingComponent: SlideLoading,
53+
})
54+
</script>
55+
56+
<template>
57+
<component :is="SlideComponent" :style="style" :class="{ 'disable-view-transition': !['slide', 'presenter'].includes(props.renderContext) }" />
58+
</template>
59+
60+
<style scoped>
61+
.disable-view-transition:deep(*) {
62+
view-transition-name: none !important;
63+
}
64+
</style>

packages/client/internals/SlidesShow.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { getSlideClass } from '../utils'
55
import { useViewTransition } from '../composables/useViewTransition'
66
import { skipTransition } from '../composables/hmr'
77
import { usePrimaryClicks } from '../composables/useClicks'
8-
import SlideWrapper from './SlideWrapper'
8+
import SlideWrapper from './SlideWrapper.vue'
99
import PresenterMouse from './PresenterMouse.vue'
1010
1111
import GlobalTop from '#slidev/global-components/top'

packages/client/pages/overview.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { useFixedClicks } from '../composables/useClicks'
88
import { isColorSchemaConfigured, isDark, toggleDark } from '../logic/dark'
99
import { getSlideClass } from '../utils'
1010
import SlideContainer from '../internals/SlideContainer.vue'
11-
import SlideWrapper from '../internals/SlideWrapper'
11+
import SlideWrapper from '../internals/SlideWrapper.vue'
1212
import DrawingPreview from '../internals/DrawingPreview.vue'
1313
import IconButton from '../internals/IconButton.vue'
1414
import NoteEditable from '../internals/NoteEditable.vue'

packages/client/pages/presenter.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { getSlideClass } from '../utils'
1212
import { useTimer } from '../logic/utils'
1313
import { isDrawing } from '../logic/drawings'
1414
import { useFixedClicks, usePrimaryClicks } from '../composables/useClicks'
15-
import SlideWrapper from '../internals/SlideWrapper'
15+
import SlideWrapper from '../internals/SlideWrapper.vue'
1616
import SlideContainer from '../internals/SlideContainer.vue'
1717
import NavControls from '../internals/NavControls.vue'
1818
import QuickOverview from '../internals/QuickOverview.vue'

0 commit comments

Comments
 (0)