Skip to content

Commit 4710695

Browse files
committed
fix: preserve clicks state for previous slide
1 parent c7b15a4 commit 4710695

File tree

2 files changed

+16
-10
lines changed

2 files changed

+16
-10
lines changed

packages/client/internals/SlidesShow.vue

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script setup lang="ts">
22
import { computed, shallowRef, watch } from 'vue'
3-
import { clicks, currentRoute, isPresenter, nextRoute, rawRoutes, transition } from '../logic/nav'
3+
import { clicks, currentRoute, isPresenter, nextRoute, rawRoutes, router, transition } from '../logic/nav'
44
import { getSlideClass } from '../utils'
55
import SlideWrapper from './SlideWrapper'
66
@@ -21,6 +21,12 @@ watch(currentRoute, () => {
2121
nextRoute.value.meta.__preloaded = true
2222
}, { immediate: true })
2323
24+
// preserve the clicks count for previous slide to avoid flash on transition
25+
let previousClicks: [string | undefined, number] = [] as any
26+
router.beforeEach(() => {
27+
previousClicks = [currentRoute.value?.path, clicks.value]
28+
})
29+
2430
const DrawingLayer = shallowRef<any>()
2531
if (__SLIDEV_FEATURE_DRAWINGS__ || __SLIDEV_FEATURE_DRAWINGS_PERSIST__)
2632
import('./DrawingLayer.vue').then(v => DrawingLayer.value = v.default)
@@ -38,7 +44,7 @@ const loadedRoutes = computed(() => rawRoutes.filter(r => r.meta?.__preloaded ||
3844
<SlideWrapper
3945
:is="route?.component as any"
4046
v-show="route === currentRoute"
41-
:clicks="route === currentRoute ? clicks : 0"
47+
:clicks="route === currentRoute ? clicks : route.path === previousClicks[0] ? previousClicks[1] : 0"
4248
:clicks-elements="route.meta?.__clicksElements || []"
4349
:clicks-disabled="false"
4450
:class="getSlideClass(route)"

packages/slidev/node/plugins/loaders.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ ${title}
297297
name: 'slidev:context-transform:pre',
298298
enforce: 'pre',
299299
async transform(code, id) {
300-
if (!id.endsWith('.vue'))
300+
if (!id.endsWith('.vue') || id.includes('/@slidev/client/') || id.includes('/packages/client/'))
301301
return
302302
return transformVue(code)
303303
},
@@ -347,12 +347,12 @@ ${title}
347347
const imports = [
348348
'import { inject as _vueInject, toRef as _vueToRef } from "vue"',
349349
`import InjectedLayout from "${toAtFS(layouts[layoutName])}"`,
350-
'import { injectionSlidevContext } from "@slidev/client/constants.ts"',
350+
'import { injectionSlidevContext as _injectionSlidevContext, injectionClicks as _injectionClicks } from "@slidev/client/constants.ts"',
351351
`const frontmatter = ${JSON.stringify(frontmatter)}`,
352352
'const $frontmatter = frontmatter',
353-
'const $slidev = _vueInject(injectionSlidevContext)',
353+
'const $slidev = _vueInject(_injectionSlidevContext)',
354354
'const $nav = _vueToRef($slidev, "nav")',
355-
'const $clicks = _vueToRef($slidev.nav, "clicks")',
355+
'const $clicks = _vueInject(_injectionClicks)',
356356
]
357357

358358
code = code.replace(/(<script setup.*>)/g, `$1\n${imports.join('\n')}\n`)
@@ -367,14 +367,14 @@ ${title}
367367
}
368368

369369
function transformVue(code: string): string {
370-
if (code.includes('injectionSlidevContext'))
370+
if (code.includes('injectionSlidevContext') || code.includes('injectionClicks') || code.includes('const $slidev'))
371371
return code // Assume that the context is already imported and used
372372
const imports = [
373373
'import { inject as _vueInject, toRef as _vueToRef } from "vue"',
374-
'import { injectionSlidevContext } from "@slidev/client/constants.ts"',
375-
'const $slidev = _vueInject(injectionSlidevContext)',
374+
'import { injectionSlidevContext as _injectionSlidevContext, injectionClicks as _injectionClicks } from "@slidev/client/constants.ts"',
375+
'const $slidev = _vueInject(_injectionSlidevContext)',
376376
'const $nav = _vueToRef($slidev, "nav")',
377-
'const $clicks = _vueToRef($slidev.nav, "clicks")',
377+
'const $clicks = _vueInject(_injectionClicks)',
378378
]
379379
const matchScript = code.match(/<script((?!setup).)*(setup)?.*>/)
380380
if (matchScript && matchScript[2]) {

0 commit comments

Comments
 (0)