From 9d3e5e6e01521d5ecb7adfacaf420fcbbd52e2f9 Mon Sep 17 00:00:00 2001 From: Elecmonkey Date: Sun, 28 Sep 2025 12:01:25 +0800 Subject: [PATCH 1/2] fix: prevent Twoslash poppers from persisting between slides --- packages/client/composables/useNav.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/client/composables/useNav.ts b/packages/client/composables/useNav.ts index e1500c42a4..f227a97c5a 100644 --- a/packages/client/composables/useNav.ts +++ b/packages/client/composables/useNav.ts @@ -5,6 +5,7 @@ import { slides } from '#slidev/slides' import { clamp } from '@antfu/utils' import { parseRangeString } from '@slidev/parser/utils' import { createSharedComposable } from '@vueuse/core' +import { hideAllPoppers } from 'floating-vue' import { computed, ref, watch } from 'vue' import { useRoute, useRouter } from 'vue-router' import { CLICKS_MAX } from '../constants' @@ -118,6 +119,8 @@ export function useNavBase( watch(currentSlideRoute, (next, prev) => { navDirection.value = next.no - prev.no + if (prev) + hideAllPoppers() }) async function openInEditor(url?: string) { From e381c42c2d6aafb5e75e471ace0cbe24b0a63aad Mon Sep 17 00:00:00 2001 From: Elecmonkey Date: Sun, 28 Sep 2025 12:13:02 +0800 Subject: [PATCH 2/2] fix: prevent all Twoslash poppers from showing by default on load --- .../syntax/markdown-it/markdown-it-shiki.ts | 3 +++ .../syntax/transform/twoslash-conditional.ts | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 packages/slidev/node/syntax/transform/twoslash-conditional.ts diff --git a/packages/slidev/node/syntax/markdown-it/markdown-it-shiki.ts b/packages/slidev/node/syntax/markdown-it/markdown-it-shiki.ts index 1cf530e870..18b85a9639 100644 --- a/packages/slidev/node/syntax/markdown-it/markdown-it-shiki.ts +++ b/packages/slidev/node/syntax/markdown-it/markdown-it-shiki.ts @@ -2,6 +2,7 @@ import type { ResolvedSlidevOptions } from '@slidev/types' import type { ShikiTransformer } from 'shiki' import { isTruthy } from '@antfu/utils' import { fromHighlighter } from '@shikijs/markdown-it/core' +import { transformerTwoslashConditional } from '../transform/twoslash-conditional' import { escapeVueInCode } from '../transform/utils' export default async function MarkdownItShiki({ data: { config }, mode, utils }: ResolvedSlidevOptions) { @@ -16,6 +17,8 @@ export default async function MarkdownItShiki({ data: { config }, mode, utils }: }, }, }), + (config.twoslash === true || config.twoslash === mode) + && transformerTwoslashConditional(), { pre(pre) { this.addClassToHast(pre, 'slidev-code') diff --git a/packages/slidev/node/syntax/transform/twoslash-conditional.ts b/packages/slidev/node/syntax/transform/twoslash-conditional.ts new file mode 100644 index 0000000000..1cc530c4fd --- /dev/null +++ b/packages/slidev/node/syntax/transform/twoslash-conditional.ts @@ -0,0 +1,17 @@ +import type { ShikiTransformer } from 'shiki' + +/** + * Custom Twoslash transformer that replaces :shown='true' with conditional logic + * to prevent poppers from being shown during preload + */ +export function transformerTwoslashConditional(): ShikiTransformer { + return { + name: 'slidev:twoslash-conditional', + postprocess(code) { + return code.replace( + /(]*):shown=['"]true['"]/g, + '$1:shown="false"', + ) + }, + } +}