diff --git a/docs/custom/index.md b/docs/custom/index.md index 762b5fd5db..a6d28c1845 100644 --- a/docs/custom/index.md +++ b/docs/custom/index.md @@ -59,6 +59,8 @@ selectable: true record: dev # enable Slidev's context menu, can be boolean, 'dev' or 'build' contextMenu: true +# enable wake lock, can be boolean, 'dev' or 'build' +wakeLock: true # force color schema for the slides, can be 'auto', 'light', or 'dark' colorSchema: auto diff --git a/packages/client/composables/useWakeLock.ts b/packages/client/composables/useWakeLock.ts new file mode 100644 index 0000000000..a595ce0e4f --- /dev/null +++ b/packages/client/composables/useWakeLock.ts @@ -0,0 +1,13 @@ +import { useWakeLock as useVueUseWakeLock } from '@vueuse/core' +import { watchEffect } from 'vue' +import { wakeLockEnabled } from '../state' + +export function useWakeLock() { + const { request, release } = useVueUseWakeLock() + + watchEffect((onCleanup) => { + if (wakeLockEnabled.value) + request('screen') + onCleanup(release) + }) +} diff --git a/packages/client/constants.ts b/packages/client/constants.ts index 4f7a0537a5..296c9d6acf 100644 --- a/packages/client/constants.ts +++ b/packages/client/constants.ts @@ -80,4 +80,5 @@ export const HEADMATTER_FIELDS = [ 'htmlAttrs', 'mdc', 'contextMenu', + 'wakeLock', ] diff --git a/packages/client/internals/SelectList.vue b/packages/client/internals/SelectList.vue index 337f388523..5df55400e9 100644 --- a/packages/client/internals/SelectList.vue +++ b/packages/client/internals/SelectList.vue @@ -5,7 +5,7 @@ import type { SelectionItem } from './types' const props = defineProps({ modelValue: { - type: [Object, String, Number] as PropType, + type: [Object, String, Number, Boolean] as PropType, }, title: { type: String, @@ -43,7 +43,7 @@ const value = useVModel(props, 'modelValue', emit, { passive: true }) diff --git a/packages/client/internals/Settings.vue b/packages/client/internals/Settings.vue index f2640eb7ec..a912470068 100644 --- a/packages/client/internals/Settings.vue +++ b/packages/client/internals/Settings.vue @@ -1,9 +1,10 @@ diff --git a/packages/client/pages/play.vue b/packages/client/pages/play.vue index 4b593a9f75..b7662ee837 100644 --- a/packages/client/pages/play.vue +++ b/packages/client/pages/play.vue @@ -10,6 +10,7 @@ import SlidesShow from '../internals/SlidesShow.vue' import PrintStyle from '../internals/PrintStyle.vue' import { onContextMenu } from '../logic/contextMenu' import { useNav } from '../composables/useNav' +import { useWakeLock } from '../composables/useWakeLock' import { useDrawings } from '../composables/useDrawings' import PresenterMouse from '../internals/PresenterMouse.vue' @@ -32,6 +33,8 @@ function onClick(e: MouseEvent) { useSwipeControls(root) registerShortcuts() +if (__SLIDEV_FEATURE_WAKE_LOCK__) + useWakeLock() const persistNav = computed(() => isScreenVertical.value || showEditor.value) diff --git a/packages/client/pages/presenter.vue b/packages/client/pages/presenter.vue index 6e905306be..2251d801b0 100644 --- a/packages/client/pages/presenter.vue +++ b/packages/client/pages/presenter.vue @@ -24,11 +24,14 @@ import ClicksSlider from '../internals/ClicksSlider.vue' import ContextMenu from '../internals/ContextMenu.vue' import { useNav } from '../composables/useNav' import { useDrawings } from '../composables/useDrawings' +import { useWakeLock } from '../composables/useWakeLock' const main = ref() registerShortcuts() useSwipeControls(main) +if (__SLIDEV_FEATURE_WAKE_LOCK__) + useWakeLock() const { clicksContext, diff --git a/packages/client/state/index.ts b/packages/client/state/index.ts index d28c7747c3..801f4c5d14 100644 --- a/packages/client/state/index.ts +++ b/packages/client/state/index.ts @@ -25,6 +25,7 @@ export const isOnFocus = computed(() => ['BUTTON', 'A'].includes(activeElement.v export const currentCamera = useLocalStorage('slidev-camera', 'default', { listenToStorageChanges: false }) export const currentMic = useLocalStorage('slidev-mic', 'default', { listenToStorageChanges: false }) export const slideScale = useLocalStorage('slidev-scale', 0) +export const wakeLockEnabled = useLocalStorage('slidev-wake-lock', true) export const showPresenterCursor = useLocalStorage('slidev-presenter-cursor', true, { listenToStorageChanges: false }) export const showEditor = useLocalStorage('slidev-show-editor', false, { listenToStorageChanges: false }) diff --git a/packages/parser/src/config.ts b/packages/parser/src/config.ts index 32beca9cd6..8dac0f32d8 100644 --- a/packages/parser/src/config.ts +++ b/packages/parser/src/config.ts @@ -39,6 +39,7 @@ export function getDefaultConfig(): SlidevConfig { transition: undefined, editor: true, contextMenu: undefined, + wakeLock: true, } } diff --git a/packages/slidev/node/vite/extendConfig.ts b/packages/slidev/node/vite/extendConfig.ts index 4204b23955..999a1f50fc 100644 --- a/packages/slidev/node/vite/extendConfig.ts +++ b/packages/slidev/node/vite/extendConfig.ts @@ -230,6 +230,7 @@ export function getDefine(options: ResolvedSlidevOptions): Record