no message

This commit is contained in:
KuroSago 2025-04-29 14:49:44 +08:00
parent 74cb238e43
commit f7bdc418c4
31 changed files with 3289 additions and 0 deletions

15
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,15 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "针对 localhost 启动 Chrome",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}"
}
]
}

12
web3/apps/web/index.html Normal file
View File

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Mind Map</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

690
web3/apps/web/package-lock.json generated Normal file
View File

@ -0,0 +1,690 @@
{
"name": "@mind-map/web",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@mind-map/web",
"version": "1.0.0",
"dependencies": {
"pinia": "^2.1.6",
"vue": "^3.3.4",
"vue-router": "^4.2.4"
},
"devDependencies": {
"@types/node": "^22.15.3",
"@typescript-eslint/eslint-plugin": "^6.2.1",
"@typescript-eslint/parser": "^6.2.1",
"@vitejs/plugin-vue": "^4.2.3",
"eslint": "^8.46.0",
"eslint-plugin-vue": "^9.16.1",
"sass": "^1.64.2",
"typescript": "^5.1.6",
"vite": "^4.4.9",
"vue-tsc": "^1.8.8"
}
},
"../../node_modules/.pnpm/@typescript-eslint+eslint-plugin@6.21.0_@typescript-eslint+parser@6.21.0_eslint@8.57.1__568544a48dea19c14ce8955143cbe955/node_modules/@typescript-eslint/eslint-plugin": {
"version": "6.21.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.5.1",
"@typescript-eslint/scope-manager": "6.21.0",
"@typescript-eslint/type-utils": "6.21.0",
"@typescript-eslint/utils": "6.21.0",
"@typescript-eslint/visitor-keys": "6.21.0",
"debug": "^4.3.4",
"graphemer": "^1.4.0",
"ignore": "^5.2.4",
"natural-compare": "^1.4.0",
"semver": "^7.5.4",
"ts-api-utils": "^1.0.1"
},
"devDependencies": {
"@prettier/sync": "*",
"@types/debug": "*",
"@types/marked": "*",
"@types/natural-compare": "*",
"@typescript-eslint/rule-schema-to-typescript-types": "6.21.0",
"@typescript-eslint/rule-tester": "6.21.0",
"ajv": "^6.12.6",
"chalk": "^5.3.0",
"cross-fetch": "*",
"grapheme-splitter": "^1.0.4",
"jest": "29.7.0",
"jest-specific-snapshot": "^8.0.0",
"json-schema": "*",
"markdown-table": "^3.0.3",
"marked": "^5.1.1",
"prettier": "^3.0.3",
"rimraf": "*",
"title-case": "^3.0.3",
"tsx": "*",
"typescript": "*"
},
"engines": {
"node": "^16.0.0 || >=18.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
"eslint": "^7.0.0 || ^8.0.0"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"../../node_modules/.pnpm/@typescript-eslint+parser@6.21.0_eslint@8.57.1_typescript@5.8.3/node_modules/@typescript-eslint/parser": {
"version": "6.21.0",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@typescript-eslint/scope-manager": "6.21.0",
"@typescript-eslint/types": "6.21.0",
"@typescript-eslint/typescript-estree": "6.21.0",
"@typescript-eslint/visitor-keys": "6.21.0",
"debug": "^4.3.4"
},
"devDependencies": {
"@types/glob": "*",
"downlevel-dts": "*",
"glob": "*",
"jest": "29.7.0",
"prettier": "^3.0.3",
"rimraf": "*",
"typescript": "*"
},
"engines": {
"node": "^16.0.0 || >=18.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"eslint": "^7.0.0 || ^8.0.0"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"../../node_modules/.pnpm/@vitejs+plugin-vue@4.6.2_vite@4.5.13_sass@1.87.0__vue@3.5.13_typescript@5.8.3_/node_modules/@vitejs/plugin-vue": {
"version": "4.6.2",
"dev": true,
"license": "MIT",
"devDependencies": {
"@jridgewell/gen-mapping": "^0.3.3",
"@jridgewell/trace-mapping": "^0.3.20",
"debug": "^4.3.4",
"rollup": "^3.29.4",
"slash": "^5.1.0",
"source-map-js": "^1.0.2",
"vite": "^4.5.0",
"vue": "^3.3.8"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"peerDependencies": {
"vite": "^4.0.0 || ^5.0.0",
"vue": "^3.2.25"
}
},
"../../node_modules/.pnpm/eslint-plugin-vue@9.33.0_eslint@8.57.1/node_modules/eslint-plugin-vue": {
"version": "9.33.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
"globals": "^13.24.0",
"natural-compare": "^1.4.0",
"nth-check": "^2.1.1",
"postcss-selector-parser": "^6.0.15",
"semver": "^7.6.3",
"vue-eslint-parser": "^9.4.3",
"xml-name-validator": "^4.0.0"
},
"devDependencies": {
"@ota-meshi/site-kit-eslint-editor-vue": "^0.2.4",
"@stylistic/eslint-plugin": "^2.12.1",
"@types/eslint": "^8.56.2",
"@types/eslint-visitor-keys": "^3.3.2",
"@types/natural-compare": "^1.4.3",
"@types/node": "^14.18.63",
"@types/semver": "^7.5.8",
"@types/xml-name-validator": "^4.0.3",
"@typescript-eslint/parser": "^7.18.0",
"@typescript-eslint/types": "^7.18.0",
"assert": "^2.1.0",
"env-cmd": "^10.1.0",
"esbuild": "^0.24.0",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-eslint-plugin": "~6.4.0",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsonc": "^2.16.0",
"eslint-plugin-node-dependencies": "^0.12.0",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-unicorn": "^56.0.0",
"eslint-plugin-vue": "file:.",
"espree": "^9.6.1",
"events": "^3.3.0",
"markdownlint-cli": "^0.42.0",
"mocha": "^10.7.3",
"nyc": "^17.1.0",
"pathe": "^1.1.2",
"prettier": "^3.3.3",
"typescript": "^5.7.2",
"vitepress": "^1.4.1"
},
"engines": {
"node": "^14.17.0 || >=16.0.0"
},
"peerDependencies": {
"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
"../../node_modules/.pnpm/eslint@8.57.1/node_modules/eslint": {
"version": "8.57.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.57.1",
"@humanwhocodes/config-array": "^0.13.0",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.2.2",
"eslint-visitor-keys": "^3.4.3",
"espree": "^9.6.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
"file-entry-cache": "^6.0.1",
"find-up": "^5.0.0",
"glob-parent": "^6.0.2",
"globals": "^13.19.0",
"graphemer": "^1.4.0",
"ignore": "^5.2.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"is-path-inside": "^3.0.3",
"js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
"optionator": "^0.9.3",
"strip-ansi": "^6.0.1",
"text-table": "^0.2.0"
},
"bin": {
"eslint": "bin/eslint.js"
},
"devDependencies": {
"@babel/core": "^7.4.3",
"@babel/preset-env": "^7.4.3",
"@sinonjs/fake-timers": "11.2.2",
"@wdio/browser-runner": "^8.14.6",
"@wdio/cli": "^8.14.6",
"@wdio/concise-reporter": "^8.14.0",
"@wdio/globals": "^8.14.6",
"@wdio/mocha-framework": "^8.14.0",
"babel-loader": "^8.0.5",
"c8": "^7.12.0",
"chai": "^4.0.1",
"cheerio": "^0.22.0",
"common-tags": "^1.8.0",
"core-js": "^3.1.3",
"ejs": "^3.0.2",
"eslint": "file:.",
"eslint-config-eslint": "file:packages/eslint-config-eslint",
"eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-eslint-plugin": "^5.2.1",
"eslint-plugin-internal-rules": "file:tools/internal-rules",
"eslint-plugin-jsdoc": "^46.2.5",
"eslint-plugin-n": "^16.6.0",
"eslint-plugin-unicorn": "^49.0.0",
"eslint-release": "^3.3.0",
"eslump": "^3.0.0",
"esprima": "^4.0.1",
"fast-glob": "^3.2.11",
"fs-teardown": "^0.1.3",
"glob": "^7.1.6",
"got": "^11.8.3",
"gray-matter": "^4.0.3",
"lint-staged": "^11.0.0",
"load-perf": "^0.2.0",
"markdown-it": "^12.2.0",
"markdown-it-container": "^3.0.0",
"markdownlint": "^0.32.0",
"markdownlint-cli": "^0.37.0",
"marked": "^4.0.8",
"memfs": "^3.0.1",
"metascraper": "^5.25.7",
"metascraper-description": "^5.25.7",
"metascraper-image": "^5.29.3",
"metascraper-logo": "^5.25.7",
"metascraper-logo-favicon": "^5.25.7",
"metascraper-title": "^5.25.7",
"mocha": "^8.3.2",
"mocha-junit-reporter": "^2.0.0",
"node-polyfill-webpack-plugin": "^1.0.3",
"npm-license": "^0.3.3",
"pirates": "^4.0.5",
"progress": "^2.0.3",
"proxyquire": "^2.0.1",
"recast": "^0.23.0",
"regenerator-runtime": "^0.14.0",
"rollup-plugin-node-polyfills": "^0.2.1",
"semver": "^7.5.3",
"shelljs": "^0.8.2",
"sinon": "^11.0.0",
"vite-plugin-commonjs": "0.10.1",
"webdriverio": "^8.14.6",
"webpack": "^5.23.0",
"webpack-cli": "^4.5.0",
"yorkie": "^2.0.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"../../node_modules/.pnpm/pinia@2.3.1_typescript@5.8.3_vue@3.5.13_typescript@5.8.3_/node_modules/pinia": {
"version": "2.3.1",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^6.6.3",
"vue-demi": "^0.14.10"
},
"devDependencies": {
"@microsoft/api-extractor": "7.48.0",
"@vue/test-utils": "^2.4.6"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"typescript": ">=4.4.4",
"vue": "^2.7.0 || ^3.5.11"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"../../node_modules/.pnpm/sass@1.87.0/node_modules/sass": {
"version": "1.87.0",
"dev": true,
"license": "MIT",
"dependencies": {
"chokidar": "^4.0.0",
"immutable": "^5.0.2",
"source-map-js": ">=0.6.2 <2.0.0"
},
"bin": {
"sass": "sass.js"
},
"engines": {
"node": ">=14.0.0"
},
"optionalDependencies": {
"@parcel/watcher": "^2.4.1"
}
},
"../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript": {
"version": "5.8.3",
"dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"devDependencies": {
"@dprint/formatter": "^0.4.1",
"@dprint/typescript": "0.93.3",
"@esfx/canceltoken": "^1.0.0",
"@eslint/js": "^9.17.0",
"@octokit/rest": "^21.0.2",
"@types/chai": "^4.3.20",
"@types/diff": "^5.2.3",
"@types/minimist": "^1.2.5",
"@types/mocha": "^10.0.10",
"@types/ms": "^0.7.34",
"@types/node": "latest",
"@types/source-map-support": "^0.5.10",
"@types/which": "^3.0.4",
"@typescript-eslint/rule-tester": "^8.18.1",
"@typescript-eslint/type-utils": "^8.18.1",
"@typescript-eslint/utils": "^8.18.1",
"azure-devops-node-api": "^14.1.0",
"c8": "^10.1.3",
"chai": "^4.5.0",
"chalk": "^4.1.2",
"chokidar": "^3.6.0",
"diff": "^5.2.0",
"dprint": "^0.47.6",
"esbuild": "^0.24.0",
"eslint": "^9.17.0",
"eslint-formatter-autolinkable-stylish": "^1.4.0",
"eslint-plugin-regexp": "^2.7.0",
"fast-xml-parser": "^4.5.1",
"glob": "^10.4.5",
"globals": "^15.13.0",
"hereby": "^1.10.0",
"jsonc-parser": "^3.3.1",
"knip": "^5.41.0",
"minimist": "^1.2.8",
"mocha": "^10.8.2",
"mocha-fivemat-progress-reporter": "^0.1.0",
"monocart-coverage-reports": "^2.11.4",
"ms": "^2.1.3",
"playwright": "^1.49.1",
"source-map-support": "^0.5.21",
"tslib": "^2.8.1",
"typescript": "^5.7.2",
"typescript-eslint": "^8.18.1",
"which": "^3.0.1"
},
"engines": {
"node": ">=14.17"
}
},
"../../node_modules/.pnpm/vite@4.5.13_sass@1.87.0/node_modules/vite": {
"version": "4.5.13",
"dev": true,
"license": "MIT",
"dependencies": {
"esbuild": "^0.18.10",
"postcss": "^8.4.27",
"rollup": "^3.27.1"
},
"bin": {
"vite": "bin/vite.js"
},
"devDependencies": {
"@ampproject/remapping": "^2.2.1",
"@babel/parser": "^7.22.7",
"@babel/types": "^7.22.5",
"@jridgewell/trace-mapping": "^0.3.18",
"@rollup/plugin-alias": "^4.0.4",
"@rollup/plugin-commonjs": "^25.0.3",
"@rollup/plugin-dynamic-import-vars": "^2.0.4",
"@rollup/plugin-json": "^6.0.0",
"@rollup/plugin-node-resolve": "15.1.0",
"@rollup/plugin-typescript": "^11.1.2",
"@rollup/pluginutils": "^5.0.2",
"@types/escape-html": "^1.0.2",
"@types/pnpapi": "^0.0.2",
"acorn": "^8.10.0",
"acorn-walk": "^8.2.0",
"cac": "^6.7.14",
"chokidar": "^3.5.3",
"connect": "^3.7.0",
"connect-history-api-fallback": "^2.0.0",
"convert-source-map": "^2.0.0",
"cors": "^2.8.5",
"cross-spawn": "^7.0.3",
"debug": "^4.3.4",
"dep-types": "link:./src/types",
"dotenv": "^16.3.1",
"dotenv-expand": "^9.0.0",
"es-module-lexer": "^1.3.0",
"escape-html": "^1.0.3",
"estree-walker": "^3.0.3",
"etag": "^1.8.1",
"fast-glob": "^3.3.1",
"http-proxy": "^1.18.1",
"json-stable-stringify": "^1.0.2",
"launch-editor-middleware": "^2.6.0",
"lightningcss": "^1.21.5",
"magic-string": "^0.30.2",
"micromatch": "^4.0.5",
"mlly": "^1.4.0",
"mrmime": "^1.0.1",
"okie": "^1.0.1",
"open": "^8.4.2",
"parse5": "^7.1.2",
"periscopic": "^3.1.0",
"picocolors": "^1.0.0",
"picomatch": "^2.3.1",
"postcss-import": "^15.1.0",
"postcss-load-config": "^4.0.1",
"postcss-modules": "^6.0.0",
"resolve.exports": "^2.0.2",
"rollup-plugin-license": "^3.0.1",
"sirv": "^2.0.3",
"source-map-support": "^0.5.21",
"strip-ansi": "^7.1.0",
"strip-literal": "^1.3.0",
"tsconfck": "^2.1.2",
"tslib": "^2.6.1",
"types": "link:./types",
"ufo": "^1.2.0",
"ws": "^8.13.0"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
},
"peerDependencies": {
"@types/node": ">= 14",
"less": "*",
"lightningcss": "^1.21.0",
"sass": "*",
"stylus": "*",
"sugarss": "*",
"terser": "^5.4.0"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
},
"less": {
"optional": true
},
"lightningcss": {
"optional": true
},
"sass": {
"optional": true
},
"stylus": {
"optional": true
},
"sugarss": {
"optional": true
},
"terser": {
"optional": true
}
}
},
"../../node_modules/.pnpm/vue-router@4.5.1_vue@3.5.13_typescript@5.8.3_/node_modules/vue-router": {
"version": "4.5.1",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^6.6.4"
},
"devDependencies": {
"@microsoft/api-extractor": "^7.48.0",
"@rollup/plugin-alias": "^5.1.1",
"@rollup/plugin-commonjs": "^25.0.8",
"@rollup/plugin-node-resolve": "^15.3.0",
"@rollup/plugin-replace": "^5.0.7",
"@rollup/plugin-terser": "^0.4.4",
"@types/jsdom": "^21.1.7",
"@types/nightwatch": "^2.3.32",
"@vitejs/plugin-vue": "^5.2.0",
"@vue/compiler-sfc": "~3.5.13",
"@vue/server-renderer": "~3.5.13",
"@vue/test-utils": "^2.4.6",
"browserstack-local": "^1.5.5",
"chromedriver": "^131.0.1",
"connect-history-api-fallback": "^1.6.0",
"conventional-changelog-cli": "^2.2.2",
"dotenv": "^16.4.5",
"faked-promise": "^2.2.2",
"geckodriver": "^4.5.1",
"happy-dom": "^15.11.6",
"nightwatch": "^2.6.25",
"nightwatch-helpers": "^1.2.0",
"rimraf": "^6.0.1",
"rollup": "^3.29.5",
"rollup-plugin-analyzer": "^4.0.0",
"rollup-plugin-typescript2": "^0.36.0",
"vite": "^5.4.11",
"vue": "~3.5.13"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"vue": "^3.2.0"
}
},
"../../node_modules/.pnpm/vue-tsc@1.8.27_typescript@5.8.3/node_modules/vue-tsc": {
"version": "1.8.27",
"dev": true,
"license": "MIT",
"dependencies": {
"@volar/typescript": "~1.11.1",
"@vue/language-core": "1.8.27",
"semver": "^7.5.4"
},
"bin": {
"vue-tsc": "bin/vue-tsc.js"
},
"devDependencies": {
"@types/node": "latest"
},
"peerDependencies": {
"typescript": "*"
}
},
"../../node_modules/.pnpm/vue@3.5.13_typescript@5.8.3/node_modules/vue": {
"version": "3.5.13",
"license": "MIT",
"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": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"../../packages/shared": {
"name": "@mind-map/shared",
"version": "1.0.0",
"extraneous": true,
"dependencies": {
"vue": "^3.3.4"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^6.2.1",
"@typescript-eslint/parser": "^6.2.1",
"eslint": "^8.46.0",
"typescript": "^5.1.6"
}
},
"node_modules/@types/node": {
"version": "22.15.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz",
"integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==",
"dev": true,
"dependencies": {
"undici-types": "~6.21.0"
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
"resolved": "../../node_modules/.pnpm/@typescript-eslint+eslint-plugin@6.21.0_@typescript-eslint+parser@6.21.0_eslint@8.57.1__568544a48dea19c14ce8955143cbe955/node_modules/@typescript-eslint/eslint-plugin",
"link": true
},
"node_modules/@typescript-eslint/parser": {
"resolved": "../../node_modules/.pnpm/@typescript-eslint+parser@6.21.0_eslint@8.57.1_typescript@5.8.3/node_modules/@typescript-eslint/parser",
"link": true
},
"node_modules/@vitejs/plugin-vue": {
"resolved": "../../node_modules/.pnpm/@vitejs+plugin-vue@4.6.2_vite@4.5.13_sass@1.87.0__vue@3.5.13_typescript@5.8.3_/node_modules/@vitejs/plugin-vue",
"link": true
},
"node_modules/eslint": {
"resolved": "../../node_modules/.pnpm/eslint@8.57.1/node_modules/eslint",
"link": true
},
"node_modules/eslint-plugin-vue": {
"resolved": "../../node_modules/.pnpm/eslint-plugin-vue@9.33.0_eslint@8.57.1/node_modules/eslint-plugin-vue",
"link": true
},
"node_modules/pinia": {
"resolved": "../../node_modules/.pnpm/pinia@2.3.1_typescript@5.8.3_vue@3.5.13_typescript@5.8.3_/node_modules/pinia",
"link": true
},
"node_modules/sass": {
"resolved": "../../node_modules/.pnpm/sass@1.87.0/node_modules/sass",
"link": true
},
"node_modules/typescript": {
"resolved": "../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript",
"link": true
},
"node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true
},
"node_modules/vite": {
"resolved": "../../node_modules/.pnpm/vite@4.5.13_sass@1.87.0/node_modules/vite",
"link": true
},
"node_modules/vue": {
"resolved": "../../node_modules/.pnpm/vue@3.5.13_typescript@5.8.3/node_modules/vue",
"link": true
},
"node_modules/vue-router": {
"resolved": "../../node_modules/.pnpm/vue-router@4.5.1_vue@3.5.13_typescript@5.8.3_/node_modules/vue-router",
"link": true
},
"node_modules/vue-tsc": {
"resolved": "../../node_modules/.pnpm/vue-tsc@1.8.27_typescript@5.8.3/node_modules/vue-tsc",
"link": true
}
}
}

View File

@ -0,0 +1,28 @@
{
"name": "@mind-map/web",
"private": true,
"version": "1.0.0",
"scripts": {
"dev": "vite",
"build": "vue-tsc --noEmit && vite build",
"preview": "vite preview",
"lint": "eslint src --ext .ts,.vue"
},
"dependencies": {
"pinia": "^2.1.6",
"vue": "^3.3.4",
"vue-router": "^4.2.4"
},
"devDependencies": {
"@types/node": "^22.15.3",
"@typescript-eslint/eslint-plugin": "^6.2.1",
"@typescript-eslint/parser": "^6.2.1",
"@vitejs/plugin-vue": "^4.2.3",
"eslint": "^8.46.0",
"eslint-plugin-vue": "^9.16.1",
"sass": "^1.64.2",
"typescript": "^5.1.6",
"vite": "^4.4.9",
"vue-tsc": "^1.8.8"
}
}

20
web3/apps/web/src/App.vue Normal file
View File

@ -0,0 +1,20 @@
<template>
<div id="app">
<router-view />
</div>
</template>
<script lang="ts" setup>
// App
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
color: #2c3e50;
height: 100vh;
width: 100vw;
}
</style>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 196.32 170.02">
<path fill="#42b883" d="M120.83 0L98.16 39.26 75.49 0H0l98.16 170.02L196.32 0h-75.49z" />
<path fill="#35495e" d="M120.83 0L98.16 39.26 75.49 0H39.26l58.9 102.01L157.06 0h-36.23z" />
</svg>

After

Width:  |  Height:  |  Size: 317 B

View File

@ -0,0 +1,96 @@
<template>
<button
:class="[
'base-button',
`base-button--${type}`,
{ 'base-button--disabled': disabled }
]"
:disabled="disabled"
@click="handleClick"
>
<slot></slot>
</button>
</template>
<script lang="ts" setup>
import { defineProps, defineEmits } from 'vue';
const props = defineProps({
type: {
type: String,
default: 'primary',
validator: (value: string) => {
return ['primary', 'secondary', 'danger', 'success'].includes(value);
}
},
disabled: {
type: Boolean,
default: false
}
});
const emit = defineEmits(['click']);
const handleClick = (event: MouseEvent) => {
if (!props.disabled) {
emit('click', event);
}
};
</script>
<style scoped>
.base-button {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 8px 16px;
font-size: 14px;
font-weight: 500;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.2s, border-color 0.2s, color 0.2s;
border: none;
outline: none;
}
.base-button--primary {
background-color: #4f46e5;
color: white;
}
.base-button--primary:hover:not(:disabled) {
background-color: #4338ca;
}
.base-button--secondary {
background-color: #e5e7eb;
color: #374151;
}
.base-button--secondary:hover:not(:disabled) {
background-color: #d1d5db;
}
.base-button--danger {
background-color: #ef4444;
color: white;
}
.base-button--danger:hover:not(:disabled) {
background-color: #dc2626;
}
.base-button--success {
background-color: #10b981;
color: white;
}
.base-button--success:hover:not(:disabled) {
background-color: #059669;
}
.base-button--disabled {
opacity: 0.5;
cursor: not-allowed;
}
</style>

11
web3/apps/web/src/env.d.ts vendored Normal file
View File

@ -0,0 +1,11 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly BASE_URL: string;
// 可以添加更多自定义环境变量
// readonly VITE_API_URL: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}

14
web3/apps/web/src/main.ts Normal file
View File

@ -0,0 +1,14 @@
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'
// 创建应用实例
const app = createApp(App)
// 使用插件
app.use(createPinia())
app.use(router)
// 挂载应用
app.mount('#app')

View File

@ -0,0 +1,19 @@
import { createRouter, createWebHistory } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router'
// 路由配置
const routes: RouteRecordRaw[] = [
{
path: '/',
name: 'Home',
component: () => import('../views/Home.vue')
},
]
// 创建路由实例
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes
})
export default router

View File

@ -0,0 +1,32 @@
import { defineStore } from 'pinia'
// 定义主要状态
interface RootState {
counter: number
theme: string
}
// 创建 store
export const useMainStore = defineStore('main', {
// 状态
state: (): RootState => ({
counter: 0,
theme: 'light'
}),
// getters
getters: {
doubleCount: (state) => state.counter * 2,
isDarkTheme: (state) => state.theme === 'dark'
},
// actions
actions: {
increment() {
this.counter++
},
toggleTheme() {
this.theme = this.theme === 'light' ? 'dark' : 'light'
}
}
})

View File

@ -0,0 +1,19 @@
<template>
<div class="home">
</div>
</template>
<script lang="ts" setup>
import { onMounted } from 'vue';
import MindMapPlugin from '@mind-map/component';
onMounted(() => {
console.log('Home view mounted');
});
</script>
<style scoped>
</style>

View File

@ -0,0 +1,24 @@
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "preserve",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx"],
"references": [{ "path": "./tsconfig.node.json" }]
}

View File

@ -0,0 +1,10 @@
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true
},
"include": ["vite.config.ts"]
}

View File

@ -0,0 +1,20 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': resolve(__dirname, './src')
}
},
build: {
rollupOptions: {
input: {
main: resolve(__dirname, 'index.html')
}
}
}
})

11
web3/package.json Normal file
View File

@ -0,0 +1,11 @@
{
"name": "mind-map-web3",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "pnpm --filter @mind-map/web dev",
"build": "pnpm --filter @mind-map/web build",
"preview": "pnpm --filter @mind-map/web preview",
"lint": "pnpm -r lint"
}
}

View File

@ -0,0 +1,23 @@
{
"name": "@mind-map/component",
"private": true,
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vue-tsc && vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.3.4"
},
"devDependencies": {
"@vitejs/plugin-vue": "^4.2.3",
"autoprefixer": "^10.4.14",
"postcss": "^8.4.27",
"tailwindcss": "^3.3.3",
"typescript": "^5.0.2",
"vite": "^4.4.5",
"vue-tsc": "^1.8.5"
}
}

View File

@ -0,0 +1,6 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

View File

@ -0,0 +1,12 @@
<template>
<div class="mind-map bg-white rounded-lg shadow-md p-4 w-full h-64">
<!-- 这是一个最小化的思维导图实现只包含一个简单的div -->
<div class="flex items-center justify-center h-full text-gray-500">
Mind Map Component
</div>
</div>
</template>
<script lang="ts" setup>
//
</script>

View File

@ -0,0 +1,11 @@
import { App } from 'vue';
import MindMap from './components/MindMap.vue';
import './styles/index.css';
export { MindMap };
export default {
install: (app: App) => {
app.component('MindMap', MindMap);
}
};

View File

@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@ -0,0 +1,11 @@
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
"./src/**/*.{vue,js,ts,jsx,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}

View File

@ -0,0 +1,25 @@
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "node",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "preserve",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
"references": [{ "path": "./tsconfig.node.json" }]
}

View File

@ -0,0 +1,10 @@
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "node",
"allowSyntheticDefaultImports": true
},
"include": ["vite.config.ts"]
}

View File

@ -0,0 +1,28 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
},
},
build: {
lib: {
entry: resolve(__dirname, 'src/index.ts'),
name: 'MindMap',
fileName: 'mind-map',
},
rollupOptions: {
external: ['vue'],
output: {
globals: {
vue: 'Vue',
},
},
},
},
})

View File

@ -0,0 +1,20 @@
{
"name": "@mind-map/shared",
"version": "1.0.0",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
"build": "tsc",
"dev": "tsc --watch",
"lint": "eslint src --ext .ts"
},
"dependencies": {
"vue": "^3.3.4"
},
"devDependencies": {
"typescript": "^5.1.6",
"eslint": "^8.46.0",
"@typescript-eslint/eslint-plugin": "^6.2.1",
"@typescript-eslint/parser": "^6.2.1"
}
}

View File

@ -0,0 +1,13 @@
import * as utils from './utils';
/**
*
*/
export function useSharedUtils() {
return {
...utils
};
}
// 直接导出所有工具函数
export * from './utils';

View File

@ -0,0 +1,47 @@
/**
*
* @param date
* @param format 'YYYY-MM-DD'
* @returns
*/
export function formatDate(date: Date, format: string = 'YYYY-MM-DD'): string {
const year = date.getFullYear().toString();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
let result = format;
result = result.replace('YYYY', year);
result = result.replace('MM', month);
result = result.replace('DD', day);
return result;
}
/**
*
* @param obj
* @returns
*/
export function deepClone<T>(obj: T): T {
if (obj === null || typeof obj !== 'object') {
return obj;
}
if (obj instanceof Date) {
return new Date(obj.getTime()) as any;
}
if (obj instanceof Array) {
return obj.map(item => deepClone(item)) as any;
}
if (obj instanceof Object) {
const copy: Record<string, any> = {};
Object.keys(obj).forEach(key => {
copy[key] = deepClone((obj as any)[key]);
});
return copy as T;
}
return obj;
}

View File

@ -0,0 +1,19 @@
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"outDir": "dist",
"declaration": true,
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src"]
}

2032
web3/pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

3
web3/pnpm-workspace.yaml Normal file
View File

@ -0,0 +1,3 @@
packages:
- 'packages/*'
- 'apps/*'