Skip to content

Commit d09d801

Browse files
experiment: add basic support for speedrunner style split timing
1 parent 63be78c commit d09d801

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

demo/starter/slides.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ The last comment block of each slide will be treated as slide notes. It will be
4545

4646
---
4747
transition: fade-out
48+
split: 30
4849
---
4950

5051
# What is Slidev?
@@ -87,6 +88,7 @@ Here is another comment.
8788
---
8889
transition: slide-up
8990
level: 2
91+
split: 60
9092
---
9193

9294
# Navigation

packages/client/composables/useNav.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { slides } from '#slidev/slides'
55
import { clamp } from '@antfu/utils'
66
import { parseRangeString } from '@slidev/parser/utils'
77
import { createSharedComposable } from '@vueuse/core'
8-
import { computed, ref, watch } from 'vue'
8+
import { computed, ref, toRaw, watch } from 'vue'
99
import { useRoute, useRouter } from 'vue-router'
1010
import { CLICKS_MAX } from '../constants'
1111
import { configs } from '../env'
@@ -292,6 +292,16 @@ const useNavState = createSharedComposable((): SlidevContextNavState => {
292292
const currentSlideRoute = computed(() => slides.value[currentSlideNo.value - 1])
293293
const printRange = ref(parseRangeString(slides.value.length, currentRoute?.query?.range as string | undefined))
294294

295+
watch(currentSlideRoute, () => {
296+
window.dispatchEvent(new CustomEvent('slidev-slide-changed', {
297+
detail: {
298+
slideNumber: currentSlideNo.value,
299+
slide: toRaw(currentSlideRoute.value?.meta.slide),
300+
frontmatter: toRaw(currentSlideRoute.value?.meta.slide.frontmatter),
301+
},
302+
}))
303+
})
304+
295305
const queryClicksRaw = useRouteQuery<string>('clicks', '0')
296306

297307
const clicksContext = computed(() => getPrimaryClicks(currentSlideRoute.value))

packages/client/pages/presenter.vue

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,21 @@ const SideEditor = shallowRef<any>()
8888
if (__DEV__ && __SLIDEV_FEATURE_EDITOR__)
8989
import('../internals/SideEditor.vue').then(v => SideEditor.value = v.default)
9090
91+
function parseTimerString(timeString: string) {
92+
const [seconds, minutes = 0, hours = 0] = timeString.split(':').toReversed().map(n => Number.parseInt(n, 10))
93+
return hours * 3600 + minutes * 60 + seconds
94+
}
95+
96+
window.addEventListener('slidev-slide-changed', (e) => {
97+
const timerCounter = parseTimerString(timer.value)
98+
const splitCounter = typeof (e as CustomEvent).detail.frontmatter.split === 'string' ? parseTimerString((e as CustomEvent).detail.frontmatter.split) : (e as CustomEvent).detail.frontmatter.split || 0
99+
100+
if (splitCounter) {
101+
const delta = timerCounter - splitCounter
102+
console.warn('delta', delta)
103+
}
104+
})
105+
91106
// sync presenter cursor
92107
onMounted(() => {
93108
const slidesContainer = main.value!.querySelector('#slide-content')!

0 commit comments

Comments
 (0)