From df8bda013055f659a542001972e817b7578f15d3 Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Mon, 27 Apr 2026 15:28:10 +0200 Subject: [PATCH] feat(markdown): render tabs as DaisyUI radio input pattern Use @mdit/plugin-tab custom renderers to emit DaisyUI tabs-lift structure (radio inputs + tab-content divs) instead of unstyled default output. CSS-driven, no JS required. --- src/hooks/useMarkdown.hook.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/hooks/useMarkdown.hook.ts b/src/hooks/useMarkdown.hook.ts index d9e8109..61ea501 100644 --- a/src/hooks/useMarkdown.hook.ts +++ b/src/hooks/useMarkdown.hook.ts @@ -1,3 +1,4 @@ +import type { MarkdownItTabData, MarkdownItTabInfo } from "@mdit/plugin-tab" import { tab } from "@mdit/plugin-tab" import markdownItKatex from "@vscode/markdown-it-katex" import GithubSlugger from "github-slugger" @@ -50,6 +51,10 @@ const markdownItMermaidExtractor = (md: MarkdownIt) => { const slugger = new GithubSlugger() +let tabGroupCounter = 0 +let currentTabGroup = 0 +let currentTabActiveSet = false + const md = new MarkdownIt({ typographer: true, quotes: ["«\xA0", "\xA0»", "‹\xA0", "\xA0›"] @@ -70,7 +75,20 @@ const md = new MarkdownIt({ .use(MarkdownItGitHubAlerts) .use(markdownItTablerIcons) .use(tab, { - name: "tabs" + name: "tabs", + openRender: (info: MarkdownItTabInfo) => { + currentTabGroup = ++tabGroupCounter + currentTabActiveSet = info.active >= 0 + return '
\n' + }, + closeRender: () => "
\n", + tabOpenRender: (data: MarkdownItTabData) => { + const isChecked = data.isActive || (!currentTabActiveSet && data.index === 0) + const checked = isChecked ? " checked" : "" + const title = data.title.replace(/"/g, """) + return `\n
\n` + }, + tabCloseRender: () => "
\n" }) .use(markdownItAnchor, { slugify: (s: string) => slugger.slug(s)