├── pnpm-workspace.yaml ├── .prettierignore ├── src ├── index.ts └── core │ ├── useProxyProps.ts │ ├── symbol.ts │ ├── ShikiProvider.ts │ ├── highlight │ ├── shiki.ts │ ├── codeTheme.ts │ └── theme-css-variables.ts │ ├── segmentText.ts │ ├── plugin │ ├── remarkEchartCodeBlock.ts │ └── remarkComponentCodeBlock.ts │ ├── ShikiStreamCodeBlock.ts │ └── VueMarkdownRenderer.ts ├── .gitignore ├── playground ├── src │ ├── style.css │ ├── animation.css │ ├── main.ts │ ├── ErrorBoundary.vue │ ├── components │ │ ├── markdown │ │ │ ├── Placeholder.vue │ │ │ ├── EchartRenderer.vue │ │ │ ├── CodeBlockRenderer.vue │ │ │ └── BarChart.vue │ │ └── Button.vue │ ├── transfrom │ │ └── think │ │ │ ├── think.ts │ │ │ └── Think.vue │ ├── polyfill.ts │ ├── md.ts │ └── App.vue ├── shims-vue.d.ts ├── tsconfig.json ├── vite.config.ts ├── index.html ├── package.json └── public │ └── md.md ├── .prettierrc.json ├── tsconfig.json ├── scripts └── check-version.mjs ├── LICENSE ├── .github └── workflows │ ├── release.yml │ └── example.yml ├── package.json ├── README.md └── pnpm-lock.yaml /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - playground 3 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | pnpm-workspace.yaml 3 | pnpm-lock.yaml -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import VueMarkdownRenderer from "./core/VueMarkdownRenderer.js"; 2 | export { VueMarkdownRenderer }; 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .cache 2 | .DS_Store 3 | .idea 4 | *.log 5 | *.tgz 6 | coverage 7 | dist 8 | lib-cov 9 | logs 10 | node_modules 11 | temp -------------------------------------------------------------------------------- /playground/src/style.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | @custom-variant dark (&:where(.dark, .dark *)); 3 | @plugin "@tailwindcss/typography"; 4 | -------------------------------------------------------------------------------- /playground/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.vue" { 2 | import { ComponentOptions } from "vue"; 3 | const componentOptions: ComponentOptions; 4 | export default componentOptions; 5 | } 6 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "singleQuote": false, 4 | "trailingComma": "es5", 5 | "tabWidth": 2, 6 | "jsxSingleQuote": true, 7 | "endOfLine": "auto", 8 | "plugins": ["prettier-plugin-tailwindcss"] 9 | } 10 | -------------------------------------------------------------------------------- /playground/src/animation.css: -------------------------------------------------------------------------------- 1 | .vue-markdown-wrapper > *, 2 | .vue-markdown-wrapper .text-segmenter, 3 | .vue-markdown-wrapper .shiki-stream span { 4 | animation: fade-in 0.5s ease-in-out; 5 | } 6 | 7 | @keyframes fade-in { 8 | 0% { 9 | opacity: 0; 10 | } 11 | 100% { 12 | opacity: 1; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /playground/src/main.ts: -------------------------------------------------------------------------------- 1 | import "./polyfill"; 2 | import { createApp, h, render } from "vue"; 3 | import App from "./App.vue"; 4 | import ErrorBoundary from "./ErrorBoundary.vue"; 5 | const app = createApp(App); 6 | app.config.errorHandler = (e) => { 7 | const errorDom = document.getElementById("error")!; 8 | render(h(ErrorBoundary, { error: e }), errorDom); 9 | }; 10 | app.mount("#app"); 11 | -------------------------------------------------------------------------------- /playground/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "jsx": "preserve", 5 | "lib": ["ESNext", "DOM"], 6 | "module": "ESNext", 7 | "moduleResolution": "Bundler", 8 | "resolveJsonModule": true, 9 | "strict": true, 10 | "strictNullChecks": true, 11 | "esModuleInterop": true, 12 | "skipDefaultLibCheck": true, 13 | "skipLibCheck": true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/core/useProxyProps.ts: -------------------------------------------------------------------------------- 1 | import { inject, provide } from "vue"; 2 | import { configPropsKey } from "./symbol.js"; 3 | 4 | export function provideProxyProps(props: any) { 5 | const proxy = new Proxy(props, { 6 | get(target, key) { 7 | return Reflect.get(target, key); 8 | }, 9 | }); 10 | provide(configPropsKey, proxy); 11 | } 12 | 13 | export function useProxyProps() { 14 | return inject(configPropsKey)!; 15 | } 16 | -------------------------------------------------------------------------------- /playground/vite.config.ts: -------------------------------------------------------------------------------- 1 | import Vue from "@vitejs/plugin-vue"; 2 | import tailwindcss from "@tailwindcss/vite"; 3 | import { defineConfig } from "vite"; 4 | 5 | export default defineConfig({ 6 | base: "./", 7 | build: { 8 | minify: false, 9 | rollupOptions: { 10 | output: { 11 | manualChunks(id: string) { 12 | if (id.includes("node_modules")) return "vendor"; 13 | }, 14 | }, 15 | }, 16 | }, 17 | plugins: [Vue(), tailwindcss()], 18 | }); 19 | -------------------------------------------------------------------------------- /playground/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | vue markdown renderer demo 8 | 9 | 10 | 11 |
12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /playground/src/ErrorBoundary.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 18 | -------------------------------------------------------------------------------- /src/core/symbol.ts: -------------------------------------------------------------------------------- 1 | import type { Highlighter } from "shiki"; 2 | import type { Component, InjectionKey, Ref } from "vue"; 3 | import { Langs } from "./highlight/shiki.js"; 4 | 5 | export const shikiHighlightCoreKey = Symbol() as InjectionKey< 6 | Ref 7 | >; 8 | 9 | export const configPropsKey = Symbol() as InjectionKey<{ 10 | source: string; 11 | theme: "dark" | "light"; 12 | extraLangs: Langs[]; 13 | codeBlockRenderer: Component | undefined; 14 | componentsMap: Record; 15 | echartRenderer: Component | undefined; 16 | echartRendererPlaceholder: Component | undefined; 17 | }>; 18 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "outDir": "dist", 5 | "target": "ESNext", 6 | "module": "esnext", 7 | "sourceMap": false, 8 | "moduleResolution": "bundler", 9 | "allowJs": false, 10 | "strict": true, 11 | "noUnusedLocals": false, 12 | "resolveJsonModule": true, 13 | "allowSyntheticDefaultImports": true, 14 | "esModuleInterop": true, 15 | "removeComments": false, 16 | "noImplicitAny": false, 17 | "skipLibCheck": true, 18 | "rootDir": ".", 19 | "forceConsistentCasingInFileNames": true 20 | }, 21 | "include": ["src"] 22 | } 23 | -------------------------------------------------------------------------------- /playground/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playground", 3 | "type": "module", 4 | "version": "0.0.0", 5 | "private": true, 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "@tailwindcss/typography": "^0.5.16", 13 | "@tailwindcss/vite": "^4.0.9", 14 | "echarts": "^5.6.0", 15 | "grapheme-splitter": "1.0.4", 16 | "katex": "^0.16.22", 17 | "rehype-katex": "^7.0.1", 18 | "remark-math": "^6.0.0", 19 | "tailwindcss": "^4.0.9", 20 | "vue": "^3.5.13" 21 | }, 22 | "devDependencies": { 23 | "@vitejs/plugin-vue": "^5.2.1" 24 | } 25 | } -------------------------------------------------------------------------------- /playground/src/components/markdown/Placeholder.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 30 | -------------------------------------------------------------------------------- /playground/src/components/Button.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 32 | -------------------------------------------------------------------------------- /scripts/check-version.mjs: -------------------------------------------------------------------------------- 1 | // scripts/check-version.js 2 | import { execSync } from "node:child_process"; 3 | import fs from "node:fs"; 4 | 5 | function run(cmd) { 6 | return execSync(cmd, { encoding: "utf-8" }).trim(); 7 | } 8 | 9 | const pkg = JSON.parse(fs.readFileSync("package.json", "utf-8")); 10 | const name = pkg.name; 11 | const version = pkg.version; 12 | 13 | let existingVersions = []; 14 | try { 15 | const result = run(`npm view ${name} versions --json`); 16 | existingVersions = JSON.parse(result); 17 | } catch (e) { 18 | existingVersions = []; 19 | } 20 | 21 | const exists = existingVersions.includes(version); 22 | 23 | console.log(`::set-output name=publish::${exists ? "false" : "true"}`); 24 | console.log( 25 | exists 26 | ? `Version ${version} already exists on npm, will skip publish.` 27 | : `Version ${version} does not exist, will publish.` 28 | ); 29 | -------------------------------------------------------------------------------- /playground/src/components/markdown/EchartRenderer.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 39 | 40 | 46 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 linzhe 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/core/ShikiProvider.ts: -------------------------------------------------------------------------------- 1 | import { inject, provide, defineComponent, ref, onMounted } from "vue"; 2 | import { type Highlighter } from "shiki"; 3 | import { initShikiHighlighter } from "./highlight/shiki.js"; 4 | import { shikiHighlightCoreKey } from "./symbol.js"; 5 | import { useProxyProps } from "./useProxyProps.js"; 6 | 7 | export const ShikiProvider = defineComponent({ 8 | setup(_, { slots }) { 9 | const proxyProps = useProxyProps(); 10 | 11 | const highlighter = ref(null); 12 | provide(shikiHighlightCoreKey, highlighter); 13 | 14 | onMounted(async () => { 15 | const _highlighter = await initShikiHighlighter(); 16 | for (const lang of proxyProps.extraLangs) { 17 | await _highlighter.loadLanguage(lang); 18 | } 19 | highlighter.value = _highlighter; 20 | }); 21 | 22 | return () => { 23 | // @ts-expect-error 24 | return slots.default(); 25 | }; 26 | }, 27 | }); 28 | 29 | export function useShiki() { 30 | const highlighter = inject(shikiHighlightCoreKey); 31 | return { 32 | highlighter, 33 | }; 34 | } 35 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | release: 10 | name: Release 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout Branch 15 | uses: actions/checkout@v4 16 | 17 | - name: Install pnpm 18 | uses: pnpm/action-setup@v2 19 | with: 20 | version: 8 21 | 22 | - name: Use Node.js 20 23 | uses: actions/setup-node@v4 24 | with: 25 | node-version: 26 | registry-url: "https://registry.npmjs.org" 27 | cache: pnpm 28 | 29 | - name: Install Dependencies 30 | run: pnpm install 31 | 32 | - name: Build Packages 33 | run: pnpm run build 34 | 35 | - name: Check if version already exists on npm 36 | id: check-version 37 | run: node scripts/check-version.mjs 38 | 39 | - name: Publish to npm 40 | if: steps.check-version.outputs.publish == 'true' 41 | run: npm publish --access public 42 | env: 43 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 44 | -------------------------------------------------------------------------------- /src/core/highlight/shiki.ts: -------------------------------------------------------------------------------- 1 | import { 2 | type Highlighter, 3 | createHighlighterCore, 4 | createOnigurumaEngine, 5 | } from "shiki"; 6 | import { shikiTheme } from "./codeTheme.js"; 7 | let highlighter: Highlighter | null = null; 8 | 9 | export type Langs = Parameters[0]; 10 | export const defaultLangs = { 11 | json: import("@shikijs/langs/json"), 12 | bash: import("@shikijs/langs/bash"), 13 | vue: import("@shikijs/langs/vue"), 14 | ts: import("@shikijs/langs/ts"), 15 | tsx: import("@shikijs/langs/tsx"), 16 | css: import("@shikijs/langs/css"), 17 | html: import("@shikijs/langs/html"), 18 | python: import("@shikijs/langs/python"), 19 | go: import("@shikijs/langs/go"), 20 | rust: import("@shikijs/langs/rust"), 21 | }; 22 | 23 | export async function initShikiHighlighter() { 24 | if (highlighter) return highlighter; 25 | const _highlighter = await createHighlighterCore({ 26 | themes: [shikiTheme], 27 | langs: Object.values(defaultLangs), 28 | engine: createOnigurumaEngine(() => import("shiki/wasm")), 29 | }); 30 | highlighter = _highlighter as Highlighter; 31 | return highlighter; 32 | } 33 | -------------------------------------------------------------------------------- /playground/src/transfrom/think/think.ts: -------------------------------------------------------------------------------- 1 | const startTag = ""; 2 | const endTag = ""; 3 | type ThinkState = "idle" | "thinking" | "finished"; 4 | export function transformThink() { 5 | let buffer = ""; 6 | let state: ThinkState = "idle"; 7 | 8 | return function processThink(chunk: string) { 9 | if (state === "finished") return; 10 | buffer += chunk; 11 | if (isState(state, "idle")) { 12 | const startIdx = buffer.indexOf(startTag); 13 | if (startIdx !== -1) { 14 | buffer = buffer.slice(startIdx + startTag.length); 15 | state = "thinking"; 16 | } 17 | } 18 | if (isState(state, "thinking")) { 19 | const endIdx = buffer.indexOf(endTag); 20 | if (endIdx !== -1) { 21 | const content = buffer.slice(0, endIdx); 22 | const rest = buffer.slice(endIdx + endTag.length); 23 | state = "finished"; 24 | return { buffer: content, rest, done: true }; 25 | } else { 26 | if (buffer) { 27 | return { buffer, done: false }; 28 | } 29 | } 30 | } 31 | }; 32 | } 33 | 34 | function isState(currentState: ThinkState, state: ThinkState) { 35 | return currentState === state; 36 | } 37 | -------------------------------------------------------------------------------- /.github/workflows/example.yml: -------------------------------------------------------------------------------- 1 | name: Deploy playground to Pages 2 | 3 | on: 4 | push: 5 | branches: ["main"] 6 | 7 | workflow_dispatch: 8 | 9 | permissions: 10 | contents: read 11 | pages: write 12 | id-token: write 13 | 14 | # Allow one concurrent deployment 15 | concurrency: 16 | group: "pages" 17 | cancel-in-progress: true 18 | 19 | jobs: 20 | deploy: 21 | environment: 22 | name: github-pages 23 | url: ${{ steps.deployment.outputs.page_url }} 24 | runs-on: ubuntu-latest 25 | steps: 26 | - name: Checkout 27 | uses: actions/checkout@v4 28 | 29 | - name: Install pnpm 30 | uses: pnpm/action-setup@v2 31 | with: 32 | version: 8 33 | 34 | - name: Use Node.js 20 35 | uses: actions/setup-node@v4 36 | with: 37 | node-version: 20 38 | cache: pnpm 39 | 40 | - name: Install Dependencies 41 | run: pnpm install 42 | 43 | - name: Build 44 | run: pnpm run build:playground 45 | 46 | - name: Setup Pages 47 | uses: actions/configure-pages@v4 48 | 49 | - name: Upload artifact 50 | uses: actions/upload-pages-artifact@v3 51 | with: 52 | # Upload dist folder 53 | path: "./playground/dist" 54 | 55 | - name: Deploy to GitHub Pages 56 | id: deployment 57 | uses: actions/deploy-pages@v4 58 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-mdr", 3 | "version": "0.0.13", 4 | "type": "module", 5 | "description": "Tranform markdown string to vue component with `mdast-> hast-> vue node`", 6 | "exports": { 7 | ".": { 8 | "import": "./dist/src/index.js", 9 | "types": "./dist/src/index.d.ts" 10 | } 11 | }, 12 | "files": [ 13 | "dist" 14 | ], 15 | "scripts": { 16 | "dev": "pnpm -F playground run dev", 17 | "build": "tsc", 18 | "build:playground": "pnpm -F playground run build", 19 | "preview:playground": "pnpm -F playground run preview", 20 | "prettier-lint": "prettier --write ." 21 | }, 22 | "keywords": [ 23 | "vue", 24 | "markdown", 25 | "stream", 26 | "stream-markdown", 27 | "markdown to html", 28 | "markdown to vue" 29 | ], 30 | "repository": { 31 | "type": "git", 32 | "url": "https://github.com/linzhe141/vue-markdown-renderer" 33 | }, 34 | "author": "linzhe141@qq.com", 35 | "license": "ISC", 36 | "packageManager": "pnpm@10.5.1", 37 | "devDependencies": { 38 | "prettier": "^3.5.2", 39 | "prettier-plugin-tailwindcss": "^0.6.11", 40 | "typescript": "^5.8.3", 41 | "vite": "^6.2.0", 42 | "vitest": "^3.0.7" 43 | }, 44 | "peerDependencies": { 45 | "vue": "^3.2.0" 46 | }, 47 | "dependencies": { 48 | "@shikijs/core": "^3.6.0", 49 | "@shikijs/langs": "^3.6.0", 50 | "@shikijs/themes": "^3.6.0", 51 | "hast-util-to-jsx-runtime": "^2.3.6", 52 | "remark-gfm": "^4.0.1", 53 | "remark-parse": "^11.0.0", 54 | "remark-rehype": "^11.1.2", 55 | "shiki": "^3.6.0", 56 | "shiki-stream": "^0.1.2", 57 | "unified": "^11.0.5", 58 | "unist-util-visit": "^5.0.0", 59 | "vfile": "^6.0.3" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /playground/src/polyfill.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import GraphemeSplitter from "grapheme-splitter"; 3 | 4 | // Polyfill Segmenter 5 | class PolyfillSegmenter { 6 | constructor(locale = "en", options = { granularity: "grapheme" }) { 7 | this.locale = locale; 8 | this.granularity = options.granularity; 9 | this.splitter = new GraphemeSplitter(); 10 | } 11 | 12 | segment(input) { 13 | if (this.granularity === "grapheme") { 14 | const graphemes = this.splitter.splitGraphemes(input); 15 | return graphemes.map((s, i) => ({ 16 | segment: s, 17 | index: i, 18 | isWordLike: true, 19 | })); 20 | } 21 | 22 | if (this.granularity === "word") { 23 | // 简单的空格/标点分词(中文可以按字符切) 24 | const words = input.split(/(\s+|[,.!?,。!?])/).filter(Boolean); 25 | let index = 0; 26 | return words.map((w) => { 27 | const obj = { 28 | segment: w, 29 | index, 30 | isWordLike: /\w|\p{Script=Han}/u.test(w), 31 | }; 32 | index += w.length; 33 | return obj; 34 | }); 35 | } 36 | 37 | if (this.granularity === "sentence") { 38 | const sentences = input.split(/([.!?。!?]+)/).filter(Boolean); 39 | let index = 0; 40 | return sentences.map((s) => { 41 | const obj = { segment: s, index, isWordLike: true }; 42 | index += s.length; 43 | return obj; 44 | }); 45 | } 46 | 47 | return [{ segment: input, index: 0, isWordLike: true }]; 48 | } 49 | 50 | resolvedOptions() { 51 | return { locale: this.locale, granularity: this.granularity }; 52 | } 53 | } 54 | 55 | // 自动挂载到 Intl 上(保持兼容) 56 | if (typeof Intl.Segmenter === "undefined") { 57 | Intl.Segmenter = PolyfillSegmenter; 58 | } 59 | -------------------------------------------------------------------------------- /playground/src/transfrom/think/Think.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 57 | -------------------------------------------------------------------------------- /src/core/segmentText.ts: -------------------------------------------------------------------------------- 1 | import { type Component, defineComponent, h, type PropType } from "vue"; 2 | 3 | export interface TextNode { 4 | type: "text"; 5 | value: string; 6 | } 7 | 8 | export interface ElementNode { 9 | type: "element"; 10 | tagName: string; 11 | properties: Record; 12 | children: (TextNode | ElementNode)[]; 13 | } 14 | 15 | export type Node = TextNode | ElementNode; 16 | 17 | const segmenter = new Intl.Segmenter("zh", { granularity: "word" }); 18 | function wrap(node: Node) { 19 | if (node.type === "text") { 20 | return [...segmenter.segment(node.value)].map((s, i) => 21 | h("span", { key: i, class: "text-segmenter" }, s.segment) 22 | ); 23 | } else if (node.type === "element" && Array.isArray(node.children)) { 24 | const newChildren = node.children.map(wrap); 25 | return h(node.tagName, node.properties, newChildren); 26 | } 27 | } 28 | 29 | const SegmentTextImpl = defineComponent({ 30 | props: { 31 | node: { 32 | type: Object as PropType, 33 | required: true, 34 | }, 35 | }, 36 | setup(props) { 37 | return () => wrap(props.node); 38 | }, 39 | }); 40 | 41 | export const segmentTextComponents = ["p", "h1", "h2", "h3", "li"].reduce( 42 | (res, key) => { 43 | const item = {} as { 44 | [x: string]: Component; 45 | }; 46 | item[key] = defineComponent({ 47 | name: key + "-wrapper", 48 | props: { 49 | node: { 50 | type: Object as PropType, 51 | required: true, 52 | }, 53 | }, 54 | setup(props) { 55 | return () => { 56 | return h( 57 | key, 58 | null, 59 | props.node.children.map((child) => 60 | h(SegmentTextImpl, { node: child }) 61 | ) 62 | ); 63 | }; 64 | }, 65 | }); 66 | return Object.assign(res, item); 67 | }, 68 | {} as { 69 | [x: string]: Component; 70 | } 71 | ); 72 | -------------------------------------------------------------------------------- /playground/src/components/markdown/CodeBlockRenderer.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 79 | -------------------------------------------------------------------------------- /playground/src/md.ts: -------------------------------------------------------------------------------- 1 | export const md = { 2 | limit: 100, 3 | hasMore: false, 4 | data: [ 5 | { 6 | id: "953f2f3e-0d8a-4420-bb79-5d596b962531", 7 | conversationId: "a31bad52-20ff-4097-b77c-0149d7cddcd3", 8 | parentMessageId: "00000000-0000-0000-0000-000000000000", 9 | inputs: {}, 10 | query: "输出1000字", 11 | answer: 12 | "\n好的,用户让我输出1000字,但看起来他们可能是在测试我的响应能力或者有其他需求。首先,我需要确定用户的具体要求是什么。他们可能想要一篇关于某个主题的文章,或者只是想看看我能否生成指定长度的内容。不过,用户没有给出具体的主题,所以我需要进一步询问。\n\n不过,用户可能只是想让我展示我的写作能力,或者测试我的输出长度。考虑到用户之前可能有过类似的请求,我应该先确认他们需要的内容类型。比如,是技术性的文章、创意写作,还是其他类型?如果没有明确说明,我可能需要提供一个通用的示例,或者建议他们指定主题。\n\n另外,用户可能希望我直接生成1000字的内容,而不需要进一步的询问。这时候,我需要快速生成符合要求的文本,同时确保内容质量。可能需要选择一个通用主题,比如科技发展的影响、环境保护、或者人工智能的未来,这些都是比较容易展开的话题。\n\n同时,我要注意避免重复或冗长的内容,保持段落之间的连贯性。可能需要分几个部分来组织内容,比如引言、几个主要论点,以及结论。每个部分大约200-300字,这样整体结构会更清晰。\n\n不过,用户也可能希望我直接回答他们的问题,而不是询问更多信息。因此,我应该先尝试生成一个1000字左右的示例,同时保持内容的相关性和逻辑性。如果用户需要调整主题或内容,他们可以进一步说明。\n\n另外,需要确保语言流畅,用词准确,避免语法错误。可能还需要使用一些例子或数据来支持观点,但如果没有具体数据,可以适当使用假设性的例子。最后检查字数,确保达到1000字左右,不过分超出或不足。\n\n总结来说,我需要先生成一个结构清晰、内容充实的1000字文章,可能选择一个常见主题,如人工智能的未来发展,并分点论述其影响、挑战和机遇。这样既满足字数要求,又提供有价值的内容。\n以下是一篇关于“人工智能与未来社会”的1000字文章,供您参考:\n\n---\n\n### 人工智能:重塑未来社会的双刃剑\n\n在21世纪的技术革命浪潮中,人工智能(AI)无疑是最具颠覆性的力量之一。从自动驾驶汽车到医疗诊断系统,从智能客服到个性化教育平台,AI技术正以前所未有的速度渗透到人类生活的各个领域。它既被视为推动社会进步的“加速器”,也被担忧为可能引发伦理危机的“潘多拉魔盒”。这场技术革命究竟将如何影响人类社会的未来?我们需要以理性视角审视其机遇与挑战。\n\n#### 一、AI技术的突破性进展与社会价值\n\n近年来,AI技术的突破性进展令人瞩目。深度学习、自然语言处理和计算机视觉等领域的革新,使得机器能够执行复杂任务并产生接近人类的决策能力。例如,AI在医疗领域的应用已取得显著成效:通过分析数百万份病例数据,AI辅助诊断系统能够在早期发现癌症等疾病,将误诊率降低至传统方法的三分之一;在药物研发领域,AI能快速筛选有效化合物,将新药研发周期从平均10年缩短至数月。\n\n在经济领域,AI驱动的自动化生产正在重塑全球制造业格局。工业机器人不仅提升了工厂的生产效率,还降低了人工操作的安全风险。麦肯锡全球研究院的报告显示,到2030年,AI有望为全球经济贡献13万亿美元的增长,其中制造业、医疗保健和零售业将成为最大受益者。此外,AI在能源管理、气候变化预测等领域的应用,也为可持续发展目标提供了技术支持。\n\n#### 二、技术背后的伦理困境与社会挑战\n\n然而,AI的快速发展也带来了一系列伦理与社会问题。首先是就业市场的结构性冲击。世界经济论坛预测,到2025年,全球将有8500万个岗位因自动化而消失,尽管同时会创造9700万个新岗位,但技能错配和过渡期的失业问题仍可能加剧社会不平等。尤其在发展中国家,大量依赖低端制造业的劳动力群体面临严峻挑战。\n\n其次是算法偏见与数据隐私的争议。AI系统的决策依赖于训练数据,若数据本身存在历史偏见(如性别、种族歧视),则可能导致算法结果的不公平。例如,某款人脸识别系统曾被曝对深色人种的识别准确率显著低于浅色人种,这直接反映了数据集的代表性缺陷。此外,个人数据的过度采集与滥用也引发公众担忧。当AI能够通过社交媒体行为预测个人偏好,甚至影响选举结果时,如何界定数据使用的边界成为亟待解决的法律难题。\n\n更深层次的挑战在于人类与AI的关系定位。当AI在围棋、象棋等策略游戏中屡屡战胜人类冠军,当生成式AI能创作出媲美人类的文学作品,人类的智力优越性似乎受到挑战。这种技术冲击不仅影响职业领域,更可能动摇人类对自身价值的认知。哲学家们开始探讨:当机器具备“类人智能”时,我们该如何定义“人性”与“意识”?\n\n#### 三、构建人机协同的未来社会\n\n面对AI带来的机遇与挑战,社会需要建立多维度的应对策略。首先,教育体系必须进行根本性变革,培养适应智能时代的“T型人才”——既具备深度专业技能,又拥有跨学科视野与批判性思维。芬兰已将编程教育纳入小学课程,新加坡则推出“技能创前程”计划,为在职人员提供AI技能培训,这些实践为全球提供了参考范本。\n\n其次,政策制定者需建立包容性的AI治理框架。欧盟《人工智能法案》将高风险AI系统(如 facial recognition)纳入严格监管,要求其通过透明性、准确性等多维度评估;中国《新一代人工智能治理原则》强调“发展负责任的人工智能”,倡导“增进人类福祉”。这些举措为平衡创新与风险提供了制度保障。\n\n最后,技术开发者应践行“以人为本”的设计理念。微软提出“AI for Good”计划,将AI应用于无障碍技术、环境保护等公益领域;谷歌开发的DeepMind不仅追求技术突破,更注重算法的可解释性与伦理合规。这些实践表明,当技术服务于人类共同价值时,AI才能真正成为社会进步的催化剂。\n\n#### 四、结语:在变革中寻找平衡\n\n人工智能的发展如同一场没有终点的马拉松,它既非乌托邦式的救世主,也非反乌托邦的毁灭者。人类社会的未来,将取决于我们如何驾驭这项技术——既不让恐惧阻碍创新,也不让狂热迷失方向。唯有通过技术创新、制度完善与人文关怀的协同推进,才能确保AI真正成为促进社会公平、增进人类福祉的智慧伙伴,而非取代人类的冰冷工具。\n\n---\n\n### 文章总结\n本文通过分析AI技术在医疗、经济等领域的应用价值,探讨了其引发的就业、伦理、社会认知等挑战,并提出了教育改革、政策监管与技术伦理的解决方案。全文字数约1000字,结构清晰,内容涵盖技术、社会、伦理多维度视角,可作为深度分析类文章参考。如需调整主题或补充细节,欢迎进一步说明。", 13 | messageFiles: [], 14 | feedback: null, 15 | retrieverResources: [], 16 | agentThoughts: [], 17 | createdAt: 1757041864, 18 | status: "normal", 19 | error: null, 20 | }, 21 | ], 22 | }.data[0].answer; 23 | -------------------------------------------------------------------------------- /playground/src/components/markdown/BarChart.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 118 | 119 | 125 | -------------------------------------------------------------------------------- /src/core/plugin/remarkEchartCodeBlock.ts: -------------------------------------------------------------------------------- 1 | import { visit } from "unist-util-visit"; 2 | import { computed, defineComponent, h } from "vue"; 3 | import { useProxyProps } from "../useProxyProps.js"; 4 | 5 | export const remarkEchartCodeBlock = () => { 6 | return (tree) => { 7 | visit(tree, "code", (node, index, parent) => { 8 | if (node.lang === "echarts") { 9 | if (!node.meta) { 10 | // 默认的placeholder 11 | const placeholder = { 12 | type: "EchartCodeBlock", 13 | data: { 14 | hName: "EchartCodeBlock", 15 | hProperties: { 16 | placeholder: "vue-mdr-default-echart-placeholder-key", 17 | }, 18 | }, 19 | }; 20 | parent.children.splice(index, 1, placeholder); 21 | } 22 | try { 23 | const meta = JSON.parse(node.meta); 24 | try { 25 | const data = JSON.parse(node.value); 26 | const echartCodeBlock = { 27 | type: "EchartCodeBlock", 28 | data: { 29 | hName: "EchartCodeBlock", 30 | hProperties: data, 31 | }, 32 | }; 33 | parent.children.splice(index, 1, echartCodeBlock); 34 | } catch (e) { 35 | const placeholder = { 36 | type: "EchartCodeBlock", 37 | data: { 38 | hName: "EchartCodeBlock", 39 | hProperties: { 40 | placeholder: meta.placeholder, 41 | }, 42 | }, 43 | }; 44 | parent.children.splice(index, 1, placeholder); 45 | } 46 | } catch (e) {} 47 | } 48 | }); 49 | }; 50 | }; 51 | 52 | // 使用json字符串作为prop的目的是防止组件(props.component)不必要的re-render 53 | const EchartWrapper = defineComponent({ 54 | props: ["optionJson"], 55 | setup(props) { 56 | const proxyProps = useProxyProps(); 57 | const echartRenderer = computed(() => proxyProps.echartRenderer); 58 | return () => { 59 | if (!echartRenderer.value) { 60 | throw new Error(`echartRenderer must be provided`); 61 | } 62 | return h(echartRenderer.value!, { 63 | option: JSON.parse(props.optionJson), 64 | }); 65 | }; 66 | }, 67 | }); 68 | 69 | const Placeholder = defineComponent({ 70 | setup() { 71 | return () => { 72 | return h("div", { class: "vue-mdr-default-echart-placeholder" }); 73 | }; 74 | }, 75 | }); 76 | 77 | export const EchartCodeBlock = defineComponent({ 78 | name: "echart-code-block", 79 | inheritAttrs: false, 80 | 81 | props: { 82 | node: { 83 | type: Object, 84 | required: true, 85 | }, 86 | }, 87 | setup(props) { 88 | const proxyProps = useProxyProps(); 89 | const echartRendererPlaceholder = computed( 90 | () => proxyProps.echartRendererPlaceholder 91 | ); 92 | 93 | return () => { 94 | const node = props.node; 95 | const placeholder = node.properties.placeholder; 96 | if (placeholder) { 97 | return h(echartRendererPlaceholder.value || Placeholder); 98 | } 99 | 100 | return h(EchartWrapper, { 101 | optionJson: JSON.stringify(node.properties), 102 | }); 103 | }; 104 | }, 105 | }); 106 | -------------------------------------------------------------------------------- /src/core/plugin/remarkComponentCodeBlock.ts: -------------------------------------------------------------------------------- 1 | import { visit } from "unist-util-visit"; 2 | import { computed, defineComponent, h } from "vue"; 3 | import { useProxyProps } from "../useProxyProps.js"; 4 | 5 | export const remarkComponentCodeBlock = () => { 6 | return (tree) => { 7 | visit(tree, "code", (node, index, parent) => { 8 | if (node.lang === "component-json") { 9 | if (!node.meta) { 10 | // 默认的placeholder 11 | const placeholder = { 12 | type: "ComponentCodeBlock", 13 | data: { 14 | hName: "ComponentCodeBlock", 15 | hProperties: { 16 | placeholder: "vue-mdr-default-component-placeholder-key", 17 | }, 18 | }, 19 | }; 20 | parent.children.splice(index, 1, placeholder); 21 | } 22 | try { 23 | const meta = JSON.parse(node.meta); 24 | try { 25 | const data = JSON.parse(node.value); 26 | const componentCodeBlock = { 27 | type: "ComponentCodeBlock", 28 | data: { 29 | hName: "ComponentCodeBlock", 30 | hProperties: data, 31 | }, 32 | }; 33 | parent.children.splice(index, 1, componentCodeBlock); 34 | } catch (e) { 35 | const placeholder = { 36 | type: "ComponentCodeBlock", 37 | data: { 38 | hName: "ComponentCodeBlock", 39 | hProperties: { 40 | placeholder: meta.placeholder, 41 | }, 42 | }, 43 | }; 44 | parent.children.splice(index, 1, placeholder); 45 | } 46 | } catch (e) {} 47 | } 48 | }); 49 | }; 50 | }; 51 | 52 | // 使用json字符串作为prop的目的是防止组件(props.component)不必要的re-render 53 | const ComponentWrapper = defineComponent({ 54 | props: ["component", "componetPropsJson"], 55 | setup(props) { 56 | return () => { 57 | return h(props.component, JSON.parse(props.componetPropsJson)); 58 | }; 59 | }, 60 | }); 61 | 62 | const Placeholder = defineComponent({ 63 | setup() { 64 | return () => { 65 | return h("div", { class: "vue-mdr-default-component-placeholder" }); 66 | }; 67 | }, 68 | }); 69 | 70 | export const ComponentCodeBlock = defineComponent({ 71 | name: "component-code-block", 72 | inheritAttrs: false, 73 | 74 | props: { 75 | node: { 76 | type: Object, 77 | required: true, 78 | }, 79 | }, 80 | setup(props) { 81 | const proxyProps = useProxyProps(); 82 | const computedComponentsMap = computed(() => proxyProps.componentsMap); 83 | 84 | return () => { 85 | const node = props.node; 86 | const placeholder = node.properties.placeholder; 87 | if (placeholder) { 88 | const target = computedComponentsMap.value[placeholder]; 89 | if (target === undefined) { 90 | console.warn( 91 | `${placeholder} does not exist in componentsMap, the built-in 'Placeholder' will be used instead.` 92 | ); 93 | } 94 | return h(target || Placeholder); 95 | } 96 | 97 | const component = computedComponentsMap.value[node.properties.type]; 98 | if (component === undefined) { 99 | throw new Error( 100 | `${node.properties.type} not exist in componentsMap:${JSON.stringify(computedComponentsMap.value, null, 2)}` 101 | ); 102 | } 103 | const componentProps = node.properties.props; 104 | return h(ComponentWrapper, { 105 | component, 106 | componetPropsJson: JSON.stringify(componentProps), 107 | }); 108 | }; 109 | }, 110 | }); 111 | -------------------------------------------------------------------------------- /src/core/ShikiStreamCodeBlock.ts: -------------------------------------------------------------------------------- 1 | import { computed, defineComponent, h } from "vue"; 2 | import { ShikiCachedRenderer } from "shiki-stream/vue"; 3 | import { useShiki } from "./ShikiProvider.js"; 4 | import { THEME } from "./highlight/codeTheme.js"; 5 | import { ElementNode } from "./segmentText.js"; 6 | import { useProxyProps } from "./useProxyProps.js"; 7 | 8 | const FALLBACK_LANG = "ts"; 9 | 10 | export const ShikiStreamCodeBlock = defineComponent({ 11 | name: "pre-wrapper", 12 | props: { 13 | nodeJSON: { 14 | type: String, 15 | required: true, 16 | }, 17 | }, 18 | setup(props) { 19 | const proxyProps = useProxyProps(); 20 | const { highlighter } = useShiki(); 21 | const computedCodeBlockRenderer = computed( 22 | () => proxyProps.codeBlockRenderer 23 | ); 24 | const themeStyle = computed(() => { 25 | const theme = proxyProps.theme; 26 | return THEME[theme]; 27 | }); 28 | 29 | function getCodeMeta() { 30 | const node = JSON.parse(props.nodeJSON) as ElementNode; 31 | const loadedLangs = highlighter!.value!.getLoadedLanguages(); 32 | let language = ""; 33 | let code = ""; 34 | const codeNode = node.children[0]; 35 | if ( 36 | codeNode && 37 | codeNode.type === "element" && 38 | codeNode.tagName === "code" 39 | ) { 40 | const codeTextNode = codeNode.children[0]; 41 | if (codeTextNode.type === "text") { 42 | const className = codeNode.properties.className as string[]; 43 | if (className) { 44 | const languageClass = className.find((i) => 45 | i.includes("language") 46 | ) as string; 47 | 48 | let [_, languageName] = languageClass.split("-"); 49 | language = languageName; 50 | } 51 | 52 | const lastChar = codeTextNode.value[codeTextNode.value.length - 1]; 53 | const codeText = codeTextNode.value.slice( 54 | 0, 55 | codeTextNode.value.length - (lastChar === "\n" ? 1 : 0) 56 | ); 57 | const lines = codeText.split("\n"); 58 | const lastLine = lines[lines.length - 1]; 59 | 60 | let matchedMarkdownCount = 0; 61 | if (language === "markdown") { 62 | lines.forEach((line) => { 63 | const trimStartLine = line.trimStart(); 64 | if (trimStartLine.startsWith("```")) { 65 | matchedMarkdownCount++; 66 | } 67 | }); 68 | if ( 69 | lastLine && 70 | lastLine.trimStart().startsWith("```") && 71 | matchedMarkdownCount % 2 === 0 72 | ) { 73 | code = codeText; 74 | } 75 | } else { 76 | if (lastLine && lastLine.trimStart().startsWith("`")) { 77 | code = lines.slice(0, lines.length - 1).join("\n"); 78 | } else { 79 | code = codeText; 80 | } 81 | } 82 | } 83 | } 84 | let highlightLang = language; 85 | if (!loadedLangs.includes(highlightLang)) highlightLang = FALLBACK_LANG; 86 | return { 87 | highlightLang, 88 | language, 89 | code, 90 | }; 91 | } 92 | 93 | return () => { 94 | if (!highlighter!.value) return null; 95 | const { highlightLang, language, code: codeChunk } = getCodeMeta(); 96 | if (codeChunk === "") return null; 97 | const highlightVnode = h(ShikiCachedRenderer, { 98 | highlighter: highlighter!.value, 99 | code: codeChunk, 100 | lang: highlightLang, 101 | theme: "css-variables", 102 | style: { 103 | ...themeStyle.value, 104 | background: "var(--vercel-code-block-background)", 105 | }, 106 | }); 107 | 108 | if (computedCodeBlockRenderer.value) { 109 | return h(computedCodeBlockRenderer.value, { 110 | highlightVnode, 111 | language, 112 | }); 113 | } 114 | return highlightVnode; 115 | }; 116 | }, 117 | }); 118 | -------------------------------------------------------------------------------- /src/core/highlight/codeTheme.ts: -------------------------------------------------------------------------------- 1 | import { type CSSProperties } from "vue"; 2 | import { createCssVariablesTheme } from "./theme-css-variables.js"; 3 | export const FONTS = [ 4 | "jetbrains-mono", 5 | "geist-mono", 6 | "ibm-plex-mono", 7 | "fira-code", 8 | "soehne-mono", 9 | ] as const; 10 | 11 | export type Font = (typeof FONTS)[number]; 12 | 13 | export const shikiTheme = createCssVariablesTheme({ 14 | name: "css-variables", 15 | variablePrefix: "--vercel-code-block-", 16 | variableDefaults: {}, 17 | fontStyle: true, 18 | }); 19 | 20 | type ShikiSyntaxObject = { 21 | background: string; 22 | /* foreground is also used as caret color */ 23 | foreground: string; 24 | /* rest is optional as syntax might come from a textmate source */ 25 | constant?: string; 26 | string?: string; 27 | comment?: string; 28 | keyword?: string; 29 | parameter?: string; 30 | function?: string; 31 | stringExpression?: string; 32 | punctuation?: string; 33 | link?: string; 34 | number?: string; 35 | property?: string; 36 | highlight?: string; 37 | highlightBorder?: string; 38 | highlightHover?: string; 39 | }; 40 | 41 | function convertToShikiTheme(syntaxObject: ShikiSyntaxObject): CSSProperties { 42 | if (!syntaxObject) { 43 | return {}; 44 | } 45 | 46 | return { 47 | "--vercel-code-block-background": syntaxObject.background, 48 | "--vercel-code-block-foreground": syntaxObject.foreground, 49 | "--vercel-code-block-token-constant": syntaxObject.constant, 50 | "--vercel-code-block-token-string": syntaxObject.string, 51 | "--vercel-code-block-token-comment": syntaxObject.comment, 52 | "--vercel-code-block-token-keyword": syntaxObject.keyword, 53 | "--vercel-code-block-token-parameter": syntaxObject.parameter, 54 | "--vercel-code-block-token-function": syntaxObject.function, 55 | "--vercel-code-block-token-string-expression": 56 | syntaxObject.stringExpression, 57 | "--vercel-code-block-token-punctuation": syntaxObject.punctuation, 58 | "--vercel-code-block-token-link": syntaxObject.link, 59 | "--vercel-code-block-token-number": syntaxObject.number, 60 | "--vercel-code-block-token-property": syntaxObject.property, 61 | "--vercel-code-block-highlight": syntaxObject.highlight, 62 | "--vercel-code-block-highlight-border": syntaxObject.highlightBorder, 63 | "--vercel-code-block-highlight-hover": syntaxObject.highlightHover, 64 | } as CSSProperties; 65 | } 66 | 67 | export const THEME = { 68 | light: convertToShikiTheme({ 69 | background: "hsla(0, 0%, 93%,1)", 70 | foreground: "hsla(0, 0%, 9%,1)", 71 | constant: "oklch(53.18% 0.2399 256.9900584162342)", 72 | string: "oklch(51.75% 0.1453 147.65)", 73 | comment: "hsla(0, 0%, 40%,1)", 74 | keyword: "oklch(53.5% 0.2058 2.84)", 75 | parameter: "oklch(52.79% 0.1496 54.65)", 76 | function: "oklch(47.18% 0.2579 304)", 77 | stringExpression: "oklch(51.75% 0.1453 147.65)", 78 | punctuation: "hsla(0, 0%, 9%,1)", 79 | link: "oklch(51.75% 0.1453 147.65)", 80 | number: "#111111", 81 | property: "oklch(53.18% 0.2399 256.9900584162342)", 82 | highlight: "oklch(94.58% 0.0293 249.84870859673202)", 83 | highlightHover: "oklch(94.58% 0.0293 249.84870859673202 / 30%)", 84 | highlightBorder: "oklch(53.18% 0.2399 256.9900584162342)", 85 | }), 86 | dark: convertToShikiTheme({ 87 | background: "hsla(0, 0%, 9%,1)", 88 | foreground: "hsla(0, 0%, 93%,1)", 89 | constant: "oklch(71.7% 0.1648 250.79360374054167)", 90 | string: "oklch(73.1% 0.2158 148.29)", 91 | comment: "hsla(0, 0%, 63%,1)", 92 | keyword: "oklch(69.36% 0.2223 3.91)", 93 | parameter: "oklch(77.21% 0.1991 64.28)", 94 | function: "oklch(69.87% 0.2037 309.51)", 95 | stringExpression: "oklch(73.1% 0.2158 148.29)", 96 | punctuation: "hsla(0, 0%, 93%,1)", 97 | link: "oklch(73.1% 0.2158 148.29)", 98 | number: "#ffffff", 99 | property: "oklch(71.7% 0.1648 250.79360374054167)", 100 | highlight: "oklch(30.86% 0.1022 255.21)", 101 | highlightHover: "oklch(30.86% 0.1022 255.21 / 30%)", 102 | highlightBorder: "oklch(71.7% 0.1648 250.79360374054167)", 103 | }), 104 | }; 105 | -------------------------------------------------------------------------------- /src/core/VueMarkdownRenderer.ts: -------------------------------------------------------------------------------- 1 | import { 2 | h, 3 | defineComponent, 4 | type PropType, 5 | computed, 6 | type Component, 7 | } from "vue"; 8 | import { Fragment } from "vue/jsx-runtime"; 9 | import { toJsxRuntime } from "hast-util-to-jsx-runtime"; 10 | import remarkParse from "remark-parse"; 11 | import remarkRehype from "remark-rehype"; 12 | import remarkGfm from "remark-gfm"; 13 | import { VFile } from "vfile"; 14 | import { unified, type Plugin } from "unified"; 15 | import { segmentTextComponents } from "./segmentText.js"; 16 | import { ShikiProvider } from "./ShikiProvider.js"; 17 | import { Langs } from "./highlight/shiki.js"; 18 | import { 19 | remarkComponentCodeBlock, 20 | ComponentCodeBlock, 21 | } from "./plugin/remarkComponentCodeBlock.js"; 22 | import { 23 | remarkEchartCodeBlock, 24 | EchartCodeBlock, 25 | } from "./plugin/remarkEchartCodeBlock.js"; 26 | import { ShikiStreamCodeBlock } from "./ShikiStreamCodeBlock.js"; 27 | import { provideProxyProps } from "./useProxyProps.js"; 28 | 29 | interface RemarkRehypeOptions { 30 | allowDangerousHtml?: boolean; 31 | [key: string]: any; 32 | } 33 | 34 | function jsx(type: any, props: Record, key: any) { 35 | const { children } = props; 36 | delete props.children; 37 | if (arguments.length > 2) { 38 | props.key = key; 39 | } 40 | if (type === Fragment) { 41 | return h(type, props, children); 42 | } else if (typeof type !== "string") { 43 | if (type === ShikiStreamCodeBlock) { 44 | // 使用json字符串作为prop的目的是防止ShikiStreamCodeBlock组件不必要的re-render 45 | const nodeJSON = JSON.stringify(props.node); 46 | delete props.node; 47 | return h(type, { ...props, nodeJSON }); 48 | } 49 | return h(type, props); 50 | } 51 | return h(type, props, children); 52 | } 53 | 54 | export default defineComponent({ 55 | name: "VueMarkdownRenderer", 56 | props: { 57 | source: { 58 | type: String as PropType, 59 | required: true, 60 | }, 61 | theme: { 62 | type: String as PropType<"light" | "dark">, 63 | required: true, 64 | }, 65 | componentsMap: { 66 | type: Object as PropType>, 67 | }, 68 | codeBlockRenderer: { 69 | type: Object as PropType, 70 | }, 71 | echartRenderer: { 72 | type: Object as PropType, 73 | }, 74 | echartRendererPlaceholder: { 75 | type: Object as PropType, 76 | }, 77 | extraLangs: { 78 | type: Array as PropType, 79 | default: () => [], 80 | }, 81 | rehypePlugins: { 82 | type: Array as PropType, 83 | default: () => [], 84 | }, 85 | remarkPlugins: { 86 | type: Array as PropType, 87 | default: () => [], 88 | }, 89 | remarkRehypeOptions: { 90 | type: Object as PropType, 91 | default: () => ({ allowDangerousHtml: true }), 92 | }, 93 | }, 94 | errorCaptured(e) { 95 | console.error("VueMarkdownRenderer captured error", e); 96 | }, 97 | setup(props) { 98 | provideProxyProps(props); 99 | const computedProcessor = computed(() => { 100 | const { rehypePlugins, remarkPlugins, remarkRehypeOptions } = props; 101 | const processor = unified() 102 | .use(remarkParse) 103 | .use(remarkGfm) 104 | .use(remarkComponentCodeBlock) 105 | .use(remarkEchartCodeBlock) 106 | .use(remarkPlugins) 107 | .use(remarkRehype, remarkRehypeOptions) 108 | .use(rehypePlugins); 109 | return processor; 110 | }); 111 | 112 | const createFile = (md: string) => { 113 | const file = new VFile(); 114 | file.value = md; 115 | return file; 116 | }; 117 | 118 | const generateVueNode = (tree: any) => { 119 | const vueVnode = toJsxRuntime(tree, { 120 | components: { 121 | ...segmentTextComponents, 122 | ComponentCodeBlock, 123 | EchartCodeBlock, 124 | pre: ShikiStreamCodeBlock, 125 | }, 126 | Fragment, 127 | jsx: jsx, 128 | jsxs: jsx, 129 | passKeys: true, 130 | passNode: true, 131 | }); 132 | return vueVnode; 133 | }; 134 | 135 | const computedVNode = computed(() => { 136 | const processor = computedProcessor.value; 137 | const file = createFile(props.source); 138 | return generateVueNode(processor.runSync(processor.parse(file), file)); 139 | }); 140 | 141 | return () => { 142 | return h(ShikiProvider, null, { 143 | default: () => computedVNode.value, 144 | }); 145 | }; 146 | }, 147 | }); 148 | -------------------------------------------------------------------------------- /playground/src/App.vue: -------------------------------------------------------------------------------- 1 | 119 | 120 | 174 | -------------------------------------------------------------------------------- /src/core/highlight/theme-css-variables.ts: -------------------------------------------------------------------------------- 1 | // Adapted from https://github.com/shikijs/shiki/blob/main/packages/shiki/src/theme-css-variables.ts 2 | 3 | import type { ThemeRegistration } from '@shikijs/core' 4 | 5 | export interface CssVariablesThemeOptions { 6 | /** 7 | * Theme name. Need to unique if multiple css variables themes are created 8 | * 9 | * @default 'css-variables' 10 | */ 11 | name?: string 12 | 13 | /** 14 | * Prefix for css variables 15 | * 16 | * @default '--shiki-' 17 | */ 18 | variablePrefix?: string 19 | 20 | /** 21 | * Default value for css variables, the key is without the prefix 22 | * 23 | * @example `{ 'token-comment': '#888' }` will generate `var(--shiki-token-comment, #888)` for comments 24 | */ 25 | variableDefaults?: Record 26 | 27 | /** 28 | * Enable font style 29 | * 30 | * @default true 31 | */ 32 | fontStyle?: boolean 33 | } 34 | 35 | /** 36 | * A factory function to create a css-variable-based theme 37 | * 38 | * @experimental This API is experimental and may change without following semver 39 | * @see https://shiki.style/guide/theme-colors#css-variables-theme 40 | */ 41 | export function createCssVariablesTheme( 42 | options: CssVariablesThemeOptions = {} 43 | ): ThemeRegistration { 44 | const { 45 | name = 'css-variables', 46 | variablePrefix = '--shiki-', 47 | fontStyle = true, 48 | } = options 49 | 50 | const variable = (name: string) => { 51 | if (options.variableDefaults?.[name]) 52 | return `var(${variablePrefix}${name}, ${options.variableDefaults[name]})` 53 | return `var(${variablePrefix}${name})` 54 | } 55 | 56 | const theme: ThemeRegistration = { 57 | name, 58 | type: 'dark', 59 | colors: { 60 | 'editor.foreground': variable('foreground'), 61 | 'editor.background': variable('background'), 62 | 'terminal.ansiBlack': variable('ansi-black'), 63 | 'terminal.ansiRed': variable('ansi-red'), 64 | 'terminal.ansiGreen': variable('ansi-green'), 65 | 'terminal.ansiYellow': variable('ansi-yellow'), 66 | 'terminal.ansiBlue': variable('ansi-blue'), 67 | 'terminal.ansiMagenta': variable('ansi-magenta'), 68 | 'terminal.ansiCyan': variable('ansi-cyan'), 69 | 'terminal.ansiWhite': variable('ansi-white'), 70 | 'terminal.ansiBrightBlack': variable('ansi-bright-black'), 71 | 'terminal.ansiBrightRed': variable('ansi-bright-red'), 72 | 'terminal.ansiBrightGreen': variable('ansi-bright-green'), 73 | 'terminal.ansiBrightYellow': variable('ansi-bright-yellow'), 74 | 'terminal.ansiBrightBlue': variable('ansi-bright-blue'), 75 | 'terminal.ansiBrightMagenta': variable('ansi-bright-magenta'), 76 | 'terminal.ansiBrightCyan': variable('ansi-bright-cyan'), 77 | 'terminal.ansiBrightWhite': variable('ansi-bright-white'), 78 | }, 79 | tokenColors: [ 80 | { 81 | scope: [ 82 | 'keyword.operator.accessor', 83 | 'meta.group.braces.round.function.arguments', 84 | 'meta.template.expression', 85 | 'markup.fenced_code meta.embedded.block', 86 | ], 87 | settings: { 88 | foreground: variable('foreground'), 89 | }, 90 | }, 91 | { 92 | scope: 'emphasis', 93 | settings: { 94 | fontStyle: 'italic', 95 | }, 96 | }, 97 | { 98 | scope: ['strong', 'markup.heading.markdown', 'markup.bold.markdown'], 99 | settings: { 100 | fontStyle: 'bold', 101 | }, 102 | }, 103 | { 104 | scope: ['markup.italic.markdown'], 105 | settings: { 106 | fontStyle: 'italic', 107 | }, 108 | }, 109 | { 110 | scope: 'meta.link.inline.markdown', 111 | settings: { 112 | fontStyle: 'underline', 113 | foreground: variable('token-link'), 114 | }, 115 | }, 116 | { 117 | scope: [ 118 | 'string', 119 | 'markup.fenced_code', 120 | 'markup.inline', 121 | 'string.quoted.docstring.multi.python', 122 | ], 123 | settings: { 124 | foreground: variable('token-string'), 125 | }, 126 | }, 127 | { 128 | scope: ['comment', 'string.quoted.docstring.multi'], 129 | settings: { 130 | foreground: variable('token-comment'), 131 | }, 132 | }, 133 | { 134 | scope: [ 135 | 'constant.numeric', 136 | 'constant.language', 137 | 'constant.other.placeholder', 138 | 'constant.character.format.placeholder', 139 | 'variable.language.this', 140 | 'variable.other.object', 141 | 'variable.other.class', 142 | 'variable.other.constant', 143 | 'meta.property-name', 144 | 'meta.property-value', 145 | 'support', 146 | ], 147 | settings: { 148 | foreground: variable('token-constant'), 149 | }, 150 | }, 151 | { 152 | scope: [ 153 | 'keyword', 154 | 'storage.modifier', 155 | 'storage.type', 156 | 'storage.control.clojure', 157 | 'entity.name.function.clojure', 158 | 'entity.name.tag.yaml', 159 | 'support.function.node', 160 | 'support.type.property-name.json', 161 | 'punctuation.separator.key-value', 162 | 'punctuation.definition.template-expression', 163 | ], 164 | settings: { 165 | foreground: variable('token-keyword'), 166 | }, 167 | }, 168 | { 169 | scope: 'variable.parameter.function', 170 | settings: { 171 | foreground: variable('token-parameter'), 172 | }, 173 | }, 174 | { 175 | scope: [ 176 | 'support.function', 177 | 'entity.name.type', 178 | 'entity.other.inherited-class', 179 | 'meta.function-call', 180 | 'meta.instance.constructor', 181 | 'entity.other.attribute-name', 182 | 'entity.name.function', 183 | 'constant.keyword.clojure', 184 | ], 185 | settings: { 186 | foreground: variable('token-function'), 187 | }, 188 | }, 189 | { 190 | scope: [ 191 | 'entity.name.tag', 192 | 'string.quoted', 193 | 'string.regexp', 194 | 'string.interpolated', 195 | 'string.template', 196 | 'string.unquoted.plain.out.yaml', 197 | 'keyword.other.template', 198 | ], 199 | settings: { 200 | foreground: variable('token-string-expression'), 201 | }, 202 | }, 203 | { 204 | scope: [ 205 | 'punctuation.definition.arguments', 206 | 'punctuation.definition.dict', 207 | 'punctuation.separator', 208 | 'meta.function-call.arguments', 209 | ], 210 | settings: { 211 | foreground: variable('token-punctuation'), 212 | }, 213 | }, 214 | { 215 | // [Custom] Markdown links 216 | scope: [ 217 | 'markup.underline.link', 218 | 'punctuation.definition.metadata.markdown', 219 | ], 220 | settings: { 221 | foreground: variable('token-link'), 222 | }, 223 | }, 224 | { 225 | // [Custom] Markdown list 226 | scope: ['beginning.punctuation.definition.list.markdown'], 227 | settings: { 228 | foreground: variable('token-string'), 229 | }, 230 | }, 231 | { 232 | // [Custom] Markdown punctuation definition brackets 233 | scope: [ 234 | 'punctuation.definition.string.begin.markdown', 235 | 'punctuation.definition.string.end.markdown', 236 | 'string.other.link.title.markdown', 237 | 'string.other.link.description.markdown', 238 | ], 239 | settings: { 240 | foreground: variable('token-keyword'), 241 | }, 242 | }, 243 | { 244 | scope: [ 245 | 'constant.numeric.decimal', 246 | 'constant.language.boolean', 247 | 'meta.var.exp.ts', 248 | ], 249 | settings: { foreground: variable('token-number') }, 250 | }, 251 | { 252 | scope: ['support.variable.property'], 253 | settings: { foreground: variable('token-property') }, 254 | }, 255 | ], 256 | } 257 | 258 | if (!fontStyle) { 259 | theme.tokenColors = theme.tokenColors?.map((tokenColor) => { 260 | if (tokenColor.settings?.fontStyle) 261 | // @ts-expect-error force delete readonly property 262 | delete tokenColor.settings.fontStyle 263 | return tokenColor 264 | }) 265 | } 266 | 267 | return theme 268 | } 269 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VueMarkdownRenderer 2 | 3 | A Vue.js markdown component with enhanced features, utilizing efficient DOM rendering through Vue's virtual DOM. 4 | 5 | [live demo](https://linzhe141.github.io/vue-markdown-renderer/) 6 | 7 | ## Features 8 | 9 | - Vue-powered rendering engine for optimal DOM updates 10 | - Syntax highlighting power by shiki 11 | - Seamless Vue.js integration 12 | - Vercel theme code blocks support dark and light mode 13 | - Support rendering Vue components using `component-json` code blocks 14 | - Support rendering echart options using `echarts` code blocks 15 | - Extensible LaTeX support through remark-math and rehype-katex — simply pass them as plugins 16 | - Custom code block renderer support via codeBlockRenderer prop — enables full control over how specific code blocks are rendered, with access to highlightVnode and language props 17 | 18 | ## Installation 19 | 20 | ```bash 21 | npm install vue-mdr 22 | ``` 23 | 24 | ## Usage 25 | 26 | You can add css animations for `.text-segmenter` and `shiki-stream token` to improve user experience like LLM outputs. 27 | 28 | ```css 29 | /* animation.css */ 30 | .vue-markdown-wrapper > *, 31 | .vue-markdown-wrapper .text-segmenter, 32 | .vue-markdown-wrapper .shiki-stream span { 33 | animation: fade-in 0.5s ease-in-out; 34 | } 35 | 36 | @keyframes fade-in { 37 | 0% { 38 | opacity: 0; 39 | } 40 | 100% { 41 | opacity: 1; 42 | } 43 | } 44 | ``` 45 | 46 | then use this animation, And you can also use @tailwindcss/typography, or other typography tools to beautify the page. 47 | 48 | ````vue 49 | 130 | 131 | 149 | ```` 150 | 151 | ### Custom Code Block Rendering 152 | 153 | You can take full control over how code blocks are rendered by passing a `codeBlockRenderer` component to the `VueMarkdownRenderer`. This component receives two props: 154 | 155 | - `highlightVnode`: a `VNode` containing the syntax-highlighted content powered by Shiki. 156 | - `language`: a `string` representing the detected language of the code block. 157 | 158 | This is useful when you want to add features like copy buttons, custom themes, header labels, or animations around your code blocks. 159 | 160 | Example Usage 161 | 162 | ```vue 163 | 168 | ``` 169 | 170 | ```vue 171 | 191 | 192 | 243 | ``` 244 | 245 | This gives you complete flexibility over how code blocks appear and behave in your markdown rendering flow — great for documentation platforms, MDX-like previews, or blogging engines. 246 | 247 | ### Supports rendering custom Vue components through component-json code blocks. Each code block should contain a JSON object with the following structure: 248 | 249 | - type: The key in componentsMap that corresponds to a registered Vue component. 250 | 251 | - props: An object containing the props to be passed to that component. 252 | 253 | Additionally, the code block's meta information can include: 254 | 255 | - placeholder (optional): Specifies a placeholder Vue component to render before the JSON content is fully parsed. For example: {"placeholder": "LoadingSkeleton"}. 256 | 257 | If no placeholder is specified, a default fallback will be rendered `h("div", { class: "vue-mdr-default-component-placeholder" })`. 258 | 259 | ````markdown 260 | ```component-json {"placeholder": "Placeholder"} 261 | {"type":"BarChart","props":{"chartData":{"categories":["type1","type2","type3","type4","type5","type6","type7","type8","type9","type10","type11","type12","type13","type14","type15","type16","type17","type18","type19","type20"],"seriesData":[100,200,150,180,120,130,170,160,190,210,220,140,125,155,165,175,185,195,205,215]}}} 262 | ``` 263 | ```` 264 | 265 | ```component-json {"placeholder": "Placeholder"} 266 | {"type":"BarChart","props":{"chartData":{"categories":["type1","type2","type3","type4","type5","type6","type7","type8","type9","type10","type11","type12","type13","type14","type15","type16","type17","type18","type19","type20"],"seriesData":[100,200,150,180,120,130,170,160,190,210,220,140,125,155,165,175,185,195,205,215]}}} 267 | ``` 268 | 269 | ### Supports rendering ECharts code blocks 270 | 271 | In addition to `component-json` code blocks, you can directly render ECharts. 272 | The content of the code block should be a valid ECharts configuration object (`option`). 273 | 274 | #### Usage 275 | 276 | ````markdown 277 | ```echarts 278 | { 279 | "title": { 280 | "text": "数据对比趋势变化", 281 | "left": "center" 282 | }, 283 | "tooltip": { 284 | "trigger": "axis", 285 | "axisPointer": { 286 | "type": "cross", 287 | "crossStyle": { "color": "#999" } 288 | }, 289 | "formatter": "{b}
{a0}: {c0}" 290 | }, 291 | "legend": { 292 | "data": ["本期"], 293 | "top": "bottom" 294 | }, 295 | "grid": { 296 | "left": "3%", 297 | "right": "4%", 298 | "bottom": "10%", 299 | "containLabel": true 300 | }, 301 | "xAxis": [ 302 | { 303 | "type": "category", 304 | "data": ["xxx", "zzz"], 305 | "axisPointer": { "type": "shadow" } 306 | } 307 | ], 308 | "yAxis": [ 309 | { 310 | "type": "value", 311 | "name": "数值", 312 | "min": 0, 313 | "axisLabel": { "formatter": "{value}" } 314 | } 315 | ], 316 | "series": [ 317 | { 318 | "name": "本期", 319 | "type": "bar", 320 | "data": [5061.1429, 504.8844], 321 | "itemStyle": { "color": "#3ba272" } 322 | } 323 | ] 324 | } 325 | ``` 326 | ```` 327 | ```echarts 328 | { 329 | "title": { 330 | "text": "数据对比趋势变化", 331 | "left": "center" 332 | }, 333 | "tooltip": { 334 | "trigger": "axis", 335 | "axisPointer": { 336 | "type": "cross", 337 | "crossStyle": { "color": "#999" } 338 | }, 339 | "formatter": "{b}
{a0}: {c0}" 340 | }, 341 | "legend": { 342 | "data": ["本期"], 343 | "top": "bottom" 344 | }, 345 | "grid": { 346 | "left": "3%", 347 | "right": "4%", 348 | "bottom": "10%", 349 | "containLabel": true 350 | }, 351 | "xAxis": [ 352 | { 353 | "type": "category", 354 | "data": ["xxx", "zzz"], 355 | "axisPointer": { "type": "shadow" } 356 | } 357 | ], 358 | "yAxis": [ 359 | { 360 | "type": "value", 361 | "name": "数值", 362 | "min": 0, 363 | "axisLabel": { "formatter": "{value}" } 364 | } 365 | ], 366 | "series": [ 367 | { 368 | "name": "本期", 369 | "type": "bar", 370 | "data": [5061.1429, 504.8844], 371 | "itemStyle": { "color": "#3ba272" } 372 | } 373 | ] 374 | } 375 | ``` 376 | #### Placeholder Support 377 | 378 | If you want to show a placeholder while rendering the chart, you can set the `:echart-renderer-placeholder` prop in ``: 379 | 380 | ```vue 381 | 387 | ``` 388 | 389 | If no placeholder is specified, a default fallback will be rendered: 390 | 391 | ```js 392 | h("div", { class: "vue-mdr-default-echart-placeholder" }) 393 | ``` 394 | 395 | ### extra lang `java` 396 | 397 | ```java 398 | public class HelloWorld { 399 | public static void main(String[] args) { 400 | System.out.println("Hello, world!"); 401 | } 402 | } 403 | ``` 404 | 405 | ### test latex render 406 | 407 | $$ 408 | \begin{align} 409 | \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ 410 | \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ 411 | \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ 412 | \nabla \cdot \vec{\mathbf{B}} & = 0 413 | \end{align} 414 | $$ 415 | -------------------------------------------------------------------------------- /playground/public/md.md: -------------------------------------------------------------------------------- 1 | 2 | VueMarkdownRenderer is a high-performance Vue.js Markdown component built for modern web applications. It leverages Vue's virtual DOM to efficiently update the DOM, ensuring smooth rendering even for complex Markdown content. 3 | 4 | The component features Shiki-powered syntax highlighting with support for both light and dark themes. It integrates seamlessly with Vue, allowing dynamic rendering of components through `component-json` code blocks, and provides support for visualizing ECharts options via `echarts` code blocks. 5 | 6 | For mathematical content, VueMarkdownRenderer supports LaTeX through remark-math and rehype-katex plugins. Additionally, it offers a flexible codeBlockRenderer prop, giving developers full control over how specific code blocks are rendered, including access to the highlighted vnode and language information. 7 | 8 | Overall, VueMarkdownRenderer combines flexibility, performance, and rich feature support to create interactive, readable, and visually appealing Markdown content in Vue applications. 9 | 10 | 11 | # VueMarkdownRenderer 12 | 13 | A Vue.js markdown component with enhanced features, utilizing efficient DOM rendering through Vue's virtual DOM. 14 | 15 | [live demo](https://linzhe141.github.io/vue-markdown-renderer/) 16 | 17 | ## Features 18 | 19 | - Vue-powered rendering engine for optimal DOM updates 20 | - Syntax highlighting power by shiki 21 | - Seamless Vue.js integration 22 | - Vercel theme code blocks support dark and light mode 23 | - Support rendering Vue components using `component-json` code blocks 24 | - Support rendering echart options using `echarts` code blocks 25 | - Extensible LaTeX support through remark-math and rehype-katex — simply pass them as plugins 26 | - Custom code block renderer support via codeBlockRenderer prop — enables full control over how specific code blocks are rendered, with access to highlightVnode and language props 27 | 28 | ## Installation 29 | 30 | ```bash 31 | npm install vue-mdr 32 | ``` 33 | 34 | ## Usage 35 | 36 | You can add css animations for `.text-segmenter` and `shiki-stream token` to improve user experience like LLM outputs. 37 | 38 | ```css 39 | /* animation.css */ 40 | .vue-markdown-wrapper > *, 41 | .vue-markdown-wrapper .text-segmenter, 42 | .vue-markdown-wrapper .shiki-stream span { 43 | animation: fade-in 0.5s ease-in-out; 44 | } 45 | 46 | @keyframes fade-in { 47 | 0% { 48 | opacity: 0; 49 | } 50 | 100% { 51 | opacity: 1; 52 | } 53 | } 54 | ``` 55 | 56 | then use this animation, And you can also use @tailwindcss/typography, or other typography tools to beautify the page. 57 | 58 | ````vue 59 | 140 | 141 | 159 | ```` 160 | 161 | ### Custom Code Block Rendering 162 | 163 | You can take full control over how code blocks are rendered by passing a `codeBlockRenderer` component to the `VueMarkdownRenderer`. This component receives two props: 164 | 165 | - `highlightVnode`: a `VNode` containing the syntax-highlighted content powered by Shiki. 166 | - `language`: a `string` representing the detected language of the code block. 167 | 168 | This is useful when you want to add features like copy buttons, custom themes, header labels, or animations around your code blocks. 169 | 170 | Example Usage 171 | 172 | ```vue 173 | 178 | ``` 179 | 180 | ```vue 181 | 201 | 202 | 253 | ``` 254 | 255 | This gives you complete flexibility over how code blocks appear and behave in your markdown rendering flow — great for documentation platforms, MDX-like previews, or blogging engines. 256 | 257 | ### Supports rendering custom Vue components through component-json code blocks. Each code block should contain a JSON object with the following structure: 258 | 259 | - type: The key in componentsMap that corresponds to a registered Vue component. 260 | 261 | - props: An object containing the props to be passed to that component. 262 | 263 | Additionally, the code block's meta information can include: 264 | 265 | - placeholder (optional): Specifies a placeholder Vue component to render before the JSON content is fully parsed. For example: {"placeholder": "LoadingSkeleton"}. 266 | 267 | If no placeholder is specified, a default fallback will be rendered `h("div", { class: "vue-mdr-default-component-placeholder" })`. 268 | 269 | ````markdown 270 | ```component-json {"placeholder": "Placeholder"} 271 | {"type":"BarChart","props":{"chartData":{"categories":["type1","type2","type3","type4","type5","type6","type7","type8","type9","type10","type11","type12","type13","type14","type15","type16","type17","type18","type19","type20"],"seriesData":[100,200,150,180,120,130,170,160,190,210,220,140,125,155,165,175,185,195,205,215]}}} 272 | ``` 273 | ```` 274 | 275 | ```component-json {"placeholder": "Placeholder"} 276 | {"type":"BarChart","props":{"chartData":{"categories":["type1","type2","type3","type4","type5","type6","type7","type8","type9","type10","type11","type12","type13","type14","type15","type16","type17","type18","type19","type20"],"seriesData":[100,200,150,180,120,130,170,160,190,210,220,140,125,155,165,175,185,195,205,215]}}} 277 | ``` 278 | 279 | ### Supports rendering ECharts code blocks 280 | 281 | In addition to `component-json` code blocks, you can directly render ECharts. 282 | The content of the code block should be a valid ECharts configuration object (`option`). 283 | 284 | #### Usage 285 | 286 | ````markdown 287 | ```echarts 288 | { 289 | "title": { 290 | "text": "数据对比趋势变化", 291 | "left": "center" 292 | }, 293 | "tooltip": { 294 | "trigger": "axis", 295 | "axisPointer": { 296 | "type": "cross", 297 | "crossStyle": { "color": "#999" } 298 | }, 299 | "formatter": "{b}
{a0}: {c0}" 300 | }, 301 | "legend": { 302 | "data": ["本期"], 303 | "top": "bottom" 304 | }, 305 | "grid": { 306 | "left": "3%", 307 | "right": "4%", 308 | "bottom": "10%", 309 | "containLabel": true 310 | }, 311 | "xAxis": [ 312 | { 313 | "type": "category", 314 | "data": ["xxx", "zzz"], 315 | "axisPointer": { "type": "shadow" } 316 | } 317 | ], 318 | "yAxis": [ 319 | { 320 | "type": "value", 321 | "name": "数值", 322 | "min": 0, 323 | "axisLabel": { "formatter": "{value}" } 324 | } 325 | ], 326 | "series": [ 327 | { 328 | "name": "本期", 329 | "type": "bar", 330 | "data": [5061.1429, 504.8844], 331 | "itemStyle": { "color": "#3ba272" } 332 | } 333 | ] 334 | } 335 | ``` 336 | ```` 337 | ```echarts 338 | { 339 | "title": { 340 | "text": "数据对比趋势变化", 341 | "left": "center" 342 | }, 343 | "tooltip": { 344 | "trigger": "axis", 345 | "axisPointer": { 346 | "type": "cross", 347 | "crossStyle": { "color": "#999" } 348 | }, 349 | "formatter": "{b}
{a0}: {c0}" 350 | }, 351 | "legend": { 352 | "data": ["本期"], 353 | "top": "bottom" 354 | }, 355 | "grid": { 356 | "left": "3%", 357 | "right": "4%", 358 | "bottom": "10%", 359 | "containLabel": true 360 | }, 361 | "xAxis": [ 362 | { 363 | "type": "category", 364 | "data": ["xxx", "zzz"], 365 | "axisPointer": { "type": "shadow" } 366 | } 367 | ], 368 | "yAxis": [ 369 | { 370 | "type": "value", 371 | "name": "数值", 372 | "min": 0, 373 | "axisLabel": { "formatter": "{value}" } 374 | } 375 | ], 376 | "series": [ 377 | { 378 | "name": "本期", 379 | "type": "bar", 380 | "data": [5061.1429, 504.8844], 381 | "itemStyle": { "color": "#3ba272" } 382 | } 383 | ] 384 | } 385 | ``` 386 | #### Placeholder Support 387 | 388 | If you want to show a placeholder while rendering the chart, you can set the `:echart-renderer-placeholder` prop in ``: 389 | 390 | ```vue 391 | 397 | ``` 398 | 399 | If no placeholder is specified, a default fallback will be rendered: 400 | 401 | ```js 402 | h("div", { class: "vue-mdr-default-echart-placeholder" }) 403 | ``` 404 | 405 | ### extra lang `java` 406 | 407 | ```java 408 | public class HelloWorld { 409 | public static void main(String[] args) { 410 | System.out.println("Hello, world!"); 411 | } 412 | } 413 | ``` 414 | 415 | ### test latex render 416 | 417 | $$ 418 | \begin{align} 419 | \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ 420 | \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ 421 | \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ 422 | \nabla \cdot \vec{\mathbf{B}} & = 0 423 | \end{align} 424 | $$ 425 | 426 | 427 | ### test image render 428 | 429 | ![img](https://github.com/user-attachments/assets/01b679c8-681c-4ce0-bcce-91742b40e7b4) 430 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@shikijs/core': 12 | specifier: ^3.6.0 13 | version: 3.7.0 14 | '@shikijs/langs': 15 | specifier: ^3.6.0 16 | version: 3.7.0 17 | '@shikijs/themes': 18 | specifier: ^3.6.0 19 | version: 3.7.0 20 | hast-util-to-jsx-runtime: 21 | specifier: ^2.3.6 22 | version: 2.3.6 23 | remark-gfm: 24 | specifier: ^4.0.1 25 | version: 4.0.1 26 | remark-parse: 27 | specifier: ^11.0.0 28 | version: 11.0.0 29 | remark-rehype: 30 | specifier: ^11.1.2 31 | version: 11.1.2 32 | shiki: 33 | specifier: ^3.6.0 34 | version: 3.7.0 35 | shiki-stream: 36 | specifier: ^0.1.2 37 | version: 0.1.2(vue@3.5.17(typescript@5.8.3)) 38 | unified: 39 | specifier: ^11.0.5 40 | version: 11.0.5 41 | unist-util-visit: 42 | specifier: ^5.0.0 43 | version: 5.0.0 44 | vfile: 45 | specifier: ^6.0.3 46 | version: 6.0.3 47 | vue: 48 | specifier: ^3.2.0 49 | version: 3.5.17(typescript@5.8.3) 50 | devDependencies: 51 | prettier: 52 | specifier: ^3.5.2 53 | version: 3.6.2 54 | prettier-plugin-tailwindcss: 55 | specifier: ^0.6.11 56 | version: 0.6.14(prettier@3.6.2) 57 | typescript: 58 | specifier: ^5.8.3 59 | version: 5.8.3 60 | vite: 61 | specifier: ^6.2.0 62 | version: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) 63 | vitest: 64 | specifier: ^3.0.7 65 | version: 3.2.4(@types/debug@4.1.12)(jiti@2.4.2)(lightningcss@1.30.1) 66 | 67 | playground: 68 | dependencies: 69 | '@tailwindcss/typography': 70 | specifier: ^0.5.16 71 | version: 0.5.16(tailwindcss@4.1.11) 72 | '@tailwindcss/vite': 73 | specifier: ^4.0.9 74 | version: 4.1.11(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) 75 | echarts: 76 | specifier: ^5.6.0 77 | version: 5.6.0 78 | grapheme-splitter: 79 | specifier: 1.0.4 80 | version: 1.0.4 81 | katex: 82 | specifier: ^0.16.22 83 | version: 0.16.22 84 | rehype-katex: 85 | specifier: ^7.0.1 86 | version: 7.0.1 87 | remark-math: 88 | specifier: ^6.0.0 89 | version: 6.0.0 90 | tailwindcss: 91 | specifier: ^4.0.9 92 | version: 4.1.11 93 | vue: 94 | specifier: ^3.5.13 95 | version: 3.5.17(typescript@5.8.3) 96 | devDependencies: 97 | '@vitejs/plugin-vue': 98 | specifier: ^5.2.1 99 | version: 5.2.4(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1))(vue@3.5.17(typescript@5.8.3)) 100 | 101 | packages: 102 | 103 | '@ampproject/remapping@2.3.0': 104 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 105 | engines: {node: '>=6.0.0'} 106 | 107 | '@babel/helper-string-parser@7.27.1': 108 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 109 | engines: {node: '>=6.9.0'} 110 | 111 | '@babel/helper-validator-identifier@7.27.1': 112 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 113 | engines: {node: '>=6.9.0'} 114 | 115 | '@babel/parser@7.28.0': 116 | resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} 117 | engines: {node: '>=6.0.0'} 118 | hasBin: true 119 | 120 | '@babel/types@7.28.0': 121 | resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} 122 | engines: {node: '>=6.9.0'} 123 | 124 | '@esbuild/aix-ppc64@0.25.6': 125 | resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} 126 | engines: {node: '>=18'} 127 | cpu: [ppc64] 128 | os: [aix] 129 | 130 | '@esbuild/android-arm64@0.25.6': 131 | resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} 132 | engines: {node: '>=18'} 133 | cpu: [arm64] 134 | os: [android] 135 | 136 | '@esbuild/android-arm@0.25.6': 137 | resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} 138 | engines: {node: '>=18'} 139 | cpu: [arm] 140 | os: [android] 141 | 142 | '@esbuild/android-x64@0.25.6': 143 | resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} 144 | engines: {node: '>=18'} 145 | cpu: [x64] 146 | os: [android] 147 | 148 | '@esbuild/darwin-arm64@0.25.6': 149 | resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} 150 | engines: {node: '>=18'} 151 | cpu: [arm64] 152 | os: [darwin] 153 | 154 | '@esbuild/darwin-x64@0.25.6': 155 | resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} 156 | engines: {node: '>=18'} 157 | cpu: [x64] 158 | os: [darwin] 159 | 160 | '@esbuild/freebsd-arm64@0.25.6': 161 | resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} 162 | engines: {node: '>=18'} 163 | cpu: [arm64] 164 | os: [freebsd] 165 | 166 | '@esbuild/freebsd-x64@0.25.6': 167 | resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} 168 | engines: {node: '>=18'} 169 | cpu: [x64] 170 | os: [freebsd] 171 | 172 | '@esbuild/linux-arm64@0.25.6': 173 | resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} 174 | engines: {node: '>=18'} 175 | cpu: [arm64] 176 | os: [linux] 177 | 178 | '@esbuild/linux-arm@0.25.6': 179 | resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} 180 | engines: {node: '>=18'} 181 | cpu: [arm] 182 | os: [linux] 183 | 184 | '@esbuild/linux-ia32@0.25.6': 185 | resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} 186 | engines: {node: '>=18'} 187 | cpu: [ia32] 188 | os: [linux] 189 | 190 | '@esbuild/linux-loong64@0.25.6': 191 | resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} 192 | engines: {node: '>=18'} 193 | cpu: [loong64] 194 | os: [linux] 195 | 196 | '@esbuild/linux-mips64el@0.25.6': 197 | resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} 198 | engines: {node: '>=18'} 199 | cpu: [mips64el] 200 | os: [linux] 201 | 202 | '@esbuild/linux-ppc64@0.25.6': 203 | resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} 204 | engines: {node: '>=18'} 205 | cpu: [ppc64] 206 | os: [linux] 207 | 208 | '@esbuild/linux-riscv64@0.25.6': 209 | resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} 210 | engines: {node: '>=18'} 211 | cpu: [riscv64] 212 | os: [linux] 213 | 214 | '@esbuild/linux-s390x@0.25.6': 215 | resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} 216 | engines: {node: '>=18'} 217 | cpu: [s390x] 218 | os: [linux] 219 | 220 | '@esbuild/linux-x64@0.25.6': 221 | resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} 222 | engines: {node: '>=18'} 223 | cpu: [x64] 224 | os: [linux] 225 | 226 | '@esbuild/netbsd-arm64@0.25.6': 227 | resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} 228 | engines: {node: '>=18'} 229 | cpu: [arm64] 230 | os: [netbsd] 231 | 232 | '@esbuild/netbsd-x64@0.25.6': 233 | resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} 234 | engines: {node: '>=18'} 235 | cpu: [x64] 236 | os: [netbsd] 237 | 238 | '@esbuild/openbsd-arm64@0.25.6': 239 | resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} 240 | engines: {node: '>=18'} 241 | cpu: [arm64] 242 | os: [openbsd] 243 | 244 | '@esbuild/openbsd-x64@0.25.6': 245 | resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} 246 | engines: {node: '>=18'} 247 | cpu: [x64] 248 | os: [openbsd] 249 | 250 | '@esbuild/openharmony-arm64@0.25.6': 251 | resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} 252 | engines: {node: '>=18'} 253 | cpu: [arm64] 254 | os: [openharmony] 255 | 256 | '@esbuild/sunos-x64@0.25.6': 257 | resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} 258 | engines: {node: '>=18'} 259 | cpu: [x64] 260 | os: [sunos] 261 | 262 | '@esbuild/win32-arm64@0.25.6': 263 | resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} 264 | engines: {node: '>=18'} 265 | cpu: [arm64] 266 | os: [win32] 267 | 268 | '@esbuild/win32-ia32@0.25.6': 269 | resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} 270 | engines: {node: '>=18'} 271 | cpu: [ia32] 272 | os: [win32] 273 | 274 | '@esbuild/win32-x64@0.25.6': 275 | resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} 276 | engines: {node: '>=18'} 277 | cpu: [x64] 278 | os: [win32] 279 | 280 | '@isaacs/fs-minipass@4.0.1': 281 | resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} 282 | engines: {node: '>=18.0.0'} 283 | 284 | '@jridgewell/gen-mapping@0.3.12': 285 | resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} 286 | 287 | '@jridgewell/resolve-uri@3.1.2': 288 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 289 | engines: {node: '>=6.0.0'} 290 | 291 | '@jridgewell/sourcemap-codec@1.5.4': 292 | resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} 293 | 294 | '@jridgewell/trace-mapping@0.3.29': 295 | resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} 296 | 297 | '@rollup/rollup-android-arm-eabi@4.44.2': 298 | resolution: {integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==} 299 | cpu: [arm] 300 | os: [android] 301 | 302 | '@rollup/rollup-android-arm64@4.44.2': 303 | resolution: {integrity: sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==} 304 | cpu: [arm64] 305 | os: [android] 306 | 307 | '@rollup/rollup-darwin-arm64@4.44.2': 308 | resolution: {integrity: sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==} 309 | cpu: [arm64] 310 | os: [darwin] 311 | 312 | '@rollup/rollup-darwin-x64@4.44.2': 313 | resolution: {integrity: sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==} 314 | cpu: [x64] 315 | os: [darwin] 316 | 317 | '@rollup/rollup-freebsd-arm64@4.44.2': 318 | resolution: {integrity: sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==} 319 | cpu: [arm64] 320 | os: [freebsd] 321 | 322 | '@rollup/rollup-freebsd-x64@4.44.2': 323 | resolution: {integrity: sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==} 324 | cpu: [x64] 325 | os: [freebsd] 326 | 327 | '@rollup/rollup-linux-arm-gnueabihf@4.44.2': 328 | resolution: {integrity: sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==} 329 | cpu: [arm] 330 | os: [linux] 331 | 332 | '@rollup/rollup-linux-arm-musleabihf@4.44.2': 333 | resolution: {integrity: sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==} 334 | cpu: [arm] 335 | os: [linux] 336 | 337 | '@rollup/rollup-linux-arm64-gnu@4.44.2': 338 | resolution: {integrity: sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==} 339 | cpu: [arm64] 340 | os: [linux] 341 | 342 | '@rollup/rollup-linux-arm64-musl@4.44.2': 343 | resolution: {integrity: sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==} 344 | cpu: [arm64] 345 | os: [linux] 346 | 347 | '@rollup/rollup-linux-loongarch64-gnu@4.44.2': 348 | resolution: {integrity: sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==} 349 | cpu: [loong64] 350 | os: [linux] 351 | 352 | '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': 353 | resolution: {integrity: sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==} 354 | cpu: [ppc64] 355 | os: [linux] 356 | 357 | '@rollup/rollup-linux-riscv64-gnu@4.44.2': 358 | resolution: {integrity: sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==} 359 | cpu: [riscv64] 360 | os: [linux] 361 | 362 | '@rollup/rollup-linux-riscv64-musl@4.44.2': 363 | resolution: {integrity: sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==} 364 | cpu: [riscv64] 365 | os: [linux] 366 | 367 | '@rollup/rollup-linux-s390x-gnu@4.44.2': 368 | resolution: {integrity: sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==} 369 | cpu: [s390x] 370 | os: [linux] 371 | 372 | '@rollup/rollup-linux-x64-gnu@4.44.2': 373 | resolution: {integrity: sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==} 374 | cpu: [x64] 375 | os: [linux] 376 | 377 | '@rollup/rollup-linux-x64-musl@4.44.2': 378 | resolution: {integrity: sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==} 379 | cpu: [x64] 380 | os: [linux] 381 | 382 | '@rollup/rollup-win32-arm64-msvc@4.44.2': 383 | resolution: {integrity: sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==} 384 | cpu: [arm64] 385 | os: [win32] 386 | 387 | '@rollup/rollup-win32-ia32-msvc@4.44.2': 388 | resolution: {integrity: sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==} 389 | cpu: [ia32] 390 | os: [win32] 391 | 392 | '@rollup/rollup-win32-x64-msvc@4.44.2': 393 | resolution: {integrity: sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==} 394 | cpu: [x64] 395 | os: [win32] 396 | 397 | '@shikijs/core@3.7.0': 398 | resolution: {integrity: sha512-yilc0S9HvTPyahHpcum8eonYrQtmGTU0lbtwxhA6jHv4Bm1cAdlPFRCJX4AHebkCm75aKTjjRAW+DezqD1b/cg==} 399 | 400 | '@shikijs/engine-javascript@3.7.0': 401 | resolution: {integrity: sha512-0t17s03Cbv+ZcUvv+y33GtX75WBLQELgNdVghnsdhTgU3hVcWcMsoP6Lb0nDTl95ZJfbP1mVMO0p3byVh3uuzA==} 402 | 403 | '@shikijs/engine-oniguruma@3.7.0': 404 | resolution: {integrity: sha512-5BxcD6LjVWsGu4xyaBC5bu8LdNgPCVBnAkWTtOCs/CZxcB22L8rcoWfv7Hh/3WooVjBZmFtyxhgvkQFedPGnFw==} 405 | 406 | '@shikijs/langs@3.7.0': 407 | resolution: {integrity: sha512-1zYtdfXLr9xDKLTGy5kb7O0zDQsxXiIsw1iIBcNOO8Yi5/Y1qDbJ+0VsFoqTlzdmneO8Ij35g7QKF8kcLyznCQ==} 408 | 409 | '@shikijs/themes@3.7.0': 410 | resolution: {integrity: sha512-VJx8497iZPy5zLiiCTSIaOChIcKQwR0FebwE9S3rcN0+J/GTWwQ1v/bqhTbpbY3zybPKeO8wdammqkpXc4NVjQ==} 411 | 412 | '@shikijs/types@3.7.0': 413 | resolution: {integrity: sha512-MGaLeaRlSWpnP0XSAum3kP3a8vtcTsITqoEPYdt3lQG3YCdQH4DnEhodkYcNMcU0uW0RffhoD1O3e0vG5eSBBg==} 414 | 415 | '@shikijs/vscode-textmate@10.0.2': 416 | resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} 417 | 418 | '@tailwindcss/node@4.1.11': 419 | resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} 420 | 421 | '@tailwindcss/oxide-android-arm64@4.1.11': 422 | resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} 423 | engines: {node: '>= 10'} 424 | cpu: [arm64] 425 | os: [android] 426 | 427 | '@tailwindcss/oxide-darwin-arm64@4.1.11': 428 | resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} 429 | engines: {node: '>= 10'} 430 | cpu: [arm64] 431 | os: [darwin] 432 | 433 | '@tailwindcss/oxide-darwin-x64@4.1.11': 434 | resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} 435 | engines: {node: '>= 10'} 436 | cpu: [x64] 437 | os: [darwin] 438 | 439 | '@tailwindcss/oxide-freebsd-x64@4.1.11': 440 | resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} 441 | engines: {node: '>= 10'} 442 | cpu: [x64] 443 | os: [freebsd] 444 | 445 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': 446 | resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} 447 | engines: {node: '>= 10'} 448 | cpu: [arm] 449 | os: [linux] 450 | 451 | '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': 452 | resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} 453 | engines: {node: '>= 10'} 454 | cpu: [arm64] 455 | os: [linux] 456 | 457 | '@tailwindcss/oxide-linux-arm64-musl@4.1.11': 458 | resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} 459 | engines: {node: '>= 10'} 460 | cpu: [arm64] 461 | os: [linux] 462 | 463 | '@tailwindcss/oxide-linux-x64-gnu@4.1.11': 464 | resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} 465 | engines: {node: '>= 10'} 466 | cpu: [x64] 467 | os: [linux] 468 | 469 | '@tailwindcss/oxide-linux-x64-musl@4.1.11': 470 | resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} 471 | engines: {node: '>= 10'} 472 | cpu: [x64] 473 | os: [linux] 474 | 475 | '@tailwindcss/oxide-wasm32-wasi@4.1.11': 476 | resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} 477 | engines: {node: '>=14.0.0'} 478 | cpu: [wasm32] 479 | bundledDependencies: 480 | - '@napi-rs/wasm-runtime' 481 | - '@emnapi/core' 482 | - '@emnapi/runtime' 483 | - '@tybys/wasm-util' 484 | - '@emnapi/wasi-threads' 485 | - tslib 486 | 487 | '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': 488 | resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} 489 | engines: {node: '>= 10'} 490 | cpu: [arm64] 491 | os: [win32] 492 | 493 | '@tailwindcss/oxide-win32-x64-msvc@4.1.11': 494 | resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} 495 | engines: {node: '>= 10'} 496 | cpu: [x64] 497 | os: [win32] 498 | 499 | '@tailwindcss/oxide@4.1.11': 500 | resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} 501 | engines: {node: '>= 10'} 502 | 503 | '@tailwindcss/typography@0.5.16': 504 | resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} 505 | peerDependencies: 506 | tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' 507 | 508 | '@tailwindcss/vite@4.1.11': 509 | resolution: {integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==} 510 | peerDependencies: 511 | vite: ^5.2.0 || ^6 || ^7 512 | 513 | '@types/chai@5.2.2': 514 | resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} 515 | 516 | '@types/debug@4.1.12': 517 | resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} 518 | 519 | '@types/deep-eql@4.0.2': 520 | resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 521 | 522 | '@types/estree-jsx@1.0.5': 523 | resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} 524 | 525 | '@types/estree@1.0.8': 526 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 527 | 528 | '@types/hast@3.0.4': 529 | resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 530 | 531 | '@types/katex@0.16.7': 532 | resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} 533 | 534 | '@types/mdast@4.0.4': 535 | resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} 536 | 537 | '@types/ms@2.1.0': 538 | resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} 539 | 540 | '@types/unist@2.0.11': 541 | resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} 542 | 543 | '@types/unist@3.0.3': 544 | resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 545 | 546 | '@ungap/structured-clone@1.3.0': 547 | resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 548 | 549 | '@vitejs/plugin-vue@5.2.4': 550 | resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} 551 | engines: {node: ^18.0.0 || >=20.0.0} 552 | peerDependencies: 553 | vite: ^5.0.0 || ^6.0.0 554 | vue: ^3.2.25 555 | 556 | '@vitest/expect@3.2.4': 557 | resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} 558 | 559 | '@vitest/mocker@3.2.4': 560 | resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} 561 | peerDependencies: 562 | msw: ^2.4.9 563 | vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 564 | peerDependenciesMeta: 565 | msw: 566 | optional: true 567 | vite: 568 | optional: true 569 | 570 | '@vitest/pretty-format@3.2.4': 571 | resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} 572 | 573 | '@vitest/runner@3.2.4': 574 | resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} 575 | 576 | '@vitest/snapshot@3.2.4': 577 | resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} 578 | 579 | '@vitest/spy@3.2.4': 580 | resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} 581 | 582 | '@vitest/utils@3.2.4': 583 | resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} 584 | 585 | '@vue/compiler-core@3.5.17': 586 | resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} 587 | 588 | '@vue/compiler-dom@3.5.17': 589 | resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} 590 | 591 | '@vue/compiler-sfc@3.5.17': 592 | resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} 593 | 594 | '@vue/compiler-ssr@3.5.17': 595 | resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} 596 | 597 | '@vue/reactivity@3.5.17': 598 | resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} 599 | 600 | '@vue/runtime-core@3.5.17': 601 | resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} 602 | 603 | '@vue/runtime-dom@3.5.17': 604 | resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} 605 | 606 | '@vue/server-renderer@3.5.17': 607 | resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} 608 | peerDependencies: 609 | vue: 3.5.17 610 | 611 | '@vue/shared@3.5.17': 612 | resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} 613 | 614 | assertion-error@2.0.1: 615 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 616 | engines: {node: '>=12'} 617 | 618 | bail@2.0.2: 619 | resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} 620 | 621 | cac@6.7.14: 622 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 623 | engines: {node: '>=8'} 624 | 625 | ccount@2.0.1: 626 | resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 627 | 628 | chai@5.2.1: 629 | resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} 630 | engines: {node: '>=18'} 631 | 632 | character-entities-html4@2.1.0: 633 | resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} 634 | 635 | character-entities-legacy@3.0.0: 636 | resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} 637 | 638 | character-entities@2.0.2: 639 | resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 640 | 641 | character-reference-invalid@2.0.1: 642 | resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} 643 | 644 | check-error@2.1.1: 645 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 646 | engines: {node: '>= 16'} 647 | 648 | chownr@3.0.0: 649 | resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} 650 | engines: {node: '>=18'} 651 | 652 | comma-separated-tokens@2.0.3: 653 | resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 654 | 655 | commander@8.3.0: 656 | resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} 657 | engines: {node: '>= 12'} 658 | 659 | cssesc@3.0.0: 660 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 661 | engines: {node: '>=4'} 662 | hasBin: true 663 | 664 | csstype@3.1.3: 665 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 666 | 667 | debug@4.4.1: 668 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 669 | engines: {node: '>=6.0'} 670 | peerDependencies: 671 | supports-color: '*' 672 | peerDependenciesMeta: 673 | supports-color: 674 | optional: true 675 | 676 | decode-named-character-reference@1.2.0: 677 | resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} 678 | 679 | deep-eql@5.0.2: 680 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 681 | engines: {node: '>=6'} 682 | 683 | dequal@2.0.3: 684 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 685 | engines: {node: '>=6'} 686 | 687 | detect-libc@2.0.4: 688 | resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} 689 | engines: {node: '>=8'} 690 | 691 | devlop@1.1.0: 692 | resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} 693 | 694 | echarts@5.6.0: 695 | resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} 696 | 697 | enhanced-resolve@5.18.2: 698 | resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} 699 | engines: {node: '>=10.13.0'} 700 | 701 | entities@4.5.0: 702 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 703 | engines: {node: '>=0.12'} 704 | 705 | entities@6.0.1: 706 | resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 707 | engines: {node: '>=0.12'} 708 | 709 | es-module-lexer@1.7.0: 710 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 711 | 712 | esbuild@0.25.6: 713 | resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} 714 | engines: {node: '>=18'} 715 | hasBin: true 716 | 717 | escape-string-regexp@5.0.0: 718 | resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 719 | engines: {node: '>=12'} 720 | 721 | estree-util-is-identifier-name@3.0.0: 722 | resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} 723 | 724 | estree-walker@2.0.2: 725 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 726 | 727 | estree-walker@3.0.3: 728 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 729 | 730 | expect-type@1.2.2: 731 | resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} 732 | engines: {node: '>=12.0.0'} 733 | 734 | extend@3.0.2: 735 | resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 736 | 737 | fdir@6.4.6: 738 | resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} 739 | peerDependencies: 740 | picomatch: ^3 || ^4 741 | peerDependenciesMeta: 742 | picomatch: 743 | optional: true 744 | 745 | fsevents@2.3.3: 746 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 747 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 748 | os: [darwin] 749 | 750 | graceful-fs@4.2.11: 751 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 752 | 753 | grapheme-splitter@1.0.4: 754 | resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 755 | 756 | hast-util-from-dom@5.0.1: 757 | resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} 758 | 759 | hast-util-from-html-isomorphic@2.0.0: 760 | resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} 761 | 762 | hast-util-from-html@2.0.3: 763 | resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} 764 | 765 | hast-util-from-parse5@8.0.3: 766 | resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} 767 | 768 | hast-util-is-element@3.0.0: 769 | resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} 770 | 771 | hast-util-parse-selector@4.0.0: 772 | resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} 773 | 774 | hast-util-to-html@9.0.5: 775 | resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} 776 | 777 | hast-util-to-jsx-runtime@2.3.6: 778 | resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} 779 | 780 | hast-util-to-text@4.0.2: 781 | resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} 782 | 783 | hast-util-whitespace@3.0.0: 784 | resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} 785 | 786 | hastscript@9.0.1: 787 | resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} 788 | 789 | html-void-elements@3.0.0: 790 | resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 791 | 792 | inline-style-parser@0.2.4: 793 | resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} 794 | 795 | is-alphabetical@2.0.1: 796 | resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} 797 | 798 | is-alphanumerical@2.0.1: 799 | resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} 800 | 801 | is-decimal@2.0.1: 802 | resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} 803 | 804 | is-hexadecimal@2.0.1: 805 | resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} 806 | 807 | is-plain-obj@4.1.0: 808 | resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 809 | engines: {node: '>=12'} 810 | 811 | jiti@2.4.2: 812 | resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 813 | hasBin: true 814 | 815 | js-tokens@9.0.1: 816 | resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 817 | 818 | katex@0.16.22: 819 | resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} 820 | hasBin: true 821 | 822 | lightningcss-darwin-arm64@1.30.1: 823 | resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} 824 | engines: {node: '>= 12.0.0'} 825 | cpu: [arm64] 826 | os: [darwin] 827 | 828 | lightningcss-darwin-x64@1.30.1: 829 | resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} 830 | engines: {node: '>= 12.0.0'} 831 | cpu: [x64] 832 | os: [darwin] 833 | 834 | lightningcss-freebsd-x64@1.30.1: 835 | resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} 836 | engines: {node: '>= 12.0.0'} 837 | cpu: [x64] 838 | os: [freebsd] 839 | 840 | lightningcss-linux-arm-gnueabihf@1.30.1: 841 | resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} 842 | engines: {node: '>= 12.0.0'} 843 | cpu: [arm] 844 | os: [linux] 845 | 846 | lightningcss-linux-arm64-gnu@1.30.1: 847 | resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} 848 | engines: {node: '>= 12.0.0'} 849 | cpu: [arm64] 850 | os: [linux] 851 | 852 | lightningcss-linux-arm64-musl@1.30.1: 853 | resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} 854 | engines: {node: '>= 12.0.0'} 855 | cpu: [arm64] 856 | os: [linux] 857 | 858 | lightningcss-linux-x64-gnu@1.30.1: 859 | resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} 860 | engines: {node: '>= 12.0.0'} 861 | cpu: [x64] 862 | os: [linux] 863 | 864 | lightningcss-linux-x64-musl@1.30.1: 865 | resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} 866 | engines: {node: '>= 12.0.0'} 867 | cpu: [x64] 868 | os: [linux] 869 | 870 | lightningcss-win32-arm64-msvc@1.30.1: 871 | resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} 872 | engines: {node: '>= 12.0.0'} 873 | cpu: [arm64] 874 | os: [win32] 875 | 876 | lightningcss-win32-x64-msvc@1.30.1: 877 | resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} 878 | engines: {node: '>= 12.0.0'} 879 | cpu: [x64] 880 | os: [win32] 881 | 882 | lightningcss@1.30.1: 883 | resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} 884 | engines: {node: '>= 12.0.0'} 885 | 886 | lodash.castarray@4.4.0: 887 | resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} 888 | 889 | lodash.isplainobject@4.0.6: 890 | resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} 891 | 892 | lodash.merge@4.6.2: 893 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 894 | 895 | longest-streak@3.1.0: 896 | resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 897 | 898 | loupe@3.1.4: 899 | resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} 900 | 901 | magic-string@0.30.17: 902 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 903 | 904 | markdown-table@3.0.4: 905 | resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} 906 | 907 | mdast-util-find-and-replace@3.0.2: 908 | resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} 909 | 910 | mdast-util-from-markdown@2.0.2: 911 | resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} 912 | 913 | mdast-util-gfm-autolink-literal@2.0.1: 914 | resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} 915 | 916 | mdast-util-gfm-footnote@2.1.0: 917 | resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} 918 | 919 | mdast-util-gfm-strikethrough@2.0.0: 920 | resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} 921 | 922 | mdast-util-gfm-table@2.0.0: 923 | resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} 924 | 925 | mdast-util-gfm-task-list-item@2.0.0: 926 | resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} 927 | 928 | mdast-util-gfm@3.1.0: 929 | resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} 930 | 931 | mdast-util-math@3.0.0: 932 | resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} 933 | 934 | mdast-util-mdx-expression@2.0.1: 935 | resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} 936 | 937 | mdast-util-mdx-jsx@3.2.0: 938 | resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} 939 | 940 | mdast-util-mdxjs-esm@2.0.1: 941 | resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} 942 | 943 | mdast-util-phrasing@4.1.0: 944 | resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} 945 | 946 | mdast-util-to-hast@13.2.0: 947 | resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} 948 | 949 | mdast-util-to-markdown@2.1.2: 950 | resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} 951 | 952 | mdast-util-to-string@4.0.0: 953 | resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} 954 | 955 | micromark-core-commonmark@2.0.3: 956 | resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} 957 | 958 | micromark-extension-gfm-autolink-literal@2.1.0: 959 | resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} 960 | 961 | micromark-extension-gfm-footnote@2.1.0: 962 | resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} 963 | 964 | micromark-extension-gfm-strikethrough@2.1.0: 965 | resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} 966 | 967 | micromark-extension-gfm-table@2.1.1: 968 | resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} 969 | 970 | micromark-extension-gfm-tagfilter@2.0.0: 971 | resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} 972 | 973 | micromark-extension-gfm-task-list-item@2.1.0: 974 | resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} 975 | 976 | micromark-extension-gfm@3.0.0: 977 | resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} 978 | 979 | micromark-extension-math@3.1.0: 980 | resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} 981 | 982 | micromark-factory-destination@2.0.1: 983 | resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} 984 | 985 | micromark-factory-label@2.0.1: 986 | resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} 987 | 988 | micromark-factory-space@2.0.1: 989 | resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} 990 | 991 | micromark-factory-title@2.0.1: 992 | resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} 993 | 994 | micromark-factory-whitespace@2.0.1: 995 | resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} 996 | 997 | micromark-util-character@2.1.1: 998 | resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} 999 | 1000 | micromark-util-chunked@2.0.1: 1001 | resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} 1002 | 1003 | micromark-util-classify-character@2.0.1: 1004 | resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} 1005 | 1006 | micromark-util-combine-extensions@2.0.1: 1007 | resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} 1008 | 1009 | micromark-util-decode-numeric-character-reference@2.0.2: 1010 | resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} 1011 | 1012 | micromark-util-decode-string@2.0.1: 1013 | resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} 1014 | 1015 | micromark-util-encode@2.0.1: 1016 | resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} 1017 | 1018 | micromark-util-html-tag-name@2.0.1: 1019 | resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} 1020 | 1021 | micromark-util-normalize-identifier@2.0.1: 1022 | resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} 1023 | 1024 | micromark-util-resolve-all@2.0.1: 1025 | resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} 1026 | 1027 | micromark-util-sanitize-uri@2.0.1: 1028 | resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} 1029 | 1030 | micromark-util-subtokenize@2.1.0: 1031 | resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} 1032 | 1033 | micromark-util-symbol@2.0.1: 1034 | resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} 1035 | 1036 | micromark-util-types@2.0.2: 1037 | resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} 1038 | 1039 | micromark@4.0.2: 1040 | resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} 1041 | 1042 | minipass@7.1.2: 1043 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1044 | engines: {node: '>=16 || 14 >=14.17'} 1045 | 1046 | minizlib@3.0.2: 1047 | resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} 1048 | engines: {node: '>= 18'} 1049 | 1050 | mkdirp@3.0.1: 1051 | resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} 1052 | engines: {node: '>=10'} 1053 | hasBin: true 1054 | 1055 | ms@2.1.3: 1056 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1057 | 1058 | nanoid@3.3.11: 1059 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1060 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1061 | hasBin: true 1062 | 1063 | oniguruma-parser@0.12.1: 1064 | resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} 1065 | 1066 | oniguruma-to-es@4.3.3: 1067 | resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} 1068 | 1069 | parse-entities@4.0.2: 1070 | resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} 1071 | 1072 | parse5@7.3.0: 1073 | resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} 1074 | 1075 | pathe@2.0.3: 1076 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1077 | 1078 | pathval@2.0.1: 1079 | resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} 1080 | engines: {node: '>= 14.16'} 1081 | 1082 | picocolors@1.1.1: 1083 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1084 | 1085 | picomatch@4.0.2: 1086 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1087 | engines: {node: '>=12'} 1088 | 1089 | postcss-selector-parser@6.0.10: 1090 | resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} 1091 | engines: {node: '>=4'} 1092 | 1093 | postcss@8.5.6: 1094 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1095 | engines: {node: ^10 || ^12 || >=14} 1096 | 1097 | prettier-plugin-tailwindcss@0.6.14: 1098 | resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} 1099 | engines: {node: '>=14.21.3'} 1100 | peerDependencies: 1101 | '@ianvs/prettier-plugin-sort-imports': '*' 1102 | '@prettier/plugin-hermes': '*' 1103 | '@prettier/plugin-oxc': '*' 1104 | '@prettier/plugin-pug': '*' 1105 | '@shopify/prettier-plugin-liquid': '*' 1106 | '@trivago/prettier-plugin-sort-imports': '*' 1107 | '@zackad/prettier-plugin-twig': '*' 1108 | prettier: ^3.0 1109 | prettier-plugin-astro: '*' 1110 | prettier-plugin-css-order: '*' 1111 | prettier-plugin-import-sort: '*' 1112 | prettier-plugin-jsdoc: '*' 1113 | prettier-plugin-marko: '*' 1114 | prettier-plugin-multiline-arrays: '*' 1115 | prettier-plugin-organize-attributes: '*' 1116 | prettier-plugin-organize-imports: '*' 1117 | prettier-plugin-sort-imports: '*' 1118 | prettier-plugin-style-order: '*' 1119 | prettier-plugin-svelte: '*' 1120 | peerDependenciesMeta: 1121 | '@ianvs/prettier-plugin-sort-imports': 1122 | optional: true 1123 | '@prettier/plugin-hermes': 1124 | optional: true 1125 | '@prettier/plugin-oxc': 1126 | optional: true 1127 | '@prettier/plugin-pug': 1128 | optional: true 1129 | '@shopify/prettier-plugin-liquid': 1130 | optional: true 1131 | '@trivago/prettier-plugin-sort-imports': 1132 | optional: true 1133 | '@zackad/prettier-plugin-twig': 1134 | optional: true 1135 | prettier-plugin-astro: 1136 | optional: true 1137 | prettier-plugin-css-order: 1138 | optional: true 1139 | prettier-plugin-import-sort: 1140 | optional: true 1141 | prettier-plugin-jsdoc: 1142 | optional: true 1143 | prettier-plugin-marko: 1144 | optional: true 1145 | prettier-plugin-multiline-arrays: 1146 | optional: true 1147 | prettier-plugin-organize-attributes: 1148 | optional: true 1149 | prettier-plugin-organize-imports: 1150 | optional: true 1151 | prettier-plugin-sort-imports: 1152 | optional: true 1153 | prettier-plugin-style-order: 1154 | optional: true 1155 | prettier-plugin-svelte: 1156 | optional: true 1157 | 1158 | prettier@3.6.2: 1159 | resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 1160 | engines: {node: '>=14'} 1161 | hasBin: true 1162 | 1163 | property-information@7.1.0: 1164 | resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} 1165 | 1166 | regex-recursion@6.0.2: 1167 | resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} 1168 | 1169 | regex-utilities@2.3.0: 1170 | resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} 1171 | 1172 | regex@6.0.1: 1173 | resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} 1174 | 1175 | rehype-katex@7.0.1: 1176 | resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} 1177 | 1178 | remark-gfm@4.0.1: 1179 | resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} 1180 | 1181 | remark-math@6.0.0: 1182 | resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} 1183 | 1184 | remark-parse@11.0.0: 1185 | resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} 1186 | 1187 | remark-rehype@11.1.2: 1188 | resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} 1189 | 1190 | remark-stringify@11.0.0: 1191 | resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} 1192 | 1193 | rollup@4.44.2: 1194 | resolution: {integrity: sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==} 1195 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1196 | hasBin: true 1197 | 1198 | shiki-stream@0.1.2: 1199 | resolution: {integrity: sha512-VtzJT2Sn2vwFoJEhKv71/M6Cl7e/m6p0vIVDgJsYKUpV7E+0zayJsuVuU2ltiSEeWUrqncHSPx8i/xKrRqK6Mw==} 1200 | peerDependencies: 1201 | react: ^19.0.0 1202 | vue: ^3.2.0 1203 | peerDependenciesMeta: 1204 | react: 1205 | optional: true 1206 | vue: 1207 | optional: true 1208 | 1209 | shiki@3.7.0: 1210 | resolution: {integrity: sha512-ZcI4UT9n6N2pDuM2n3Jbk0sR4Swzq43nLPgS/4h0E3B/NrFn2HKElrDtceSf8Zx/OWYOo7G1SAtBLypCp+YXqg==} 1211 | 1212 | siginfo@2.0.0: 1213 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1214 | 1215 | source-map-js@1.2.1: 1216 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1217 | engines: {node: '>=0.10.0'} 1218 | 1219 | space-separated-tokens@2.0.2: 1220 | resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 1221 | 1222 | stackback@0.0.2: 1223 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1224 | 1225 | std-env@3.9.0: 1226 | resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 1227 | 1228 | stringify-entities@4.0.4: 1229 | resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} 1230 | 1231 | strip-literal@3.0.0: 1232 | resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} 1233 | 1234 | style-to-js@1.1.17: 1235 | resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} 1236 | 1237 | style-to-object@1.0.9: 1238 | resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} 1239 | 1240 | tailwindcss@4.1.11: 1241 | resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} 1242 | 1243 | tapable@2.2.2: 1244 | resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} 1245 | engines: {node: '>=6'} 1246 | 1247 | tar@7.4.3: 1248 | resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} 1249 | engines: {node: '>=18'} 1250 | 1251 | tinybench@2.9.0: 1252 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1253 | 1254 | tinyexec@0.3.2: 1255 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1256 | 1257 | tinyglobby@0.2.14: 1258 | resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 1259 | engines: {node: '>=12.0.0'} 1260 | 1261 | tinypool@1.1.1: 1262 | resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} 1263 | engines: {node: ^18.0.0 || >=20.0.0} 1264 | 1265 | tinyrainbow@2.0.0: 1266 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 1267 | engines: {node: '>=14.0.0'} 1268 | 1269 | tinyspy@4.0.3: 1270 | resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} 1271 | engines: {node: '>=14.0.0'} 1272 | 1273 | trim-lines@3.0.1: 1274 | resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} 1275 | 1276 | trough@2.2.0: 1277 | resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} 1278 | 1279 | tslib@2.3.0: 1280 | resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} 1281 | 1282 | typescript@5.8.3: 1283 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1284 | engines: {node: '>=14.17'} 1285 | hasBin: true 1286 | 1287 | unified@11.0.5: 1288 | resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} 1289 | 1290 | unist-util-find-after@5.0.0: 1291 | resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} 1292 | 1293 | unist-util-is@6.0.0: 1294 | resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} 1295 | 1296 | unist-util-position@5.0.0: 1297 | resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} 1298 | 1299 | unist-util-remove-position@5.0.0: 1300 | resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} 1301 | 1302 | unist-util-stringify-position@4.0.0: 1303 | resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} 1304 | 1305 | unist-util-visit-parents@6.0.1: 1306 | resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} 1307 | 1308 | unist-util-visit@5.0.0: 1309 | resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} 1310 | 1311 | util-deprecate@1.0.2: 1312 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1313 | 1314 | vfile-location@5.0.3: 1315 | resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} 1316 | 1317 | vfile-message@4.0.2: 1318 | resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} 1319 | 1320 | vfile@6.0.3: 1321 | resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 1322 | 1323 | vite-node@3.2.4: 1324 | resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} 1325 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1326 | hasBin: true 1327 | 1328 | vite@6.3.5: 1329 | resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 1330 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1331 | hasBin: true 1332 | peerDependencies: 1333 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1334 | jiti: '>=1.21.0' 1335 | less: '*' 1336 | lightningcss: ^1.21.0 1337 | sass: '*' 1338 | sass-embedded: '*' 1339 | stylus: '*' 1340 | sugarss: '*' 1341 | terser: ^5.16.0 1342 | tsx: ^4.8.1 1343 | yaml: ^2.4.2 1344 | peerDependenciesMeta: 1345 | '@types/node': 1346 | optional: true 1347 | jiti: 1348 | optional: true 1349 | less: 1350 | optional: true 1351 | lightningcss: 1352 | optional: true 1353 | sass: 1354 | optional: true 1355 | sass-embedded: 1356 | optional: true 1357 | stylus: 1358 | optional: true 1359 | sugarss: 1360 | optional: true 1361 | terser: 1362 | optional: true 1363 | tsx: 1364 | optional: true 1365 | yaml: 1366 | optional: true 1367 | 1368 | vitest@3.2.4: 1369 | resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} 1370 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1371 | hasBin: true 1372 | peerDependencies: 1373 | '@edge-runtime/vm': '*' 1374 | '@types/debug': ^4.1.12 1375 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1376 | '@vitest/browser': 3.2.4 1377 | '@vitest/ui': 3.2.4 1378 | happy-dom: '*' 1379 | jsdom: '*' 1380 | peerDependenciesMeta: 1381 | '@edge-runtime/vm': 1382 | optional: true 1383 | '@types/debug': 1384 | optional: true 1385 | '@types/node': 1386 | optional: true 1387 | '@vitest/browser': 1388 | optional: true 1389 | '@vitest/ui': 1390 | optional: true 1391 | happy-dom: 1392 | optional: true 1393 | jsdom: 1394 | optional: true 1395 | 1396 | vue@3.5.17: 1397 | resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} 1398 | peerDependencies: 1399 | typescript: '*' 1400 | peerDependenciesMeta: 1401 | typescript: 1402 | optional: true 1403 | 1404 | web-namespaces@2.0.1: 1405 | resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} 1406 | 1407 | why-is-node-running@2.3.0: 1408 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1409 | engines: {node: '>=8'} 1410 | hasBin: true 1411 | 1412 | yallist@5.0.0: 1413 | resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} 1414 | engines: {node: '>=18'} 1415 | 1416 | zrender@5.6.1: 1417 | resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} 1418 | 1419 | zwitch@2.0.4: 1420 | resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 1421 | 1422 | snapshots: 1423 | 1424 | '@ampproject/remapping@2.3.0': 1425 | dependencies: 1426 | '@jridgewell/gen-mapping': 0.3.12 1427 | '@jridgewell/trace-mapping': 0.3.29 1428 | 1429 | '@babel/helper-string-parser@7.27.1': {} 1430 | 1431 | '@babel/helper-validator-identifier@7.27.1': {} 1432 | 1433 | '@babel/parser@7.28.0': 1434 | dependencies: 1435 | '@babel/types': 7.28.0 1436 | 1437 | '@babel/types@7.28.0': 1438 | dependencies: 1439 | '@babel/helper-string-parser': 7.27.1 1440 | '@babel/helper-validator-identifier': 7.27.1 1441 | 1442 | '@esbuild/aix-ppc64@0.25.6': 1443 | optional: true 1444 | 1445 | '@esbuild/android-arm64@0.25.6': 1446 | optional: true 1447 | 1448 | '@esbuild/android-arm@0.25.6': 1449 | optional: true 1450 | 1451 | '@esbuild/android-x64@0.25.6': 1452 | optional: true 1453 | 1454 | '@esbuild/darwin-arm64@0.25.6': 1455 | optional: true 1456 | 1457 | '@esbuild/darwin-x64@0.25.6': 1458 | optional: true 1459 | 1460 | '@esbuild/freebsd-arm64@0.25.6': 1461 | optional: true 1462 | 1463 | '@esbuild/freebsd-x64@0.25.6': 1464 | optional: true 1465 | 1466 | '@esbuild/linux-arm64@0.25.6': 1467 | optional: true 1468 | 1469 | '@esbuild/linux-arm@0.25.6': 1470 | optional: true 1471 | 1472 | '@esbuild/linux-ia32@0.25.6': 1473 | optional: true 1474 | 1475 | '@esbuild/linux-loong64@0.25.6': 1476 | optional: true 1477 | 1478 | '@esbuild/linux-mips64el@0.25.6': 1479 | optional: true 1480 | 1481 | '@esbuild/linux-ppc64@0.25.6': 1482 | optional: true 1483 | 1484 | '@esbuild/linux-riscv64@0.25.6': 1485 | optional: true 1486 | 1487 | '@esbuild/linux-s390x@0.25.6': 1488 | optional: true 1489 | 1490 | '@esbuild/linux-x64@0.25.6': 1491 | optional: true 1492 | 1493 | '@esbuild/netbsd-arm64@0.25.6': 1494 | optional: true 1495 | 1496 | '@esbuild/netbsd-x64@0.25.6': 1497 | optional: true 1498 | 1499 | '@esbuild/openbsd-arm64@0.25.6': 1500 | optional: true 1501 | 1502 | '@esbuild/openbsd-x64@0.25.6': 1503 | optional: true 1504 | 1505 | '@esbuild/openharmony-arm64@0.25.6': 1506 | optional: true 1507 | 1508 | '@esbuild/sunos-x64@0.25.6': 1509 | optional: true 1510 | 1511 | '@esbuild/win32-arm64@0.25.6': 1512 | optional: true 1513 | 1514 | '@esbuild/win32-ia32@0.25.6': 1515 | optional: true 1516 | 1517 | '@esbuild/win32-x64@0.25.6': 1518 | optional: true 1519 | 1520 | '@isaacs/fs-minipass@4.0.1': 1521 | dependencies: 1522 | minipass: 7.1.2 1523 | 1524 | '@jridgewell/gen-mapping@0.3.12': 1525 | dependencies: 1526 | '@jridgewell/sourcemap-codec': 1.5.4 1527 | '@jridgewell/trace-mapping': 0.3.29 1528 | 1529 | '@jridgewell/resolve-uri@3.1.2': {} 1530 | 1531 | '@jridgewell/sourcemap-codec@1.5.4': {} 1532 | 1533 | '@jridgewell/trace-mapping@0.3.29': 1534 | dependencies: 1535 | '@jridgewell/resolve-uri': 3.1.2 1536 | '@jridgewell/sourcemap-codec': 1.5.4 1537 | 1538 | '@rollup/rollup-android-arm-eabi@4.44.2': 1539 | optional: true 1540 | 1541 | '@rollup/rollup-android-arm64@4.44.2': 1542 | optional: true 1543 | 1544 | '@rollup/rollup-darwin-arm64@4.44.2': 1545 | optional: true 1546 | 1547 | '@rollup/rollup-darwin-x64@4.44.2': 1548 | optional: true 1549 | 1550 | '@rollup/rollup-freebsd-arm64@4.44.2': 1551 | optional: true 1552 | 1553 | '@rollup/rollup-freebsd-x64@4.44.2': 1554 | optional: true 1555 | 1556 | '@rollup/rollup-linux-arm-gnueabihf@4.44.2': 1557 | optional: true 1558 | 1559 | '@rollup/rollup-linux-arm-musleabihf@4.44.2': 1560 | optional: true 1561 | 1562 | '@rollup/rollup-linux-arm64-gnu@4.44.2': 1563 | optional: true 1564 | 1565 | '@rollup/rollup-linux-arm64-musl@4.44.2': 1566 | optional: true 1567 | 1568 | '@rollup/rollup-linux-loongarch64-gnu@4.44.2': 1569 | optional: true 1570 | 1571 | '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': 1572 | optional: true 1573 | 1574 | '@rollup/rollup-linux-riscv64-gnu@4.44.2': 1575 | optional: true 1576 | 1577 | '@rollup/rollup-linux-riscv64-musl@4.44.2': 1578 | optional: true 1579 | 1580 | '@rollup/rollup-linux-s390x-gnu@4.44.2': 1581 | optional: true 1582 | 1583 | '@rollup/rollup-linux-x64-gnu@4.44.2': 1584 | optional: true 1585 | 1586 | '@rollup/rollup-linux-x64-musl@4.44.2': 1587 | optional: true 1588 | 1589 | '@rollup/rollup-win32-arm64-msvc@4.44.2': 1590 | optional: true 1591 | 1592 | '@rollup/rollup-win32-ia32-msvc@4.44.2': 1593 | optional: true 1594 | 1595 | '@rollup/rollup-win32-x64-msvc@4.44.2': 1596 | optional: true 1597 | 1598 | '@shikijs/core@3.7.0': 1599 | dependencies: 1600 | '@shikijs/types': 3.7.0 1601 | '@shikijs/vscode-textmate': 10.0.2 1602 | '@types/hast': 3.0.4 1603 | hast-util-to-html: 9.0.5 1604 | 1605 | '@shikijs/engine-javascript@3.7.0': 1606 | dependencies: 1607 | '@shikijs/types': 3.7.0 1608 | '@shikijs/vscode-textmate': 10.0.2 1609 | oniguruma-to-es: 4.3.3 1610 | 1611 | '@shikijs/engine-oniguruma@3.7.0': 1612 | dependencies: 1613 | '@shikijs/types': 3.7.0 1614 | '@shikijs/vscode-textmate': 10.0.2 1615 | 1616 | '@shikijs/langs@3.7.0': 1617 | dependencies: 1618 | '@shikijs/types': 3.7.0 1619 | 1620 | '@shikijs/themes@3.7.0': 1621 | dependencies: 1622 | '@shikijs/types': 3.7.0 1623 | 1624 | '@shikijs/types@3.7.0': 1625 | dependencies: 1626 | '@shikijs/vscode-textmate': 10.0.2 1627 | '@types/hast': 3.0.4 1628 | 1629 | '@shikijs/vscode-textmate@10.0.2': {} 1630 | 1631 | '@tailwindcss/node@4.1.11': 1632 | dependencies: 1633 | '@ampproject/remapping': 2.3.0 1634 | enhanced-resolve: 5.18.2 1635 | jiti: 2.4.2 1636 | lightningcss: 1.30.1 1637 | magic-string: 0.30.17 1638 | source-map-js: 1.2.1 1639 | tailwindcss: 4.1.11 1640 | 1641 | '@tailwindcss/oxide-android-arm64@4.1.11': 1642 | optional: true 1643 | 1644 | '@tailwindcss/oxide-darwin-arm64@4.1.11': 1645 | optional: true 1646 | 1647 | '@tailwindcss/oxide-darwin-x64@4.1.11': 1648 | optional: true 1649 | 1650 | '@tailwindcss/oxide-freebsd-x64@4.1.11': 1651 | optional: true 1652 | 1653 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': 1654 | optional: true 1655 | 1656 | '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': 1657 | optional: true 1658 | 1659 | '@tailwindcss/oxide-linux-arm64-musl@4.1.11': 1660 | optional: true 1661 | 1662 | '@tailwindcss/oxide-linux-x64-gnu@4.1.11': 1663 | optional: true 1664 | 1665 | '@tailwindcss/oxide-linux-x64-musl@4.1.11': 1666 | optional: true 1667 | 1668 | '@tailwindcss/oxide-wasm32-wasi@4.1.11': 1669 | optional: true 1670 | 1671 | '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': 1672 | optional: true 1673 | 1674 | '@tailwindcss/oxide-win32-x64-msvc@4.1.11': 1675 | optional: true 1676 | 1677 | '@tailwindcss/oxide@4.1.11': 1678 | dependencies: 1679 | detect-libc: 2.0.4 1680 | tar: 7.4.3 1681 | optionalDependencies: 1682 | '@tailwindcss/oxide-android-arm64': 4.1.11 1683 | '@tailwindcss/oxide-darwin-arm64': 4.1.11 1684 | '@tailwindcss/oxide-darwin-x64': 4.1.11 1685 | '@tailwindcss/oxide-freebsd-x64': 4.1.11 1686 | '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 1687 | '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 1688 | '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 1689 | '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 1690 | '@tailwindcss/oxide-linux-x64-musl': 4.1.11 1691 | '@tailwindcss/oxide-wasm32-wasi': 4.1.11 1692 | '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 1693 | '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 1694 | 1695 | '@tailwindcss/typography@0.5.16(tailwindcss@4.1.11)': 1696 | dependencies: 1697 | lodash.castarray: 4.4.0 1698 | lodash.isplainobject: 4.0.6 1699 | lodash.merge: 4.6.2 1700 | postcss-selector-parser: 6.0.10 1701 | tailwindcss: 4.1.11 1702 | 1703 | '@tailwindcss/vite@4.1.11(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1))': 1704 | dependencies: 1705 | '@tailwindcss/node': 4.1.11 1706 | '@tailwindcss/oxide': 4.1.11 1707 | tailwindcss: 4.1.11 1708 | vite: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) 1709 | 1710 | '@types/chai@5.2.2': 1711 | dependencies: 1712 | '@types/deep-eql': 4.0.2 1713 | 1714 | '@types/debug@4.1.12': 1715 | dependencies: 1716 | '@types/ms': 2.1.0 1717 | 1718 | '@types/deep-eql@4.0.2': {} 1719 | 1720 | '@types/estree-jsx@1.0.5': 1721 | dependencies: 1722 | '@types/estree': 1.0.8 1723 | 1724 | '@types/estree@1.0.8': {} 1725 | 1726 | '@types/hast@3.0.4': 1727 | dependencies: 1728 | '@types/unist': 3.0.3 1729 | 1730 | '@types/katex@0.16.7': {} 1731 | 1732 | '@types/mdast@4.0.4': 1733 | dependencies: 1734 | '@types/unist': 3.0.3 1735 | 1736 | '@types/ms@2.1.0': {} 1737 | 1738 | '@types/unist@2.0.11': {} 1739 | 1740 | '@types/unist@3.0.3': {} 1741 | 1742 | '@ungap/structured-clone@1.3.0': {} 1743 | 1744 | '@vitejs/plugin-vue@5.2.4(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1))(vue@3.5.17(typescript@5.8.3))': 1745 | dependencies: 1746 | vite: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) 1747 | vue: 3.5.17(typescript@5.8.3) 1748 | 1749 | '@vitest/expect@3.2.4': 1750 | dependencies: 1751 | '@types/chai': 5.2.2 1752 | '@vitest/spy': 3.2.4 1753 | '@vitest/utils': 3.2.4 1754 | chai: 5.2.1 1755 | tinyrainbow: 2.0.0 1756 | 1757 | '@vitest/mocker@3.2.4(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1))': 1758 | dependencies: 1759 | '@vitest/spy': 3.2.4 1760 | estree-walker: 3.0.3 1761 | magic-string: 0.30.17 1762 | optionalDependencies: 1763 | vite: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) 1764 | 1765 | '@vitest/pretty-format@3.2.4': 1766 | dependencies: 1767 | tinyrainbow: 2.0.0 1768 | 1769 | '@vitest/runner@3.2.4': 1770 | dependencies: 1771 | '@vitest/utils': 3.2.4 1772 | pathe: 2.0.3 1773 | strip-literal: 3.0.0 1774 | 1775 | '@vitest/snapshot@3.2.4': 1776 | dependencies: 1777 | '@vitest/pretty-format': 3.2.4 1778 | magic-string: 0.30.17 1779 | pathe: 2.0.3 1780 | 1781 | '@vitest/spy@3.2.4': 1782 | dependencies: 1783 | tinyspy: 4.0.3 1784 | 1785 | '@vitest/utils@3.2.4': 1786 | dependencies: 1787 | '@vitest/pretty-format': 3.2.4 1788 | loupe: 3.1.4 1789 | tinyrainbow: 2.0.0 1790 | 1791 | '@vue/compiler-core@3.5.17': 1792 | dependencies: 1793 | '@babel/parser': 7.28.0 1794 | '@vue/shared': 3.5.17 1795 | entities: 4.5.0 1796 | estree-walker: 2.0.2 1797 | source-map-js: 1.2.1 1798 | 1799 | '@vue/compiler-dom@3.5.17': 1800 | dependencies: 1801 | '@vue/compiler-core': 3.5.17 1802 | '@vue/shared': 3.5.17 1803 | 1804 | '@vue/compiler-sfc@3.5.17': 1805 | dependencies: 1806 | '@babel/parser': 7.28.0 1807 | '@vue/compiler-core': 3.5.17 1808 | '@vue/compiler-dom': 3.5.17 1809 | '@vue/compiler-ssr': 3.5.17 1810 | '@vue/shared': 3.5.17 1811 | estree-walker: 2.0.2 1812 | magic-string: 0.30.17 1813 | postcss: 8.5.6 1814 | source-map-js: 1.2.1 1815 | 1816 | '@vue/compiler-ssr@3.5.17': 1817 | dependencies: 1818 | '@vue/compiler-dom': 3.5.17 1819 | '@vue/shared': 3.5.17 1820 | 1821 | '@vue/reactivity@3.5.17': 1822 | dependencies: 1823 | '@vue/shared': 3.5.17 1824 | 1825 | '@vue/runtime-core@3.5.17': 1826 | dependencies: 1827 | '@vue/reactivity': 3.5.17 1828 | '@vue/shared': 3.5.17 1829 | 1830 | '@vue/runtime-dom@3.5.17': 1831 | dependencies: 1832 | '@vue/reactivity': 3.5.17 1833 | '@vue/runtime-core': 3.5.17 1834 | '@vue/shared': 3.5.17 1835 | csstype: 3.1.3 1836 | 1837 | '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))': 1838 | dependencies: 1839 | '@vue/compiler-ssr': 3.5.17 1840 | '@vue/shared': 3.5.17 1841 | vue: 3.5.17(typescript@5.8.3) 1842 | 1843 | '@vue/shared@3.5.17': {} 1844 | 1845 | assertion-error@2.0.1: {} 1846 | 1847 | bail@2.0.2: {} 1848 | 1849 | cac@6.7.14: {} 1850 | 1851 | ccount@2.0.1: {} 1852 | 1853 | chai@5.2.1: 1854 | dependencies: 1855 | assertion-error: 2.0.1 1856 | check-error: 2.1.1 1857 | deep-eql: 5.0.2 1858 | loupe: 3.1.4 1859 | pathval: 2.0.1 1860 | 1861 | character-entities-html4@2.1.0: {} 1862 | 1863 | character-entities-legacy@3.0.0: {} 1864 | 1865 | character-entities@2.0.2: {} 1866 | 1867 | character-reference-invalid@2.0.1: {} 1868 | 1869 | check-error@2.1.1: {} 1870 | 1871 | chownr@3.0.0: {} 1872 | 1873 | comma-separated-tokens@2.0.3: {} 1874 | 1875 | commander@8.3.0: {} 1876 | 1877 | cssesc@3.0.0: {} 1878 | 1879 | csstype@3.1.3: {} 1880 | 1881 | debug@4.4.1: 1882 | dependencies: 1883 | ms: 2.1.3 1884 | 1885 | decode-named-character-reference@1.2.0: 1886 | dependencies: 1887 | character-entities: 2.0.2 1888 | 1889 | deep-eql@5.0.2: {} 1890 | 1891 | dequal@2.0.3: {} 1892 | 1893 | detect-libc@2.0.4: {} 1894 | 1895 | devlop@1.1.0: 1896 | dependencies: 1897 | dequal: 2.0.3 1898 | 1899 | echarts@5.6.0: 1900 | dependencies: 1901 | tslib: 2.3.0 1902 | zrender: 5.6.1 1903 | 1904 | enhanced-resolve@5.18.2: 1905 | dependencies: 1906 | graceful-fs: 4.2.11 1907 | tapable: 2.2.2 1908 | 1909 | entities@4.5.0: {} 1910 | 1911 | entities@6.0.1: {} 1912 | 1913 | es-module-lexer@1.7.0: {} 1914 | 1915 | esbuild@0.25.6: 1916 | optionalDependencies: 1917 | '@esbuild/aix-ppc64': 0.25.6 1918 | '@esbuild/android-arm': 0.25.6 1919 | '@esbuild/android-arm64': 0.25.6 1920 | '@esbuild/android-x64': 0.25.6 1921 | '@esbuild/darwin-arm64': 0.25.6 1922 | '@esbuild/darwin-x64': 0.25.6 1923 | '@esbuild/freebsd-arm64': 0.25.6 1924 | '@esbuild/freebsd-x64': 0.25.6 1925 | '@esbuild/linux-arm': 0.25.6 1926 | '@esbuild/linux-arm64': 0.25.6 1927 | '@esbuild/linux-ia32': 0.25.6 1928 | '@esbuild/linux-loong64': 0.25.6 1929 | '@esbuild/linux-mips64el': 0.25.6 1930 | '@esbuild/linux-ppc64': 0.25.6 1931 | '@esbuild/linux-riscv64': 0.25.6 1932 | '@esbuild/linux-s390x': 0.25.6 1933 | '@esbuild/linux-x64': 0.25.6 1934 | '@esbuild/netbsd-arm64': 0.25.6 1935 | '@esbuild/netbsd-x64': 0.25.6 1936 | '@esbuild/openbsd-arm64': 0.25.6 1937 | '@esbuild/openbsd-x64': 0.25.6 1938 | '@esbuild/openharmony-arm64': 0.25.6 1939 | '@esbuild/sunos-x64': 0.25.6 1940 | '@esbuild/win32-arm64': 0.25.6 1941 | '@esbuild/win32-ia32': 0.25.6 1942 | '@esbuild/win32-x64': 0.25.6 1943 | 1944 | escape-string-regexp@5.0.0: {} 1945 | 1946 | estree-util-is-identifier-name@3.0.0: {} 1947 | 1948 | estree-walker@2.0.2: {} 1949 | 1950 | estree-walker@3.0.3: 1951 | dependencies: 1952 | '@types/estree': 1.0.8 1953 | 1954 | expect-type@1.2.2: {} 1955 | 1956 | extend@3.0.2: {} 1957 | 1958 | fdir@6.4.6(picomatch@4.0.2): 1959 | optionalDependencies: 1960 | picomatch: 4.0.2 1961 | 1962 | fsevents@2.3.3: 1963 | optional: true 1964 | 1965 | graceful-fs@4.2.11: {} 1966 | 1967 | grapheme-splitter@1.0.4: {} 1968 | 1969 | hast-util-from-dom@5.0.1: 1970 | dependencies: 1971 | '@types/hast': 3.0.4 1972 | hastscript: 9.0.1 1973 | web-namespaces: 2.0.1 1974 | 1975 | hast-util-from-html-isomorphic@2.0.0: 1976 | dependencies: 1977 | '@types/hast': 3.0.4 1978 | hast-util-from-dom: 5.0.1 1979 | hast-util-from-html: 2.0.3 1980 | unist-util-remove-position: 5.0.0 1981 | 1982 | hast-util-from-html@2.0.3: 1983 | dependencies: 1984 | '@types/hast': 3.0.4 1985 | devlop: 1.1.0 1986 | hast-util-from-parse5: 8.0.3 1987 | parse5: 7.3.0 1988 | vfile: 6.0.3 1989 | vfile-message: 4.0.2 1990 | 1991 | hast-util-from-parse5@8.0.3: 1992 | dependencies: 1993 | '@types/hast': 3.0.4 1994 | '@types/unist': 3.0.3 1995 | devlop: 1.1.0 1996 | hastscript: 9.0.1 1997 | property-information: 7.1.0 1998 | vfile: 6.0.3 1999 | vfile-location: 5.0.3 2000 | web-namespaces: 2.0.1 2001 | 2002 | hast-util-is-element@3.0.0: 2003 | dependencies: 2004 | '@types/hast': 3.0.4 2005 | 2006 | hast-util-parse-selector@4.0.0: 2007 | dependencies: 2008 | '@types/hast': 3.0.4 2009 | 2010 | hast-util-to-html@9.0.5: 2011 | dependencies: 2012 | '@types/hast': 3.0.4 2013 | '@types/unist': 3.0.3 2014 | ccount: 2.0.1 2015 | comma-separated-tokens: 2.0.3 2016 | hast-util-whitespace: 3.0.0 2017 | html-void-elements: 3.0.0 2018 | mdast-util-to-hast: 13.2.0 2019 | property-information: 7.1.0 2020 | space-separated-tokens: 2.0.2 2021 | stringify-entities: 4.0.4 2022 | zwitch: 2.0.4 2023 | 2024 | hast-util-to-jsx-runtime@2.3.6: 2025 | dependencies: 2026 | '@types/estree': 1.0.8 2027 | '@types/hast': 3.0.4 2028 | '@types/unist': 3.0.3 2029 | comma-separated-tokens: 2.0.3 2030 | devlop: 1.1.0 2031 | estree-util-is-identifier-name: 3.0.0 2032 | hast-util-whitespace: 3.0.0 2033 | mdast-util-mdx-expression: 2.0.1 2034 | mdast-util-mdx-jsx: 3.2.0 2035 | mdast-util-mdxjs-esm: 2.0.1 2036 | property-information: 7.1.0 2037 | space-separated-tokens: 2.0.2 2038 | style-to-js: 1.1.17 2039 | unist-util-position: 5.0.0 2040 | vfile-message: 4.0.2 2041 | transitivePeerDependencies: 2042 | - supports-color 2043 | 2044 | hast-util-to-text@4.0.2: 2045 | dependencies: 2046 | '@types/hast': 3.0.4 2047 | '@types/unist': 3.0.3 2048 | hast-util-is-element: 3.0.0 2049 | unist-util-find-after: 5.0.0 2050 | 2051 | hast-util-whitespace@3.0.0: 2052 | dependencies: 2053 | '@types/hast': 3.0.4 2054 | 2055 | hastscript@9.0.1: 2056 | dependencies: 2057 | '@types/hast': 3.0.4 2058 | comma-separated-tokens: 2.0.3 2059 | hast-util-parse-selector: 4.0.0 2060 | property-information: 7.1.0 2061 | space-separated-tokens: 2.0.2 2062 | 2063 | html-void-elements@3.0.0: {} 2064 | 2065 | inline-style-parser@0.2.4: {} 2066 | 2067 | is-alphabetical@2.0.1: {} 2068 | 2069 | is-alphanumerical@2.0.1: 2070 | dependencies: 2071 | is-alphabetical: 2.0.1 2072 | is-decimal: 2.0.1 2073 | 2074 | is-decimal@2.0.1: {} 2075 | 2076 | is-hexadecimal@2.0.1: {} 2077 | 2078 | is-plain-obj@4.1.0: {} 2079 | 2080 | jiti@2.4.2: {} 2081 | 2082 | js-tokens@9.0.1: {} 2083 | 2084 | katex@0.16.22: 2085 | dependencies: 2086 | commander: 8.3.0 2087 | 2088 | lightningcss-darwin-arm64@1.30.1: 2089 | optional: true 2090 | 2091 | lightningcss-darwin-x64@1.30.1: 2092 | optional: true 2093 | 2094 | lightningcss-freebsd-x64@1.30.1: 2095 | optional: true 2096 | 2097 | lightningcss-linux-arm-gnueabihf@1.30.1: 2098 | optional: true 2099 | 2100 | lightningcss-linux-arm64-gnu@1.30.1: 2101 | optional: true 2102 | 2103 | lightningcss-linux-arm64-musl@1.30.1: 2104 | optional: true 2105 | 2106 | lightningcss-linux-x64-gnu@1.30.1: 2107 | optional: true 2108 | 2109 | lightningcss-linux-x64-musl@1.30.1: 2110 | optional: true 2111 | 2112 | lightningcss-win32-arm64-msvc@1.30.1: 2113 | optional: true 2114 | 2115 | lightningcss-win32-x64-msvc@1.30.1: 2116 | optional: true 2117 | 2118 | lightningcss@1.30.1: 2119 | dependencies: 2120 | detect-libc: 2.0.4 2121 | optionalDependencies: 2122 | lightningcss-darwin-arm64: 1.30.1 2123 | lightningcss-darwin-x64: 1.30.1 2124 | lightningcss-freebsd-x64: 1.30.1 2125 | lightningcss-linux-arm-gnueabihf: 1.30.1 2126 | lightningcss-linux-arm64-gnu: 1.30.1 2127 | lightningcss-linux-arm64-musl: 1.30.1 2128 | lightningcss-linux-x64-gnu: 1.30.1 2129 | lightningcss-linux-x64-musl: 1.30.1 2130 | lightningcss-win32-arm64-msvc: 1.30.1 2131 | lightningcss-win32-x64-msvc: 1.30.1 2132 | 2133 | lodash.castarray@4.4.0: {} 2134 | 2135 | lodash.isplainobject@4.0.6: {} 2136 | 2137 | lodash.merge@4.6.2: {} 2138 | 2139 | longest-streak@3.1.0: {} 2140 | 2141 | loupe@3.1.4: {} 2142 | 2143 | magic-string@0.30.17: 2144 | dependencies: 2145 | '@jridgewell/sourcemap-codec': 1.5.4 2146 | 2147 | markdown-table@3.0.4: {} 2148 | 2149 | mdast-util-find-and-replace@3.0.2: 2150 | dependencies: 2151 | '@types/mdast': 4.0.4 2152 | escape-string-regexp: 5.0.0 2153 | unist-util-is: 6.0.0 2154 | unist-util-visit-parents: 6.0.1 2155 | 2156 | mdast-util-from-markdown@2.0.2: 2157 | dependencies: 2158 | '@types/mdast': 4.0.4 2159 | '@types/unist': 3.0.3 2160 | decode-named-character-reference: 1.2.0 2161 | devlop: 1.1.0 2162 | mdast-util-to-string: 4.0.0 2163 | micromark: 4.0.2 2164 | micromark-util-decode-numeric-character-reference: 2.0.2 2165 | micromark-util-decode-string: 2.0.1 2166 | micromark-util-normalize-identifier: 2.0.1 2167 | micromark-util-symbol: 2.0.1 2168 | micromark-util-types: 2.0.2 2169 | unist-util-stringify-position: 4.0.0 2170 | transitivePeerDependencies: 2171 | - supports-color 2172 | 2173 | mdast-util-gfm-autolink-literal@2.0.1: 2174 | dependencies: 2175 | '@types/mdast': 4.0.4 2176 | ccount: 2.0.1 2177 | devlop: 1.1.0 2178 | mdast-util-find-and-replace: 3.0.2 2179 | micromark-util-character: 2.1.1 2180 | 2181 | mdast-util-gfm-footnote@2.1.0: 2182 | dependencies: 2183 | '@types/mdast': 4.0.4 2184 | devlop: 1.1.0 2185 | mdast-util-from-markdown: 2.0.2 2186 | mdast-util-to-markdown: 2.1.2 2187 | micromark-util-normalize-identifier: 2.0.1 2188 | transitivePeerDependencies: 2189 | - supports-color 2190 | 2191 | mdast-util-gfm-strikethrough@2.0.0: 2192 | dependencies: 2193 | '@types/mdast': 4.0.4 2194 | mdast-util-from-markdown: 2.0.2 2195 | mdast-util-to-markdown: 2.1.2 2196 | transitivePeerDependencies: 2197 | - supports-color 2198 | 2199 | mdast-util-gfm-table@2.0.0: 2200 | dependencies: 2201 | '@types/mdast': 4.0.4 2202 | devlop: 1.1.0 2203 | markdown-table: 3.0.4 2204 | mdast-util-from-markdown: 2.0.2 2205 | mdast-util-to-markdown: 2.1.2 2206 | transitivePeerDependencies: 2207 | - supports-color 2208 | 2209 | mdast-util-gfm-task-list-item@2.0.0: 2210 | dependencies: 2211 | '@types/mdast': 4.0.4 2212 | devlop: 1.1.0 2213 | mdast-util-from-markdown: 2.0.2 2214 | mdast-util-to-markdown: 2.1.2 2215 | transitivePeerDependencies: 2216 | - supports-color 2217 | 2218 | mdast-util-gfm@3.1.0: 2219 | dependencies: 2220 | mdast-util-from-markdown: 2.0.2 2221 | mdast-util-gfm-autolink-literal: 2.0.1 2222 | mdast-util-gfm-footnote: 2.1.0 2223 | mdast-util-gfm-strikethrough: 2.0.0 2224 | mdast-util-gfm-table: 2.0.0 2225 | mdast-util-gfm-task-list-item: 2.0.0 2226 | mdast-util-to-markdown: 2.1.2 2227 | transitivePeerDependencies: 2228 | - supports-color 2229 | 2230 | mdast-util-math@3.0.0: 2231 | dependencies: 2232 | '@types/hast': 3.0.4 2233 | '@types/mdast': 4.0.4 2234 | devlop: 1.1.0 2235 | longest-streak: 3.1.0 2236 | mdast-util-from-markdown: 2.0.2 2237 | mdast-util-to-markdown: 2.1.2 2238 | unist-util-remove-position: 5.0.0 2239 | transitivePeerDependencies: 2240 | - supports-color 2241 | 2242 | mdast-util-mdx-expression@2.0.1: 2243 | dependencies: 2244 | '@types/estree-jsx': 1.0.5 2245 | '@types/hast': 3.0.4 2246 | '@types/mdast': 4.0.4 2247 | devlop: 1.1.0 2248 | mdast-util-from-markdown: 2.0.2 2249 | mdast-util-to-markdown: 2.1.2 2250 | transitivePeerDependencies: 2251 | - supports-color 2252 | 2253 | mdast-util-mdx-jsx@3.2.0: 2254 | dependencies: 2255 | '@types/estree-jsx': 1.0.5 2256 | '@types/hast': 3.0.4 2257 | '@types/mdast': 4.0.4 2258 | '@types/unist': 3.0.3 2259 | ccount: 2.0.1 2260 | devlop: 1.1.0 2261 | mdast-util-from-markdown: 2.0.2 2262 | mdast-util-to-markdown: 2.1.2 2263 | parse-entities: 4.0.2 2264 | stringify-entities: 4.0.4 2265 | unist-util-stringify-position: 4.0.0 2266 | vfile-message: 4.0.2 2267 | transitivePeerDependencies: 2268 | - supports-color 2269 | 2270 | mdast-util-mdxjs-esm@2.0.1: 2271 | dependencies: 2272 | '@types/estree-jsx': 1.0.5 2273 | '@types/hast': 3.0.4 2274 | '@types/mdast': 4.0.4 2275 | devlop: 1.1.0 2276 | mdast-util-from-markdown: 2.0.2 2277 | mdast-util-to-markdown: 2.1.2 2278 | transitivePeerDependencies: 2279 | - supports-color 2280 | 2281 | mdast-util-phrasing@4.1.0: 2282 | dependencies: 2283 | '@types/mdast': 4.0.4 2284 | unist-util-is: 6.0.0 2285 | 2286 | mdast-util-to-hast@13.2.0: 2287 | dependencies: 2288 | '@types/hast': 3.0.4 2289 | '@types/mdast': 4.0.4 2290 | '@ungap/structured-clone': 1.3.0 2291 | devlop: 1.1.0 2292 | micromark-util-sanitize-uri: 2.0.1 2293 | trim-lines: 3.0.1 2294 | unist-util-position: 5.0.0 2295 | unist-util-visit: 5.0.0 2296 | vfile: 6.0.3 2297 | 2298 | mdast-util-to-markdown@2.1.2: 2299 | dependencies: 2300 | '@types/mdast': 4.0.4 2301 | '@types/unist': 3.0.3 2302 | longest-streak: 3.1.0 2303 | mdast-util-phrasing: 4.1.0 2304 | mdast-util-to-string: 4.0.0 2305 | micromark-util-classify-character: 2.0.1 2306 | micromark-util-decode-string: 2.0.1 2307 | unist-util-visit: 5.0.0 2308 | zwitch: 2.0.4 2309 | 2310 | mdast-util-to-string@4.0.0: 2311 | dependencies: 2312 | '@types/mdast': 4.0.4 2313 | 2314 | micromark-core-commonmark@2.0.3: 2315 | dependencies: 2316 | decode-named-character-reference: 1.2.0 2317 | devlop: 1.1.0 2318 | micromark-factory-destination: 2.0.1 2319 | micromark-factory-label: 2.0.1 2320 | micromark-factory-space: 2.0.1 2321 | micromark-factory-title: 2.0.1 2322 | micromark-factory-whitespace: 2.0.1 2323 | micromark-util-character: 2.1.1 2324 | micromark-util-chunked: 2.0.1 2325 | micromark-util-classify-character: 2.0.1 2326 | micromark-util-html-tag-name: 2.0.1 2327 | micromark-util-normalize-identifier: 2.0.1 2328 | micromark-util-resolve-all: 2.0.1 2329 | micromark-util-subtokenize: 2.1.0 2330 | micromark-util-symbol: 2.0.1 2331 | micromark-util-types: 2.0.2 2332 | 2333 | micromark-extension-gfm-autolink-literal@2.1.0: 2334 | dependencies: 2335 | micromark-util-character: 2.1.1 2336 | micromark-util-sanitize-uri: 2.0.1 2337 | micromark-util-symbol: 2.0.1 2338 | micromark-util-types: 2.0.2 2339 | 2340 | micromark-extension-gfm-footnote@2.1.0: 2341 | dependencies: 2342 | devlop: 1.1.0 2343 | micromark-core-commonmark: 2.0.3 2344 | micromark-factory-space: 2.0.1 2345 | micromark-util-character: 2.1.1 2346 | micromark-util-normalize-identifier: 2.0.1 2347 | micromark-util-sanitize-uri: 2.0.1 2348 | micromark-util-symbol: 2.0.1 2349 | micromark-util-types: 2.0.2 2350 | 2351 | micromark-extension-gfm-strikethrough@2.1.0: 2352 | dependencies: 2353 | devlop: 1.1.0 2354 | micromark-util-chunked: 2.0.1 2355 | micromark-util-classify-character: 2.0.1 2356 | micromark-util-resolve-all: 2.0.1 2357 | micromark-util-symbol: 2.0.1 2358 | micromark-util-types: 2.0.2 2359 | 2360 | micromark-extension-gfm-table@2.1.1: 2361 | dependencies: 2362 | devlop: 1.1.0 2363 | micromark-factory-space: 2.0.1 2364 | micromark-util-character: 2.1.1 2365 | micromark-util-symbol: 2.0.1 2366 | micromark-util-types: 2.0.2 2367 | 2368 | micromark-extension-gfm-tagfilter@2.0.0: 2369 | dependencies: 2370 | micromark-util-types: 2.0.2 2371 | 2372 | micromark-extension-gfm-task-list-item@2.1.0: 2373 | dependencies: 2374 | devlop: 1.1.0 2375 | micromark-factory-space: 2.0.1 2376 | micromark-util-character: 2.1.1 2377 | micromark-util-symbol: 2.0.1 2378 | micromark-util-types: 2.0.2 2379 | 2380 | micromark-extension-gfm@3.0.0: 2381 | dependencies: 2382 | micromark-extension-gfm-autolink-literal: 2.1.0 2383 | micromark-extension-gfm-footnote: 2.1.0 2384 | micromark-extension-gfm-strikethrough: 2.1.0 2385 | micromark-extension-gfm-table: 2.1.1 2386 | micromark-extension-gfm-tagfilter: 2.0.0 2387 | micromark-extension-gfm-task-list-item: 2.1.0 2388 | micromark-util-combine-extensions: 2.0.1 2389 | micromark-util-types: 2.0.2 2390 | 2391 | micromark-extension-math@3.1.0: 2392 | dependencies: 2393 | '@types/katex': 0.16.7 2394 | devlop: 1.1.0 2395 | katex: 0.16.22 2396 | micromark-factory-space: 2.0.1 2397 | micromark-util-character: 2.1.1 2398 | micromark-util-symbol: 2.0.1 2399 | micromark-util-types: 2.0.2 2400 | 2401 | micromark-factory-destination@2.0.1: 2402 | dependencies: 2403 | micromark-util-character: 2.1.1 2404 | micromark-util-symbol: 2.0.1 2405 | micromark-util-types: 2.0.2 2406 | 2407 | micromark-factory-label@2.0.1: 2408 | dependencies: 2409 | devlop: 1.1.0 2410 | micromark-util-character: 2.1.1 2411 | micromark-util-symbol: 2.0.1 2412 | micromark-util-types: 2.0.2 2413 | 2414 | micromark-factory-space@2.0.1: 2415 | dependencies: 2416 | micromark-util-character: 2.1.1 2417 | micromark-util-types: 2.0.2 2418 | 2419 | micromark-factory-title@2.0.1: 2420 | dependencies: 2421 | micromark-factory-space: 2.0.1 2422 | micromark-util-character: 2.1.1 2423 | micromark-util-symbol: 2.0.1 2424 | micromark-util-types: 2.0.2 2425 | 2426 | micromark-factory-whitespace@2.0.1: 2427 | dependencies: 2428 | micromark-factory-space: 2.0.1 2429 | micromark-util-character: 2.1.1 2430 | micromark-util-symbol: 2.0.1 2431 | micromark-util-types: 2.0.2 2432 | 2433 | micromark-util-character@2.1.1: 2434 | dependencies: 2435 | micromark-util-symbol: 2.0.1 2436 | micromark-util-types: 2.0.2 2437 | 2438 | micromark-util-chunked@2.0.1: 2439 | dependencies: 2440 | micromark-util-symbol: 2.0.1 2441 | 2442 | micromark-util-classify-character@2.0.1: 2443 | dependencies: 2444 | micromark-util-character: 2.1.1 2445 | micromark-util-symbol: 2.0.1 2446 | micromark-util-types: 2.0.2 2447 | 2448 | micromark-util-combine-extensions@2.0.1: 2449 | dependencies: 2450 | micromark-util-chunked: 2.0.1 2451 | micromark-util-types: 2.0.2 2452 | 2453 | micromark-util-decode-numeric-character-reference@2.0.2: 2454 | dependencies: 2455 | micromark-util-symbol: 2.0.1 2456 | 2457 | micromark-util-decode-string@2.0.1: 2458 | dependencies: 2459 | decode-named-character-reference: 1.2.0 2460 | micromark-util-character: 2.1.1 2461 | micromark-util-decode-numeric-character-reference: 2.0.2 2462 | micromark-util-symbol: 2.0.1 2463 | 2464 | micromark-util-encode@2.0.1: {} 2465 | 2466 | micromark-util-html-tag-name@2.0.1: {} 2467 | 2468 | micromark-util-normalize-identifier@2.0.1: 2469 | dependencies: 2470 | micromark-util-symbol: 2.0.1 2471 | 2472 | micromark-util-resolve-all@2.0.1: 2473 | dependencies: 2474 | micromark-util-types: 2.0.2 2475 | 2476 | micromark-util-sanitize-uri@2.0.1: 2477 | dependencies: 2478 | micromark-util-character: 2.1.1 2479 | micromark-util-encode: 2.0.1 2480 | micromark-util-symbol: 2.0.1 2481 | 2482 | micromark-util-subtokenize@2.1.0: 2483 | dependencies: 2484 | devlop: 1.1.0 2485 | micromark-util-chunked: 2.0.1 2486 | micromark-util-symbol: 2.0.1 2487 | micromark-util-types: 2.0.2 2488 | 2489 | micromark-util-symbol@2.0.1: {} 2490 | 2491 | micromark-util-types@2.0.2: {} 2492 | 2493 | micromark@4.0.2: 2494 | dependencies: 2495 | '@types/debug': 4.1.12 2496 | debug: 4.4.1 2497 | decode-named-character-reference: 1.2.0 2498 | devlop: 1.1.0 2499 | micromark-core-commonmark: 2.0.3 2500 | micromark-factory-space: 2.0.1 2501 | micromark-util-character: 2.1.1 2502 | micromark-util-chunked: 2.0.1 2503 | micromark-util-combine-extensions: 2.0.1 2504 | micromark-util-decode-numeric-character-reference: 2.0.2 2505 | micromark-util-encode: 2.0.1 2506 | micromark-util-normalize-identifier: 2.0.1 2507 | micromark-util-resolve-all: 2.0.1 2508 | micromark-util-sanitize-uri: 2.0.1 2509 | micromark-util-subtokenize: 2.1.0 2510 | micromark-util-symbol: 2.0.1 2511 | micromark-util-types: 2.0.2 2512 | transitivePeerDependencies: 2513 | - supports-color 2514 | 2515 | minipass@7.1.2: {} 2516 | 2517 | minizlib@3.0.2: 2518 | dependencies: 2519 | minipass: 7.1.2 2520 | 2521 | mkdirp@3.0.1: {} 2522 | 2523 | ms@2.1.3: {} 2524 | 2525 | nanoid@3.3.11: {} 2526 | 2527 | oniguruma-parser@0.12.1: {} 2528 | 2529 | oniguruma-to-es@4.3.3: 2530 | dependencies: 2531 | oniguruma-parser: 0.12.1 2532 | regex: 6.0.1 2533 | regex-recursion: 6.0.2 2534 | 2535 | parse-entities@4.0.2: 2536 | dependencies: 2537 | '@types/unist': 2.0.11 2538 | character-entities-legacy: 3.0.0 2539 | character-reference-invalid: 2.0.1 2540 | decode-named-character-reference: 1.2.0 2541 | is-alphanumerical: 2.0.1 2542 | is-decimal: 2.0.1 2543 | is-hexadecimal: 2.0.1 2544 | 2545 | parse5@7.3.0: 2546 | dependencies: 2547 | entities: 6.0.1 2548 | 2549 | pathe@2.0.3: {} 2550 | 2551 | pathval@2.0.1: {} 2552 | 2553 | picocolors@1.1.1: {} 2554 | 2555 | picomatch@4.0.2: {} 2556 | 2557 | postcss-selector-parser@6.0.10: 2558 | dependencies: 2559 | cssesc: 3.0.0 2560 | util-deprecate: 1.0.2 2561 | 2562 | postcss@8.5.6: 2563 | dependencies: 2564 | nanoid: 3.3.11 2565 | picocolors: 1.1.1 2566 | source-map-js: 1.2.1 2567 | 2568 | prettier-plugin-tailwindcss@0.6.14(prettier@3.6.2): 2569 | dependencies: 2570 | prettier: 3.6.2 2571 | 2572 | prettier@3.6.2: {} 2573 | 2574 | property-information@7.1.0: {} 2575 | 2576 | regex-recursion@6.0.2: 2577 | dependencies: 2578 | regex-utilities: 2.3.0 2579 | 2580 | regex-utilities@2.3.0: {} 2581 | 2582 | regex@6.0.1: 2583 | dependencies: 2584 | regex-utilities: 2.3.0 2585 | 2586 | rehype-katex@7.0.1: 2587 | dependencies: 2588 | '@types/hast': 3.0.4 2589 | '@types/katex': 0.16.7 2590 | hast-util-from-html-isomorphic: 2.0.0 2591 | hast-util-to-text: 4.0.2 2592 | katex: 0.16.22 2593 | unist-util-visit-parents: 6.0.1 2594 | vfile: 6.0.3 2595 | 2596 | remark-gfm@4.0.1: 2597 | dependencies: 2598 | '@types/mdast': 4.0.4 2599 | mdast-util-gfm: 3.1.0 2600 | micromark-extension-gfm: 3.0.0 2601 | remark-parse: 11.0.0 2602 | remark-stringify: 11.0.0 2603 | unified: 11.0.5 2604 | transitivePeerDependencies: 2605 | - supports-color 2606 | 2607 | remark-math@6.0.0: 2608 | dependencies: 2609 | '@types/mdast': 4.0.4 2610 | mdast-util-math: 3.0.0 2611 | micromark-extension-math: 3.1.0 2612 | unified: 11.0.5 2613 | transitivePeerDependencies: 2614 | - supports-color 2615 | 2616 | remark-parse@11.0.0: 2617 | dependencies: 2618 | '@types/mdast': 4.0.4 2619 | mdast-util-from-markdown: 2.0.2 2620 | micromark-util-types: 2.0.2 2621 | unified: 11.0.5 2622 | transitivePeerDependencies: 2623 | - supports-color 2624 | 2625 | remark-rehype@11.1.2: 2626 | dependencies: 2627 | '@types/hast': 3.0.4 2628 | '@types/mdast': 4.0.4 2629 | mdast-util-to-hast: 13.2.0 2630 | unified: 11.0.5 2631 | vfile: 6.0.3 2632 | 2633 | remark-stringify@11.0.0: 2634 | dependencies: 2635 | '@types/mdast': 4.0.4 2636 | mdast-util-to-markdown: 2.1.2 2637 | unified: 11.0.5 2638 | 2639 | rollup@4.44.2: 2640 | dependencies: 2641 | '@types/estree': 1.0.8 2642 | optionalDependencies: 2643 | '@rollup/rollup-android-arm-eabi': 4.44.2 2644 | '@rollup/rollup-android-arm64': 4.44.2 2645 | '@rollup/rollup-darwin-arm64': 4.44.2 2646 | '@rollup/rollup-darwin-x64': 4.44.2 2647 | '@rollup/rollup-freebsd-arm64': 4.44.2 2648 | '@rollup/rollup-freebsd-x64': 4.44.2 2649 | '@rollup/rollup-linux-arm-gnueabihf': 4.44.2 2650 | '@rollup/rollup-linux-arm-musleabihf': 4.44.2 2651 | '@rollup/rollup-linux-arm64-gnu': 4.44.2 2652 | '@rollup/rollup-linux-arm64-musl': 4.44.2 2653 | '@rollup/rollup-linux-loongarch64-gnu': 4.44.2 2654 | '@rollup/rollup-linux-powerpc64le-gnu': 4.44.2 2655 | '@rollup/rollup-linux-riscv64-gnu': 4.44.2 2656 | '@rollup/rollup-linux-riscv64-musl': 4.44.2 2657 | '@rollup/rollup-linux-s390x-gnu': 4.44.2 2658 | '@rollup/rollup-linux-x64-gnu': 4.44.2 2659 | '@rollup/rollup-linux-x64-musl': 4.44.2 2660 | '@rollup/rollup-win32-arm64-msvc': 4.44.2 2661 | '@rollup/rollup-win32-ia32-msvc': 4.44.2 2662 | '@rollup/rollup-win32-x64-msvc': 4.44.2 2663 | fsevents: 2.3.3 2664 | 2665 | shiki-stream@0.1.2(vue@3.5.17(typescript@5.8.3)): 2666 | dependencies: 2667 | '@shikijs/core': 3.7.0 2668 | optionalDependencies: 2669 | vue: 3.5.17(typescript@5.8.3) 2670 | 2671 | shiki@3.7.0: 2672 | dependencies: 2673 | '@shikijs/core': 3.7.0 2674 | '@shikijs/engine-javascript': 3.7.0 2675 | '@shikijs/engine-oniguruma': 3.7.0 2676 | '@shikijs/langs': 3.7.0 2677 | '@shikijs/themes': 3.7.0 2678 | '@shikijs/types': 3.7.0 2679 | '@shikijs/vscode-textmate': 10.0.2 2680 | '@types/hast': 3.0.4 2681 | 2682 | siginfo@2.0.0: {} 2683 | 2684 | source-map-js@1.2.1: {} 2685 | 2686 | space-separated-tokens@2.0.2: {} 2687 | 2688 | stackback@0.0.2: {} 2689 | 2690 | std-env@3.9.0: {} 2691 | 2692 | stringify-entities@4.0.4: 2693 | dependencies: 2694 | character-entities-html4: 2.1.0 2695 | character-entities-legacy: 3.0.0 2696 | 2697 | strip-literal@3.0.0: 2698 | dependencies: 2699 | js-tokens: 9.0.1 2700 | 2701 | style-to-js@1.1.17: 2702 | dependencies: 2703 | style-to-object: 1.0.9 2704 | 2705 | style-to-object@1.0.9: 2706 | dependencies: 2707 | inline-style-parser: 0.2.4 2708 | 2709 | tailwindcss@4.1.11: {} 2710 | 2711 | tapable@2.2.2: {} 2712 | 2713 | tar@7.4.3: 2714 | dependencies: 2715 | '@isaacs/fs-minipass': 4.0.1 2716 | chownr: 3.0.0 2717 | minipass: 7.1.2 2718 | minizlib: 3.0.2 2719 | mkdirp: 3.0.1 2720 | yallist: 5.0.0 2721 | 2722 | tinybench@2.9.0: {} 2723 | 2724 | tinyexec@0.3.2: {} 2725 | 2726 | tinyglobby@0.2.14: 2727 | dependencies: 2728 | fdir: 6.4.6(picomatch@4.0.2) 2729 | picomatch: 4.0.2 2730 | 2731 | tinypool@1.1.1: {} 2732 | 2733 | tinyrainbow@2.0.0: {} 2734 | 2735 | tinyspy@4.0.3: {} 2736 | 2737 | trim-lines@3.0.1: {} 2738 | 2739 | trough@2.2.0: {} 2740 | 2741 | tslib@2.3.0: {} 2742 | 2743 | typescript@5.8.3: {} 2744 | 2745 | unified@11.0.5: 2746 | dependencies: 2747 | '@types/unist': 3.0.3 2748 | bail: 2.0.2 2749 | devlop: 1.1.0 2750 | extend: 3.0.2 2751 | is-plain-obj: 4.1.0 2752 | trough: 2.2.0 2753 | vfile: 6.0.3 2754 | 2755 | unist-util-find-after@5.0.0: 2756 | dependencies: 2757 | '@types/unist': 3.0.3 2758 | unist-util-is: 6.0.0 2759 | 2760 | unist-util-is@6.0.0: 2761 | dependencies: 2762 | '@types/unist': 3.0.3 2763 | 2764 | unist-util-position@5.0.0: 2765 | dependencies: 2766 | '@types/unist': 3.0.3 2767 | 2768 | unist-util-remove-position@5.0.0: 2769 | dependencies: 2770 | '@types/unist': 3.0.3 2771 | unist-util-visit: 5.0.0 2772 | 2773 | unist-util-stringify-position@4.0.0: 2774 | dependencies: 2775 | '@types/unist': 3.0.3 2776 | 2777 | unist-util-visit-parents@6.0.1: 2778 | dependencies: 2779 | '@types/unist': 3.0.3 2780 | unist-util-is: 6.0.0 2781 | 2782 | unist-util-visit@5.0.0: 2783 | dependencies: 2784 | '@types/unist': 3.0.3 2785 | unist-util-is: 6.0.0 2786 | unist-util-visit-parents: 6.0.1 2787 | 2788 | util-deprecate@1.0.2: {} 2789 | 2790 | vfile-location@5.0.3: 2791 | dependencies: 2792 | '@types/unist': 3.0.3 2793 | vfile: 6.0.3 2794 | 2795 | vfile-message@4.0.2: 2796 | dependencies: 2797 | '@types/unist': 3.0.3 2798 | unist-util-stringify-position: 4.0.0 2799 | 2800 | vfile@6.0.3: 2801 | dependencies: 2802 | '@types/unist': 3.0.3 2803 | vfile-message: 4.0.2 2804 | 2805 | vite-node@3.2.4(jiti@2.4.2)(lightningcss@1.30.1): 2806 | dependencies: 2807 | cac: 6.7.14 2808 | debug: 4.4.1 2809 | es-module-lexer: 1.7.0 2810 | pathe: 2.0.3 2811 | vite: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) 2812 | transitivePeerDependencies: 2813 | - '@types/node' 2814 | - jiti 2815 | - less 2816 | - lightningcss 2817 | - sass 2818 | - sass-embedded 2819 | - stylus 2820 | - sugarss 2821 | - supports-color 2822 | - terser 2823 | - tsx 2824 | - yaml 2825 | 2826 | vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1): 2827 | dependencies: 2828 | esbuild: 0.25.6 2829 | fdir: 6.4.6(picomatch@4.0.2) 2830 | picomatch: 4.0.2 2831 | postcss: 8.5.6 2832 | rollup: 4.44.2 2833 | tinyglobby: 0.2.14 2834 | optionalDependencies: 2835 | fsevents: 2.3.3 2836 | jiti: 2.4.2 2837 | lightningcss: 1.30.1 2838 | 2839 | vitest@3.2.4(@types/debug@4.1.12)(jiti@2.4.2)(lightningcss@1.30.1): 2840 | dependencies: 2841 | '@types/chai': 5.2.2 2842 | '@vitest/expect': 3.2.4 2843 | '@vitest/mocker': 3.2.4(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) 2844 | '@vitest/pretty-format': 3.2.4 2845 | '@vitest/runner': 3.2.4 2846 | '@vitest/snapshot': 3.2.4 2847 | '@vitest/spy': 3.2.4 2848 | '@vitest/utils': 3.2.4 2849 | chai: 5.2.1 2850 | debug: 4.4.1 2851 | expect-type: 1.2.2 2852 | magic-string: 0.30.17 2853 | pathe: 2.0.3 2854 | picomatch: 4.0.2 2855 | std-env: 3.9.0 2856 | tinybench: 2.9.0 2857 | tinyexec: 0.3.2 2858 | tinyglobby: 0.2.14 2859 | tinypool: 1.1.1 2860 | tinyrainbow: 2.0.0 2861 | vite: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) 2862 | vite-node: 3.2.4(jiti@2.4.2)(lightningcss@1.30.1) 2863 | why-is-node-running: 2.3.0 2864 | optionalDependencies: 2865 | '@types/debug': 4.1.12 2866 | transitivePeerDependencies: 2867 | - jiti 2868 | - less 2869 | - lightningcss 2870 | - msw 2871 | - sass 2872 | - sass-embedded 2873 | - stylus 2874 | - sugarss 2875 | - supports-color 2876 | - terser 2877 | - tsx 2878 | - yaml 2879 | 2880 | vue@3.5.17(typescript@5.8.3): 2881 | dependencies: 2882 | '@vue/compiler-dom': 3.5.17 2883 | '@vue/compiler-sfc': 3.5.17 2884 | '@vue/runtime-dom': 3.5.17 2885 | '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.8.3)) 2886 | '@vue/shared': 3.5.17 2887 | optionalDependencies: 2888 | typescript: 5.8.3 2889 | 2890 | web-namespaces@2.0.1: {} 2891 | 2892 | why-is-node-running@2.3.0: 2893 | dependencies: 2894 | siginfo: 2.0.0 2895 | stackback: 0.0.2 2896 | 2897 | yallist@5.0.0: {} 2898 | 2899 | zrender@5.6.1: 2900 | dependencies: 2901 | tslib: 2.3.0 2902 | 2903 | zwitch@2.0.4: {} 2904 | --------------------------------------------------------------------------------