update blog; support mermaid
292
bun.lock
@ -4,6 +4,7 @@
|
||||
"": {
|
||||
"name": "home-page",
|
||||
"dependencies": {
|
||||
"@agoose77/markdown-it-mermaid": "^1.1.0",
|
||||
"@breezystack/lamejs": "^1.2.7",
|
||||
"gray-matter": "^4.0.3",
|
||||
"gsap": "^3.12.7",
|
||||
@ -13,6 +14,7 @@
|
||||
"markdown-it": "^14.1.0",
|
||||
"markdown-it-katex": "^2.0.3",
|
||||
"markdown-it-math": "^5.2.0",
|
||||
"mermaid": "^11.6.0",
|
||||
"normalize.css": "^8.0.1",
|
||||
"vue": "^3.5.13",
|
||||
"vue-router": "^4.5.0",
|
||||
@ -35,8 +37,12 @@
|
||||
},
|
||||
},
|
||||
"packages": {
|
||||
"@agoose77/markdown-it-mermaid": ["@agoose77/markdown-it-mermaid@1.1.0", "", { "dependencies": { "markdown-it": "^13.0.1", "mermaid": "^9.1.7" } }, "sha512-DIDgGazLgcT3M60xJYXaiFZQG9UzkCl55mDpU+XucjHlPuTb80fYwZJr0Cw5uAqVScY1a4shY7QlNbObnVO4VQ=="],
|
||||
|
||||
"@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
|
||||
|
||||
"@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="],
|
||||
|
||||
"@antfu/utils": ["@antfu/utils@0.7.10", "", {}, "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww=="],
|
||||
|
||||
"@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="],
|
||||
@ -97,10 +103,22 @@
|
||||
|
||||
"@babel/types": ["@babel/types@7.27.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg=="],
|
||||
|
||||
"@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.1", "", {}, "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw=="],
|
||||
|
||||
"@breezystack/lamejs": ["@breezystack/lamejs@1.2.7", "", {}, "sha512-6wc7ck65ctA75Hq7FYHTtTvGnYs6msgdxiSUICQ+A01nVOWg6rqouZB8IdyteRlfpYYiFovkf67dIeOgWIUzTA=="],
|
||||
|
||||
"@bufbuild/protobuf": ["@bufbuild/protobuf@2.2.5", "", {}, "sha512-/g5EzJifw5GF8aren8wZ/G5oMuPoGeS6MQD3ca8ddcvdXR5UELUfdTZITCGNhNXynY/AYl3Z4plmxdj/tRl/hQ=="],
|
||||
|
||||
"@chevrotain/cst-dts-gen": ["@chevrotain/cst-dts-gen@11.0.3", "", { "dependencies": { "@chevrotain/gast": "11.0.3", "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ=="],
|
||||
|
||||
"@chevrotain/gast": ["@chevrotain/gast@11.0.3", "", { "dependencies": { "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q=="],
|
||||
|
||||
"@chevrotain/regexp-to-ast": ["@chevrotain/regexp-to-ast@11.0.3", "", {}, "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA=="],
|
||||
|
||||
"@chevrotain/types": ["@chevrotain/types@11.0.3", "", {}, "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ=="],
|
||||
|
||||
"@chevrotain/utils": ["@chevrotain/utils@11.0.3", "", {}, "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ=="],
|
||||
|
||||
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag=="],
|
||||
|
||||
"@esbuild/android-arm": ["@esbuild/android-arm@0.25.2", "", { "os": "android", "cpu": "arm" }, "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA=="],
|
||||
@ -151,6 +169,10 @@
|
||||
|
||||
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.2", "", { "os": "win32", "cpu": "x64" }, "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA=="],
|
||||
|
||||
"@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
|
||||
|
||||
"@iconify/utils": ["@iconify/utils@2.3.0", "", { "dependencies": { "@antfu/install-pkg": "^1.0.0", "@antfu/utils": "^8.1.0", "@iconify/types": "^2.0.0", "debug": "^4.4.0", "globals": "^15.14.0", "kolorist": "^1.8.0", "local-pkg": "^1.0.0", "mlly": "^1.7.4" } }, "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA=="],
|
||||
|
||||
"@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
|
||||
|
||||
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="],
|
||||
@ -165,6 +187,8 @@
|
||||
|
||||
"@jsdevtools/ez-spawn": ["@jsdevtools/ez-spawn@3.0.4", "", { "dependencies": { "call-me-maybe": "^1.0.1", "cross-spawn": "^7.0.3", "string-argv": "^0.3.1", "type-detect": "^4.0.8" } }, "sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA=="],
|
||||
|
||||
"@mermaid-js/parser": ["@mermaid-js/parser@0.4.0", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA=="],
|
||||
|
||||
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
|
||||
|
||||
"@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
|
||||
@ -227,8 +251,72 @@
|
||||
|
||||
"@types/chai-subset": ["@types/chai-subset@1.3.6", "", { "peerDependencies": { "@types/chai": "<5.2.0" } }, "sha512-m8lERkkQj+uek18hXOZuec3W/fCRTrU4hrnXjH3qhHy96ytuPaPiWGgu7sJb7tZxZonO75vYAjCvpe/e4VUwRw=="],
|
||||
|
||||
"@types/d3": ["@types/d3@7.4.3", "", { "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-delaunay": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-zoom": "*" } }, "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww=="],
|
||||
|
||||
"@types/d3-array": ["@types/d3-array@3.2.1", "", {}, "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="],
|
||||
|
||||
"@types/d3-axis": ["@types/d3-axis@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw=="],
|
||||
|
||||
"@types/d3-brush": ["@types/d3-brush@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A=="],
|
||||
|
||||
"@types/d3-chord": ["@types/d3-chord@3.0.6", "", {}, "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="],
|
||||
|
||||
"@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="],
|
||||
|
||||
"@types/d3-contour": ["@types/d3-contour@3.0.6", "", { "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg=="],
|
||||
|
||||
"@types/d3-delaunay": ["@types/d3-delaunay@6.0.4", "", {}, "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="],
|
||||
|
||||
"@types/d3-dispatch": ["@types/d3-dispatch@3.0.6", "", {}, "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ=="],
|
||||
|
||||
"@types/d3-drag": ["@types/d3-drag@3.0.7", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ=="],
|
||||
|
||||
"@types/d3-dsv": ["@types/d3-dsv@3.0.7", "", {}, "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="],
|
||||
|
||||
"@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="],
|
||||
|
||||
"@types/d3-fetch": ["@types/d3-fetch@3.0.7", "", { "dependencies": { "@types/d3-dsv": "*" } }, "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA=="],
|
||||
|
||||
"@types/d3-force": ["@types/d3-force@3.0.10", "", {}, "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="],
|
||||
|
||||
"@types/d3-format": ["@types/d3-format@3.0.4", "", {}, "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="],
|
||||
|
||||
"@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="],
|
||||
|
||||
"@types/d3-hierarchy": ["@types/d3-hierarchy@3.1.7", "", {}, "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="],
|
||||
|
||||
"@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="],
|
||||
|
||||
"@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="],
|
||||
|
||||
"@types/d3-polygon": ["@types/d3-polygon@3.0.2", "", {}, "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="],
|
||||
|
||||
"@types/d3-quadtree": ["@types/d3-quadtree@3.0.6", "", {}, "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="],
|
||||
|
||||
"@types/d3-random": ["@types/d3-random@3.0.3", "", {}, "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="],
|
||||
|
||||
"@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="],
|
||||
|
||||
"@types/d3-scale-chromatic": ["@types/d3-scale-chromatic@3.1.0", "", {}, "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="],
|
||||
|
||||
"@types/d3-selection": ["@types/d3-selection@3.0.11", "", {}, "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="],
|
||||
|
||||
"@types/d3-shape": ["@types/d3-shape@3.1.7", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="],
|
||||
|
||||
"@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
|
||||
|
||||
"@types/d3-time-format": ["@types/d3-time-format@4.0.3", "", {}, "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="],
|
||||
|
||||
"@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="],
|
||||
|
||||
"@types/d3-transition": ["@types/d3-transition@3.0.9", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg=="],
|
||||
|
||||
"@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="],
|
||||
|
||||
"@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="],
|
||||
|
||||
"@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
|
||||
|
||||
"@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="],
|
||||
|
||||
"@types/markdown-it": ["@types/markdown-it@12.2.3", "", { "dependencies": { "@types/linkify-it": "*", "@types/mdurl": "*" } }, "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ=="],
|
||||
@ -237,6 +325,8 @@
|
||||
|
||||
"@types/node": ["@types/node@22.14.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw=="],
|
||||
|
||||
"@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
|
||||
|
||||
"@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.3", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg=="],
|
||||
|
||||
"@vitejs/plugin-vue-jsx": ["@vitejs/plugin-vue-jsx@4.1.2", "", { "dependencies": { "@babel/core": "^7.26.7", "@babel/plugin-transform-typescript": "^7.26.7", "@vue/babel-plugin-jsx": "^1.2.5" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.0.0" } }, "sha512-4Rk0GdE0QCdsIkuMmWeg11gmM4x8UmTnZR/LWPm7QJ7+BsK4tq08udrN0isrrWqz5heFy9HLV/7bOLgFS8hUjA=="],
|
||||
@ -361,6 +451,10 @@
|
||||
|
||||
"check-error": ["check-error@1.0.3", "", { "dependencies": { "get-func-name": "^2.0.2" } }, "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg=="],
|
||||
|
||||
"chevrotain": ["chevrotain@11.0.3", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", "@chevrotain/regexp-to-ast": "11.0.3", "@chevrotain/types": "11.0.3", "@chevrotain/utils": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw=="],
|
||||
|
||||
"chevrotain-allstar": ["chevrotain-allstar@0.3.1", "", { "dependencies": { "lodash-es": "^4.17.21" }, "peerDependencies": { "chevrotain": "^11.0.0" } }, "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw=="],
|
||||
|
||||
"chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="],
|
||||
|
||||
"cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="],
|
||||
@ -379,16 +473,96 @@
|
||||
|
||||
"colorjs.io": ["colorjs.io@0.5.2", "", {}, "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw=="],
|
||||
|
||||
"commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="],
|
||||
|
||||
"confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="],
|
||||
|
||||
"convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
|
||||
|
||||
"copy-anything": ["copy-anything@3.0.5", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w=="],
|
||||
|
||||
"cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="],
|
||||
|
||||
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
|
||||
|
||||
"css.escape": ["css.escape@1.5.1", "", {}, "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="],
|
||||
|
||||
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
|
||||
|
||||
"cytoscape": ["cytoscape@3.32.0", "", {}, "sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ=="],
|
||||
|
||||
"cytoscape-cose-bilkent": ["cytoscape-cose-bilkent@4.1.0", "", { "dependencies": { "cose-base": "^1.0.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ=="],
|
||||
|
||||
"cytoscape-fcose": ["cytoscape-fcose@2.2.0", "", { "dependencies": { "cose-base": "^2.2.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ=="],
|
||||
|
||||
"d3": ["d3@7.9.0", "", { "dependencies": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", "d3-dsv": "3", "d3-ease": "3", "d3-fetch": "3", "d3-force": "3", "d3-format": "3", "d3-geo": "3", "d3-hierarchy": "3", "d3-interpolate": "3", "d3-path": "3", "d3-polygon": "3", "d3-quadtree": "3", "d3-random": "3", "d3-scale": "4", "d3-scale-chromatic": "3", "d3-selection": "3", "d3-shape": "3", "d3-time": "3", "d3-time-format": "4", "d3-timer": "3", "d3-transition": "3", "d3-zoom": "3" } }, "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA=="],
|
||||
|
||||
"d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="],
|
||||
|
||||
"d3-axis": ["d3-axis@3.0.0", "", {}, "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="],
|
||||
|
||||
"d3-brush": ["d3-brush@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "3", "d3-transition": "3" } }, "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ=="],
|
||||
|
||||
"d3-chord": ["d3-chord@3.0.1", "", { "dependencies": { "d3-path": "1 - 3" } }, "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g=="],
|
||||
|
||||
"d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="],
|
||||
|
||||
"d3-contour": ["d3-contour@4.0.2", "", { "dependencies": { "d3-array": "^3.2.0" } }, "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA=="],
|
||||
|
||||
"d3-delaunay": ["d3-delaunay@6.0.4", "", { "dependencies": { "delaunator": "5" } }, "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A=="],
|
||||
|
||||
"d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="],
|
||||
|
||||
"d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="],
|
||||
|
||||
"d3-dsv": ["d3-dsv@3.0.1", "", { "dependencies": { "commander": "7", "iconv-lite": "0.6", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json.js", "csv2tsv": "bin/dsv2dsv.js", "dsv2dsv": "bin/dsv2dsv.js", "dsv2json": "bin/dsv2json.js", "json2csv": "bin/json2dsv.js", "json2dsv": "bin/json2dsv.js", "json2tsv": "bin/json2dsv.js", "tsv2csv": "bin/dsv2dsv.js", "tsv2json": "bin/dsv2json.js" } }, "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q=="],
|
||||
|
||||
"d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="],
|
||||
|
||||
"d3-fetch": ["d3-fetch@3.0.1", "", { "dependencies": { "d3-dsv": "1 - 3" } }, "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw=="],
|
||||
|
||||
"d3-force": ["d3-force@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", "d3-timer": "1 - 3" } }, "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg=="],
|
||||
|
||||
"d3-format": ["d3-format@3.1.0", "", {}, "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="],
|
||||
|
||||
"d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="],
|
||||
|
||||
"d3-hierarchy": ["d3-hierarchy@3.1.2", "", {}, "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="],
|
||||
|
||||
"d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="],
|
||||
|
||||
"d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="],
|
||||
|
||||
"d3-polygon": ["d3-polygon@3.0.1", "", {}, "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="],
|
||||
|
||||
"d3-quadtree": ["d3-quadtree@3.0.1", "", {}, "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="],
|
||||
|
||||
"d3-random": ["d3-random@3.0.1", "", {}, "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="],
|
||||
|
||||
"d3-sankey": ["d3-sankey@0.12.3", "", { "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" } }, "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ=="],
|
||||
|
||||
"d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="],
|
||||
|
||||
"d3-scale-chromatic": ["d3-scale-chromatic@3.1.0", "", { "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" } }, "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ=="],
|
||||
|
||||
"d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="],
|
||||
|
||||
"d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="],
|
||||
|
||||
"d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="],
|
||||
|
||||
"d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="],
|
||||
|
||||
"d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="],
|
||||
|
||||
"d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="],
|
||||
|
||||
"d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="],
|
||||
|
||||
"dagre-d3-es": ["dagre-d3-es@7.0.11", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw=="],
|
||||
|
||||
"dayjs": ["dayjs@1.11.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="],
|
||||
|
||||
"de-indent": ["de-indent@1.0.2", "", {}, "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg=="],
|
||||
|
||||
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
|
||||
@ -405,12 +579,18 @@
|
||||
|
||||
"define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
|
||||
|
||||
"delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="],
|
||||
|
||||
"detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="],
|
||||
|
||||
"dompurify": ["dompurify@3.2.6", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ=="],
|
||||
|
||||
"eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
|
||||
|
||||
"electron-to-chromium": ["electron-to-chromium@1.5.137", "", {}, "sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA=="],
|
||||
|
||||
"elkjs": ["elkjs@0.8.2", "", {}, "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ=="],
|
||||
|
||||
"emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
|
||||
|
||||
"end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="],
|
||||
@ -431,6 +611,8 @@
|
||||
|
||||
"expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="],
|
||||
|
||||
"exsolve": ["exsolve@1.0.5", "", {}, "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg=="],
|
||||
|
||||
"extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="],
|
||||
|
||||
"fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="],
|
||||
@ -467,7 +649,7 @@
|
||||
|
||||
"glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
||||
|
||||
"globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="],
|
||||
"globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="],
|
||||
|
||||
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
||||
|
||||
@ -475,6 +657,8 @@
|
||||
|
||||
"gsap": ["gsap@3.12.7", "", {}, "sha512-V4GsyVamhmKefvcAKaoy0h6si0xX7ogwBoBSs2CTJwt7luW0oZzC0LhdkyuKV8PJAXr7Yaj8pMjCKD4GJ+eEMg=="],
|
||||
|
||||
"hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="],
|
||||
|
||||
"happy-dom": ["happy-dom@8.9.0", "", { "dependencies": { "css.escape": "^1.5.1", "he": "^1.2.0", "iconv-lite": "^0.6.3", "node-fetch": "^2.x.x", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^2.0.0", "whatwg-mimetype": "^3.0.0" } }, "sha512-JZwJuGdR7ko8L61136YzmrLv7LgTh5b8XaEM3P709mLjyQuXJ3zHTDXvUtBBahRjGlcYW0zGjIiEWizoTUGKfA=="],
|
||||
|
||||
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
@ -501,6 +685,8 @@
|
||||
|
||||
"ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="],
|
||||
|
||||
"internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
|
||||
|
||||
"is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
|
||||
|
||||
"is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
|
||||
@ -547,6 +733,8 @@
|
||||
|
||||
"katex": ["katex@0.6.0", "", { "dependencies": { "match-at": "^0.1.0" }, "bin": { "katex": "cli.js" } }, "sha512-rS4mY3SvHYg5LtQV6RBcK0if7ur6plyEukAOV+jGGPqFImuzu8fHL6M752iBmRGoUyF0bhZbAPoezehn7xYksA=="],
|
||||
|
||||
"khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="],
|
||||
|
||||
"kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
|
||||
|
||||
"kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
|
||||
@ -555,11 +743,15 @@
|
||||
|
||||
"lamejs": ["lamejs@1.2.1", "", { "dependencies": { "use-strict": "1.0.1" } }, "sha512-s7bxvjvYthw6oPLCm5pFxvA84wUROODB8jEO2+CE1adhKgrIvVOlmMgY8zyugxGrvRaDHNJanOiS21/emty6dQ=="],
|
||||
|
||||
"langium": ["langium@3.3.1", "", { "dependencies": { "chevrotain": "~11.0.3", "chevrotain-allstar": "~0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.0.8" } }, "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w=="],
|
||||
|
||||
"layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="],
|
||||
|
||||
"lie": ["lie@3.1.1", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw=="],
|
||||
|
||||
"linkify-it": ["linkify-it@5.0.0", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ=="],
|
||||
|
||||
"local-pkg": ["local-pkg@0.4.3", "", {}, "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g=="],
|
||||
"local-pkg": ["local-pkg@1.1.1", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.0.1", "quansync": "^0.2.8" } }, "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg=="],
|
||||
|
||||
"localforage": ["localforage@1.10.0", "", { "dependencies": { "lie": "3.1.1" } }, "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg=="],
|
||||
|
||||
@ -579,6 +771,8 @@
|
||||
|
||||
"markdown-it-math": ["markdown-it-math@5.2.0", "", { "peerDependencies": { "mathup": "^1.0.0", "temml": "^0.11.0" }, "optionalPeers": ["mathup", "temml"] }, "sha512-K9cnNVUnK42OxDLPwpdiv3nhWfJgCh45FfSkFOirnIa0usBTheRVp2Mv9wKFDy+7RJyoNqsICQ7G8SiojaSbLA=="],
|
||||
|
||||
"marked": ["marked@15.0.12", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="],
|
||||
|
||||
"match-at": ["match-at@0.1.1", "", {}, "sha512-h4Yd392z9mST+dzc+yjuybOGFNOZjmXIPKWjxBd1Bb23r4SmDOsk2NYCU2BMUBGbSpZqwVsZYNq26QS3xfaT3Q=="],
|
||||
|
||||
"mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="],
|
||||
@ -587,6 +781,8 @@
|
||||
|
||||
"merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
|
||||
|
||||
"mermaid": ["mermaid@11.6.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.0.4", "@iconify/utils": "^2.1.33", "@mermaid-js/parser": "^0.4.0", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.13", "dompurify": "^3.2.4", "katex": "^0.16.9", "khroma": "^2.1.0", "lodash-es": "^4.17.21", "marked": "^15.0.7", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg=="],
|
||||
|
||||
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
|
||||
|
||||
"mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
|
||||
@ -603,6 +799,8 @@
|
||||
|
||||
"mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="],
|
||||
|
||||
"mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="],
|
||||
|
||||
"mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
|
||||
|
||||
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||
@ -623,6 +821,8 @@
|
||||
|
||||
"node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="],
|
||||
|
||||
"non-layered-tidy-tree-layout": ["non-layered-tidy-tree-layout@2.0.2", "", {}, "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw=="],
|
||||
|
||||
"normalize.css": ["normalize.css@8.0.1", "", {}, "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="],
|
||||
|
||||
"npm-normalize-package-bin": ["npm-normalize-package-bin@4.0.0", "", {}, "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w=="],
|
||||
@ -641,10 +841,14 @@
|
||||
|
||||
"package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
|
||||
|
||||
"package-manager-detector": ["package-manager-detector@1.3.0", "", {}, "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ=="],
|
||||
|
||||
"parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="],
|
||||
|
||||
"path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
|
||||
|
||||
"path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="],
|
||||
|
||||
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
|
||||
|
||||
"path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
|
||||
@ -661,6 +865,12 @@
|
||||
|
||||
"pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="],
|
||||
|
||||
"pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="],
|
||||
|
||||
"points-on-curve": ["points-on-curve@0.2.0", "", {}, "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A=="],
|
||||
|
||||
"points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="],
|
||||
|
||||
"postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="],
|
||||
|
||||
"prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="],
|
||||
@ -673,6 +883,8 @@
|
||||
|
||||
"punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="],
|
||||
|
||||
"quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="],
|
||||
|
||||
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
|
||||
|
||||
"rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="],
|
||||
@ -687,12 +899,18 @@
|
||||
|
||||
"rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
|
||||
|
||||
"robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="],
|
||||
|
||||
"rollup": ["rollup@4.40.0", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.40.0", "@rollup/rollup-android-arm64": "4.40.0", "@rollup/rollup-darwin-arm64": "4.40.0", "@rollup/rollup-darwin-x64": "4.40.0", "@rollup/rollup-freebsd-arm64": "4.40.0", "@rollup/rollup-freebsd-x64": "4.40.0", "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", "@rollup/rollup-linux-arm-musleabihf": "4.40.0", "@rollup/rollup-linux-arm64-gnu": "4.40.0", "@rollup/rollup-linux-arm64-musl": "4.40.0", "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", "@rollup/rollup-linux-riscv64-gnu": "4.40.0", "@rollup/rollup-linux-riscv64-musl": "4.40.0", "@rollup/rollup-linux-s390x-gnu": "4.40.0", "@rollup/rollup-linux-x64-gnu": "4.40.0", "@rollup/rollup-linux-x64-musl": "4.40.0", "@rollup/rollup-win32-arm64-msvc": "4.40.0", "@rollup/rollup-win32-ia32-msvc": "4.40.0", "@rollup/rollup-win32-x64-msvc": "4.40.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w=="],
|
||||
|
||||
"roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="],
|
||||
|
||||
"run-applescript": ["run-applescript@7.0.0", "", {}, "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A=="],
|
||||
|
||||
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
|
||||
|
||||
"rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="],
|
||||
|
||||
"rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="],
|
||||
|
||||
"safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
@ -797,6 +1015,8 @@
|
||||
|
||||
"strip-literal": ["strip-literal@1.3.0", "", { "dependencies": { "acorn": "^8.10.0" } }, "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg=="],
|
||||
|
||||
"stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="],
|
||||
|
||||
"superjson": ["superjson@2.2.2", "", { "dependencies": { "copy-anything": "^3.0.2" } }, "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q=="],
|
||||
|
||||
"supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
|
||||
@ -813,6 +1033,8 @@
|
||||
|
||||
"tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="],
|
||||
|
||||
"tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="],
|
||||
|
||||
"tinypool": ["tinypool@0.3.1", "", {}, "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ=="],
|
||||
|
||||
"tinyspy": ["tinyspy@1.1.1", "", {}, "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g=="],
|
||||
@ -823,6 +1045,8 @@
|
||||
|
||||
"tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
|
||||
|
||||
"ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="],
|
||||
|
||||
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||
|
||||
"tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="],
|
||||
@ -835,6 +1059,8 @@
|
||||
|
||||
"uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="],
|
||||
|
||||
"ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="],
|
||||
|
||||
"undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
|
||||
|
||||
"unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="],
|
||||
@ -847,6 +1073,8 @@
|
||||
|
||||
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
|
||||
|
||||
"uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="],
|
||||
|
||||
"varint": ["varint@6.0.0", "", {}, "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="],
|
||||
|
||||
"vite": ["vite@6.2.6", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw=="],
|
||||
@ -865,6 +1093,16 @@
|
||||
|
||||
"vitest": ["vitest@0.25.8", "", { "dependencies": { "@types/chai": "^4.3.4", "@types/chai-subset": "^1.3.3", "@types/node": "*", "acorn": "^8.8.1", "acorn-walk": "^8.2.0", "chai": "^4.3.7", "debug": "^4.3.4", "local-pkg": "^0.4.2", "source-map": "^0.6.1", "strip-literal": "^1.0.0", "tinybench": "^2.3.1", "tinypool": "^0.3.0", "tinyspy": "^1.0.2", "vite": "^3.0.0 || ^4.0.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@vitest/browser": "*", "@vitest/ui": "*", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-X75TApG2wZTJn299E/TIYevr4E9/nBo1sUtZzn0Ci5oK8qnpZAZyhwg0qCeMSakGIWtc6oRwcQFyFfW14aOFWg=="],
|
||||
|
||||
"vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="],
|
||||
|
||||
"vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="],
|
||||
|
||||
"vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="],
|
||||
|
||||
"vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="],
|
||||
|
||||
"vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="],
|
||||
|
||||
"vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
|
||||
|
||||
"vue": ["vue@3.5.13", "", { "dependencies": { "@vue/compiler-dom": "3.5.13", "@vue/compiler-sfc": "3.5.13", "@vue/runtime-dom": "3.5.13", "@vue/server-renderer": "3.5.13", "@vue/shared": "3.5.13" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ=="],
|
||||
@ -873,6 +1111,8 @@
|
||||
|
||||
"vue-tsc": ["vue-tsc@2.2.8", "", { "dependencies": { "@volar/typescript": "~2.4.11", "@vue/language-core": "2.2.8" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "./bin/vue-tsc.js" } }, "sha512-jBYKBNFADTN+L+MdesNX/TB3XuDSyaWynKMDgR+yCSln0GQ9Tfb7JS2lr46s2LiFUT1WsmfWsSvIElyxzOPqcQ=="],
|
||||
|
||||
"web-worker": ["web-worker@1.5.0", "", {}, "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw=="],
|
||||
|
||||
"webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="],
|
||||
|
||||
"whatwg-encoding": ["whatwg-encoding@2.0.0", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg=="],
|
||||
@ -895,6 +1135,14 @@
|
||||
|
||||
"yoctocolors": ["yoctocolors@2.1.1", "", {}, "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ=="],
|
||||
|
||||
"@agoose77/markdown-it-mermaid/markdown-it": ["markdown-it@13.0.2", "", { "dependencies": { "argparse": "^2.0.1", "entities": "~3.0.1", "linkify-it": "^4.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "bin": { "markdown-it": "bin/markdown-it.js" } }, "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w=="],
|
||||
|
||||
"@agoose77/markdown-it-mermaid/mermaid": ["mermaid@9.4.3", "", { "dependencies": { "@braintree/sanitize-url": "^6.0.0", "cytoscape": "^3.23.0", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.1.0", "d3": "^7.4.0", "dagre-d3-es": "7.0.9", "dayjs": "^1.11.7", "dompurify": "2.4.3", "elkjs": "^0.8.2", "khroma": "^2.0.0", "lodash-es": "^4.17.21", "non-layered-tidy-tree-layout": "^2.0.2", "stylis": "^4.1.2", "ts-dedent": "^2.2.0", "uuid": "^9.0.0", "web-worker": "^1.2.0" } }, "sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw=="],
|
||||
|
||||
"@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="],
|
||||
|
||||
"@iconify/utils/@antfu/utils": ["@antfu/utils@8.1.1", "", {}, "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ=="],
|
||||
|
||||
"@vue/devtools-core/nanoid": ["nanoid@5.1.5", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw=="],
|
||||
|
||||
"@yankeeinlondon/builder-api/markdown-it": ["markdown-it@13.0.2", "", { "dependencies": { "argparse": "^2.0.1", "entities": "~3.0.1", "linkify-it": "^4.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "bin": { "markdown-it": "bin/markdown-it.js" } }, "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w=="],
|
||||
@ -909,12 +1157,26 @@
|
||||
|
||||
"cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
||||
|
||||
"cytoscape-fcose/cose-base": ["cose-base@2.2.0", "", { "dependencies": { "layout-base": "^2.0.0" } }, "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g=="],
|
||||
|
||||
"d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="],
|
||||
|
||||
"d3-sankey/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="],
|
||||
|
||||
"d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="],
|
||||
|
||||
"figures/is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
|
||||
|
||||
"js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
|
||||
|
||||
"langium/vscode-uri": ["vscode-uri@3.0.8", "", {}, "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw=="],
|
||||
|
||||
"mermaid/katex": ["katex@0.16.22", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg=="],
|
||||
|
||||
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
|
||||
"mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
|
||||
|
||||
"node-abi/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
|
||||
|
||||
"npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
|
||||
@ -939,6 +1201,8 @@
|
||||
|
||||
"vite-plugin-md/markdown-it": ["markdown-it@13.0.2", "", { "dependencies": { "argparse": "^2.0.1", "entities": "~3.0.1", "linkify-it": "^4.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "bin": { "markdown-it": "bin/markdown-it.js" } }, "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w=="],
|
||||
|
||||
"vitest/local-pkg": ["local-pkg@0.4.3", "", {}, "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g=="],
|
||||
|
||||
"vitest/vite": ["vite@4.5.13", "", { "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", "rollup": "^3.27.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-Hgp8IF/yZDzKsN1hQWOuQZbrKiaFsbQud+07jJ8h9m9PaHWkpvZ5u55Xw5yYjWRXwRQ4jwFlJvY7T7FUJG9MCA=="],
|
||||
|
||||
"whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
|
||||
@ -949,6 +1213,22 @@
|
||||
|
||||
"wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"@agoose77/markdown-it-mermaid/markdown-it/entities": ["entities@3.0.1", "", {}, "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q=="],
|
||||
|
||||
"@agoose77/markdown-it-mermaid/markdown-it/linkify-it": ["linkify-it@4.0.1", "", { "dependencies": { "uc.micro": "^1.0.1" } }, "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw=="],
|
||||
|
||||
"@agoose77/markdown-it-mermaid/markdown-it/mdurl": ["mdurl@1.0.1", "", {}, "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="],
|
||||
|
||||
"@agoose77/markdown-it-mermaid/markdown-it/uc.micro": ["uc.micro@1.0.6", "", {}, "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="],
|
||||
|
||||
"@agoose77/markdown-it-mermaid/mermaid/@braintree/sanitize-url": ["@braintree/sanitize-url@6.0.4", "", {}, "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A=="],
|
||||
|
||||
"@agoose77/markdown-it-mermaid/mermaid/dagre-d3-es": ["dagre-d3-es@7.0.9", "", { "dependencies": { "d3": "^7.8.2", "lodash-es": "^4.17.21" } }, "sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w=="],
|
||||
|
||||
"@agoose77/markdown-it-mermaid/mermaid/dompurify": ["dompurify@2.4.3", "", {}, "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ=="],
|
||||
|
||||
"@agoose77/markdown-it-mermaid/mermaid/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="],
|
||||
|
||||
"@yankeeinlondon/builder-api/markdown-it/entities": ["entities@3.0.1", "", {}, "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q=="],
|
||||
|
||||
"@yankeeinlondon/builder-api/markdown-it/linkify-it": ["linkify-it@4.0.1", "", { "dependencies": { "uc.micro": "^1.0.1" } }, "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw=="],
|
||||
@ -963,6 +1243,14 @@
|
||||
|
||||
"cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||
|
||||
"cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="],
|
||||
|
||||
"d3-sankey/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="],
|
||||
|
||||
"d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="],
|
||||
|
||||
"mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
|
||||
|
||||
"ora/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
|
||||
|
||||
"prebuild-install/tar-fs/tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="],
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
"type-check": "vue-tsc --build"
|
||||
},
|
||||
"dependencies": {
|
||||
"@agoose77/markdown-it-mermaid": "^1.1.0",
|
||||
"@breezystack/lamejs": "^1.2.7",
|
||||
"gray-matter": "^4.0.3",
|
||||
"gsap": "^3.12.7",
|
||||
@ -20,6 +21,7 @@
|
||||
"markdown-it": "^14.1.0",
|
||||
"markdown-it-katex": "^2.0.3",
|
||||
"markdown-it-math": "^5.2.0",
|
||||
"mermaid": "^11.6.0",
|
||||
"normalize.css": "^8.0.1",
|
||||
"vue": "^3.5.13",
|
||||
"vue-router": "^4.5.0"
|
||||
|
||||
BIN
public/resources/Phy-exp/录屏2025-05-30 22.14.43.mp4
Normal file
@ -73,5 +73,56 @@
|
||||
|
||||
.katex-html {
|
||||
display: none;
|
||||
}
|
||||
|
||||
// Mermaid 图表样式
|
||||
.mermaid-container {
|
||||
text-align: center;
|
||||
margin: 2rem 0;
|
||||
padding: 1rem;
|
||||
background-color: rgb(from var(--text-color-gray) r g b / 0.02);
|
||||
border-radius: var(--border-radius);
|
||||
border: var(--border);
|
||||
|
||||
svg {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.mermaid-placeholder {
|
||||
background-color: rgb(from var(--text-color-gray) r g b / 0.05);
|
||||
border: 1px dashed rgb(from var(--text-color-gray) r g b / 0.3);
|
||||
border-radius: var(--border-radius);
|
||||
padding: 1rem;
|
||||
margin: 2rem 0;
|
||||
text-align: center;
|
||||
color: rgb(from var(--text-color-gray) r g b / 0.6);
|
||||
font-family: monospace;
|
||||
font-size: 0.9rem;
|
||||
position: relative;
|
||||
|
||||
&:before {
|
||||
content: "Mermaid Diagram";
|
||||
position: absolute;
|
||||
top: -10px;
|
||||
left: 1rem;
|
||||
background: var(--bg-color);
|
||||
padding: 0 0.5rem;
|
||||
font-size: 0.8rem;
|
||||
color: rgb(from var(--text-color-gray) r g b / 0.7);
|
||||
}
|
||||
}
|
||||
|
||||
.alert {
|
||||
padding: 0.75rem 1.25rem;
|
||||
margin: 1rem 0;
|
||||
border: 1px solid transparent;
|
||||
border-radius: var(--border-radius);
|
||||
|
||||
&.alert-danger {
|
||||
color: #721c24;
|
||||
background-color: #f8d7da;
|
||||
border-color: #f5c6cb;
|
||||
}
|
||||
}
|
||||
59
src/blogs/AI Agent赋能的基于PhET的电路虚拟实验室.md
Normal file
@ -0,0 +1,59 @@
|
||||
---
|
||||
title: AI Agent赋能的基于PhET的电路虚拟实验室
|
||||
desc: 基于AI Agent和PhET虚拟实验平台的电路实验系统。通过计算机视觉识别实物电路并转换为结构化数据,在虚拟环境中实现电路复现与AI智能交互,提供实时答疑和操作指导,打造虚实结合的智能化实验教学平台。
|
||||
author: feie9454
|
||||
date: 2025-05-30
|
||||
tags: AI、教育、虚拟实验、PhET
|
||||
---
|
||||
|
||||
# AI Agent赋能的基于PhET的电路虚拟实验室
|
||||
|
||||
## 2025/05/27
|
||||
|
||||
确定了基于AI的电路实验改进方案:**AI Agent赋能的基于PhET项目的电路虚拟实验室**。
|
||||
|
||||
电学实验系统采用以下工作流程:
|
||||
|
||||
1. **实物电路识别**:学生完成实验电路连接后,通过拍照上传至平台
|
||||
2. **智能转换**:采用AI算法识别电路图片,将其转换为结构化的电路描述数据
|
||||
3. **虚拟复现**:将结构化数据导入虚拟实验平台,实现实物电路的数字化复刻
|
||||
4. **AI助手交互**:虚拟平台集成AI助手,提供针对性的电路答疑和指导
|
||||
|
||||
参考Demo:[PhET电路构建实验室](https://phet.colorado.edu/sims/html/circuit-construction-kit-ac-virtual-lab/latest/circuit-construction-kit-ac-virtual-lab_all.html)
|
||||
|
||||
### 为什么要额外套一层虚拟实验平台?
|
||||
|
||||
1. 大模型的视觉能力更多为模糊的感性认识,对于实物电路图片的幻觉严重,不可能直接分析,先转换到虚拟平台,大模型拿到的是结构化的文字数据,可以大幅优化效果。
|
||||
2. 虚拟平台可以很方便测量电流电压,能够展示电子流向等,对学生更直观。
|
||||
3. 引入AI实验助手后,AI可以通过类似MCP协议,直接操作虚拟平台上的元件,学生又可以反向根据AI一步步的操作来更改实物电路,达到排障的目的。
|
||||
4. 从比赛的角度来说,和AI每做一步拍张照再聊几句是大模型的原生能力,我们纯调API套壳缺乏创新性。这个比赛主题是AI,肯定有懂AI的评委,明显套壳直接毙了。我们要做的是给AI提供更高维度的信息,赋予AI在更高维度而不仅限于文字图像输入输出的能力,这是要引入虚拟平台的原因。
|
||||
|
||||
### 目前分工如下:
|
||||
|
||||
@碳灰面包 负责实现实物电路的识别,转换为结构化的电路描述数据。
|
||||
|
||||
我 基于之前找到的开源虚拟试验平台进行二次开发,目前代码只支持手动拖放元件,需要修改以支持从结构化的电路描述数据直接导入电路。之后继续在平台中加入AI助手,实时答疑。此外对平台进行本地化、修改元件材质、添加学校Logo等。
|
||||
|
||||
示例实验内容暂时确定为「直流电桥测电阻」与「电表的改装和校准」,优先进行「电表的改装和校准」。@浮槎 帮忙组织一下最好今天去实验室连接实物电路并且拍照给 @碳灰面包 进行识别的开发。需要包含错误连接的电路和正确连接的示范电路。角度包括俯视与45度左右侧视,线路需要尽可能清晰,不可以交错堆叠。我们给评委展示的主要是思想,细节可以慢慢调优,先从简单的入手。
|
||||
|
||||
## 2025/05/30
|
||||
|
||||
目前我这边虚拟实验室进度:
|
||||
1. 成功把整个项目拉下来,并且本地编译跑通了;
|
||||
2. 进行了中文环境的本地化,后续可以插入学校Logo之类的;
|
||||
3. 构建了一整套序列化脚本,能够序列化和反序列化当前实验环境中的所有连接点和元件,具体可以看录屏。
|
||||
|
||||
-->V(/resources/Phy-exp/录屏2025-05-30 22.14.43.mp4)
|
||||
|
||||
*注:当前面板中导入导出的功能仅供调试使用,后续会接入AI电路识别系统,自动化把现实电路导入,当前仅为展示对PhET平台的二次开发。*
|
||||
|
||||
后续计划:
|
||||
1. 在6月4日前把AI助手集成进虚拟环境,具体表现为一个悬浮窗,点击后进去聊天界面;
|
||||
2. AI助手应用目前流行的AI Agent概念,利用MCP协议与虚拟环境通信,包括:
|
||||
- 环境状态读取:获取当前所有元件信息
|
||||
- 元件操作控制:支持元件修改和参数调整
|
||||
- 视觉引导功能:实现特定元件的高亮显示
|
||||
3. 等罗同学把识别那边做好后,把识别集成进系统,有个设想是在识别过程中保留元件相对位置信息,在虚拟环境中尽可能还原原始电路布局,提升用户体验的连贯性。
|
||||
|
||||
## 2025/6/6
|
||||
|
||||
BIN
src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg
Normal file
|
After Width: | Height: | Size: 182 KiB |
BIN
src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg
Normal file
|
After Width: | Height: | Size: 182 KiB |
BIN
src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/clip_image001.jpg
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/clip_image002.jpg
Normal file
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 203 KiB |
|
After Width: | Height: | Size: 642 KiB |
|
After Width: | Height: | Size: 375 KiB |
|
After Width: | Height: | Size: 384 KiB |
|
After Width: | Height: | Size: 583 KiB |
|
After Width: | Height: | Size: 672 KiB |
|
After Width: | Height: | Size: 769 KiB |
|
After Width: | Height: | Size: 682 KiB |
|
After Width: | Height: | Size: 889 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 180 KiB |
|
After Width: | Height: | Size: 144 KiB |
|
After Width: | Height: | Size: 331 KiB |
|
After Width: | Height: | Size: 322 KiB |
|
After Width: | Height: | Size: 367 KiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 2.1 MiB |
|
After Width: | Height: | Size: 2.1 MiB |
|
After Width: | Height: | Size: 2.1 MiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 2.0 MiB |
|
After Width: | Height: | Size: 903 KiB |
|
After Width: | Height: | Size: 295 KiB |
|
After Width: | Height: | Size: 842 KiB |
|
After Width: | Height: | Size: 246 KiB |
|
After Width: | Height: | Size: 253 KiB |
|
After Width: | Height: | Size: 739 KiB |
|
After Width: | Height: | Size: 903 KiB |
|
After Width: | Height: | Size: 205 KiB |
|
After Width: | Height: | Size: 252 KiB |
|
After Width: | Height: | Size: 301 KiB |
373
src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.md
Normal file
@ -0,0 +1,373 @@
|
||||
---
|
||||
title: AI 视觉驱动的智慧物理实验全过程教学平台
|
||||
desc: 基于计算机视觉与人工智能技术的一体化物理实验辅助平台,深度融合CV、AI算法与现代Web技术,革新物理实验教学模式。平台重点展示力学领域的高精度CV单摆实验系统和电学领域的AI Agent赋能电路虚拟实验室,实现精准测量、智能校正与个性化辅导,为学生提供低成本、高精度的全能型AI物理实验新范式。
|
||||
author: feie9454
|
||||
date: 2025-06-15
|
||||
tags: AI、物理、教育、竞赛
|
||||
---
|
||||
|
||||
# AI 视觉驱动的智慧物理实验全过程教学平台
|
||||
|
||||
<div align="center">本科生组 挑战杯“人工智能 + 教育教学”应用赛</div>
|
||||
|
||||
**摘要**:传统物理实验教学面临操作精度有限、现象观测困难、系统误差难以量化及实验成本与安全风险等挑战。本项目旨在构建一个**一体化、可扩展的“基于计算机视觉的AI物理实验辅助平台”**。该平台深度融合计算机视觉(CV)、人工智能(AI)算法与现代Web技术,致力于革新物理实验的教学与实践模式。平台的核心AI与CV引擎已成功应用于多个物理学分支,现阶段重点展示其在**力学领域**(通过高精度CV单摆实验系统,实现对重力加速度 $ g $ 的精准测量及系统误差智能校正与分析)和**电学领域**(通过AI Agent赋能的电路虚拟实验室,实现真实电路到虚拟环境的智能转换与个性化辅导)的强大能力。这些应用不仅验证了平台核心技术的有效性,也为未来向光学、热学等更多经典物理实验领域的全面拓展奠定了坚实基础。本项目所有功能均可在用户手机浏览器中流畅运行,极大降低了实验门槛与成本,旨在为广大学生提供一个精准、便捷、富有洞察力且低成本的**全能型AI物理实验新范式**。
|
||||
|
||||
## 1. 引言:物理实验教学的革新需求与AI的契机
|
||||
|
||||
物理学作为一门以实验为基础的自然科学,其教学过程离不开实验环节。经典物理实验不仅是验证物理定律、理解物理概念的重要途径,更是培养学生科学素养、创新思维和实践能力的关键。然而,传统的物理实验教学模式在实践中常面临一系列挑战:例如,实验设备成本高昂,部分实验(如电学高压部分)存在安全隐患,导致普及受限;人工观测与手动计时(如单摆测 $g$)易引入较大的随机误差和系统误差,影响结果的准确性与教学效果;复杂现象(如傅科摆进动)的细微变化难以精确捕捉与量化分析;实验过程往往侧重于结果验证,缺乏对物理过程的深度洞察和个性化指导。这些因素在一定程度上制约了物理实验教学的质量和学生的学习体验。
|
||||
|
||||
近年来,人工智能(AI)与计算机视觉(CV)技术的飞速发展,为突破上述瓶颈带来了前所未有的机遇。CV技术能够非接触、高精度地捕捉和量化物理过程中的动态信息,替代人眼进行精密观测。AI算法则能在海量数据中提取深层特征,构建复杂模型,实现智能分析、误差校正乃至自主决策。将AI与CV技术应用于物理实验,不仅可以大幅提升数据采集的精度与效率,更能将实验从简单的“动手操作”提升为“智能探索”,帮助学生更直观、更深入地理解物理规律,并培养其数据分析和模型建构能力。
|
||||
|
||||
在此背景下,我们提出了“基于计算机视觉的AI物理实验辅助平台”项目。本平台旨在利用智能手机等普及型设备作为前端,通过浏览器端的Web应用,集成先进的CV算法进行高精度数据采集,并结合AI模型进行智能分析、误差校正与交互式指导。平台以单摆测 $g$ 和电路虚拟实验两大典型应用为核心,辐射至更多经典物理实验,力图打造一个低成本、高精度、高互动性、强拓展性的新型物理实验解决方案,赋能物理教学,激发学生对物理学的兴趣与探索欲。
|
||||
|
||||
## 2. 平台总体设计与核心技术架构
|
||||
|
||||
### 2.1. “AI+CV”驱动的实验范式
|
||||
|
||||
本平台的核心理念在于构建一个以AI和CV技术为双引擎,驱动物理实验从数据采集、处理、分析到结果解读与学习反馈全链路智能化的新范式。
|
||||
|
||||
**计算机视觉(CV)模块**主要承担物理现象的“感知者”角色。无论是力学实验中物体的运动轨迹、速度、加速度,还是未来可能拓展的光学条纹、热学形变等,CV技术都能通过图像序列分析,将宏观或微观的物理过程转化为精确的数字信号。例如,在单摆实验中,利用Hough变换、轮廓检测或更先进的目标跟踪算法(如基于深度学习的YOLO系列进行特定标记物跟踪)实时定位摆球中心,其精度远超手动计时和肉眼估读。对于电路实验,CV则用于识别实物电路板上的元件种类、参数及连接关系。
|
||||
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615162942540.png" alt="image-20250615162942540" style="zoom: 33%;" />
|
||||
|
||||
<center>图2-1 Web端摆球跟踪示例</center>
|
||||
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615190426360.png" alt="image-20250615190426360" style="zoom: 50%;" />
|
||||
|
||||
<center>图2-2 电路识别示例</center>
|
||||
|
||||
**人工智能(AI)模块**则扮演“分析师”与“导师”的角色。它接收来自CV模块的原始数据,并进行深度加工与智能解读:
|
||||
|
||||
1. **数据清洗与特征提取**:滤除噪声,提取关键物理量(如周期、振幅、相位、电压、电流等)。
|
||||
2. **物理建模与参数拟合**:基于物理定律(如单摆运动方程、电路欧姆定律等),结合机器学习算法(如非线性最小二乘法、符号回归、甚至神经网络),从数据中反向推断核心物理参数(如 $g$ 值、阻尼系数、电阻值等),并对模型进行优化。
|
||||
3. **系统误差智能校正**:AI模型能够学习和识别实验中常见的系统误差来源(如单摆的大摆角效应、空气阻力效应),并根据理论模型自动进行校正,提高测量结果的可靠性。
|
||||
4. **智能交互与反馈**:在虚拟电路实验中,AI Agent能够理解学生的自然语言提问,提供电路原理讲解、故障排查提示、实验步骤引导等个性化辅导。
|
||||
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615163029255.png" alt="image-20250615163029255" style="zoom:40%;" />
|
||||
|
||||
<center>图2-3 在线分析单摆数据</center>
|
||||
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615190320971.png" alt="image-20250615190320971" style="zoom: 50%;" />
|
||||
|
||||
<center>图2-4 AI智能电路分析与问答</center>
|
||||
|
||||
这种“CV感知 + AI分析/指导”的结合,使得物理实验不再是孤立的数据点测量,而是成为一个动态的、可深入探究的智能学习过程。
|
||||
|
||||
### 2.2. Web端轻量化部署的技术实现
|
||||
|
||||
为了最大限度地降低实验门槛,提升平台的可及性与易用性,本项目创新性地采用了完全基于Web的技术架构。这意味着所有核心功能,包括CV处理和AI运算,均可在用户智能手机或电脑的浏览器环境中直接运行,无需下载安装任何本地应用程序,同时也可以部署微信小程序版本,最大程度降低实验门槛。
|
||||
|
||||
这一技术选择主要基于以下考量:
|
||||
1. **跨平台兼容性**:Web应用天然支持各种操作系统(iOS, Android, Windows, macOS, Linux),用户只需一个现代浏览器即可访问。
|
||||
2. **硬件普适性**:充分利用了现代智能手机普遍配备的高性能摄像头和处理器,避免需要额外采购定制化的实验设备。
|
||||
4. **技术前沿性**:随着WebAssembly、WebGL、WebGPU以及TensorFlow.js、OpenCV.js等前端AI/CV库的成熟,在浏览器中进行复杂的计算密集型任务已成为可能。
|
||||
|
||||
具体技术实现上,我们采用了前端框架 Vue.js 构建用户交互界面,利用 `getUserMedia` API调用设备摄像头获取视频流。CV算法(如OpenCV.js中的图像处理函数)直接在客户端对视频帧进行实时分析。对于AI模型的部署,较小的模型或规则可以直接用JavaScript实现;对于复杂的深度学习模型(如YOLO),则通过TensorFlow.js加载预训练模型,在用户设备上进行推理。对于AI Agent,则结合后端API(如 Qwen 或 Deepseek 大模型)共同实现。
|
||||
|
||||
这种纯Web端的轻量化部署,不仅使得高质量的物理实验分析工具能够触达更广泛的学生群体,也为教育资源匮乏地区提供了一种低成本、高效能的解决方案。
|
||||
|
||||
## 3. 核心模块一:基于CV的力学实验智能优化与分析
|
||||
|
||||
力学是物理学的基础分支,其相关的经典实验是中学和大学物理教学的重点。本平台首先聚焦于利用CV和AI技术对传统力学实验进行智能化改造与精度提升,其中最具代表性的是单摆实验。
|
||||
|
||||
### 3.1. 以单摆实验为例:从经典到精准的AI赋能
|
||||
|
||||
#### 3.1.1. 传统单摆实验的局限性回顾
|
||||
|
||||
单摆实验是测定当地重力加速度 $g$ 的经典方法。其理想化的小角度摆动周期公式 $T = 2\pi\sqrt{L/g}$ 简洁明了。然而,传统的手动秒表计时方法,由于人类反应时间的限制(通常在0.1-0.2秒量级),即使测量数十个周期,周期 $T$ 的测量相对误差也难以低于1%,进而导致 $g$ 值的误差往往达到几个百分点。此外,实验中难以完全避免的大角度效应($\sin\theta \approx \theta$ 近似失效)和空气阻力等系统误差,若不加修正,会进一步降低 $g$ 的测量准确度。例如,若初始摆角达到45°而不进行修正,仅此一项即可导致计算出的 $g$ 值被低估约8%。这些局限性不仅影响了实验精度,也可能使学生对物理定律的普适性和实验方法的严谨性产生困惑。
|
||||
|
||||
#### 3.1.2. 计算机视觉:捕捉运动的“慧眼”
|
||||
|
||||
为了克服传统方法的不足,我们引入计算机视觉技术对单摆的运动进行高精度、高频率的自动追踪。用户使用智能手机摄像头对准单摆进行拍摄,平台内置的CV算法便能实时处理视频流:
|
||||
1. **目标检测与定位**:通过色彩阈值分割、轮廓检测与质心计算方法,在每一帧图像中精确锁定摆球的位置(像素坐标)。我们针对实际拍摄中可能出现的球体阴影和反光导致识别不完整的问题,采用了最大外接圆优化算法,确保了定位的稳定性和准确性。
|
||||
2. **坐标转换与标定**:为了将像素坐标转换为实际物理坐标,实验前需要在摆动平面附近放置一个已知长度的参照物(如一把尺子)进行标定。CV算法会识别参照物并计算像素与物理单位(如毫米/像素)的转换系数。这一步的精度对摆长 $L$ 和振幅的测量至关重要。
|
||||
3. **轨迹数据生成**:通过连续追踪,平台能够以视频帧率(通常为30fps或60fps,部分手机支持更高帧率如240fps)记录下摆球在二维平面上的 $(x(t), y(t))$ 坐标序列。这一高密度的时间序列数据为后续的精确分析奠定了基础,其时间分辨率远高于手动计时。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[用户手机摄像头拍摄单摆] --> B{实时视频流};
|
||||
B --> C[OpenCV.js 帧处理];
|
||||
C --> D{图像预处理};
|
||||
D --> E[摆球检测与定位 轮廓+质心];
|
||||
E --> F[像素坐标 x_p, y_p, t];
|
||||
G[参照物标定<br>用户操作] --> H[长度转换系数 k m/px];
|
||||
F & H --> I[物理坐标 x_m, y_m, t];
|
||||
I --> J[摆角计算 θ t];
|
||||
J --> K[高密度轨迹与摆角数据输出];
|
||||
|
||||
subgraph "CV感知模块 (浏览器端)"
|
||||
C
|
||||
D
|
||||
E
|
||||
F
|
||||
H
|
||||
I
|
||||
J
|
||||
end
|
||||
|
||||
style A fill:#f9f,stroke:#333,stroke-width:2px
|
||||
style B fill:#lightblue,stroke:#333,stroke-width:2px
|
||||
style K fill:#lightgreen,stroke:#333,stroke-width:2px
|
||||
```
|
||||
|
||||
<center>图3-1 基于CV的单摆改进实验流程图</center>
|
||||
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615163300814.png" alt="image-20250615163300814" style="zoom:50%;" />
|
||||
|
||||
<center>图3-2 摆球跟踪流程与示例</center>
|
||||
|
||||
#### 3.1.3. AI驱动的数据处理与物理建模
|
||||
|
||||
获取高质量的摆球位置-时间数据后,平台的AI模块介入进行深度分析和物理参数提取:
|
||||
1. **神经网络模型预处理数据**:降低随机噪声对实验数据的干扰,弥补视觉识别的丢帧或帧时间不稳定。
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/clip_image001.jpg" alt="img" style="zoom: 80%;" />
|
||||
|
||||
<center>图3-3 神经网络模型训练过程</center>
|
||||
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/clip_image002.jpg" alt="img" style="zoom:75%;" />
|
||||
|
||||
<center>图3-4 神经网络模型预处理后的效果展示</center>
|
||||
|
||||
2. **摆角计算与周期初判**:根据摆球的实时坐标 $(x(t), y(t))$ ,计算出每一时刻的摆角 $\theta(t)$。通过三角函数拟合,可以初步得到多个连续摆动周期的测量值 $T_i$。
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615163513570.png" alt="image-20250615163513570" style="zoom: 20%;" />
|
||||
|
||||
<center>图3-5 摆角计算示例</center>
|
||||
|
||||
3. **非线性拟合与参数精化**:考虑到单摆的运动是受阻尼的简谐振动(或更复杂的非线性振动),平台采用非线性最小二乘法,将实验数据 $\theta(t)$ 拟合到包含阻尼项和大摆角修正的单摆运动方程的解析解或数值解。例如,拟合函数形式为 $\theta(t) = A_0 e^{-\gamma t} \cos(\omega_d t + \phi)$,其中 $A_0$ 是初始振幅,$\gamma$ 是阻尼系数(与空气阻力相关),$\omega_d$ 是阻尼下的角频率(与 $g$ 和 $L$ 相关),$\phi$ 是初相位。通过拟合,可以同时、精确地得到这些物理参数。
|
||||
|
||||
4. **重力加速度 $g$ 的计算**:由拟合得到的 $\omega_d$ 和 $\gamma$,结合已知的摆长 $L$(可手动精确测量输入,或通过CV辅助测量),可以计算出校正后的角频率 $\omega_0 = \sqrt{\omega_d^2 + \gamma^2}$,进而得到 $g = \omega_0^2 L$。
|
||||
|
||||
#### 3.1.4. 系统误差的智能识别与校正(大摆角、空气阻尼)
|
||||
|
||||
本平台的一大特色在于对系统误差的智能处理,这主要体现在对大摆角效应和空气阻尼效应的量化与校正:
|
||||
* **大摆角效应校正**:单摆周期 $T$ 实际上是初始摆角 $\theta_0$ 的函数,其精确表达式涉及椭圆积分,可展开为级数:
|
||||
$$T(\theta_0) = 2\pi\sqrt{L/g}(1 + \frac{1}{16}\theta_0^2 + \frac{11}{3072}\theta_0^4 + \dots)$$。
|
||||
* 平台在拟合周期时,会根据CV测得的每一周期的实际振幅 $\theta_0$(或随时间衰减的振幅包络),应用此修正公式。这意味着即使实验在较大摆角下进行,平台也能通过AI算法反推出在理想小角度下的等效周期,从而得到更准确的 $g$ 值。
|
||||
* **空气阻尼分析与校正**:如前述,通过拟合振幅 $A(t) = A_0 e^{-\gamma t}$ 的衰减包络,平台能够精确测定阻尼系数 $\gamma = b/(2m)$(其中 $b$ 是线性阻尼系数, $m$ 是摆球质量)。这不仅使得我们可以量化空气阻力的影响(例如计算品质因数 $Q = \omega_0 / (2\gamma)$),还能在计算 $g$ 时考虑阻尼对周期的微小影响:
|
||||
$T_d = T_0 / \sqrt{1 - (\gamma/\omega_0)^2} \approx T_0 (1 + \gamma^2/(2\omega_0^2))$
|
||||
通过这种方式,我们不仅测准了 $g$,还额外获得了关于空气阻力的有价值信息。
|
||||
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/pendulum_period_analysis.png" alt="pendulum_period_analysis" style="zoom:20%;" />
|
||||
|
||||
<center>图3-6 大摆角修正和阻尼修正效果示例</center>
|
||||
|
||||
同时,因为引入了大摆角和阻尼修正,对实验设备的要求更低,也体现了我们尽可能降低实验门槛的初衷。
|
||||
|
||||
我们曾面临摆长 $L$ 的精确测量难题。最初尝试完全依赖CV通过参照物标定来确定摆长,但发现由于手机摄像头的广角畸变、参照物与摆动平面难以严格共面等因素,导致 $L$ 的测量误差较大,直接影响 $g$ 的准确性。通过分析,我们改进了方案:允许用户手动输入精确测量的摆长,同时利用CV数据进行多组不同摆长实验的 $T^2-L$ 图像绘制与线性拟合。根据 $T^2 = (4\pi^2/g)L$,从拟合直线的斜率中求解 $g$。这种方法有效平均了单次测量的随机误差,并能检验不同摆长下 $g$ 值的一致性。
|
||||
|
||||
#### 3.1.5. 实验成果:g值测量精度的大幅提升与多参数洞察
|
||||
|
||||
经过上述CV追踪与AI分析校正流程,我们对单摆实验进行了多次验证。结果表明,采用人工精确测量摆长并结合平台进行四种不同摆长的测量与拟合后,最终测得的 $g$ 值与当地标准值的相对误差可稳定控制在**0.5%以内**,例如一次典型实验得到 $g = 9.7576 \pm 0.0147 \text{ m/s}^2$(95%置信区间),与标准值9.80 m/s²的相对误差为0.43%。$T^2-L$ 关系的线性拟合优度 $R^2$ 值可高达1.0000,显示了数据的高度线性相关性和实验的可靠性。同时,平台还能给出空气阻尼系数 $\gamma$(例如,典型值为0.002 s⁻¹级别)及其标准差,这些都是传统实验难以获得的附加信息。
|
||||
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/pendulum_parameters_summary.png" alt="pendulum_parameters_summary" style="zoom: 20%;" />
|
||||
|
||||
<center>图3-7 单次实验数据展示</center>
|
||||
|
||||
#### 3.1.6. 实验完整数据
|
||||
|
||||
##### 3.1.6.1 总览
|
||||
|
||||
| **指标** | **数值** | **说明** |
|
||||
| ------------------ | ------------------------------------------------------- | -------------------------------- |
|
||||
| **平均重力加速度** | **9.7576 ± 0.0147 m/s²** | 四次实验均值(95 %置信区间) |
|
||||
| 单次测量值 | g₁ = 9.7498、g₂ = 9.7746、g₃ = 9.7411、g₄ = 9.7650 m/s² | |
|
||||
| 标准差 σ | 0.0147 m/s² | 公式 σ = √[Σ(xᵢ − x̄)² / (n − 1)] |
|
||||
| 相对标准值误差 | 0.43 % | |
|
||||
|
||||
| **指标** | **数值** | **说明** |
|
||||
| -------------- | ------------------------ | -------------------- |
|
||||
| **线性拟合 g** | **9.9063 ± 0.0121 m/s²** | 由 T²–L 拟合斜率计算 |
|
||||
| 拟合斜率 | 3.9852 ± 0.0034 | g = 4π²/斜率 |
|
||||
| 拟合标准误差 | 0.0017 | |
|
||||
| 相对标准值误差 | 1.08 % | |
|
||||
| 拟合优度 R² | 1.0000 | |
|
||||
|
||||
| **拟合方程** | **标准 g₀** | **平均测量 ḡ** | **差值 Δ** |
|
||||
| ---------------------------------------- | ----------- | -------------- | ----------- |
|
||||
| **T² = 3.9852 L + 0.0404 (R² = 1.0000)** | 9.8000 m/s² | 9.7576 m/s² | 0.0424 m/s² |
|
||||
|
||||
##### 3.1.6.2 详细数据
|
||||
|
||||
| **实验编号** | **摆长 L (m)** | **周期 T (s)** | **周期平方 T² (s²)** | **角频率 ω (rad/s)** | **初始振幅 θ₀ (rad)** | **相位 φ (rad)** | **周期数量 N** |
|
||||
| ------------ | -------------- | -------------- | -------------------- | -------------------- | --------------------- | ---------------- | -------------- |
|
||||
| 1 | 0.5490 | 1.4921 | 2.2264 | 4.2111 | 0.1559 | −0.5596 | 294 |
|
||||
| 2 | 0.4040 | 1.2846 | 1.6502 | 4.8911 | 0.3166 | 1.6707 | 273 |
|
||||
| 3 | 0.4480 | 1.3516 | 1.8268 | 4.6487 | 0.2821 | −2.1701 | 273 |
|
||||
| 4 | 0.6180 | 1.5825 | 2.5043 | 3.9704 | 0.2183 | −1.7966 | 360 |
|
||||
|
||||
阻尼参数
|
||||
|
||||
| **实验编号** | **阻尼系数 γ (s⁻¹)** | **相对阻尼系数 b/m (s⁻¹)** | **γ 的标准差** |
|
||||
| ------------ | -------------------- | -------------------------- | -------------- |
|
||||
| 1 | 0.0023 | 0.0046 | 0.000008 |
|
||||
| 2 | 0.0026 | 0.0051 | 0.000065 |
|
||||
| 3 | 0.0025 | 0.0050 | 0.000023 |
|
||||
| 4 | 0.0022 | 0.0044 | 0.000007 |
|
||||
|
||||
##### 3.1.6.3 重力加速度计算
|
||||
|
||||
| **实验编号** | **拟合得到 g (m/s²)** | **无阻尼 g (m/s²)** | **全面修正后 g (m/s²)** | **最大偏差 (%)** |
|
||||
| ------------ | --------------------- | ------------------- | ----------------------- | ---------------- |
|
||||
| 1 | 9.7355 | 9.7355 | 9.7498 | 2.24 |
|
||||
| 2 | 9.6648 | 9.6648 | 9.7746 | 4.17 |
|
||||
| 3 | 9.6815 | 9.6815 | 9.7411 | 2.48 |
|
||||
| 4 | 9.7421 | 9.7421 | 9.7650 | 2.13 |
|
||||
|
||||
#### 3.1.7. 圆锥摆(傅科摆)进动分析的进阶探索
|
||||
|
||||
基于CV高精度追踪的能力,我们进一步将平台拓展应用于更复杂的圆锥摆(傅科摆效应)的初步观测与分析。通过顶部俯视拍摄摆球在水平面内的运动轨迹,CV算法提取出摆动轨迹椭圆的长轴方向。我们发现,在精心控制初始释放条件(特别是尽量消除摆球初始自旋)后,观测到的椭圆长轴进动速率显著降低。在一次摆长 $L=1.72 \text{ m}$、纬度 $\varphi=37^\circ \text{ N}$ 的实验中,测得的进动角速度 $\omega_p = -4.5 \times 10^{-5} \text{ rad/s}$,与理论傅科进动速率 $\omega_F = \Omega \sin\varphi = 4.39 \times 10^{-5} \text{ rad/s}$($\Omega$为地球自转角速度)的绝对值非常接近,**相对偏差仅约1.9%**。这一结果初步验证了平台在捕捉和分析微弱物理效应方面的潜力,也揭示了初始条件控制(如避免摆线扭转引入的伪进动)对此类精密实验的重要性。同时,实验还获得了高达 $Q \approx 500$ 的品质因数,表明实验装置的能量损耗极低。
|
||||
|
||||
| 量 | 符号 | 数值 | 备注 |
|
||||
| ---------- | --------- | ---------- | --------------------------- |
|
||||
| 摆长 | $L$ | **1.72 m** | 悬点到质心 |
|
||||
| 摆球质量 | $m$ | **27.0 g** | 实心不锈钢球 |
|
||||
| 纬度 | $\varphi$ | **37 ° N** | 实验位置 |
|
||||
| 摄像机帧率 | | 60 fps | FHD (实验一) / UHD (实验二) |
|
||||
|
||||
| 实验一 | 实验二 |
|
||||
| ------------------------------------------------------------ | ------------------------------------------------------------ |
|
||||
| <br /><center>图3-8 摆球仰视轨迹(实验一)</center> | <br /><center>图3-9 摆球仰视轨迹(实验二)</center> |
|
||||
| <br /><center>图3-10 傅科摆实验数据图(实验一)</center> | <br /><center>图3-11 傅科摆实验数据图(实验二)</center> |
|
||||
| <br /><center>图3-12 进动角度分析图(实验一)</center> | <br /><center>图3-13 进动角度分析图(实验二)</center> |
|
||||
|
||||
##### 3.1.7.1 关键数值
|
||||
|
||||
| Parameter | 实验一 | 实验二 |
|
||||
| ---------------- | ---------- | ---------- |
|
||||
| **周期 T** | 2.633 s | 2.625 s |
|
||||
| **阻尼常数 τ** | 405 ± 5 | 422 ± 5 |
|
||||
| **品质因数 Q** | 505 | 483 |
|
||||
| **进动速率 ωₚ** | -4.5 ×10⁻⁵ | –2.1 ×10⁻⁴ |
|
||||
| **与标准值误差** | +1.9% | +385.4% |
|
||||
|
||||
地转傅科速率 $\omega_{F}=\Omega\sin\varphi$ = $\Omega=7.292\times10^{-5}$ = 4.39 × 10⁻⁵ rad s⁻¹。在两次实验中虽然误差不稳定(主要受到放手时初始旋转速度影响),但是能和标准值在一个数量级,说明了实验的基本可行性,在未来进一步优化实验装置后(如使用电磁设备放球,减少人手不稳定因素),期望能获得更好的准确度。
|
||||
|
||||
### 3.2. 力学实验模块的拓展性应用
|
||||
|
||||
单摆实验的成功经验为平台在其他力学实验中的应用奠定了基础。CV追踪物体运动轨迹的核心能力是共通的:
|
||||
* **自由落体与斜抛运动**:通过高速摄像捕捉下落或抛出小球的运动过程,CV算法可以精确提取每一帧中小球的位置。由此可得到位移-时间、速度-时间(通过差分计算)、加速度-时间(再次差分)的完整运动学图像。AI模块可对这些数据进行拟合,例如,对自由落体数据拟合 $y(t) = y_0 + v_0 t + \frac{1}{2}gt^2$ 来求解 $g$;对斜抛运动则可验证其水平匀速、竖直匀加速的运动规律,并分析空气阻力的影响。初步实验表明,即使使用手机的240fps拍摄,由于物体运动速度快、短时间内帧数有限,加速度数据的离散度较大,对算法的平滑和拟合能力提出了更高要求。
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615181038206.png" alt="image-20250615181038206" style="zoom: 33%;" />
|
||||
|
||||
<center>图3-14 自由落体跟踪数据</center>
|
||||
* **弹簧振子振动特性分析**:将CV追踪应用于弹簧振子末端标记物的运动,可以精确记录其振动位移随时间的变化。AI模块可拟合得到振动周期 $T$、振幅 $A(t)$、阻尼系数 $\gamma$。通过改变悬挂质量 $m$,可以验证周期公式 $T = 2\pi\sqrt{m/k}$(其中 $k$ 为弹簧劲度系数),并测定 $k$ 值。同样,可以研究不同阻尼条件(如空气中、水中)对振动的影响。
|
||||
|
||||
这些拓展应用进一步证明了本平台作为通用力学实验辅助工具的潜力。CV技术提供了前所未有的观测精度和数据密度,而AI算法则负责从这些丰富数据中挖掘物理规律、校正系统误差,共同提升了实验的深度和广度。
|
||||
|
||||
## 4. 核心模块二:AI Agent赋能的电路虚拟实验室
|
||||
|
||||
电路实验是物理学的另一重要组成部分,对于培养学生的逻辑思维、动手能力和故障排查能力至关重要。然而,传统电路实验也存在一些固有的挑战。
|
||||
|
||||
### 4.1. 电路实验教学的痛点与虚拟化的优势
|
||||
|
||||
传统电路实验中,学生需要花费大量时间查找、连接元件,容易因接线错误导致元件损坏(如烧毁电流表、电源)或实验失败,不仅增加了实验成本,也可能打击学生的积极性。同时,电路中的电流、电压等不可见量的变化难以直观感知,一些复杂电路的现象分析也较为抽象。
|
||||
|
||||
虚拟电路实验室(如PhET等优秀项目)通过软件模拟电路行为,有效解决了上述部分问题。它允许学生自由拖拽、连接虚拟元件,实时观察电路参数变化,安全地进行各种尝试,且成本极低。然而,纯虚拟实验有时也因缺乏与真实世界的联系,可能削弱学生对实物操作的熟练度和对真实元件特性的理解。
|
||||
|
||||
本平台提出的AI Agent赋能的电路虚拟实验室,试图结合实物操作与虚拟仿真的优点,并通过AI技术实现两者间的智能桥梁与学习增强。
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615183849113.png" alt="image-20250615183849113" style="zoom: 25%;" />
|
||||
|
||||
<center>图4-1 电路虚拟实验室概览</center>
|
||||
|
||||
### 4.2. 从实物到虚拟:AI驱动的电路智能转换流程
|
||||
|
||||
本模块的核心工作流程是将学生在真实环境中搭建的电路,通过AI技术自动识别并复现到虚拟实验平台中,具体步骤如下:
|
||||
|
||||
1. **图像采集与预处理**:学生使用手机或平板电脑拍摄自己搭建完成的物理电路。上传图片后,平台首先进行必要的预处理,如调整图像尺寸、对比度增强、噪声滤除等,以提高后续识别的准确率。
|
||||
2. **基于YOLO的电路元件与连接关系识别**:这是AI技术的核心应用环节。我们采用先进的**YOLO(You Only Look Once)系列目标检测算法**,训练一个专门用于识别电路元件(如电阻、电容、电感、电源、开关、导线、仪表等)的模型。YOLO算法能够快速、准确地在图片中定位各种元件,并给出其类别和位置边界框。不仅如此,我们还通过OpenCV分析元件间的相对位置和导线的走向,用算法进一步推断出它们之间的连接关系,形成电路的拓扑结构,供后续使用。
|
||||
|
||||
| 俯视元件识别 | 侧视元件识别 |
|
||||
| ------------------------------------------------------------ | ------------------------------------------------------------ |
|
||||
| <br /><center>图4-2 俯视角度元件识别示例</center> | <br /><center>图4-3 侧视角度元件识别示例</center> |
|
||||
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615184125377.png" alt="image-20250615184125377" style="zoom: 50%;" />
|
||||
|
||||
<center>图4-4 电路元件连接关系分析</center>
|
||||
3. **结构化数据生成与虚拟电路复现**:识别完成后,AI模块会将电路的元件列表、各元件参数(部分参数需要用户辅助输入,如电阻具体阻值)以及它们的连接关系,转换成标准化的JSON结构化数据格式。这份结构化数据随后被导入到我们基于Web的虚拟电路实验环境中。虚拟环境根据这份“数字蓝图”,自动生成一个与实物电路完全对应的、可交互的虚拟复制品。
|
||||
|
||||
| 系统首页提示上传图片 | 识别图片后提示导入 |
|
||||
| ------------------------------------------------------------ | ------------------------------------------------------------ |
|
||||
| <br /><center>图4-5 系统首页上传界面</center> | <br /><center>图4-6 电路识别结果导入界面</center> |
|
||||
|
||||
通过这一流程,学生如果实物电路有故障,学生把电路导入到我们平台后,可以借由AI来帮助分析排障,还可以先进行实物搭建的练习,然后利用平台快速获得一个对应的虚拟仿真环境。在这个虚拟环境中,可以在行业前沿的AI辅助下进行通电测试、参数修改、故障排查等操作,将实物操作的经验与虚拟仿真的即时反馈和深度分析能力结合起来。
|
||||
|
||||
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615210657893.png" alt="image-20250615210657893" style="zoom:25%;" />
|
||||
|
||||
<center>图4-7 AI电路虚拟实验室流程图</center>
|
||||
|
||||
### 4.3. AI实验助手:个性化学习与智能引导
|
||||
|
||||
在复现的虚拟电路中,本平台还集成了一个**AI实验助手(AI Agent)**,旨在为学生提供智能化的、个性化的学习支持:
|
||||
1. **电路原理的交互式答疑**:学生可以随时通过文本或语音(未来规划)向AI助手提问关于当前电路的问题,例如“这个电阻的作用是什么?”、“为什么电流表读数这么小?”、“欧姆定律在这里是如何体现的?”。得益于LLM的高速发展,AI助手能基于对当前虚拟电路状态的分析,给出针对性的、易于理解的解答。
|
||||
2. **故障诊断与实验优化建议**:如果学生在实物搭建或虚拟操作中遇到问题(如电路不工作、读数异常),AI助手可以引导学生进行排查。例如,它可以提示检查电源连接、仪表量程选择、元件是否损坏(虚拟)、是否存在短路或断路等。对于复杂电路设计,AI助手还能根据实验目标,提供一些优化建议或替代方案。
|
||||
3. **探究性学习引导**:AI助手还可以设计一些启发式问题或小挑战,鼓励学生在虚拟环境中改变电路参数、观察现象变化、主动探究电路规律,从而深化对知识点的理解。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[用户在虚拟电路中操作/遇到问题] --> B{通过界面提问/触发事件};
|
||||
B --> C[AI Agent NLP前端 + 知识库];
|
||||
C -- 理解用户意图/分析电路状态 --> D{生成回应/指导};
|
||||
D -- 电路原理讲解 --> E[显示文本/图示解释];
|
||||
D -- 故障诊断提示 --> F[高亮可能故障点/提供检查步骤];
|
||||
D -- 实验优化建议 --> G[给出改进方案/参数调整提示];
|
||||
D -- 探究性引导 --> H[提出启发式问题/设置小挑战];
|
||||
E --> I[用户接收反馈, 继续学习/操作];
|
||||
F --> I;
|
||||
G --> I;
|
||||
H --> I;
|
||||
|
||||
subgraph "AI Agent交互模块"
|
||||
C
|
||||
D
|
||||
end
|
||||
|
||||
style A fill:#lightblue,stroke:#333,stroke-width:2px
|
||||
style I fill:#orange,stroke:#333,stroke-width:2px
|
||||
```
|
||||
|
||||
这个AI实验助手将传统的单向实验指导,转变为双向的、即时的、个性化的智能辅导,有助于弥补师资不足,并满足不同层次学生的学习需求。通过虚拟环境的方式,把识别和问答的AI进行分离,各司其职,通过直接给LLM传递结构化数据,有效避免了LLM分析图片的幻觉现象。
|
||||
|
||||
| AI分析复杂电路 | AI直接操作修改电路 |
|
||||
| ------------------------------------------------------------ | ------------------------------------------------------------ |
|
||||
| <img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615184921833.png" alt="image-20250615184921833" style="zoom: 50%;" /><br /><center>图4-8 AI智能电路分析界面</center> | <img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615184724178.png" alt="image-20250615184724178" style="zoom: 50%;" /><br /><center>图4-9 AI辅助电路修改界面</center> |
|
||||
|
||||
## 5. 项目创新点与特色
|
||||
|
||||
力学实验的智能分析与电学实验的虚实结合,并非本平台两个孤立的功能模块,而是其**统一AI/CV核心框架在不同物理领域的具体应用和能力展示**,这两个模块体现了AI辅助思路在物理实验的各方面都可以发挥作用,这种统一性是平台未来向“全能型”物理实验辅助工具发展的基石。
|
||||
|
||||
### 5.1. 通用技术栈与模块化架构:赋能多领域拓展
|
||||
|
||||
从技术层面看,平台内不同物理实验应用均构建在统一的Web前端架构之上。它们共享用户界面框架、摄像头调用接口、图像/数据处理的JavaScript库(如OpenCV.js, TensorFlow.js),以及后端服务。平台采用高度模块化的设计思想,使得每一种物理实验的特定分析逻辑(如单摆的周期拟合、电路的拓扑生成)都可以作为独立但兼容的模块集成进来。这种设计不仅保证了用户体验的一致性,更为未来无缝拓展至光学(如利用CV分析衍射条纹)、热学(如追踪热膨胀过程)等更多物理实验领域铺平了道路。
|
||||
|
||||
### 5.2. AI在数据获取、分析、交互与评估中的核心引擎作用
|
||||
|
||||
更深层次的统一性体现在AI在本平台中扮演的**核心引擎**角色,其作用贯穿所有实验类型和应用场景:
|
||||
|
||||
* **AI驱动的智能感知**:无论是通过CV追踪单摆的动态轨迹,还是识别电路板上的静态元件,本质都是AI模型(从传统算法到深度学习)在赋能机器“看懂”物理现象。
|
||||
* **AI驱动的深度分析与建模**:无论是拟合单摆的运动方程以提取 $g$ 值和阻尼,还是解析电路的拓扑结构以进行仿真,都是AI算法在从数据中挖掘物理规律、构建数学模型。
|
||||
* **AI驱动的智能交互与辅导**:无论是解读单摆实验的误差来源,还是在虚拟电路中解答学生疑问,都是AI Agent在提供个性化、情境化的学习支持。
|
||||
* **AI驱动的实验过程优化与评估**(未来展望):平台可以记录学生在不同实验中的操作数据和结果,AI可以分析这些数据,不仅用于评估学生的技能掌握,甚至可以反过来优化实验设计或平台的引导策略。
|
||||
|
||||
因此,力学和电学的应用实例,仅仅是这个强大AI引擎驱动下的“冰山一角”,它们共同验证了平台核心框架的有效性和通用性,充分展示了其发展成为一个覆盖广泛物理学科的**全能型AI实验平台**的巨大潜力。
|
||||
|
||||
### 5.3 应用前景与社会价值
|
||||
|
||||
“基于计算机视觉的AI物理实验辅助平台”具有广阔的应用前景和显著的社会价值:
|
||||
|
||||
1. **培养创新实践能力**:平台不仅辅助经典实验,其AI+CV的内核本身就是前沿科技应用的典范,能够激发学生对人工智能、计算机视觉等领域的兴趣,引导他们进行跨学科的创新实践。
|
||||
2. **推动实验教学模式改革**:**从“验证型”实验向“探究型”、“设计型”实验**转变提供了技术支撑。学生可以利用平台快速验证自己的实验设想,观察细微的物理效应,进行更深入的科学探究。
|
||||
3. **科研与科普潜力**:平台的高精度测量能力,使其不仅可用于教学,也可作为科研人员进行初步探索或数据采集的便捷工具。同时,其直观的可视化和交互性也使其成为优秀的物理科普工具。
|
||||
|
||||
我们相信,随着平台的进一步完善和推广,它将在K-12教育、高等教育乃至职业技能培训等多个层面发挥积极作用,为培养新时代的创新型科技人才贡献力量。
|
||||
|
||||
## 6. 总结与展望
|
||||
|
||||
本项目成功研发了一款“基于计算机视觉的AI物理实验辅助平台”,通过深度融合计算机视觉与人工智能技术,显著优化了经典物理实验的精度与体验,并创新性地构建了从实物电路到虚拟仿真与智能辅导的桥梁。单摆实验模块实现了对重力加速度 $g$ 的高精度测量(误差<0.5%)和系统误差的智能校正,并成功应用于傅科摆等复杂现象的初步分析。电路实验模块通过AI技术实现了真实电路的快速虚拟化,并集成了AI助手提供个性化学习支持。平台全程采用Web端技术,实现了低成本、跨平台的便捷应用。这些应用,证明了AI物理实验辅助的可行性,我们相信,AI赋能的实验辅助在未来的教育市场中,能发挥出巨大作用。
|
||||
|
||||
展望未来,我们将继续深化平台的AI能力:
|
||||
* **拓展更多实验模块**:逐步覆盖光学(如衍射条纹分析)、热学(如热膨胀形变追踪)等更多物理分支的经典实验。
|
||||
* **增强AI模型性能**:引入更先进的CV算法(如自监督学习关键点跟踪)和AI模型(如符号回归模型SINDy、AI Feynman自动发现物理方程),进一步提升平台的智能化水平和物理洞察力。
|
||||
* **完善AI Agent功能**:提升AI助手的自然语言理解能力、知识库广度与深度,使其能应对更复杂的提问和更开放的探究场景。
|
||||
* **构建实验数据共享与协作社区**:允许师生共享实验数据、模型和发现,形成一个教学相长的在线物理实验社区。
|
||||
* **探索自适应实验设计**:未来甚至可以研究让AI根据学习目标和当前数据,智能推荐或调整实验参数(如摆长、初始振幅、电路元件值等),实现“AI智能调参实验台”。
|
||||
|
||||
我们坚信,AI与CV技术必将为物理实验教学带来一场深刻的革命。本平台作为这一趋势的积极探索者,致力于让每一位学生都能在AI的辅助下,更轻松、更精准、更深入地感知物理之美,探索科学之秘。
|
||||
@ -2,7 +2,7 @@
|
||||
title: 基于CV的单摆实验优化方案——实验进度与总结
|
||||
desc: 单摆是一种经典的实验方法,用于测定重力加速度 $g$,但传统方法(例如用秒表计时)存在局限性。由于人类反应时间以及小角度近似的限制,所测得的 $g$ 往往存在几百分点的误差。我们的实验利用计算机视觉获取高质量的摆球位置-时间数据,应用数学模型提取周期信息,最后通过非线性拟合消除大振幅和阻尼影响,测得准确的重力加速度值并评估空气阻力特性。
|
||||
author: feie9454
|
||||
date: 2025-05-11
|
||||
date: 2025-05-30
|
||||
tags: 计算机、物理、竞赛
|
||||
---
|
||||
|
||||
@ -50,7 +50,66 @@ tags: 计算机、物理、竞赛
|
||||
|
||||
## 2025.3.29
|
||||
|
||||
1. 通过4种不同摆长测量并拟合公式$L \propto T^2$,最终误差降至0.43%,拟合精度极高。
|
||||
1. 通过4种不同摆长测量并拟合公式 $ L \propto T^2 $,最终误差降至0.43%,拟合精度极高。
|
||||
|
||||
#### **一、实验摘要**
|
||||
|
||||
| **指标** | **数值** | **说明** |
|
||||
| ------------------ | ------------------------------------------------------- | -------------------------------- |
|
||||
| **平均重力加速度** | **9.7576 ± 0.0147 m/s²** | 四次实验均值(95 %置信区间) |
|
||||
| 单次测量值 | g₁ = 9.7498、g₂ = 9.7746、g₃ = 9.7411、g₄ = 9.7650 m/s² | |
|
||||
| 标准差 σ | 0.0147 m/s² | 公式 σ = √[Σ(xᵢ − x̄)² / (n − 1)] |
|
||||
| 相对标准值误差 | 0.43 % | |
|
||||
|
||||
| **指标** | **数值** | **说明** |
|
||||
| -------------- | ------------------------ | -------------------- |
|
||||
| **线性拟合 g** | **9.9063 ± 0.0121 m/s²** | 由 T²–L 拟合斜率计算 |
|
||||
| 拟合斜率 | 3.9852 ± 0.0034 | g = 4π²/斜率 |
|
||||
| 拟合标准误差 | 0.0017 | |
|
||||
| 相对标准值误差 | 1.08 % | |
|
||||
| 拟合优度 R² | 1.0000 | |
|
||||
|
||||
| **拟合方程** | **标准 g₀** | **平均测量 ḡ** | **差值 Δ** |
|
||||
| ---------------------------------------- | ----------- | -------------- | ----------- |
|
||||
| **T² = 3.9852 L + 0.0404 (R² = 1.0000)** | 9.8000 m/s² | 9.7576 m/s² | 0.0424 m/s² |
|
||||
|
||||
#### **二、实验数据详情**
|
||||
|
||||
### **1. 基本参数**
|
||||
|
||||
| **实验编号** | **摆长 L (m)** | **周期 T (s)** | **周期平方 T² (s²)** | **角频率 ω (rad/s)** | **初始振幅 θ₀ (rad)** | **相位 φ (rad)** | **周期数量 N** |
|
||||
| ------------ | -------------- | -------------- | -------------------- | -------------------- | --------------------- | ---------------- | -------------- |
|
||||
| 1 | 0.5490 | 1.4921 | 2.2264 | 4.2111 | 0.1559 | −0.5596 | 294 |
|
||||
| 2 | 0.4040 | 1.2846 | 1.6502 | 4.8911 | 0.3166 | 1.6707 | 273 |
|
||||
| 3 | 0.4480 | 1.3516 | 1.8268 | 4.6487 | 0.2821 | −2.1701 | 273 |
|
||||
| 4 | 0.6180 | 1.5825 | 2.5043 | 3.9704 | 0.2183 | −1.7966 | 360 |
|
||||
|
||||
### **2. 阻尼参数**
|
||||
|
||||
| **实验编号** | **阻尼系数 γ (s⁻¹)** | **相对阻尼系数 b/m (s⁻¹)** | **γ 的标准差** |
|
||||
| ------------ | -------------------- | -------------------------- | -------------- |
|
||||
| 1 | 0.0023 | 0.0046 | 0.000008 |
|
||||
| 2 | 0.0026 | 0.0051 | 0.000065 |
|
||||
| 3 | 0.0025 | 0.0050 | 0.000023 |
|
||||
| 4 | 0.0022 | 0.0044 | 0.000007 |
|
||||
|
||||
### **3. 重力加速度计算**
|
||||
|
||||
| **实验编号** | **拟合得到 g (m/s²)** | **无阻尼 g (m/s²)** | **全面修正后 g (m/s²)** | **最大偏差 (%)** |
|
||||
| ------------ | --------------------- | ------------------- | ----------------------- | ---------------- |
|
||||
| 1 | 9.7355 | 9.7355 | 9.7498 | 2.24 |
|
||||
| 2 | 9.6648 | 9.6648 | 9.7746 | 4.17 |
|
||||
| 3 | 9.6815 | 9.6815 | 9.7411 | 2.48 |
|
||||
| 4 | 9.7421 | 9.7421 | 9.7650 | 2.13 |
|
||||
|
||||
### **4. 像素与坐标数据**
|
||||
|
||||
| **实验编号** | **摆长 (像素)** | **实际摆长 (mm)** | **像素→米转换系数** | **支点 X (像素)** | **支点 Y (像素)** |
|
||||
| ------------ | --------------- | ----------------- | ------------------- | ----------------- | ----------------- |
|
||||
| 1 | 3090.06 | 549 | 0.177666 | 1375.41 | −2630.58 |
|
||||
| 2 | 1954.91 | 404 | 0.206659 | 1270.15 | −1675.48 |
|
||||
| 3 | 2608.85 | 448 | 0.171723 | 1370.59 | −2360.96 |
|
||||
| 4 | 3413.14 | 618 | 0.181065 | 1458.18 | −2939.74 |
|
||||
|
||||
-->(/resources/Phy-exp/report0329.html)
|
||||
|
||||
@ -236,3 +295,4 @@ $$
|
||||
## 2025/5/18
|
||||
|
||||
-->V(/resources/Phy-exp/WebDemo.mp4)
|
||||
|
||||
|
||||
67
src/components/MermaidRenderer.vue
Normal file
@ -0,0 +1,67 @@
|
||||
<template>
|
||||
<div ref="container" class="mermaid-container"></div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, nextTick } from 'vue'
|
||||
|
||||
interface Props {
|
||||
code: string
|
||||
id?: string
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
id: () => `mermaid-${Math.random().toString(36).substr(2, 9)}`
|
||||
})
|
||||
|
||||
const container = ref<HTMLElement>()
|
||||
|
||||
onMounted(async () => {
|
||||
try {
|
||||
// 动态导入 mermaid
|
||||
const { default: mermaid } = await import('mermaid')
|
||||
|
||||
// 初始化 mermaid
|
||||
mermaid.initialize({
|
||||
securityLevel: 'loose',
|
||||
startOnLoad: false
|
||||
})
|
||||
|
||||
await nextTick()
|
||||
|
||||
if (container.value && props.code) {
|
||||
// 清空容器
|
||||
container.value.innerHTML = ''
|
||||
|
||||
// 渲染图表
|
||||
const { svg } = await mermaid.render(props.id, props.code)
|
||||
container.value.innerHTML = svg
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Mermaid rendering error:', error)
|
||||
if (container.value) {
|
||||
container.value.innerHTML = `<div class="alert alert-danger">Mermaid rendering failed: ${error}</div>`
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.mermaid-container {
|
||||
text-align: center;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.alert {
|
||||
padding: 0.75rem 1.25rem;
|
||||
margin-bottom: 1rem;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
|
||||
.alert-danger {
|
||||
color: #721c24;
|
||||
background-color: #f8d7da;
|
||||
border-color: #f5c6cb;
|
||||
}
|
||||
</style>
|
||||
19
src/main.ts
@ -2,6 +2,7 @@ import './assets/main.scss'
|
||||
import './assets/markdown.scss'
|
||||
import 'normalize.css'
|
||||
import 'highlight.js/styles/github.css';
|
||||
import { initializeMermaidPlaceholders } from './utils/mermaid-client'
|
||||
|
||||
|
||||
import { createApp } from 'vue'
|
||||
@ -12,4 +13,22 @@ const app = createApp(App)
|
||||
|
||||
app.use(router)
|
||||
|
||||
// 监听路由变化,重新初始化 Mermaid
|
||||
router.afterEach(async () => {
|
||||
// 等待 DOM 更新
|
||||
await new Promise(resolve => setTimeout(resolve, 100));
|
||||
initializeMermaidPlaceholders();
|
||||
});
|
||||
|
||||
app.mount('#app')
|
||||
|
||||
// 初始化 Mermaid(页面首次加载)
|
||||
if (typeof window !== 'undefined') {
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
setTimeout(initializeMermaidPlaceholders, 100);
|
||||
});
|
||||
} else {
|
||||
setTimeout(initializeMermaidPlaceholders, 100);
|
||||
}
|
||||
}
|
||||
|
||||
32
src/plugins/markdown-it-mermaid-ssr.ts
Normal file
@ -0,0 +1,32 @@
|
||||
// SSR-compatible mermaid plugin for markdown-it
|
||||
export default function mermaidSSR(md: any, options: any = {}) {
|
||||
function getLangName(info: string) {
|
||||
return info.split(/\s+/g)[0];
|
||||
}
|
||||
|
||||
// Store reference to original renderer.
|
||||
let defaultFenceRenderer = md.renderer.rules.fence;
|
||||
|
||||
// Render custom code types as placeholder div in SSR, letting the fence parser do all the heavy lifting.
|
||||
function customFenceRenderer(tokens: any[], idx: number, options: any, env: any, slf: any) {
|
||||
let token = tokens[idx];
|
||||
let info = token.info.trim();
|
||||
let langName = info ? getLangName(info) : "";
|
||||
|
||||
if (["mermaid", "{mermaid}"].indexOf(langName) === -1) {
|
||||
if (defaultFenceRenderer !== undefined) {
|
||||
return defaultFenceRenderer(tokens, idx, options, env, slf);
|
||||
}
|
||||
// Missing fence renderer!
|
||||
return "";
|
||||
}
|
||||
|
||||
// In SSR environment, return a placeholder that will be processed on the client
|
||||
const mermaidCode = token.content.trim();
|
||||
const encodedCode = encodeURIComponent(mermaidCode);
|
||||
|
||||
return `<div class="mermaid-placeholder" data-mermaid="${encodedCode}">${mermaidCode}</div>`;
|
||||
}
|
||||
|
||||
md.renderer.rules.fence = customFenceRenderer;
|
||||
}
|
||||
63
src/utils/mermaid-client.ts
Normal file
@ -0,0 +1,63 @@
|
||||
// 客户端 Mermaid 渲染器
|
||||
let mermaidInstance: any = null;
|
||||
|
||||
export async function initializeMermaidPlaceholders() {
|
||||
// 查找所有 mermaid placeholder
|
||||
const placeholders = document.querySelectorAll('.mermaid-placeholder');
|
||||
|
||||
console.log('Found mermaid placeholders:', placeholders.length);
|
||||
|
||||
if (placeholders.length === 0) return;
|
||||
|
||||
try {
|
||||
// 动态导入 mermaid (如果还没有导入)
|
||||
if (!mermaidInstance) {
|
||||
const { default: mermaid } = await import('mermaid');
|
||||
mermaidInstance = mermaid;
|
||||
|
||||
// 初始化 mermaid
|
||||
mermaidInstance.initialize({
|
||||
securityLevel: 'loose',
|
||||
startOnLoad: false
|
||||
});
|
||||
}
|
||||
|
||||
// 处理每个 placeholder
|
||||
for (let i = 0; i < placeholders.length; i++) {
|
||||
const placeholder = placeholders[i] as HTMLElement;
|
||||
const encodedCode = placeholder.getAttribute('data-mermaid');
|
||||
|
||||
if (!encodedCode) {
|
||||
console.log('No encoded code found for placeholder');
|
||||
continue;
|
||||
}
|
||||
|
||||
const code = decodeURIComponent(encodedCode);
|
||||
const id = `mermaid-${Math.random().toString(36).substr(2, 9)}`;
|
||||
|
||||
console.log('Rendering mermaid with code:', code);
|
||||
|
||||
try {
|
||||
// 渲染图表
|
||||
const { svg } = await mermaidInstance.render(id, code);
|
||||
|
||||
// 创建新的容器
|
||||
const container = document.createElement('div');
|
||||
container.className = 'mermaid-container';
|
||||
container.innerHTML = svg;
|
||||
|
||||
// 替换 placeholder
|
||||
placeholder.parentNode?.replaceChild(container, placeholder);
|
||||
|
||||
console.log('Successfully rendered mermaid diagram');
|
||||
} catch (error) {
|
||||
console.error('Mermaid rendering error:', error);
|
||||
placeholder.innerHTML = `<div class="alert alert-danger">Mermaid rendering failed: ${error}</div>`;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load mermaid:', error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -58,7 +58,7 @@ const moveBlogInfoAfterTitle = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
/* // 当组件挂载后,执行移动操作
|
||||
// 当组件挂载后,执行移动操作
|
||||
onMounted(() => {
|
||||
// 由于 markdown 内容可能是异步加载的,需要等待 DOM 更新后再执行移动操作
|
||||
watch(() => mdComponent.value, async () => {
|
||||
@ -78,7 +78,7 @@ const blogInfo = computed(() => {
|
||||
date: mdComponent.value?.frontmatter.date,
|
||||
tags: mdComponent.value?.frontmatter.tags.split('、'),
|
||||
}
|
||||
}) */
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
@ -87,7 +87,7 @@ const blogInfo = computed(() => {
|
||||
<div v-if="!mdComponent">加载中...</div>
|
||||
<div v-else>
|
||||
<component :is="mdComponent.default" />
|
||||
<!-- <div ref="blogInfoRef" class="blog-info">
|
||||
<div ref="blogInfoRef" class="blog-info">
|
||||
<div class="meta-info">
|
||||
<span v-if="blogInfo.author" class="meta-item author">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
@ -117,7 +117,7 @@ const blogInfo = computed(() => {
|
||||
</div>
|
||||
</div>
|
||||
<p v-if="blogInfo.desc" class="description" v-html="md.render(blogInfo.desc)"></p>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</template>
|
||||
|
||||
@ -14,6 +14,7 @@ import { getStaticRoutes } from './src/router/routes';
|
||||
import matter from 'gray-matter';
|
||||
import expandableMediaPlugin from './src/plugins/markdown-it-expandable-media'
|
||||
import blogInfoPlugin from './src/plugins/markdown-it-blog-info';
|
||||
import mermaidSSR from './src/plugins/markdown-it-mermaid-ssr';
|
||||
import hljs from 'highlight.js'
|
||||
|
||||
// https://vite.dev/config/
|
||||
@ -105,7 +106,7 @@ export default defineConfig({
|
||||
return ''; // use external default escaping
|
||||
}
|
||||
},
|
||||
markdownItUses: [MarkdownItKatex, expandableMediaPlugin, blogInfoPlugin]
|
||||
markdownItUses: [MarkdownItKatex, mermaidSSR, expandableMediaPlugin, blogInfoPlugin]
|
||||
}),
|
||||
minipic({
|
||||
sharpOptions: {
|
||||
|
||||