├── 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 |
6 |
7 |
Error Message:
8 |
9 | {{ error?.message || error }}
10 |
11 |
12 |
Stack Trace:
13 |
14 | {{ error?.stack }}
15 |
16 |
17 |
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 |
2 |
3 |
4 |
5 |
30 |
--------------------------------------------------------------------------------
/playground/src/components/Button.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
16 |
29 |
30 |
31 |
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 |
2 |
3 |
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 |
14 |
17 |
18 |
19 |
38 |
42 | {{ collapsed ? "展开" : "折叠" }}
43 |
44 |
45 |
46 |
47 |
55 |
56 |
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 |
25 |
28 |
29 |
32 |
33 | {{ langLabel }}
34 |
35 |
36 |
37 |
38 |
39 |
42 | Copied!
43 |
45 |
46 |
47 |
52 |
53 |
54 |
55 |
56 |
57 |
62 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
75 |
76 |
77 |
78 |
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 |
2 |
3 |
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 |
121 |
122 |
149 |
150 |
151 |
156 |
159 |
170 |
171 |
172 |
173 |
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 |
132 |
148 |
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 |
193 |
196 |
197 |
200 |
201 | {{ langLabel }}
202 |
203 |
204 |
205 |
206 |
209 | Copied!
211 |
212 |
217 |
218 |
219 |
220 |
221 |
226 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
239 |
240 |
241 |
242 |
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 |
142 |
158 |
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 |
203 |
206 |
207 |
210 |
211 | {{ langLabel }}
212 |
213 |
214 |
215 |
216 |
219 | Copied!
221 |
222 |
227 |
228 |
229 |
230 |
231 |
236 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
249 |
250 |
251 |
252 |
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 | 
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 |
--------------------------------------------------------------------------------