diff --git a/e2e/fixtures/plugin-shiki/package.json b/e2e/fixtures/plugin-shiki/package.json index 26002a1c0..b691a45e0 100644 --- a/e2e/fixtures/plugin-shiki/package.json +++ b/e2e/fixtures/plugin-shiki/package.json @@ -9,6 +9,7 @@ }, "dependencies": { "@rspress/plugin-shiki": "workspace:*", + "@shikijs/transformers": "1.24.2", "rspress": "workspace:*" }, "devDependencies": { diff --git a/e2e/fixtures/plugin-shiki/rspress.config.ts b/e2e/fixtures/plugin-shiki/rspress.config.ts index a2bee0abb..4c210bf64 100644 --- a/e2e/fixtures/plugin-shiki/rspress.config.ts +++ b/e2e/fixtures/plugin-shiki/rspress.config.ts @@ -1,24 +1,26 @@ -import path from 'node:path'; -import { defineConfig } from 'rspress/config'; import { - createTransformerDiff, - createTransformerErrorLevel, - createTransformerFocus, - createTransformerHighlight, createTransformerLineNumber, pluginShiki, } from '@rspress/plugin-shiki'; +import { + transformerNotationDiff, + transformerNotationErrorLevel, + transformerNotationFocus, + transformerNotationHighlight, +} from '@shikijs/transformers'; +import path from 'node:path'; +import { defineConfig } from 'rspress/config'; export default defineConfig({ root: path.join(__dirname, 'doc'), plugins: [ pluginShiki({ transformers: [ - createTransformerDiff(), + transformerNotationDiff(), + transformerNotationErrorLevel(), + transformerNotationHighlight(), + transformerNotationFocus(), createTransformerLineNumber(), - createTransformerErrorLevel(), - createTransformerHighlight(), - createTransformerFocus(), ], }), ], diff --git a/packages/document/docs/en/plugin/official-plugins/shiki.mdx b/packages/document/docs/en/plugin/official-plugins/shiki.mdx index 1b5cf743e..af4408fbc 100644 --- a/packages/document/docs/en/plugin/official-plugins/shiki.mdx +++ b/packages/document/docs/en/plugin/official-plugins/shiki.mdx @@ -36,19 +36,21 @@ export default defineConfig({ This plugin supports passing in an object configuration. The properties of this object configuration are as follows: ```ts -interface PluginShikiOptions { +import type { BuiltinLanguage, BuiltinTheme, ShikiTransformer, SpecialLanguage } from 'shiki'; + +export interface PluginShikiOptions { /** - * Code highlighting theme + * Code highlighting theme, @see https://shiki.style/themes */ - theme: string; + theme: BuiltinTheme | 'css-variables'; /** - * Code highlighting language + * Code highlighting language, @see https://shiki.style/languages */ - langs: string[]; + langs: Array; /** - * Add custom transformer + * Custom shiki transformer, @see https://shiki.style/guide/transformers */ - transformers: Transformer[]; + transformers: ShikiTransformer[]; } ``` @@ -64,81 +66,34 @@ Transformer is a concept in this plugin, its function is to transform specific s A few Transformers are built into this plugin, including: -- `createTransformerDiff`: Implementation of the diff highlighting effect of the code block. - `createTransformerLineNumber`: Implement the display of the line number of the code block. -- `createTransformerErrorLevel`: Implement the display of the error level of the corresponding line of the code block, including `error` and `warning`. -- `createTransformerHighlight`: Implement line highlighting display of the code block. -- `createTransformerFocus`: Implement line focus display of the code block. You can enable these Transformers by configuring the `transformers` attribute, such as: ```ts title="rspress.config.ts" import { defineConfig } from 'rspress/config'; import { pluginShiki, createTransformerDiff } from '@rspress/plugin-shiki'; +import { + transformerNotationDiff, + transformerNotationErrorLevel, + transformerNotationFocus, + transformerNotationHighlight, +} from '@shikijs/transformers'; export default defineConfig({ plugins: [ pluginShiki({ transformers: [ // Add as needed - createTransformerDiff(), - // createTransformerLineNumber(), - // createTransformerErrorLevel(), - // createTransformerHighlight(), - // createTransformerFocus(), + createTransformerLineNumber(), + // transformerNotationDiff(), + // transformerNotationErrorLevel(), + // transformerNotationHighlight(), + // transformerNotationFocus(), ], }), ], }); ``` -Then let us introduce how to use the syntax corresponding to these Transformers. - -#### Diff highlighting - -Use the `diff` syntax in the markdown code block, such as: - -```ts -export function foo() { - console.log('Diff remove'); // [!code --] - console.log('Diff add'); // [!code ++] -} -``` - -This will automatically apply the diff highlighting effect to the corresponding line of code. - -#### Line number display - -Use the `hl` syntax in the markdown code block, such as: - -```ts -export function foo() { - console.log('Line number'); // [!code hl] -} -``` - -This will automatically display the line number for the corresponding line of code. - -#### Error level display - -Use the `error` or `warning` syntax in the markdown code block, such as: - -```ts -export function foo() { - console.log('Error level'); // [!code error] -} -``` - -This will automatically display the error level for the corresponding line of code. - -#### Line focus display - -Use the `focus` syntax in the markdown code block, such as: - -```ts -export function foo() { - console.log('Focus'); // [!code focus] -} -``` - -This will automatically display the focus effect for the corresponding line of code. +Please view [Shiki Transformers documentation](https://shiki.style/guide/transformers) for more information. diff --git a/packages/document/docs/zh/plugin/official-plugins/shiki.mdx b/packages/document/docs/zh/plugin/official-plugins/shiki.mdx index 1259dfa9a..9a6eec7f0 100644 --- a/packages/document/docs/zh/plugin/official-plugins/shiki.mdx +++ b/packages/document/docs/zh/plugin/official-plugins/shiki.mdx @@ -36,19 +36,21 @@ export default defineConfig({ 该插件支持传入一个对象配置,该对象配置的属性如下: ```ts -interface PluginShikiOptions { +import type { BuiltinLanguage, BuiltinTheme, ShikiTransformer, SpecialLanguage } from 'shiki'; + +export interface PluginShikiOptions { /** - * 代码高亮主题 + * 代码高亮主题,@see https://shiki.style/themes */ - theme: string; + theme: BuiltinTheme | 'css-variables'; /** - * 代码高亮的语言 + * 代码高亮的语言,@see https://shiki.style/languages */ - langs: string[]; + langs: Array; /** - * 添加自定义 transformer + * 自定义 shiki transformer,@see https://shiki.style/guide/transformers */ - transformers: Transformer[]; + transformers: ShikiTransformer[]; } ``` @@ -64,81 +66,34 @@ Transformer 是本插件中的一个概念,它的作用是对代码块的特 本插件中内置了一些 Transformer,包括: -- `createTransformerDiff`:实现代码块的 diff 高亮效果。 - `createTransformerLineNumber`:实现代码块的行号显示。 -- `createTransformerErrorLevel`:实现代码块对应行的错误等级显示,包括 `error` 和 `warning`。 -- `createTransformerHighlight`:实现代码块的行高亮显示。 -- `createTransformerFocus`: 实现代码块的行聚焦显示。 你可以通过配置 `transformers` 属性来启用这些 Transformer,比如: ```ts title="rspress.config.ts" import { defineConfig } from 'rspress/config'; import { pluginShiki, createTransformerDiff } from '@rspress/plugin-shiki'; +import { + transformerNotationDiff, + transformerNotationErrorLevel, + transformerNotationFocus, + transformerNotationHighlight, +} from '@shikijs/transformers'; export default defineConfig({ plugins: [ pluginShiki({ transformers: [ // 按需加入即可 - createTransformerDiff(), - // createTransformerLineNumber(), - // createTransformerErrorLevel(), - // createTransformerHighlight(), - // createTransformerFocus(), + createTransformerLineNumber(), + // transformerNotationDiff(), + // transformerNotationErrorLevel(), + // transformerNotationHighlight(), + // transformerNotationFocus(), ], }), ], }); ``` -接着我们来介绍一下如何使用这些 Transformer 对应的语法。 - -#### diff 高亮 - -在 markdown 的代码块中使用 `diff` 语法,比如: - -```ts -export function foo() { - console.log('Diff remove'); // [!code --] - console.log('Diff add'); // [!code ++] -} -``` - -这样会自动对相应行的代码应用 diff 高亮效果。 - -#### 行号显示 - -在 markdown 的代码块中使用 `hl` 语法,比如: - -```ts -export function foo() { - console.log('Line number'); // [!code hl] -} -``` - -这样会自动对相应行的代码显示行号。 - -#### 错误等级显示 - -在 markdown 的代码块中使用 `error` 或 `warning` 语法,比如: - -```ts -export function foo() { - console.log('Error level'); // [!code error] -} -``` - -这样会自动对相应行的代码显示错误等级。 - -#### 行聚焦显示 - -在 markdown 的代码块中使用 `focus` 语法,比如: - -```ts -export function foo() { - console.log('Focus'); // [!code focus] -} -``` - -这样会自动对相应行的代码显示聚焦效果。 +请查看 [Shiki Transformers 文档](https://shiki.style/guide/transformers) 获取更多信息。 diff --git a/packages/plugin-shiki/package.json b/packages/plugin-shiki/package.json index 52541a440..12ed1a0c6 100644 --- a/packages/plugin-shiki/package.json +++ b/packages/plugin-shiki/package.json @@ -54,7 +54,7 @@ "dependencies": { "@rspress/shared": "workspace:*", "hast-util-from-html": "2.0.3", - "shiki": "0.14.7", + "shiki": "1.24.2", "unist-util-visit": "5.0.0" } } diff --git a/packages/plugin-shiki/shiki.css b/packages/plugin-shiki/shiki.css index f5ec693c6..02f122a7d 100644 --- a/packages/plugin-shiki/shiki.css +++ b/packages/plugin-shiki/shiki.css @@ -4,8 +4,8 @@ * -------------------------------------------------------------------------- */ :root { - --shiki-color-text: #414141; - --shiki-color-background: transparent; + --shiki-foreground: #414141; + --shiki-background: transparent; --shiki-token-constant: #1976d2; --shiki-token-string: #31a94d; --shiki-token-comment: rgb(182, 180, 180); @@ -18,7 +18,7 @@ } .dark { - --shiki-color-text: #cac7c7; + --shiki-foreground: #cac7c7; --shiki-token-constant: #6fb0fa; --shiki-token-string: #f9a86e; --shiki-token-comment: #6a727b; @@ -37,9 +37,8 @@ .diff, .code-line-highlighted { transition: background-color 0.5s; - margin: 0 -20px; padding: 0 20px; - width: calc(100% + 40px); + width: 100%; display: inline-block; position: relative; } diff --git a/packages/plugin-shiki/src/rehypePlugin.ts b/packages/plugin-shiki/src/rehypePlugin.ts deleted file mode 100644 index 1b8d88edd..000000000 --- a/packages/plugin-shiki/src/rehypePlugin.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { visit } from 'unist-util-visit'; -import type { Plugin } from 'unified'; -import type { Text, Root, ElementContent } from 'hast'; -import { fromHtml } from 'hast-util-from-html'; -import type shiki from 'shiki'; - -interface Options { - highlighter: shiki.Highlighter; -} - -export const rehypePluginShiki: Plugin<[Options], Root> = function ({ - highlighter, -}) { - return (tree: Root) => { - visit(tree, 'element', (node, index, parent) => { - //
...
- if ( - node.tagName === 'pre' && - node.children[0]?.type === 'element' && - node.children[0].tagName === 'code' - ) { - const codeNode = node.children[0]; - const codeContent = (codeNode.children[0] as Text).value; - const codeClassName = codeNode.properties?.className?.toString() || ''; - - const codeMeta = codeNode.properties?.meta?.toString() || ''; - const highlightLinesReg = /{[\d,-]*}/i; - const highlightResult = highlightLinesReg.exec(codeMeta); - let highlightLines: number[] = []; - if (highlightResult) { - const highlightMatch = highlightResult[0]; - highlightLines = highlightMatch - ?.replace(/[{}]/g, '') - .split(',') - .map(item => { - const [start, end] = item.split('-'); - if (end) { - return Array.from( - { length: Number(end) - Number(start) + 1 }, - (_, i) => i + Number(start), - ); - } - return Number(start); - }) - .flat(); - } - // for example: language-js {1,2,3-5} - const lang = codeClassName.split(' ')[0].split('-')[1]; - if (!lang) { - return; - } - const highlightedCode = highlighter.codeToHtml(codeContent, { lang }); - const fragmentAst = fromHtml(highlightedCode, { fragment: true }); - const preElement = fragmentAst.children[0] as unknown as any; - const codeElement = preElement.children[0]; - codeElement.properties.className = `language-${lang}`; - codeElement.properties.meta = codeMeta; - const codeLines = codeElement.children; - // Take the odd lines as highlighted lines - codeLines - ?.filter((_: any, index: number) => index % 2 === 0) - .forEach((line: any, index: number) => { - if (highlightLines?.includes(index + 1)) { - line.properties.className.push('code-line-highlighted'); - } - }); - - parent!.children.splice(index!, 1, { - type: 'element', - tagName: 'pre', - properties: { - className: 'code', - }, - children: [...fragmentAst.children] as ElementContent[], - }); - } - }); - }; -}; diff --git a/packages/plugin-shiki/src/shiki/highlighter.ts b/packages/plugin-shiki/src/shiki/highlighter.ts index cd6e73e84..fc601d215 100644 --- a/packages/plugin-shiki/src/shiki/highlighter.ts +++ b/packages/plugin-shiki/src/shiki/highlighter.ts @@ -1,43 +1,31 @@ import { - getHighlighter as getShikiHighlighter, + type BuiltinLanguage, + type BuiltinTheme, type Highlighter, - type HighlighterOptions as ShikiHighlighterOptions, + type BundledHighlighterOptions as ShikiHighlighterOptions, + type ShikiTransformer, + createHighlighter as createShikiHighlighter, } from 'shiki'; -import { postTransformer, transformer } from './transformer'; -import type { ITransformer } from './types'; - -export interface HighlighterOptions extends ShikiHighlighterOptions { - transformers?: ITransformer[]; +export interface HighlighterOptions + extends ShikiHighlighterOptions { + transformers?: ShikiTransformer[]; } export async function getHighlighter( - options: HighlighterOptions = {}, + options: HighlighterOptions, ): Promise { - const highlighter = await getShikiHighlighter(options); - const transformers = options.transformers ?? []; + const highlighter = await createShikiHighlighter(options); + const baseTransformers = options.transformers ?? []; return { ...highlighter, - codeToHtml: (str, htmlOptions) => { - const lang = - typeof htmlOptions === 'object' ? htmlOptions.lang! : htmlOptions!; - - const baseLineOptions = - typeof htmlOptions === 'object' ? (htmlOptions.lineOptions ?? []) : []; - - const theme = - typeof htmlOptions === 'object' ? htmlOptions.theme : undefined; - - const { code, lineOptions } = transformer(transformers, str, lang); - - const highlighted = highlighter.codeToHtml(code, { - lang, - theme, - lineOptions: [...lineOptions, ...baseLineOptions], + codeToHtml: (code, htmlOptions) => { + const transformers = htmlOptions.transformers ?? []; + return highlighter.codeToHtml(code, { + ...htmlOptions, + transformers: [...baseTransformers, ...transformers], }); - - return postTransformer(transformers, highlighted, lang); }, }; } diff --git a/packages/plugin-shiki/src/shiki/pluginShiki.ts b/packages/plugin-shiki/src/shiki/pluginShiki.ts index bf15185ef..a467afe63 100644 --- a/packages/plugin-shiki/src/shiki/pluginShiki.ts +++ b/packages/plugin-shiki/src/shiki/pluginShiki.ts @@ -1,36 +1,40 @@ -import { join } from 'node:path'; -import { getHighlighter } from './highlighter'; +import type { RspressPlugin } from '@rspress/shared'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + type BuiltinLanguage, + type BuiltinTheme, + type ShikiTransformer, + type SpecialLanguage, + createCssVariablesTheme, +} from 'shiki'; + import { rehypePluginShiki } from './rehypePlugin'; import { SHIKI_TRANSFORMER_LINE_NUMBER, createTransformerLineNumber, } from './transformers/line-number'; -import { fileURLToPath } from 'node:url'; -import { dirname } from 'node:path'; +import { getHighlighter } from './highlighter'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); -import type { Lang } from 'shiki'; -import type { RspressPlugin } from '@rspress/shared'; -import type { ITransformer } from './types'; - export interface PluginShikiOptions { /** - * The theme of shiki. + * Code highlighting theme, @see https://shiki.style/themes */ - theme?: string; + theme: BuiltinTheme | 'css-variables'; /** - * The languages to highlight. + * Code highlighting language, @see https://shiki.style/languages */ - langs?: Lang[]; + langs: Array; /** - * The transformers to transform the code block. + * Custom shiki transformer, @see https://shiki.style/guide/transformers */ - transformers?: ITransformer[]; + transformers: ShikiTransformer[]; } -export const SHIKI_DEFAULT_HIGHLIGHT_LANGUAGES = [ +export const SHIKI_DEFAULT_HIGHLIGHT_LANGUAGES: BuiltinLanguage[] = [ 'js', 'ts', 'jsx', @@ -47,10 +51,19 @@ export const SHIKI_DEFAULT_HIGHLIGHT_LANGUAGES = [ 'bash', ]; +const cssVariablesTheme = createCssVariablesTheme({ + name: 'css-variables', + variablePrefix: '--shiki-', + variableDefaults: {}, + fontStyle: true, +}); + /** * The plugin is used to add the last updated time to the page. */ -export function pluginShiki(options?: PluginShikiOptions): RspressPlugin { +export function pluginShiki( + options?: Partial, +): RspressPlugin { const { theme = 'css-variables', langs = [], @@ -68,20 +81,23 @@ export function pluginShiki(options?: PluginShikiOptions): RspressPlugin { config.markdown.rehypePlugins = config.markdown.rehypePlugins || []; if ( config.markdown.showLineNumbers && - !transformers.includes( - (transformerItem: ITransformer) => + !transformers.some( + transformerItem => transformerItem.name === SHIKI_TRANSFORMER_LINE_NUMBER, ) ) { transformers.push(createTransformerLineNumber()); } const highlighter = await getHighlighter({ - theme, - langs: [...SHIKI_DEFAULT_HIGHLIGHT_LANGUAGES, ...langs] as Lang[], + themes: [cssVariablesTheme], + langs: [...SHIKI_DEFAULT_HIGHLIGHT_LANGUAGES, ...langs], transformers, }); - config.markdown.rehypePlugins.push([rehypePluginShiki, { highlighter }]); + config.markdown.rehypePlugins.push([ + rehypePluginShiki, + { highlighter, theme }, + ]); return config; }, globalStyles: join(__dirname, '../shiki.css'), diff --git a/packages/plugin-shiki/src/shiki/rehypePlugin.ts b/packages/plugin-shiki/src/shiki/rehypePlugin.ts index 1445c6ae4..2cb140b30 100644 --- a/packages/plugin-shiki/src/shiki/rehypePlugin.ts +++ b/packages/plugin-shiki/src/shiki/rehypePlugin.ts @@ -1,17 +1,18 @@ import { visit } from 'unist-util-visit'; import type { Plugin } from 'unified'; -import type { Text, Root, ElementContent } from 'hast'; +import type { Element, Text, Root, ElementContent } from 'hast'; import { fromHtml } from 'hast-util-from-html'; -import type shiki from 'shiki'; +import type { BuiltinTheme, Highlighter } from 'shiki'; interface Options { - highlighter: shiki.Highlighter; + highlighter: Highlighter; + theme: BuiltinTheme; } -export const rehypePluginShiki: Plugin<[Options], Root> = function ({ - highlighter, -}) { - return (tree: Root) => { +// TODO: migrate to official @shikijs/rehype plugin after upgrading unified/remark/rehype packages +export const rehypePluginShiki: Plugin<[Options], Root> = + ({ highlighter, theme }) => + (tree: Root) => { visit(tree, 'element', (node, index, parent) => { //
...
if ( @@ -32,7 +33,7 @@ export const rehypePluginShiki: Plugin<[Options], Root> = function ({ highlightLines = highlightMatch ?.replace(/[{}]/g, '') .split(',') - .map(item => { + .flatMap(item => { const [start, end] = item.split('-'); if (end) { return Array.from( @@ -41,18 +42,20 @@ export const rehypePluginShiki: Plugin<[Options], Root> = function ({ ); } return Number(start); - }) - .flat(); + }); } // for example: language-js {1,2,3-5} const lang = codeClassName.split(' ')[0].split('-')[1]; if (!lang) { return; } - const highlightedCode = highlighter.codeToHtml(codeContent, { lang }); + const highlightedCode = highlighter.codeToHtml(codeContent, { + lang, + theme, + }); const fragmentAst = fromHtml(highlightedCode, { fragment: true }); - const preElement = fragmentAst.children[0] as unknown as any; - const codeElement = preElement.children[0]; + const preElement = fragmentAst.children[0] as Element; + const codeElement = preElement.children[0] as Element; codeElement.properties.className = `language-${lang}`; codeElement.properties.meta = codeMeta; const codeLines = codeElement.children; @@ -66,7 +69,7 @@ export const rehypePluginShiki: Plugin<[Options], Root> = function ({ }); // Strip the final empty span - const lastLine = codeLines[codeLines.length - 1]; + const lastLine = codeLines[codeLines.length - 1] as Element; if (lastLine?.children.length === 0) { codeLines.pop(); } @@ -82,4 +85,3 @@ export const rehypePluginShiki: Plugin<[Options], Root> = function ({ } }); }; -}; diff --git a/packages/plugin-shiki/src/shiki/transformer.ts b/packages/plugin-shiki/src/shiki/transformer.ts deleted file mode 100644 index 42c779283..000000000 --- a/packages/plugin-shiki/src/shiki/transformer.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { ITransformer, ITransformerResult } from './types'; - -/** - * Defines a transformer. - */ -export function defineTransformer(transformer: ITransformer): ITransformer { - return transformer; -} - -/** - * Transforms code through the given transformer. - */ -export function transformer( - transformers: ITransformer[], - code: string, - lang: string, -) { - return transformers.reduce( - (options, transformer) => { - const { code, lineOptions } = - transformer?.preTransformer?.({ - code: options.code, - lang, - }) ?? options; - - return { - code, - lineOptions: [...options.lineOptions, ...lineOptions], - }; - }, - { - code, - lineOptions: [], - } as ITransformerResult, - ); -} - -/** - * Transforms final code through the given Transformers. - */ -export function postTransformer( - transformers: ITransformer[], - code: string, - lang: string, -) { - return transformers.reduce( - (code, transformer) => - transformer?.postTransformer?.({ - code, - lang, - }) ?? code, - code, - ); -} diff --git a/packages/plugin-shiki/src/shiki/transformers/diff.ts b/packages/plugin-shiki/src/shiki/transformers/diff.ts deleted file mode 100644 index 3001973de..000000000 --- a/packages/plugin-shiki/src/shiki/transformers/diff.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { checkClass } from '../utils/check-class'; -import type { IRangeTransformerOptions, ITransformer } from '../types'; -import { addClass } from '../utils'; -import { createRangeTransformer } from '../utils/create-range-transformer'; - -export interface ITransformerDiffOptions extends IRangeTransformerOptions { - /** - * Class for added lines - */ - classLineAdd?: string; - /** - * Class for removed lines - */ - classLineRemove?: string; - /** - * Class added to the
 element when the current code has diff
-   */
-  classActivePre?: string;
-}
-
-export function createTransformerDiff(
-  options: ITransformerDiffOptions = {},
-): ITransformer {
-  const {
-    classLineAdd = 'diff add',
-    classLineRemove = 'diff remove',
-    classActivePre = 'has-diff',
-  } = options;
-
-  return {
-    name: 'shiki-transformer:diff',
-    preTransformer: createRangeTransformer(
-      {
-        '++': classLineAdd,
-        '--': classLineRemove,
-      },
-      options,
-    ),
-    postTransformer: ({ code }) => {
-      if (
-        !checkClass(code, classLineAdd) &&
-        !checkClass(code, classLineRemove)
-      ) {
-        return code;
-      }
-
-      return addClass(code, classActivePre, 'pre');
-    },
-  };
-}
diff --git a/packages/plugin-shiki/src/shiki/transformers/focus.ts b/packages/plugin-shiki/src/shiki/transformers/focus.ts
deleted file mode 100644
index 87adcc5b7..000000000
--- a/packages/plugin-shiki/src/shiki/transformers/focus.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { checkClass } from '../utils/check-class';
-import type { IRangeTransformerOptions, ITransformer } from '../types';
-import { addClass } from '../utils/add-class';
-import { createRangeTransformer } from '../utils/create-range-transformer';
-
-export interface ITransformerFocusOptions extends IRangeTransformerOptions {
-  /**
-   * Class for focused lines
-   */
-  classActiveLine?: string;
-  /**
-   * Class added to the root element when the code has focused lines
-   */
-  classActivePre?: string;
-}
-
-export function createTransformerFocus(
-  options: ITransformerFocusOptions = {},
-): ITransformer {
-  const { classActiveLine = 'focused', classActivePre = 'has-focused' } =
-    options;
-
-  return {
-    name: 'shiki-transformer:focus',
-    preTransformer: createRangeTransformer(
-      {
-        focus: classActiveLine,
-        fc: classActiveLine,
-      },
-      options,
-    ),
-    postTransformer: ({ code }) => {
-      if (!checkClass(code, classActiveLine)) {
-        return code;
-      }
-
-      return addClass(code, classActivePre, 'pre');
-    },
-  };
-}
diff --git a/packages/plugin-shiki/src/shiki/transformers/highlight-error-level.ts b/packages/plugin-shiki/src/shiki/transformers/highlight-error-level.ts
deleted file mode 100644
index 1e415b66b..000000000
--- a/packages/plugin-shiki/src/shiki/transformers/highlight-error-level.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { checkClass } from '../utils/check-class';
-import type { IRangeTransformerOptions, ITransformer } from '../types';
-import { addClass } from '../utils/add-class';
-import { createRangeTransformer } from '../utils/create-range-transformer';
-
-export interface ITransformerErrorLevelOptions
-  extends IRangeTransformerOptions {
-  classMap?: Record;
-  /**
-   * Class added to the 
 element when the current code has diff
-   */
-  classActivePre?: string;
-}
-
-export function createTransformerErrorLevel(
-  options: ITransformerErrorLevelOptions = {},
-): ITransformer {
-  const {
-    classMap = {
-      error: ['highlighted', 'error'],
-      warning: ['highlighted', 'warning'],
-    },
-    classActivePre = 'has-highlight',
-  } = options;
-
-  return {
-    name: 'shiki-transformer:highlight-error',
-    preTransformer: createRangeTransformer(classMap, options),
-    postTransformer: ({ code }) => {
-      if (
-        !checkClass(code, classMap.error) &&
-        !checkClass(code, classMap.warning)
-      ) {
-        return code;
-      }
-
-      return addClass(code, classActivePre, 'pre');
-    },
-  };
-}
diff --git a/packages/plugin-shiki/src/shiki/transformers/highlight.ts b/packages/plugin-shiki/src/shiki/transformers/highlight.ts
deleted file mode 100644
index be08c14e5..000000000
--- a/packages/plugin-shiki/src/shiki/transformers/highlight.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { checkClass } from '../utils/check-class';
-import type { IRangeTransformerOptions, ITransformer } from '../types';
-import { addClass } from '../utils/add-class';
-import { createRangeTransformer } from '../utils/create-range-transformer';
-
-export interface ITransformerHighlightOptions extends IRangeTransformerOptions {
-  classActivePre?: string;
-  classActiveLine?: string;
-}
-
-export function createTransformerHighlight(
-  options: ITransformerHighlightOptions = {},
-): ITransformer {
-  const { classActiveLine = 'highlighted', classActivePre = 'has-highlight' } =
-    options;
-
-  return {
-    name: 'shiki-transformer:highlight',
-    preTransformer: createRangeTransformer(
-      {
-        highlight: classActiveLine,
-        hl: classActiveLine,
-      },
-      options,
-    ),
-    postTransformer: ({ code }) => {
-      if (!checkClass(code, classActiveLine)) {
-        return code;
-      }
-
-      return addClass(code, classActivePre, 'pre');
-    },
-  };
-}
diff --git a/packages/plugin-shiki/src/shiki/transformers/index.ts b/packages/plugin-shiki/src/shiki/transformers/index.ts
index c7e308abd..711c65ad2 100644
--- a/packages/plugin-shiki/src/shiki/transformers/index.ts
+++ b/packages/plugin-shiki/src/shiki/transformers/index.ts
@@ -1,5 +1 @@
-export * from './diff';
-export * from './focus';
-export * from './highlight';
-export * from './highlight-error-level';
 export * from './line-number';
diff --git a/packages/plugin-shiki/src/shiki/transformers/line-number.ts b/packages/plugin-shiki/src/shiki/transformers/line-number.ts
index bd23c28e1..55fdcae00 100644
--- a/packages/plugin-shiki/src/shiki/transformers/line-number.ts
+++ b/packages/plugin-shiki/src/shiki/transformers/line-number.ts
@@ -1,5 +1,4 @@
-import type { ITransformer, TLineOptions } from '../types';
-import { addClass } from '../utils';
+import type { ShikiTransformer } from 'shiki';
 
 export interface ITransformerLineNumberOptions {
   classActivePre?: string;
@@ -10,7 +9,7 @@ export const SHIKI_TRANSFORMER_LINE_NUMBER = 'shiki-transformer:line-number';
 
 export function createTransformerLineNumber(
   options: ITransformerLineNumberOptions = {},
-): ITransformer {
+): ShikiTransformer {
   const {
     classActiveLine = 'line-number',
     classActivePre = 'has-line-number',
@@ -18,26 +17,11 @@ export function createTransformerLineNumber(
 
   return {
     name: SHIKI_TRANSFORMER_LINE_NUMBER,
-    preTransformer: ({ code }) => {
-      const lineOptions = [] as TLineOptions;
-
-      code.split('\n').forEach((_, idx) => {
-        const lineNumber = idx + 1;
-        lineOptions.push({
-          line: lineNumber,
-          classes: [classActiveLine],
-        });
-      });
-
-      lineOptions.pop();
-
-      return {
-        code,
-        lineOptions,
-      };
+    pre(pre) {
+      return this.addClassToHast(pre, classActivePre);
     },
-    postTransformer: ({ code }) => {
-      return addClass(code, classActivePre, 'pre');
+    line(node, line) {
+      this.addClassToHast(node, classActiveLine);
     },
   };
 }
diff --git a/packages/plugin-shiki/src/shiki/types.ts b/packages/plugin-shiki/src/shiki/types.ts
deleted file mode 100644
index 7ca7e9e14..000000000
--- a/packages/plugin-shiki/src/shiki/types.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import type { HtmlRendererOptions } from 'shiki';
-
-export type TLineOptions = NonNullable;
-export interface ITransformerResult {
-  code: string;
-  lineOptions: TLineOptions;
-}
-
-export type TPostTransformerResult = string | undefined;
-
-export interface ITransformerOptions {
-  code: string;
-  lang: string;
-}
-
-export type TPreTransformer = (
-  options: ITransformerOptions,
-) => ITransformerResult;
-export type TPostTransformerHandler = (
-  options: ITransformerOptions,
-) => TPostTransformerResult;
-
-export interface IRangeTransformerOptions {
-  tagRegExp?: RegExp;
-}
-
-export interface ITransformer {
-  name: string;
-  preTransformer?: TPreTransformer;
-  postTransformer?: TPostTransformerHandler;
-}
diff --git a/packages/plugin-shiki/src/shiki/utils/add-class.ts b/packages/plugin-shiki/src/shiki/utils/add-class.ts
deleted file mode 100644
index 5b4550bf6..000000000
--- a/packages/plugin-shiki/src/shiki/utils/add-class.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export function addClass(
-  code: string,
-  classes: string | string[],
-  tag?: string,
-): string {
-  const classRE = new RegExp(`<${tag ?? 'w+'}[^>]*class="([\\w+-:;\\/* ]*)"`);
-  // eslint-disable-next-line no-param-reassign
-  classes = Array.isArray(classes) ? classes : [classes];
-
-  return code.replace(classRE, (match, previousClasses) => {
-    return match.replace(previousClasses, `${previousClasses} ${classes}`);
-  });
-}
diff --git a/packages/plugin-shiki/src/shiki/utils/check-class.ts b/packages/plugin-shiki/src/shiki/utils/check-class.ts
deleted file mode 100644
index 2f93f4667..000000000
--- a/packages/plugin-shiki/src/shiki/utils/check-class.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export const checkClass = (code: string, className: string | string[]) => {
-  const classes = Array.isArray(className) ? className.join('') : className;
-
-  return code.search(classes) !== -1;
-};
diff --git a/packages/plugin-shiki/src/shiki/utils/create-range-transformer.ts b/packages/plugin-shiki/src/shiki/utils/create-range-transformer.ts
deleted file mode 100644
index 9fb33fa18..000000000
--- a/packages/plugin-shiki/src/shiki/utils/create-range-transformer.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import type {
-  TLineOptions,
-  TPreTransformer,
-  ITransformerOptions,
-  IRangeTransformerOptions,
-} from '../types';
-
-export function createRangeTransformer(
-  classMap: Record,
-  options: IRangeTransformerOptions = {},
-): TPreTransformer {
-  return ({ code }: ITransformerOptions) => {
-    // https://regex101.com/r/mUxvfx/1
-    const tagRE =
-      options.tagRegExp ??
-      /(?:\/\/|\/\*{1,2}) *\[!code ([\w+-]+)(?::(\d+))?] *(?:\*{1,2}\/)?/;
-    const lineOptions: TLineOptions = [];
-
-    const tags = Object.keys(classMap);
-
-    const codeFormat = code
-      .split('\n')
-      .map((lineOfCode, lineNumber) => {
-        const [match, tag, range] = lineOfCode.match(tagRE) ?? [];
-
-        if (!match) {
-          return lineOfCode;
-        }
-
-        if (!tags.includes(tag)) {
-          return lineOfCode;
-        }
-
-        for (const [rangeOffset] of Array.from({
-          length: Number(range ?? 1),
-        }).entries()) {
-          lineOptions.push({
-            line: lineNumber + rangeOffset + 1,
-            classes:
-              typeof classMap[tag] === 'string'
-                ? ([classMap[tag]] as string[])
-                : (classMap[tag as any] as any),
-          });
-        }
-
-        return lineOfCode.replace(tagRE, '');
-      })
-      .join('\n');
-
-    return {
-      code: codeFormat,
-      lineOptions,
-    };
-  };
-}
diff --git a/packages/plugin-shiki/src/shiki/utils/index.ts b/packages/plugin-shiki/src/shiki/utils/index.ts
deleted file mode 100644
index 12bfbb96f..000000000
--- a/packages/plugin-shiki/src/shiki/utils/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './add-class';
-export * from './create-range-transformer';
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9e3faeeab..c1e7f43cf 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -430,6 +430,9 @@ importers:
       '@rspress/plugin-shiki':
         specifier: workspace:*
         version: link:../../../packages/plugin-shiki
+      '@shikijs/transformers':
+        specifier: 1.24.2
+        version: 1.24.2
       rspress:
         specifier: workspace:*
         version: link:../../../packages/cli
@@ -1321,8 +1324,8 @@ importers:
         specifier: 2.0.3
         version: 2.0.3
       shiki:
-        specifier: 0.14.7
-        version: 0.14.7
+        specifier: 1.24.2
+        version: 1.24.2
       unist-util-visit:
         specifier: 5.0.0
         version: 5.0.0
@@ -1643,10 +1646,6 @@ packages:
     resolution: {integrity: sha512-qOqQG9o97Q4tIZXZyWI7JuDZGJi3yibTN7LiGLmnzNLaIhmpv26BWj5OYJibUyQLVH/aTjdZSNx4spa7EihUzg==}
     engines: {node: '>= 10'}
 
-  '@babel/code-frame@7.25.7':
-    resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/code-frame@7.26.2':
     resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
     engines: {node: '>=6.9.0'}
@@ -1655,18 +1654,10 @@ packages:
     resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/core@7.25.2':
-    resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/core@7.26.0':
     resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/generator@7.25.0':
-    resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/generator@7.26.2':
     resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==}
     engines: {node: '>=6.9.0'}
@@ -1707,10 +1698,6 @@ packages:
     resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-plugin-utils@7.25.7':
-    resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/helper-plugin-utils@7.25.9':
     resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
     engines: {node: '>=6.9.0'}
@@ -1745,15 +1732,6 @@ packages:
     resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/highlight@7.25.7':
-    resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/parser@7.25.3':
-    resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-
   '@babel/parser@7.26.2':
     resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==}
     engines: {node: '>=6.0.0'}
@@ -1771,12 +1749,6 @@ packages:
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
-  '@babel/plugin-syntax-jsx@7.25.7':
-    resolution: {integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-
   '@babel/plugin-syntax-jsx@7.25.9':
     resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
     engines: {node: '>=6.9.0'}
@@ -1821,18 +1793,10 @@ packages:
     resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/traverse@7.25.3':
-    resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/traverse@7.25.9':
     resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/types@7.25.6':
-    resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/types@7.26.3':
     resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
     engines: {node: '>=6.9.0'}
@@ -2989,6 +2953,24 @@ packages:
   '@selderee/plugin-htmlparser2@0.11.0':
     resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==}
 
+  '@shikijs/core@1.24.2':
+    resolution: {integrity: sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==}
+
+  '@shikijs/engine-javascript@1.24.2':
+    resolution: {integrity: sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==}
+
+  '@shikijs/engine-oniguruma@1.24.2':
+    resolution: {integrity: sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==}
+
+  '@shikijs/transformers@1.24.2':
+    resolution: {integrity: sha512-cIwn8YSwO3bsWKJ+pezcXY1Vq0BVwvuLes1TZSC5+Awi6Tsfqhf3vBahOIqZK1rraMKOti2VEAEF/95oXMig1w==}
+
+  '@shikijs/types@1.24.2':
+    resolution: {integrity: sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==}
+
+  '@shikijs/vscode-textmate@9.3.1':
+    resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==}
+
   '@sinclair/typebox@0.27.8':
     resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
 
@@ -3022,18 +3004,12 @@ packages:
   '@types/babel__core@7.20.5':
     resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
 
-  '@types/babel__generator@7.6.4':
-    resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
-
   '@types/babel__generator@7.6.8':
     resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
 
   '@types/babel__standalone@7.1.9':
     resolution: {integrity: sha512-IcCNPLqpevUD7UpV8QB0uwQPOyoOKACFf0YtYWRHcmxcakaje4Q7dbG2+jMqxw/I8Zk0NHvEps66WwS7z/UaaA==}
 
-  '@types/babel__template@7.4.1':
-    resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
-
   '@types/babel__template@7.4.4':
     resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
 
@@ -3449,10 +3425,6 @@ packages:
   brace-expansion@2.0.1:
     resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
 
-  braces@3.0.2:
-    resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
-    engines: {node: '>=8'}
-
   braces@3.0.3:
     resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
     engines: {node: '>=8'}
@@ -3631,7 +3603,7 @@ packages:
     resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==}
 
   concat-map@0.0.1:
-    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+    resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
 
   convert-source-map@1.8.0:
     resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==}
@@ -3684,15 +3656,6 @@ packages:
   de-indent@1.0.2:
     resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
 
-  debug@4.3.7:
-    resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
-    engines: {node: '>=6.0'}
-    peerDependencies:
-      supports-color: '*'
-    peerDependenciesMeta:
-      supports-color:
-        optional: true
-
   debug@4.4.0:
     resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
     engines: {node: '>=6.0'}
@@ -3812,6 +3775,9 @@ packages:
   electron-to-chromium@1.5.38:
     resolution: {integrity: sha512-VbeVexmZ1IFh+5EfrYz1I0HTzHVIlJa112UEWhciPyeOcKJGeTv6N8WnG4wsQB81DGCaVEGhpSb6o6a8WYFXXg==}
 
+  emoji-regex-xs@1.0.0:
+    resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==}
+
   emoji-regex@10.4.0:
     resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
 
@@ -4244,12 +4210,18 @@ packages:
   hast-util-to-html@8.0.4:
     resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==}
 
+  hast-util-to-html@9.0.4:
+    resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==}
+
   hast-util-to-parse5@7.1.0:
     resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==}
 
   hast-util-whitespace@2.0.1:
     resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==}
 
+  hast-util-whitespace@3.0.0:
+    resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
   hastscript@6.0.0:
     resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==}
 
@@ -4290,6 +4262,9 @@ packages:
   html-void-elements@2.0.1:
     resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
 
+  html-void-elements@3.0.0:
+    resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
   htmlparser2@6.1.0:
     resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
 
@@ -4557,11 +4532,6 @@ packages:
     resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
     hasBin: true
 
-  jsesc@2.5.2:
-    resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
-    engines: {node: '>=4'}
-    hasBin: true
-
   jsesc@3.0.2:
     resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
     engines: {node: '>=6'}
@@ -4767,6 +4737,9 @@ packages:
   mdast-util-to-hast@12.3.0:
     resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==}
 
+  mdast-util-to-hast@13.2.0:
+    resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
+
   mdast-util-to-markdown@1.5.0:
     resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==}
 
@@ -4849,6 +4822,9 @@ packages:
   micromark-util-character@1.2.0:
     resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==}
 
+  micromark-util-character@2.1.1:
+    resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+
   micromark-util-chunked@1.1.0:
     resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==}
 
@@ -4867,6 +4843,9 @@ packages:
   micromark-util-encode@1.1.0:
     resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==}
 
+  micromark-util-encode@2.0.1:
+    resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
   micromark-util-events-to-acorn@1.2.3:
     resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==}
 
@@ -4882,15 +4861,24 @@ packages:
   micromark-util-sanitize-uri@1.2.0:
     resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==}
 
+  micromark-util-sanitize-uri@2.0.1:
+    resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+
   micromark-util-subtokenize@1.1.0:
     resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==}
 
   micromark-util-symbol@1.1.0:
     resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==}
 
+  micromark-util-symbol@2.0.1:
+    resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
   micromark-util-types@1.1.0:
     resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==}
 
+  micromark-util-types@2.0.1:
+    resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==}
+
   micromark@3.2.0:
     resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==}
 
@@ -5029,6 +5017,9 @@ packages:
     resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
     engines: {node: '>=18'}
 
+  oniguruma-to-es@0.7.0:
+    resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==}
+
   open@8.4.2:
     resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
     engines: {node: '>=12'}
@@ -5102,9 +5093,6 @@ packages:
   parse5@6.0.1:
     resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
 
-  parse5@7.1.1:
-    resolution: {integrity: sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==}
-
   parse5@7.1.2:
     resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
 
@@ -5163,9 +5151,6 @@ packages:
   periscopic@3.1.0:
     resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
 
-  picocolors@1.1.0:
-    resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
-
   picocolors@1.1.1:
     resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
 
@@ -5461,9 +5446,6 @@ packages:
     resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
     engines: {node: '>=8.10.0'}
 
-  reduce-configs@1.0.0:
-    resolution: {integrity: sha512-/JCYSgL/QeXXsq0Lv/7kOZfqvof7vyzHWfyNQPt3c6vc73mU4WRyT8RJ6ZH5Ci08vUOqXwk7jkZy6BycHTDD9w==}
-
   reduce-configs@1.1.0:
     resolution: {integrity: sha512-DQxy6liNadHfrLahZR7lMdc227NYVaQZhY5FMsxLEjX8X0SCuH+ESHSLCoz2yDZFq1/CLMDOAHdsEHwOEXKtvg==}
 
@@ -5473,6 +5455,15 @@ packages:
   regenerator-runtime@0.14.0:
     resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
 
+  regex-recursion@4.3.0:
+    resolution: {integrity: sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==}
+
+  regex-utilities@2.3.0:
+    resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
+
+  regex@5.0.2:
+    resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==}
+
   rehype-external-links@3.0.0:
     resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==}
 
@@ -5525,10 +5516,6 @@ packages:
     resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
     engines: {node: '>=8'}
 
-  resolve@1.22.4:
-    resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==}
-    hasBin: true
-
   resolve@1.22.8:
     resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
     hasBin: true
@@ -5818,6 +5805,9 @@ packages:
   shiki@0.14.7:
     resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==}
 
+  shiki@1.24.2:
+    resolution: {integrity: sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==}
+
   siginfo@2.0.0:
     resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
 
@@ -6097,10 +6087,6 @@ packages:
     resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
     engines: {node: '>=8.17.0'}
 
-  to-fast-properties@2.0.0:
-    resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
-    engines: {node: '>=4'}
-
   to-regex-range@5.0.1:
     resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
     engines: {node: '>=8.0'}
@@ -6206,6 +6192,9 @@ packages:
   unist-util-position@4.0.4:
     resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==}
 
+  unist-util-position@5.0.0:
+    resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
   unist-util-remove-position@4.0.2:
     resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==}
 
@@ -6561,11 +6550,6 @@ snapshots:
       '@ast-grep/napi-win32-ia32-msvc': 0.16.0
       '@ast-grep/napi-win32-x64-msvc': 0.16.0
 
-  '@babel/code-frame@7.25.7':
-    dependencies:
-      '@babel/highlight': 7.25.7
-      picocolors: 1.1.1
-
   '@babel/code-frame@7.26.2':
     dependencies:
       '@babel/helper-validator-identifier': 7.25.9
@@ -6574,26 +6558,6 @@ snapshots:
 
   '@babel/compat-data@7.26.2': {}
 
-  '@babel/core@7.25.2':
-    dependencies:
-      '@ampproject/remapping': 2.3.0
-      '@babel/code-frame': 7.26.2
-      '@babel/generator': 7.26.2
-      '@babel/helper-compilation-targets': 7.25.9
-      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.25.2)
-      '@babel/helpers': 7.26.0
-      '@babel/parser': 7.26.2
-      '@babel/template': 7.25.9
-      '@babel/traverse': 7.25.9
-      '@babel/types': 7.26.3
-      convert-source-map: 2.0.0
-      debug: 4.3.7
-      gensync: 1.0.0-beta.2
-      json5: 2.2.3
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
-
   '@babel/core@7.26.0':
     dependencies:
       '@ampproject/remapping': 2.3.0
@@ -6607,20 +6571,13 @@ snapshots:
       '@babel/traverse': 7.25.9
       '@babel/types': 7.26.3
       convert-source-map: 2.0.0
-      debug: 4.3.7
+      debug: 4.4.0
       gensync: 1.0.0-beta.2
       json5: 2.2.3
       semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/generator@7.25.0':
-    dependencies:
-      '@babel/types': 7.26.3
-      '@jridgewell/gen-mapping': 0.3.5
-      '@jridgewell/trace-mapping': 0.3.25
-      jsesc: 2.5.2
-
   '@babel/generator@7.26.2':
     dependencies:
       '@babel/parser': 7.26.2
@@ -6672,15 +6629,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/helper-module-transforms@7.26.0(@babel/core@7.25.2)':
-    dependencies:
-      '@babel/core': 7.25.2
-      '@babel/helper-module-imports': 7.25.9
-      '@babel/helper-validator-identifier': 7.25.9
-      '@babel/traverse': 7.25.9
-    transitivePeerDependencies:
-      - supports-color
-
   '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
     dependencies:
       '@babel/core': 7.26.0
@@ -6694,8 +6642,6 @@ snapshots:
     dependencies:
       '@babel/types': 7.26.3
 
-  '@babel/helper-plugin-utils@7.25.7': {}
-
   '@babel/helper-plugin-utils@7.25.9': {}
 
   '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)':
@@ -6732,17 +6678,6 @@ snapshots:
       '@babel/template': 7.25.9
       '@babel/types': 7.26.3
 
-  '@babel/highlight@7.25.7':
-    dependencies:
-      '@babel/helper-validator-identifier': 7.25.9
-      chalk: 2.4.2
-      js-tokens: 4.0.0
-      picocolors: 1.1.1
-
-  '@babel/parser@7.25.3':
-    dependencies:
-      '@babel/types': 7.26.3
-
   '@babel/parser@7.26.2':
     dependencies:
       '@babel/types': 7.26.3
@@ -6761,11 +6696,6 @@ snapshots:
       '@babel/core': 7.26.0
       '@babel/helper-plugin-utils': 7.25.9
 
-  '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.26.0)':
-    dependencies:
-      '@babel/core': 7.26.0
-      '@babel/helper-plugin-utils': 7.25.7
-
   '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)':
     dependencies:
       '@babel/core': 7.26.0
@@ -6825,18 +6755,6 @@ snapshots:
       '@babel/parser': 7.26.2
       '@babel/types': 7.26.3
 
-  '@babel/traverse@7.25.3':
-    dependencies:
-      '@babel/code-frame': 7.26.2
-      '@babel/generator': 7.26.2
-      '@babel/parser': 7.26.2
-      '@babel/template': 7.25.9
-      '@babel/types': 7.26.3
-      debug: 4.3.7
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-
   '@babel/traverse@7.25.9':
     dependencies:
       '@babel/code-frame': 7.26.2
@@ -6844,17 +6762,11 @@ snapshots:
       '@babel/parser': 7.26.2
       '@babel/template': 7.25.9
       '@babel/types': 7.26.3
-      debug: 4.3.7
+      debug: 4.4.0
       globals: 11.12.0
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/types@7.25.6':
-    dependencies:
-      '@babel/helper-string-parser': 7.25.9
-      '@babel/helper-validator-identifier': 7.25.9
-      to-fast-properties: 2.0.0
-
   '@babel/types@7.26.3':
     dependencies:
       '@babel/helper-string-parser': 7.25.9
@@ -6951,7 +6863,7 @@ snapshots:
       mri: 1.2.0
       p-limit: 2.3.0
       package-manager-detector: 0.2.0
-      picocolors: 1.1.0
+      picocolors: 1.1.1
       resolve-from: 5.0.0
       semver: 7.5.4
       spawndamnit: 3.0.1
@@ -6979,7 +6891,7 @@ snapshots:
     dependencies:
       '@changesets/types': 6.0.0
       '@manypkg/get-packages': 1.1.3
-      picocolors: 1.1.0
+      picocolors: 1.1.1
       semver: 7.5.4
 
   '@changesets/get-release-plan@4.0.5':
@@ -7017,7 +6929,7 @@ snapshots:
 
   '@changesets/logger@0.1.1':
     dependencies:
-      picocolors: 1.1.0
+      picocolors: 1.1.1
 
   '@changesets/parse@0.3.16':
     dependencies:
@@ -7055,7 +6967,7 @@ snapshots:
       '@changesets/types': 6.0.0
       fs-extra: 7.0.1
       p-filter: 2.1.0
-      picocolors: 1.1.0
+      picocolors: 1.1.1
 
   '@changesets/should-skip-package@0.1.1':
     dependencies:
@@ -7759,7 +7671,7 @@ snapshots:
       '@rsbuild/core': 1.1.10
       '@types/babel__core': 7.20.5
       deepmerge: 4.3.1
-      reduce-configs: 1.0.0
+      reduce-configs: 1.1.0
       upath: 2.0.1
     transitivePeerDependencies:
       - supports-color
@@ -7768,7 +7680,7 @@ snapshots:
     dependencies:
       '@rsbuild/core': 1.1.10
       deepmerge: 4.3.1
-      reduce-configs: 1.0.0
+      reduce-configs: 1.1.0
 
   '@rsbuild/plugin-react@1.1.0(@rsbuild/core@1.1.10)':
     dependencies:
@@ -7944,6 +7856,37 @@ snapshots:
       domhandler: 5.0.3
       selderee: 0.11.0
 
+  '@shikijs/core@1.24.2':
+    dependencies:
+      '@shikijs/engine-javascript': 1.24.2
+      '@shikijs/engine-oniguruma': 1.24.2
+      '@shikijs/types': 1.24.2
+      '@shikijs/vscode-textmate': 9.3.1
+      '@types/hast': 3.0.4
+      hast-util-to-html: 9.0.4
+
+  '@shikijs/engine-javascript@1.24.2':
+    dependencies:
+      '@shikijs/types': 1.24.2
+      '@shikijs/vscode-textmate': 9.3.1
+      oniguruma-to-es: 0.7.0
+
+  '@shikijs/engine-oniguruma@1.24.2':
+    dependencies:
+      '@shikijs/types': 1.24.2
+      '@shikijs/vscode-textmate': 9.3.1
+
+  '@shikijs/transformers@1.24.2':
+    dependencies:
+      shiki: 1.24.2
+
+  '@shikijs/types@1.24.2':
+    dependencies:
+      '@shikijs/vscode-textmate': 9.3.1
+      '@types/hast': 3.0.4
+
+  '@shikijs/vscode-textmate@9.3.1': {}
+
   '@sinclair/typebox@0.27.8': {}
 
   '@swc/helpers@0.5.13':
@@ -7978,16 +7921,12 @@ snapshots:
 
   '@types/babel__core@7.20.5':
     dependencies:
-      '@babel/parser': 7.25.3
+      '@babel/parser': 7.26.2
       '@babel/types': 7.26.3
-      '@types/babel__generator': 7.6.4
-      '@types/babel__template': 7.4.1
+      '@types/babel__generator': 7.6.8
+      '@types/babel__template': 7.4.4
       '@types/babel__traverse': 7.20.6
 
-  '@types/babel__generator@7.6.4':
-    dependencies:
-      '@babel/types': 7.26.3
-
   '@types/babel__generator@7.6.8':
     dependencies:
       '@babel/types': 7.26.3
@@ -8001,11 +7940,6 @@ snapshots:
       '@types/babel__template': 7.4.4
       '@types/babel__traverse': 7.20.6
 
-  '@types/babel__template@7.4.1':
-    dependencies:
-      '@babel/parser': 7.25.3
-      '@babel/types': 7.26.3
-
   '@types/babel__template@7.4.4':
     dependencies:
       '@babel/parser': 7.26.2
@@ -8422,7 +8356,7 @@ snapshots:
     dependencies:
       '@babel/core': 7.26.0
       '@babel/helper-module-imports': 7.18.6
-      '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.26.0)
+      '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
       '@babel/types': 7.26.3
       html-entities: 2.3.3
       parse5: 7.1.2
@@ -8470,10 +8404,6 @@ snapshots:
     dependencies:
       balanced-match: 1.0.2
 
-  braces@3.0.2:
-    dependencies:
-      fill-range: 7.1.1
-
   braces@3.0.3:
     dependencies:
       fill-range: 7.1.1
@@ -8558,7 +8488,7 @@ snapshots:
   chokidar@3.6.0:
     dependencies:
       anymatch: 3.1.3
-      braces: 3.0.2
+      braces: 3.0.3
       glob-parent: 5.1.2
       is-binary-path: 2.1.0
       is-glob: 4.0.3
@@ -8694,10 +8624,6 @@ snapshots:
   de-indent@1.0.2:
     optional: true
 
-  debug@4.3.7:
-    dependencies:
-      ms: 2.1.3
-
   debug@4.4.0:
     dependencies:
       ms: 2.1.3
@@ -8749,11 +8675,11 @@ snapshots:
 
   documentation@14.0.3:
     dependencies:
-      '@babel/core': 7.25.2
-      '@babel/generator': 7.25.0
-      '@babel/parser': 7.25.3
-      '@babel/traverse': 7.25.3
-      '@babel/types': 7.25.6
+      '@babel/core': 7.26.0
+      '@babel/generator': 7.26.2
+      '@babel/parser': 7.26.2
+      '@babel/traverse': 7.25.9
+      '@babel/types': 7.26.3
       chalk: 5.3.0
       chokidar: 3.6.0
       diff: 5.1.0
@@ -8778,7 +8704,7 @@ snapshots:
       remark-html: 15.0.2
       remark-reference-links: 6.0.1
       remark-toc: 8.0.1
-      resolve: 1.22.4
+      resolve: 1.22.8
       strip-json-comments: 5.0.1
       unist-builder: 3.0.1
       unist-util-visit: 4.1.2
@@ -8849,6 +8775,8 @@ snapshots:
 
   electron-to-chromium@1.5.38: {}
 
+  emoji-regex-xs@1.0.0: {}
+
   emoji-regex@10.4.0: {}
 
   emoji-regex@8.0.0: {}
@@ -9313,7 +9241,7 @@ snapshots:
       '@types/hast': 3.0.4
       devlop: 1.1.0
       hast-util-from-parse5: 8.0.1
-      parse5: 7.1.1
+      parse5: 7.1.2
       vfile: 6.0.1
       vfile-message: 4.0.2
 
@@ -9408,6 +9336,20 @@ snapshots:
       stringify-entities: 4.0.3
       zwitch: 2.0.4
 
+  hast-util-to-html@9.0.4:
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/unist': 3.0.2
+      ccount: 2.0.1
+      comma-separated-tokens: 2.0.3
+      hast-util-whitespace: 3.0.0
+      html-void-elements: 3.0.0
+      mdast-util-to-hast: 13.2.0
+      property-information: 6.2.0
+      space-separated-tokens: 2.0.2
+      stringify-entities: 4.0.3
+      zwitch: 2.0.4
+
   hast-util-to-parse5@7.1.0:
     dependencies:
       '@types/hast': 2.3.4
@@ -9419,6 +9361,10 @@ snapshots:
 
   hast-util-whitespace@2.0.1: {}
 
+  hast-util-whitespace@3.0.0:
+    dependencies:
+      '@types/hast': 3.0.4
+
   hastscript@6.0.0:
     dependencies:
       '@types/hast': 2.3.4
@@ -9470,6 +9416,8 @@ snapshots:
 
   html-void-elements@2.0.1: {}
 
+  html-void-elements@3.0.0: {}
+
   htmlparser2@6.1.0:
     dependencies:
       domelementtype: 2.3.0
@@ -9671,7 +9619,7 @@ snapshots:
 
   jest-message-util@29.6.2:
     dependencies:
-      '@babel/code-frame': 7.25.7
+      '@babel/code-frame': 7.26.2
       '@jest/types': 29.6.1
       '@types/stack-utils': 2.0.1
       chalk: 4.1.2
@@ -9711,8 +9659,6 @@ snapshots:
     dependencies:
       argparse: 2.0.1
 
-  jsesc@2.5.2: {}
-
   jsesc@3.0.2: {}
 
   json-parse-even-better-errors@2.3.1: {}
@@ -10005,6 +9951,18 @@ snapshots:
       unist-util-position: 4.0.4
       unist-util-visit: 4.1.2
 
+  mdast-util-to-hast@13.2.0:
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/mdast': 4.0.4
+      '@ungap/structured-clone': 1.2.0
+      devlop: 1.1.0
+      micromark-util-sanitize-uri: 2.0.1
+      trim-lines: 3.0.1
+      unist-util-position: 5.0.0
+      unist-util-visit: 5.0.0
+      vfile: 6.0.1
+
   mdast-util-to-markdown@1.5.0:
     dependencies:
       '@types/mdast': 3.0.15
@@ -10214,6 +10172,11 @@ snapshots:
       micromark-util-symbol: 1.1.0
       micromark-util-types: 1.1.0
 
+  micromark-util-character@2.1.1:
+    dependencies:
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.1
+
   micromark-util-chunked@1.1.0:
     dependencies:
       micromark-util-symbol: 1.1.0
@@ -10242,6 +10205,8 @@ snapshots:
 
   micromark-util-encode@1.1.0: {}
 
+  micromark-util-encode@2.0.1: {}
+
   micromark-util-events-to-acorn@1.2.3:
     dependencies:
       '@types/acorn': 4.0.6
@@ -10269,6 +10234,12 @@ snapshots:
       micromark-util-encode: 1.1.0
       micromark-util-symbol: 1.1.0
 
+  micromark-util-sanitize-uri@2.0.1:
+    dependencies:
+      micromark-util-character: 2.1.1
+      micromark-util-encode: 2.0.1
+      micromark-util-symbol: 2.0.1
+
   micromark-util-subtokenize@1.1.0:
     dependencies:
       micromark-util-chunked: 1.1.0
@@ -10278,12 +10249,16 @@ snapshots:
 
   micromark-util-symbol@1.1.0: {}
 
+  micromark-util-symbol@2.0.1: {}
+
   micromark-util-types@1.1.0: {}
 
+  micromark-util-types@2.0.1: {}
+
   micromark@3.2.0:
     dependencies:
       '@types/debug': 4.1.8
-      debug: 4.3.7
+      debug: 4.4.0
       decode-named-character-reference: 1.0.2
       micromark-core-commonmark: 1.1.0
       micromark-factory-space: 1.1.0
@@ -10453,6 +10428,12 @@ snapshots:
     dependencies:
       mimic-function: 5.0.1
 
+  oniguruma-to-es@0.7.0:
+    dependencies:
+      emoji-regex-xs: 1.0.0
+      regex: 5.0.2
+      regex-recursion: 4.3.0
+
   open@8.4.2:
     dependencies:
       define-lazy-prop: 2.0.0
@@ -10547,10 +10528,6 @@ snapshots:
 
   parse5@6.0.1: {}
 
-  parse5@7.1.1:
-    dependencies:
-      entities: 4.5.0
-
   parse5@7.1.2:
     dependencies:
       entities: 4.5.0
@@ -10597,8 +10574,6 @@ snapshots:
       estree-walker: 3.0.3
       is-reference: 3.0.1
 
-  picocolors@1.1.0: {}
-
   picocolors@1.1.1: {}
 
   picomatch@2.3.1: {}
@@ -10899,10 +10874,6 @@ snapshots:
     dependencies:
       picomatch: 2.3.1
 
-  reduce-configs@1.0.0:
-    dependencies:
-      browserslist: 4.24.0
-
   reduce-configs@1.1.0: {}
 
   refractor@3.6.0:
@@ -10913,6 +10884,16 @@ snapshots:
 
   regenerator-runtime@0.14.0: {}
 
+  regex-recursion@4.3.0:
+    dependencies:
+      regex-utilities: 2.3.0
+
+  regex-utilities@2.3.0: {}
+
+  regex@5.0.2:
+    dependencies:
+      regex-utilities: 2.3.0
+
   rehype-external-links@3.0.0:
     dependencies:
       '@types/hast': 3.0.4
@@ -11004,12 +10985,6 @@ snapshots:
 
   resolve-from@5.0.0: {}
 
-  resolve@1.22.4:
-    dependencies:
-      is-core-module: 2.13.0
-      path-parse: 1.0.7
-      supports-preserve-symlinks-flag: 1.0.0
-
   resolve@1.22.8:
     dependencies:
       is-core-module: 2.13.0
@@ -11265,6 +11240,15 @@ snapshots:
       vscode-oniguruma: 1.7.0
       vscode-textmate: 8.0.0
 
+  shiki@1.24.2:
+    dependencies:
+      '@shikijs/core': 1.24.2
+      '@shikijs/engine-javascript': 1.24.2
+      '@shikijs/engine-oniguruma': 1.24.2
+      '@shikijs/types': 1.24.2
+      '@shikijs/vscode-textmate': 9.3.1
+      '@types/hast': 3.0.4
+
   siginfo@2.0.0: {}
 
   signal-exit@3.0.7: {}
@@ -11555,8 +11539,6 @@ snapshots:
     dependencies:
       rimraf: 3.0.2
 
-  to-fast-properties@2.0.0: {}
-
   to-regex-range@5.0.1:
     dependencies:
       is-number: 7.0.0
@@ -11662,6 +11644,10 @@ snapshots:
     dependencies:
       '@types/unist': 2.0.7
 
+  unist-util-position@5.0.0:
+    dependencies:
+      '@types/unist': 3.0.2
+
   unist-util-remove-position@4.0.2:
     dependencies:
       '@types/unist': 2.0.7
@@ -11810,7 +11796,7 @@ snapshots:
   vite-node@2.1.8(@types/node@18.11.17)(sass-embedded@1.82.0)(terser@5.31.6):
     dependencies:
       cac: 6.7.14
-      debug: 4.3.7
+      debug: 4.4.0
       es-module-lexer: 1.5.4
       pathe: 1.1.2
       vite: 5.4.0(@types/node@18.11.17)(sass-embedded@1.82.0)(terser@5.31.6)
@@ -11846,7 +11832,7 @@ snapshots:
       '@vitest/spy': 2.1.8
       '@vitest/utils': 2.1.8
       chai: 5.1.2
-      debug: 4.3.7
+      debug: 4.4.0
       expect-type: 1.1.0
       magic-string: 0.30.14
       pathe: 1.1.2