Jelajahi Sumber

feat:新增mindMap组件

hanyang 1 tahun lalu
induk
melakukan
6edd508f24

+ 726 - 8
package-lock.json

@@ -23,6 +23,9 @@
         "js-cookie": "3.0.5",
         "jsencrypt": "3.3.1",
         "lodash-es": "4.17.21",
+        "markmap-common": "^0.18.9",
+        "markmap-lib": "^0.18.11",
+        "markmap-view": "^0.18.10",
         "md5": "2.3.0",
         "mitt": "3.0.1",
         "pinia": "2.2.8",
@@ -1661,6 +1664,14 @@
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
+    "node_modules/@gera2ld/jsx-dom": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/@gera2ld/jsx-dom/-/jsx-dom-2.2.2.tgz",
+      "integrity": "sha512-EOqf31IATRE6zS1W1EoWmXZhGfLAoO9FIlwTtHduSrBdud4npYBxYAkv8dZ5hudDPwJeeSjn40kbCL4wAzr8dA==",
+      "dependencies": {
+        "@babel/runtime": "^7.21.5"
+      }
+    },
     "node_modules/@humanfs/core": {
       "version": "0.19.1",
       "resolved": "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.1.tgz",
@@ -2588,6 +2599,14 @@
         "vue": "^3.2.25"
       }
     },
+    "node_modules/@vscode/markdown-it-katex": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/@vscode/markdown-it-katex/-/markdown-it-katex-1.1.1.tgz",
+      "integrity": "sha512-3KTlbsRBPJQLE2YmLL7K6nunTlU+W9T5+FjfNdWuIUKgxSS6HWLQHaO3L4MkJi7z7MpIPpY+g4N+cWNBPE/MSA==",
+      "dependencies": {
+        "katex": "^0.16.4"
+      }
+    },
     "node_modules/@vue/babel-helper-vue-transform-on": {
       "version": "1.2.5",
       "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz",
@@ -3354,8 +3373,7 @@
     "node_modules/argparse": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-      "dev": true
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
     },
     "node_modules/array-find-index": {
       "version": "1.0.2",
@@ -4026,8 +4044,7 @@
     "node_modules/boolbase": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
-      "dev": true
+      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
     },
     "node_modules/brace-expansion": {
       "version": "1.1.11",
@@ -4377,6 +4394,163 @@
         "node": "*"
       }
     },
+    "node_modules/cheerio": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/cheerio/-/cheerio-1.0.0.tgz",
+      "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==",
+      "dependencies": {
+        "cheerio-select": "^2.1.0",
+        "dom-serializer": "^2.0.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.1.0",
+        "encoding-sniffer": "^0.2.0",
+        "htmlparser2": "^9.1.0",
+        "parse5": "^7.1.2",
+        "parse5-htmlparser2-tree-adapter": "^7.0.0",
+        "parse5-parser-stream": "^7.1.2",
+        "undici": "^6.19.5",
+        "whatwg-mimetype": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=18.17"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+      }
+    },
+    "node_modules/cheerio-select": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz",
+      "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-select": "^5.1.0",
+        "css-what": "^6.1.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/cheerio-select/node_modules/css-select": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmmirror.com/css-select/-/css-select-5.1.0.tgz",
+      "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-what": "^6.1.0",
+        "domhandler": "^5.0.2",
+        "domutils": "^3.0.1",
+        "nth-check": "^2.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/cheerio-select/node_modules/dom-serializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz",
+      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/cheerio-select/node_modules/domhandler": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz",
+      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+      "dependencies": {
+        "domelementtype": "^2.3.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/cheerio-select/node_modules/domutils": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.2.2.tgz",
+      "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+      "dependencies": {
+        "dom-serializer": "^2.0.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/cheerio-select/node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/cheerio/node_modules/dom-serializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz",
+      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/cheerio/node_modules/domhandler": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz",
+      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+      "dependencies": {
+        "domelementtype": "^2.3.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/cheerio/node_modules/domutils": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.2.2.tgz",
+      "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+      "dependencies": {
+        "dom-serializer": "^2.0.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/cheerio/node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
     "node_modules/chokidar": {
       "version": "3.6.0",
       "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
@@ -4687,7 +4861,6 @@
       "version": "6.1.0",
       "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz",
       "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
-      "dev": true,
       "engines": {
         "node": ">= 6"
       },
@@ -4756,6 +4929,46 @@
         "url": "https://github.com/imagemin/cwebp-bin?sponsor=1"
       }
     },
+    "node_modules/d3": {
+      "version": "7.9.0",
+      "resolved": "https://registry.npmmirror.com/d3/-/d3-7.9.0.tgz",
+      "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
+      "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"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/d3-array": {
       "version": "3.2.4",
       "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.4.tgz",
@@ -4767,11 +4980,45 @@
         "node": ">=12"
       }
     },
+    "node_modules/d3-axis": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz",
+      "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/d3-binarytree": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/d3-binarytree/-/d3-binarytree-1.0.2.tgz",
       "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw=="
     },
+    "node_modules/d3-brush": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/d3-brush/-/d3-brush-3.0.0.tgz",
+      "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "3",
+        "d3-transition": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-chord": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/d3-chord/-/d3-chord-3.0.1.tgz",
+      "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
+      "dependencies": {
+        "d3-path": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/d3-color": {
       "version": "3.1.0",
       "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz",
@@ -4780,6 +5027,28 @@
         "node": ">=12"
       }
     },
+    "node_modules/d3-contour": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/d3-contour/-/d3-contour-4.0.2.tgz",
+      "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
+      "dependencies": {
+        "d3-array": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-delaunay": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+      "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
+      "dependencies": {
+        "delaunator": "5"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/d3-dispatch": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
@@ -4788,6 +5057,18 @@
         "node": ">=12"
       }
     },
+    "node_modules/d3-drag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz",
+      "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-selection": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/d3-dsv": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz",
@@ -4820,6 +5101,14 @@
         "node": ">= 10"
       }
     },
+    "node_modules/d3-ease": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz",
+      "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/d3-fetch": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-3.0.1.tgz",
@@ -4938,6 +5227,14 @@
         "node": ">=12"
       }
     },
+    "node_modules/d3-polygon": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz",
+      "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/d3-quadtree": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
@@ -4959,6 +5256,21 @@
       "resolved": "https://registry.npmmirror.com/d3-regression/-/d3-regression-1.3.10.tgz",
       "integrity": "sha512-PF8GWEL70cHHWpx2jUQXc68r1pyPHIA+St16muk/XRokETzlegj5LriNKg7o4LR0TySug4nHYPJNNRz/W+/Niw=="
     },
+    "node_modules/d3-scale": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz",
+      "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+      "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"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/d3-scale-chromatic": {
       "version": "3.1.0",
       "resolved": "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
@@ -4971,6 +5283,14 @@
         "node": ">=12"
       }
     },
+    "node_modules/d3-selection": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz",
+      "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/d3-shape": {
       "version": "3.2.0",
       "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz",
@@ -4982,6 +5302,28 @@
         "node": ">=12"
       }
     },
+    "node_modules/d3-time": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz",
+      "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+      "dependencies": {
+        "d3-array": "2 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-time-format": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz",
+      "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+      "dependencies": {
+        "d3-time": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/d3-timer": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz",
@@ -4990,6 +5332,39 @@
         "node": ">=12"
       }
     },
+    "node_modules/d3-transition": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz",
+      "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
+      "dependencies": {
+        "d3-color": "1 - 3",
+        "d3-dispatch": "1 - 3",
+        "d3-ease": "1 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-timer": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "d3-selection": "2 - 3"
+      }
+    },
+    "node_modules/d3-zoom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz",
+      "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "2 - 3",
+        "d3-transition": "2 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/dagre": {
       "version": "0.8.5",
       "resolved": "https://registry.npmmirror.com/dagre/-/dagre-0.8.5.tgz",
@@ -5225,6 +5600,14 @@
         "node": ">=8"
       }
     },
+    "node_modules/delaunator": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.1.tgz",
+      "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==",
+      "dependencies": {
+        "robust-predicates": "^3.0.2"
+      }
+    },
     "node_modules/delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -5298,7 +5681,6 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
       "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
-      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -5421,6 +5803,18 @@
         "node": ">= 4"
       }
     },
+    "node_modules/encoding-sniffer": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz",
+      "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==",
+      "dependencies": {
+        "iconv-lite": "^0.6.3",
+        "whatwg-encoding": "^3.1.1"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
+      }
+    },
     "node_modules/end-of-stream": {
       "version": "1.4.4",
       "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -7115,6 +7509,75 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
+    "node_modules/htmlparser2": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-9.1.0.tgz",
+      "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==",
+      "funding": [
+        "https://github.com/fb55/htmlparser2?sponsor=1",
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.1.0",
+        "entities": "^4.5.0"
+      }
+    },
+    "node_modules/htmlparser2/node_modules/dom-serializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz",
+      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/htmlparser2/node_modules/domhandler": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz",
+      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+      "dependencies": {
+        "domelementtype": "^2.3.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/htmlparser2/node_modules/domutils": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.2.2.tgz",
+      "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+      "dependencies": {
+        "dom-serializer": "^2.0.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/htmlparser2/node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
     "node_modules/http-cache-semantics": {
       "version": "3.8.1",
       "resolved": "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
@@ -8186,6 +8649,29 @@
         "node": ">=8"
       }
     },
+    "node_modules/katex": {
+      "version": "0.16.21",
+      "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.21.tgz",
+      "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==",
+      "funding": [
+        "https://opencollective.com/katex",
+        "https://github.com/sponsors/katex"
+      ],
+      "dependencies": {
+        "commander": "^8.3.0"
+      },
+      "bin": {
+        "katex": "cli.js"
+      }
+    },
+    "node_modules/katex/node_modules/commander": {
+      "version": "8.3.0",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
+      "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
     "node_modules/keyv": {
       "version": "4.5.4",
       "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz",
@@ -8231,6 +8717,14 @@
         "immediate": "~3.0.5"
       }
     },
+    "node_modules/linkify-it": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-5.0.0.tgz",
+      "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+      "dependencies": {
+        "uc.micro": "^2.0.0"
+      }
+    },
     "node_modules/load-json-file": {
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/load-json-file/-/load-json-file-1.1.0.tgz",
@@ -8441,6 +8935,53 @@
       "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
       "dev": true
     },
+    "node_modules/markdown-it": {
+      "version": "14.1.0",
+      "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-14.1.0.tgz",
+      "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+      "dependencies": {
+        "argparse": "^2.0.1",
+        "entities": "^4.4.0",
+        "linkify-it": "^5.0.0",
+        "mdurl": "^2.0.0",
+        "punycode.js": "^2.3.1",
+        "uc.micro": "^2.1.0"
+      },
+      "bin": {
+        "markdown-it": "bin/markdown-it.mjs"
+      }
+    },
+    "node_modules/markdown-it-ins": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/markdown-it-ins/-/markdown-it-ins-4.0.0.tgz",
+      "integrity": "sha512-sWbjK2DprrkINE4oYDhHdCijGT+MIDhEupjSHLXe5UXeVr5qmVxs/nTUVtgi0Oh/qtF+QKV0tNWDhQBEPxiMew=="
+    },
+    "node_modules/markdown-it-mark": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/markdown-it-mark/-/markdown-it-mark-4.0.0.tgz",
+      "integrity": "sha512-YLhzaOsU9THO/cal0lUjfMjrqSMPjjyjChYM7oyj4DnyaXEzA8gnW6cVJeyCrCVeyesrY2PlEdUYJSPFYL4Nkg=="
+    },
+    "node_modules/markdown-it-sub": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/markdown-it-sub/-/markdown-it-sub-2.0.0.tgz",
+      "integrity": "sha512-iCBKgwCkfQBRg2vApy9vx1C1Tu6D8XYo8NvevI3OlwzBRmiMtsJ2sXupBgEA7PPxiDwNni3qIUkhZ6j5wofDUA=="
+    },
+    "node_modules/markdown-it-sup": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/markdown-it-sup/-/markdown-it-sup-2.0.0.tgz",
+      "integrity": "sha512-5VgmdKlkBd8sgXuoDoxMpiU+BiEt3I49GItBzzw7Mxq9CxvnhE/k09HFli09zgfFDRixDQDfDxi0mgBCXtaTvA=="
+    },
+    "node_modules/markdown-it/node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
     "node_modules/marked": {
       "version": "15.0.4",
       "resolved": "https://registry.npmmirror.com/marked/-/marked-15.0.4.tgz",
@@ -8453,6 +8994,63 @@
         "node": ">= 18"
       }
     },
+    "node_modules/markmap-common": {
+      "version": "0.18.9",
+      "resolved": "https://registry.npmmirror.com/markmap-common/-/markmap-common-0.18.9.tgz",
+      "integrity": "sha512-MV2HQO7IGIm3jWEJXSG8vmdpqf4WIDXcEyAEN52lrWR1qD53Zg5l81JwjXoZ2l0rY5mofKYqUFlmdM2fqTGMVg==",
+      "dependencies": {
+        "@babel/runtime": "^7.22.6",
+        "@gera2ld/jsx-dom": "^2.2.2",
+        "npm2url": "^0.2.4"
+      }
+    },
+    "node_modules/markmap-html-parser": {
+      "version": "0.18.11",
+      "resolved": "https://registry.npmmirror.com/markmap-html-parser/-/markmap-html-parser-0.18.11.tgz",
+      "integrity": "sha512-+kC5C4sCGntGUhGvTa5VIb5rtM75cSy/VCy3tzZoNAcn2qZGdgYvljN0WvjsOzrEzp+V6XKgwzO0u2TdzNAiOg==",
+      "dependencies": {
+        "@babel/runtime": "^7.22.6",
+        "cheerio": "1.0.0"
+      },
+      "peerDependencies": {
+        "markmap-common": "*"
+      }
+    },
+    "node_modules/markmap-lib": {
+      "version": "0.18.11",
+      "resolved": "https://registry.npmmirror.com/markmap-lib/-/markmap-lib-0.18.11.tgz",
+      "integrity": "sha512-2mBWrWRdK61W5//FlJ0zN20vi+/oVlPtnydyO3xR+0E2bhiTLNPjFwRi0h2RrdT/hUiiHV98s9iRckwXEhDtJg==",
+      "dependencies": {
+        "@babel/runtime": "^7.22.6",
+        "@vscode/markdown-it-katex": "^1.1.0",
+        "highlight.js": "^11.8.0",
+        "katex": "^0.16.8",
+        "markdown-it": "^14.1.0",
+        "markdown-it-ins": "^4.0.0",
+        "markdown-it-mark": "^4.0.0",
+        "markdown-it-sub": "^2.0.0",
+        "markdown-it-sup": "^2.0.0",
+        "markmap-html-parser": "0.18.11",
+        "markmap-view": "0.18.10",
+        "prismjs": "^1.29.0",
+        "yaml": "^2.5.1"
+      },
+      "peerDependencies": {
+        "markmap-common": "*"
+      }
+    },
+    "node_modules/markmap-view": {
+      "version": "0.18.10",
+      "resolved": "https://registry.npmmirror.com/markmap-view/-/markmap-view-0.18.10.tgz",
+      "integrity": "sha512-2Wi/HpOHwhDjw+Lj6/CoZzWtxvAF2ymkjCpexJKC1uYQERqMhja8Rr5d5hww7oVAith80Bsr6h+ZIYQGgxnhdQ==",
+      "dependencies": {
+        "@babel/runtime": "^7.22.6",
+        "d3": "^7.8.5"
+      },
+      "peerDependencies": {
+        "markmap-common": "*"
+      }
+    },
     "node_modules/math-intrinsics": {
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -8499,6 +9097,11 @@
       "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
       "dev": true
     },
+    "node_modules/mdurl": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-2.0.0.tgz",
+      "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="
+    },
     "node_modules/meow": {
       "version": "3.7.0",
       "resolved": "https://registry.npmmirror.com/meow/-/meow-3.7.0.tgz",
@@ -8923,11 +9526,15 @@
         "node": ">=8"
       }
     },
+    "node_modules/npm2url": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmmirror.com/npm2url/-/npm2url-0.2.4.tgz",
+      "integrity": "sha512-arzGp/hQz0Ey+ZGhF64XVH7Xqwd+1Q/po5uGiBbzph8ebX6T0uvt3N7c1nBHQNsQVykQgHhqoRTX7JFcHecGuw=="
+    },
     "node_modules/nth-check": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz",
       "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
-      "dev": true,
       "dependencies": {
         "boolbase": "^1.0.0"
       },
@@ -9234,6 +9841,65 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/parse5": {
+      "version": "7.2.1",
+      "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.2.1.tgz",
+      "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==",
+      "dependencies": {
+        "entities": "^4.5.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parse5-htmlparser2-tree-adapter": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+      "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+      "dependencies": {
+        "domhandler": "^5.0.3",
+        "parse5": "^7.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz",
+      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+      "dependencies": {
+        "domelementtype": "^2.3.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/parse5-parser-stream": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmmirror.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+      "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+      "dependencies": {
+        "parse5": "^7.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parse5/node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
     "node_modules/patch-package": {
       "version": "8.0.0",
       "resolved": "https://registry.npmmirror.com/patch-package/-/patch-package-8.0.0.tgz",
@@ -9635,6 +10301,14 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/prismjs": {
+      "version": "1.29.0",
+      "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz",
+      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -9686,6 +10360,14 @@
         "node": ">=6"
       }
     },
+    "node_modules/punycode.js": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/punycode.js/-/punycode.js-2.3.1.tgz",
+      "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/query-string": {
       "version": "5.1.1",
       "resolved": "https://registry.npmmirror.com/query-string/-/query-string-5.1.1.tgz",
@@ -10002,6 +10684,11 @@
         "rimraf": "bin.js"
       }
     },
+    "node_modules/robust-predicates": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz",
+      "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
+    },
     "node_modules/rollup": {
       "version": "4.34.6",
       "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.34.6.tgz",
@@ -11096,6 +11783,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/uc.micro": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-2.1.0.tgz",
+      "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="
+    },
     "node_modules/ufo": {
       "version": "1.5.4",
       "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz",
@@ -11112,6 +11804,14 @@
         "through": "^2.3.8"
       }
     },
+    "node_modules/undici": {
+      "version": "6.21.1",
+      "resolved": "https://registry.npmmirror.com/undici/-/undici-6.21.1.tgz",
+      "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==",
+      "engines": {
+        "node": ">=18.17"
+      }
+    },
     "node_modules/undici-types": {
       "version": "6.20.0",
       "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.20.0.tgz",
@@ -12258,6 +12958,25 @@
         "node": ">=4.0"
       }
     },
+    "node_modules/whatwg-encoding": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+      "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+      "dependencies": {
+        "iconv-lite": "0.6.3"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/whatwg-mimetype": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+      "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
@@ -12373,7 +13092,6 @@
       "version": "2.7.0",
       "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.7.0.tgz",
       "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
-      "dev": true,
       "bin": {
         "yaml": "bin.mjs"
       },

+ 3 - 0
package.json

@@ -46,6 +46,9 @@
     "js-cookie": "3.0.5",
     "jsencrypt": "3.3.1",
     "lodash-es": "4.17.21",
+    "markmap-common": "^0.18.9",
+    "markmap-lib": "^0.18.11",
+    "markmap-view": "^0.18.10",
     "md5": "2.3.0",
     "mitt": "3.0.1",
     "pinia": "2.2.8",

+ 13 - 0
patches/markmap-view+0.18.10.patch

@@ -0,0 +1,13 @@
+diff --git a/node_modules/markmap-view/dist/index.js b/node_modules/markmap-view/dist/index.js
+index e28a29f..7d2d6e2 100644
+--- a/node_modules/markmap-view/dist/index.js
++++ b/node_modules/markmap-view/dist/index.js
+@@ -565,7 +565,7 @@ class it {
+       if (!((h = l.payload) != null && h.fold)) return l.children;
+     }).nodeSize((l) => {
+       const [h, d] = l.data.state.size;
+-      return [d, h + (h ? i * 2 : 0) + n];
++      return [d, h + (h + 20 ? i * 2 + 20 : 0) + n];
+     }).spacing((l, h) => (l.parent === h.parent ? s : s * 2) + t(l.data)), c = a.hierarchy(this.state.data);
+     a(c);
+     const o = c.descendants();

TEMPAT SAMPAH
src/assets/chat-aside/aside-btn-expond.png


+ 475 - 0
src/components/MindMap.vue

@@ -0,0 +1,475 @@
+<template>
+  <div :style="box_style">
+    <svg xmlns="http://www.w3.org/2000/svg" :style="svg_style" ref="svgRef"></svg>
+  </div>
+</template>
+
+<script setup>
+import { ref, onMounted, onUpdated, watch } from 'vue';
+import { Markmap } from 'markmap-view';
+import * as markmap from 'markmap-view';
+import { loadJS, loadCSS } from 'markmap-common';
+import { Transformer } from 'markmap-lib';
+
+const transformer = new Transformer();
+const { scripts, styles } = transformer.getAssets();
+loadCSS(styles);
+loadJS(scripts, { getMarkmap: () => markmap });
+
+const props = defineProps({
+  /**
+   * Markmap 文档内容,此内容用于生成脑图节点数据
+   */
+  content: {
+    type: String
+  },
+  /**
+   * 外层div节点的样式
+   * 外层div节点是必须的,否则无法正常显示
+   */
+  box_style: {
+    type: Object,
+    default: {
+      width: '100%',
+      height: '100%'
+    }
+  },
+  /**
+   * svg节点的样式,svg节点用于呈现脑图效果
+   * 此处的尺寸为脑图实际的尺寸
+   * 此处的尺寸定义通常和 box_style 中尺寸定义一致,即宽度和高度一致
+   */
+  svg_style: {
+    type: Object,
+    default: {
+      width: '100%',
+      height: '100%'
+    }
+  },
+  /**
+   * 当点击扩展时的加载进度
+   */
+  progress: {
+    type: Number,
+    default: 0
+  }
+});
+
+const emits = defineEmits(['extend']);
+
+/**
+ * 文档1: https://markmap.js.org/api/classes/markmap-view.Markmap.html#findelement
+ * 文档中文:https://www.min2k.com/intro/online-markmap.html
+ * 在线编辑器:https://www.min2k.com/tools/markmap/
+ */
+
+const svgRef = ref();
+
+// 终点节点列表查找路径
+let end_node_list = [];
+let mark_map;
+let is_pause_observe = false; // 是否暂停DOM检测
+let plus_icon_list = [];
+let plus_icon_index = 1;
+let timer_progress = null;
+const targetEle = ref(null);
+/**
+ * 遍历脑图树种的每一个节点
+ * @param nd - 脑图树的节点
+ * @param path - 节点路径数组
+ */
+function loopTreeNode(nd, path) {
+  const child = nd.children;
+
+  const len = child.length;
+
+  if (len === 0) {
+    // 无子元素: 是终点元素
+    end_node_list.push(path);
+  } else {
+    // 有子元素
+    for (let i = 0; i < len; i++) {
+      const node = child[i];
+
+      const arr = JSON.parse(JSON.stringify(path));
+      arr.push(i);
+
+      loopTreeNode(node, arr);
+    }
+  }
+}
+
+const update = async (data) => {
+  const result = transformer.transform(data);
+  const root = result.root;
+
+  // 遍历数据
+  loopTreeNode(root, [0]);
+
+  await mark_map.setData(root);
+  mark_map.fit();
+
+  setTimeout(() => {
+    attachPlusIcon(root);
+    observeMindMapChanged(root);
+  }, 500);
+};
+
+const initMarkMap = (data) => {
+  mark_map = Markmap.create(svgRef.value, {
+    paddingX: 0,
+    // duration: 0,
+    lineWidth: (node) => {
+      return 1;
+    }
+  });
+  update(data);
+};
+
+const updateMarkMap = () => {
+  console.log('组件更新了吗??');
+  update(props.content);
+};
+
+function observeMindMapChanged(root_value) {
+  const observer = new MutationObserver((mutationsList) => {
+    if (is_pause_observe) {
+      // 被锁定,不做任何处理
+      return;
+    }
+
+    let remove_count = 0; // 移除的统计
+    let add_count = 0; // 添加的统计
+
+    mutationsList.forEach((mutation) => {
+      if (mutation.type === 'childList') {
+        if (mutation.addedNodes.length > 0) {
+          add_count = add_count + mutation.addedNodes.length;
+        }
+
+        if (mutation.removedNodes.length > 0) {
+          remove_count = remove_count + mutation.removedNodes.length;
+        }
+      } else if (mutation.type === 'attributes') {
+        // console.log('属性被修改了');
+      } else {
+        // console.log('其他');
+      }
+    });
+
+    /**
+     * 锁定观测:避免触发死循环
+     * 当Markmap自身的变化时,应该进行观测
+     * 当是我们自定义加入的节点(添加节点终端加号)时,应该停止观测,当节点添加完毕,再解锁
+     *
+     * 此处延迟进行节点添加与解锁,避免不小心卡死浏览器进程
+     */
+    is_pause_observe = true;
+    setTimeout(() => {
+      // 重新查找需要添加加号的节点,并进行设置
+      attachPlusIcon(root_value);
+
+      // setTimeout(() => {
+      //   // 解锁
+      //   is_pause_observe = false;
+      // }, 500);
+    });
+
+    if (remove_count !== 0) {
+      // 移除
+      console.log('折叠');
+    }
+
+    if (add_count !== 0) {
+      // 添加
+      console.log('展开');
+    }
+  });
+
+  const root_node = svgRef.value;
+  observer.observe(root_node, { childList: true, subtree: true });
+}
+
+/**
+ * 在 svg终点节点末尾添加加号图标
+ * @param root_value - 此处的参数是内部通过eval使用
+ */
+function attachPlusIcon(root_value) {
+  end_node_list.forEach((item, index) => {
+    // 根据路径数组,找到对应的节点
+    let str = item.toString();
+    str = str.replace(/,/g, '].children[');
+    str = 'root_value[' + str + ']';
+    str = str.replace('root_value[0].', 'root_value.');
+
+    let cur_node = null;
+    eval(`cur_node=${str}`);
+
+    const result = mark_map.findElement(cur_node);
+    if (!result) {
+      // console.log('找不到节点', cur_node, root_value, str);
+      return;
+    } else {
+      // console.log('找到节点');
+    }
+
+    const node_group = result.g; // svg g 元素
+    const node_data = result.data; // svg 元素数据
+
+    if (node_group) {
+      const foreign_ele = node_group.querySelectorAll('foreignObject.markmap-foreign');
+      // 在foreignObject节点中添加加号图标节点
+      foreign_ele.forEach((item) => {
+        // item.style.width = item.clientWidth + 20;
+
+        const child_count = item.childNodes.length;
+        if (child_count === 1) {
+          // 只有一个
+          const div = generatePlusIconDiv(node_data, root_value);
+          item.appendChild(div);
+          // append_index = append_index + 1;
+        } else {
+          // // 有两个
+          // // 移除最后一个子节点
+          // const last_child = item.lastChild;
+          // item.removeChild(last_child);
+        }
+      });
+    }
+  });
+}
+
+/**
+ * 生成加号图标的div节点
+ * @param node_data - 节点的数据
+ */
+function generatePlusIconDiv(node_data, root_data) {
+  const div = document.createElement('div');
+  div.setAttribute('class', 'mindmap-full-svg-extend-wrap');
+
+  const icon_wrap = document.createElement('div');
+  icon_wrap.setAttribute('class', 'mindmap-svg-icon-wrap');
+  icon_wrap.innerHTML = `
+      <svg width="16" height="16" class="mindmap-full-svg-extend" data-id="mindmap-full-extend-svg" xmlns="http://www.w3.org/1999/xhtml">
+        <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0Zm0 4c-.368 0-.667.283-.667.727v2.606H4.727l-.127.02c-.404.082-.6.34-.6.647 0 .368.283.667.727.667l2.606-.001v2.607l.02.127c.082.404.34.6.647.6.368 0 .667-.283.667-.727l-.001-2.607h2.607l.127-.019c.404-.082.6-.34.6-.647 0-.368-.283-.667-.727-.667H8.666V4.727L8.648 4.6C8.565 4.196 8.307 4 8 4Z" fill="#1D6FFF" fill-rule="evenodd"></path>
+      </svg>
+  `;
+
+  div.appendChild(icon_wrap);
+
+  const cur_index = plus_icon_index;
+  icon_wrap.setAttribute('data-index', cur_index);
+  icon_wrap.setAttribute('clickable', 1);
+
+  // 绑定点击事件
+  icon_wrap.addEventListener('click', function (e) {
+    const is_clickable = this.getAttribute('clickable') / 1;
+    if (is_clickable === 0) {
+      // 不可点击
+      return;
+    } else {
+    }
+
+    plus_icon_list.forEach((item) => {
+      const data_index = item.getAttribute('data-index') / 1;
+
+      if (data_index === cur_index) {
+        // 当前的序号
+        item.setAttribute('style', 'opacity: 1;cursor:pointer;');
+
+        mark_map.setOptions({
+          toggleRecursively: false
+        });
+
+        emits('extend', {
+          node: node_data, // 当前node的数据
+          full: root_data, // 全部node的数据
+          ele: item // 当前被点击的元素
+        });
+        targetEle.value = item;
+
+        // updateIconProgress(item)
+      } else {
+        // 其他的
+        item.setAttribute('clickable', 0);
+        item.setAttribute('style', 'opacity: 0.1;cursor:default;');
+      }
+    });
+  });
+
+  // 收集端点击加号
+  plus_icon_list.push(icon_wrap);
+  plus_icon_index = plus_icon_index + 1;
+
+  return div;
+}
+
+/**
+ * 生成进度节点
+ * @param count
+ */
+function genProgressSpan(count) {
+  return `<span style="font-size:10px;display: inline-block;text-align:center;">${count}%</span>`;
+}
+
+// /**
+//  * 更新进度
+//  * @param item
+//  */
+// function updateIconProgress(item) {
+//   if (timer_progress != null) {
+//     console.log('正在进行中,不用重复点击');
+//     return;
+//   }
+
+//   // 设置子元素为动态的加载进度
+//   let count = 0;
+//   item.innerHTML = genProgressSpan(count);
+
+//   timer_progress = setInterval(() => {
+//     is_pause_observe = true;
+//     count = count + 1;
+
+//     if (count > 100) {
+//       // 进度圆满
+//       clearInterval(timer_progress);
+
+//       is_pause_observe = false;
+//       end_node_list = [];
+//       // mark_map;
+//       is_pause_observe = false; // 是否暂停DOM检测
+//       plus_icon_list = [];
+//       plus_icon_index = 1;
+//       timer_progress = null;
+
+//       mark_map.destroy();
+//       mark_map = null;
+//       initMarkMap(props.content);
+//       return;
+//     }
+
+//     item.innerHTML = genProgressSpan(count);
+//   }, 50);
+// }
+
+watch(
+  () => props.content,
+  (newVal, oldVal) => {}
+);
+watch(
+  () => props.progress,
+  (newVal, oldVal) => {
+    console.log(newVal, oldVal, '--->>>');
+    if (newVal < 100) {
+      is_pause_observe = true;
+      if (targetEle.value) {
+        targetEle.value.innerHTML = genProgressSpan(newVal);
+      }
+    } else {
+      is_pause_observe = false;
+      // 重新加载mindMap
+      updateMarkMap();
+    }
+  }
+);
+
+onMounted(() => initMarkMap(props.content));
+onUpdated(updateMarkMap);
+</script>
+
+<style lang="css" scoped>
+.flex-1 {
+  width: 1000px;
+  height: 600px;
+
+  background-color: #ccc;
+}
+
+/* svg.mindmap-full-svg  */
+.mindmap-full-svg-extend-wrap svg {
+  color: #1d6fff;
+  cursor: pointer;
+}
+</style>
+
+<style>
+svg.mindmap-full-svg g g foreignObject {
+  overflow: visible;
+}
+
+svg.mindmap-full-svg g g foreignObject > div {
+  overflow: visible;
+}
+
+svg.mindmap-full-svg g g foreignObject > div .content-wrap {
+  color: rgba(0, 0, 0, 0.8);
+  cursor: pointer;
+}
+
+svg.mindmap-full-svg g g foreignObject > div .content-wrap:hover {
+  color: #000;
+  background-color: rgba(var(--color-bg-r), var(--color-bg-g), var(--color-bg-b), 0.2);
+  border-radius: 4px;
+}
+
+svg.mindmap-full-svg .mindmap-full-svg-extend-wrap {
+  float: none;
+}
+
+svg.mindmap-full-svg .mindmap-full-svg-extend-wrap .mindmap-svg-icon-wrap {
+  width: 16px;
+  height: 16px;
+}
+
+svg.mindmap-full-svg .mindmap-full-svg-extend-wrap .mindmap-svg-icon-wrap:hover:before {
+  content: '\5c55\5f00\5206\6790';
+  float: left;
+  margin-left: -22px;
+  margin-top: -30px;
+  width: 60px;
+  height: 24px;
+  box-sizing: border-box;
+  padding: 0;
+  line-height: 24px !important;
+  font-size: 12px !important;
+  font-weight: 400 !important;
+  font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif,
+    'Apple Color Emoji', 'Segoe UI Emoji', Segoe UI Symbol, 'Noto Color Emoji' !important;
+  text-align: center;
+  border-radius: 6px;
+  background-color: rgba(0, 0, 0, 0.85);
+  color: #fff;
+  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05);
+}
+
+svg.mindmap-full-svg .mindmap-full-svg-extend-wrap svg {
+  color: #1d6fff;
+  cursor: pointer;
+}
+
+svg.mindmap-full-svg .mindmap-full-svg-extend-wrap svg:hover {
+  color: #165ad2;
+}
+
+.markmap-foreign {
+  /* overflow: visible; */
+}
+
+.mindmap-full-svg-extend-wrap {
+  height: 16px;
+}
+.mindmap-svg-icon-wrap {
+  top: 4px;
+  position: absolute;
+  right: 0;
+  cursor: pointer;
+}
+
+.mindmap-svg-icon-wrap > svg {
+  transform: scale(0.7);
+}
+
+foreignObject.markmap-foreign > div {
+  display: inline-block;
+}
+</style>

+ 1 - 1
src/router/index.js

@@ -17,7 +17,7 @@ const router = createRouter({
  */
 
 /** 免验证白名单 */
-const whiteList = ['/login', '/reg', '/denied'];
+const whiteList = ['/login', '/reg', '/denied', '/'];
 
 /**
  * 需要登录的链接

+ 2 - 1
src/router/route.js

@@ -5,7 +5,8 @@ import Home from '../views/Home.vue';
  */
 export const systemRoutes = [
   // { path: '/', component: Home, redirect: '/chat/qa' },
-  { path: '/', component: Home, redirect: '/xiaoshu' },
+  // { path: '/', component: Home, redirect: '/xiaoshu' },
+  { path: '/', component: Home },
 
   // 登录与注册 白名单页面
   { path: '/login', component: () => import('../views/Login.vue') },

+ 7 - 0
src/views/ConversationQA.vue

@@ -37,6 +37,8 @@ import ChatAsideMenu from './conversation/ChatAsideMenu.vue';
 
 import ConversationChatContainer from './conversation/ConversationChatContainer.vue';
 
+import ChatAsideBtn from './conversation/ChatAsideBtn.vue';
+
 import { useAllAgentStore } from '../base/store/use-all-agents';
 import getChatAgentInfomation from '../modules/conversation-board/get-chat-agent-infomation';
 
@@ -289,3 +291,8 @@ onBeforeUpdate(async () => {
   await init();
 });
 </script>
+<style scoped>
+.icon-btn {
+  position: absolute;
+}
+</style>

+ 92 - 0
src/views/Home.vue

@@ -1,7 +1,99 @@
 <template>
   <div>SmartAI</div>
+  <div class="box">
+    <MindMap
+      :content="test_mk_str"
+      :box_style="box_style"
+      :svg_style="svg_style"
+      :progress="progress"
+      @extend="extend"
+    ></MindMap>
+  </div>
 </template>
 
 <script setup>
+import { ref, onMounted } from 'vue';
+import MindMap from '../components/MindMap.vue';
 // 系统第一页
+
+const mindMap_content = ref();
+const test_mk_str = `
+# markmap
+
+- beautiful
+- useful
+- easy
+  - hard
+  - code
+- interactive
+  - age
+  - name
+  - job
+    - shaa
+    - hhe
+    - nihao
+      - jfksaj
+    - zheg
+`;
+const test_mk_str_extend = `
+# markmap
+
+- beautiful
+- useful
+- easy
+  - hard
+  - code
+- interactive
+  - age
+  - name
+  - job
+    - shaa
+    - hhe
+    - nihao
+      - jfksaj
+    - zheg
+      - 张三
+      - 李四
+      - 王五
+      - 赵六
+      - 孙七
+`;
+
+const box_style = ref({
+  width: '100%',
+  height: '100%'
+});
+const svg_style = ref({
+  width: '100%',
+  height: '100%'
+});
+const progress = ref(0);
+const target_node = ref(null);
+const root_full = ref(null);
+let timer_progress = null;
+
+const extend = (item) => {
+  console.log(item);
+  target_node.value = item.node;
+  root_full.value = item.full;
+  progress.value = 0;
+  timer_progress = setInterval(() => {
+    if (progress.value < 100) {
+      progress.value += 1;
+    }
+    if (progress.value == 100) {
+      mindMap_content.value = test_mk_str_extend;
+    }
+  }, 30);
+};
+onMounted(() => {
+  mindMap_content.value = test_mk_str;
+});
 </script>
+<style scoped>
+.box {
+  width: 100%;
+  height: 800px;
+}
+</style>
+-

+ 0 - 0
src/views/conversation/ChatAsideExpand.vue


+ 12 - 0
src/views/conversation/ChatAsideExpandBtn.vue

@@ -0,0 +1,12 @@
+<template>
+  <!-- <img class="img-btn" src="../../assets/chat-aside/aside-btn-expond.png" alt="展开/收起" /> -->
+</template>
+
+<script setup></script>
+<style scoped lang="scss">
+.img-btn {
+  position: absolute;
+  right: 10px;
+  top: 30px;
+}
+</style>