Skip to content

Commit d83edd8

Browse files
authored
refactor: DOM structure (#1556)
1 parent e03fd38 commit d83edd8

23 files changed

+152
-219
lines changed

packages/client/composables/useNav.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export interface SlidevContextNav {
5555
/** Go to previous slide */
5656
prevSlide: (lastClicks?: boolean) => Promise<void>
5757
/** Go to slide */
58-
go: (page: number | string, clicks?: number) => Promise<void>
58+
go: (page: number | string, clicks?: number, force?: boolean) => Promise<void>
5959
/** Go to the first slide */
6060
goFirst: () => Promise<void>
6161
/** Go to the last slide */
@@ -181,14 +181,14 @@ export function useNavBase(
181181
return go(total.value)
182182
}
183183

184-
async function go(page: number | string, clicks: number = 0) {
184+
async function go(page: number | string, clicks: number = 0, force = false) {
185185
skipTransition.value = false
186186
const pageChanged = currentSlideNo.value !== page
187187
const clicksChanged = clicks !== queryClicks.value
188188
const meta = getSlide(page)?.meta
189189
const clicksStart = meta?.slide?.frontmatter.clicksStart ?? 0
190190
clicks = clamp(clicks, clicksStart, meta?.__clicksContext?.total ?? CLICKS_MAX)
191-
if (pageChanged || clicksChanged) {
191+
if (force || pageChanged || clicksChanged) {
192192
await router?.push({
193193
path: getSlidePath(page, isPresenter.value),
194194
query: {
@@ -380,9 +380,16 @@ export const useNav = createSharedComposable((): SlidevContextNavFull => {
380380
watch(
381381
[nav.total, state.currentRoute],
382382
async () => {
383-
if (state.hasPrimarySlide.value && !getSlide(state.currentRoute.value.params.no as string)) {
384-
// The current slide may has been removed. Redirect to the last slide.
385-
await nav.goLast()
383+
const no = state.currentRoute.value.params.no as string
384+
if (state.hasPrimarySlide.value && !getSlide(no)) {
385+
if (no && no !== 'index.html') {
386+
// The current slide may has been removed. Redirect to the last slide.
387+
await nav.go(nav.total.value, 0, true)
388+
}
389+
else {
390+
// Redirect to the first slide
391+
await nav.go(1, 0, true)
392+
}
386393
}
387394
},
388395
{ flush: 'pre', immediate: true },

packages/client/constants.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ export const injectionSlideScale = '$$slidev-slide-scale' as unknown as Injectio
1111
export const injectionSlidevContext = '$$slidev-context' as unknown as InjectionKey<UnwrapNestedRefs<SlidevContext>>
1212
export const injectionRoute = '$$slidev-route' as unknown as InjectionKey<SlideRoute>
1313
export const injectionRenderContext = '$$slidev-render-context' as unknown as InjectionKey<Ref<RenderContext>>
14-
export const injectionActive = '$$slidev-active' as unknown as InjectionKey<Ref<boolean>>
1514
export const injectionFrontmatter = '$$slidev-fontmatter' as unknown as InjectionKey<Record<string, any>>
1615
export const injectionSlideZoom = '$$slidev-slide-zoom' as unknown as InjectionKey<ComputedRef<number>>
1716

packages/client/env.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,5 @@ export const slideHeight = computed(() => Math.ceil(slideWidth.value / slideAspe
1616
export const themeVars = computed(() => {
1717
return objectMap(configs.themeConfig || {}, (k, v) => [`--slidev-theme-${k}`, v])
1818
})
19+
20+
export const slidesTitle = configs.titleTemplate.replace('%s', configs.title || 'Slidev')

packages/client/internals/Controls.vue

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
<script setup lang="ts">
22
import { shallowRef } from 'vue'
3-
import { showInfoDialog, showOverview, showRecordingDialog } from '../state'
3+
import { showInfoDialog, showRecordingDialog } from '../state'
44
import { configs } from '../env'
5+
import { useNav } from '../composables/useNav'
56
import QuickOverview from './QuickOverview.vue'
67
import InfoDialog from './InfoDialog.vue'
78
import Goto from './Goto.vue'
89
import ContextMenu from './ContextMenu.vue'
910
11+
const { isEmbedded } = useNav()
12+
const drawingEnabled = __SLIDEV_FEATURE_DRAWINGS__ && !configs.drawings.presenterOnly && !isEmbedded.value
13+
const DrawingControls = shallowRef<any>()
14+
if (drawingEnabled)
15+
import('../internals/DrawingControls.vue').then(v => DrawingControls.value = v.default)
16+
1017
const WebCamera = shallowRef<any>()
1118
const RecordingDialog = shallowRef<any>()
1219
if (__SLIDEV_FEATURE_RECORD__) {
@@ -16,7 +23,8 @@ if (__SLIDEV_FEATURE_RECORD__) {
1623
</script>
1724

1825
<template>
19-
<QuickOverview v-model="showOverview" />
26+
<DrawingControls v-if="drawingEnabled && DrawingControls" />
27+
<QuickOverview />
2028
<Goto />
2129
<WebCamera v-if="WebCamera" />
2230
<RecordingDialog v-if="RecordingDialog" v-model="showRecordingDialog" />

packages/client/internals/DrawingControls.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,4 +136,4 @@ function setBrushColor(color: typeof brush.color) {
136136
.v-popper--theme-menu .v-popper__arrow-inner {
137137
--uno: border-main;
138138
}
139-
</style>../composables/drawings
139+
</style>

packages/client/internals/DrawingLayer.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ onBeforeUnmount(() => {
2525
class="w-full h-full absolute top-0"
2626
:class="{ 'pointer-events-none': !drawingEnabled, 'touch-none': drawingEnabled }"
2727
/>
28-
</template>../composables/drawings
28+
</template>

packages/client/internals/DrawingPreview.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ const { drawingState } = useDrawings()
1212
class="w-full h-full absolute top-0 pointer-events-none"
1313
v-html="drawingState[page]"
1414
/>
15-
</template>../composables/drawings
15+
</template>

packages/client/internals/NavControls.vue

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,6 @@ const barStyle = computed(() => props.persist
5353
const RecordingControls = shallowRef<any>()
5454
if (__SLIDEV_FEATURE_RECORD__)
5555
import('./RecordingControls.vue').then(v => RecordingControls.value = v.default)
56-
57-
const DrawingControls = shallowRef<any>()
58-
if (__SLIDEV_FEATURE_DRAWINGS__)
59-
import('./DrawingControls.vue').then(v => DrawingControls.value = v.default)
6056
</script>
6157

6258
<template>
@@ -179,4 +175,4 @@ if (__SLIDEV_FEATURE_DRAWINGS__)
179175
<CustomNavControls />
180176
</div>
181177
</nav>
182-
</template>../composables/drawings
178+
</template>

packages/client/internals/NoteDisplay.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const emit = defineEmits<{
1717
(type: 'markerClick', e: MouseEvent, clicks: number): void
1818
}>()
1919
20-
const withClicks = computed(() => props.clicksContext?.current != null && props.noteHtml?.includes('slidev-note-click-mark'))
20+
const withClicks = computed(() => props.clicksContext != null && props.noteHtml?.includes('slidev-note-click-mark'))
2121
const noteDisplay = ref<HTMLElement | null>(null)
2222
2323
const CLASS_FADE = 'slidev-note-fade'

packages/client/internals/QuickOverview.vue

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,20 @@
11
<script setup lang="ts">
2-
import { useEventListener, useVModel } from '@vueuse/core'
2+
import { useEventListener } from '@vueuse/core'
33
import { computed, ref, watchEffect } from 'vue'
44
import { breakpoints, showOverview, windowSize } from '../state'
55
import { currentOverviewPage, overviewRowCount } from '../logic/overview'
66
import { createFixedClicks } from '../composables/useClicks'
7-
import { getSlideClass } from '../utils'
87
import { CLICKS_MAX } from '../constants'
98
import { useNav } from '../composables/useNav'
109
import SlideContainer from './SlideContainer.vue'
1110
import SlideWrapper from './SlideWrapper.vue'
1211
import DrawingPreview from './DrawingPreview.vue'
1312
import IconButton from './IconButton.vue'
1413
15-
const props = defineProps<{ modelValue: boolean }>()
16-
const emit = defineEmits(['update:modelValue'])
17-
const value = useVModel(props, 'modelValue', emit)
18-
1914
const { currentSlideNo, go: goSlide, slides } = useNav()
2015
2116
function close() {
22-
value.value = false
17+
showOverview.value = false
2318
}
2419
2520
function go(page: number) {
@@ -117,10 +112,10 @@ setTimeout(() => {
117112
leave-to-class="opacity-0 scale-102 !backdrop-blur-0px"
118113
>
119114
<div
120-
v-if="value || activeSlidesLoaded"
121-
v-show="value"
122-
class="bg-main !bg-opacity-75 p-16 py-20 overflow-y-auto backdrop-blur-5px fixed left-0 right-0 top-0 h-[calc(var(--vh,1vh)*100)]"
123-
@click="close()"
115+
v-if="showOverview || activeSlidesLoaded"
116+
v-show="showOverview"
117+
class="fixed left-0 right-0 top-0 h-[calc(var(--vh,1vh)*100)] z-20 bg-main !bg-opacity-75 p-16 py-20 overflow-y-auto backdrop-blur-5px"
118+
@click="close"
124119
>
125120
<div
126121
class="grid gap-y-4 gap-x-8 w-full"
@@ -142,10 +137,7 @@ setTimeout(() => {
142137
class="pointer-events-none"
143138
>
144139
<SlideWrapper
145-
:is="route.component"
146-
v-if="route?.component"
147140
:clicks-context="createFixedClicks(route, CLICKS_MAX)"
148-
:class="getSlideClass(route)"
149141
:route="route"
150142
render-context="overview"
151143
/>
@@ -168,12 +160,12 @@ setTimeout(() => {
168160
</div>
169161
</div>
170162
</Transition>
171-
<div v-if="value" class="fixed top-4 right-4 text-gray-400 flex flex-col items-center gap-2">
163+
<div v-if="showOverview" class="fixed top-4 right-4 z-20 text-gray-400 flex flex-col items-center gap-2">
172164
<IconButton title="Close" class="text-2xl" @click="close">
173165
<carbon:close />
174166
</IconButton>
175167
<IconButton
176-
v-if="__DEV__"
168+
v-if="__SLIDEV_FEATURE_PRESENTER__"
177169
as="a"
178170
title="Slides Overview"
179171
target="_blank"

0 commit comments

Comments
 (0)