├── .env
├── .env.development
├── .env.production
├── .eslintrc.js
├── .github
└── workflows
│ └── static.yml
├── .gitignore
├── LICENSE
├── README.md
├── git-history.sh
├── index.html
├── package-lock.json
├── package.json
├── src
├── App.vue
├── components
│ ├── MindmapView
│ │ ├── MindmapView.js
│ │ ├── Parser.js
│ │ ├── TreeNode.js
│ │ └── TreeProperties.js
│ ├── MindnoteBox.vue
│ ├── MindnoteCard.vue
│ ├── MindnoteInput.vue
│ ├── MindnoteItem.vue
│ ├── MindnotePage.vue
│ ├── MindnotePageX.vue
│ └── SpacePage.vue
├── index.css
├── main.js
├── router
│ └── index.js
└── utils
│ └── util.js
└── vite.config.js
/.env:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aregrid/aregrid-mindnote/a970b50086a8905319d2bacd1a704f9652fbde60/.env
--------------------------------------------------------------------------------
/.env.development:
--------------------------------------------------------------------------------
1 | VITE_ASSETS_DIR ='./assets/'
--------------------------------------------------------------------------------
/.env.production:
--------------------------------------------------------------------------------
1 | # loaded in all cases
2 | # VITE_HOST = '0.0.0.0'
3 | # VITE_PORT = 8080
4 | VITE_BASE_URL = '/aregrid-mindnote/'
5 | VITE_OUTPUT_DIR = 'docs'
6 | VITE_ASSETS_DIR ='./assets/'
7 | #VITE_PUBLIC_DIR = 'https://cg0101.github.io/mindnote/assets/'
8 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: {
4 | node: true
5 | },
6 | 'extends': [
7 | 'plugin:vue/essential',
8 | 'eslint:recommended'
9 | ],
10 | parserOptions: {
11 | ecmaVersion: 2020
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/.github/workflows/static.yml:
--------------------------------------------------------------------------------
1 | # Simple workflow for deploying static content to GitHub Pages
2 | name: Deploy static content to Pages
3 |
4 | on:
5 | # Runs on pushes targeting the default branch
6 | push:
7 | branches: ['master']
8 |
9 | # Allows you to run this workflow manually from the Actions tab
10 | workflow_dispatch:
11 |
12 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
13 | permissions:
14 | contents: read
15 | pages: write
16 | id-token: write
17 |
18 | # Allow one concurrent deployment
19 | concurrency:
20 | group: 'pages'
21 | cancel-in-progress: true
22 |
23 | jobs:
24 | # Single deploy job since we're just deploying
25 | deploy:
26 | environment:
27 | name: github-pages
28 | url: ${{ steps.deployment.outputs.page_url }}
29 | runs-on: ubuntu-latest
30 | steps:
31 | - name: Checkout
32 | uses: actions/checkout@v3
33 | - uses: pnpm/action-setup@v2
34 | with:
35 | version: 7.9.5
36 | - uses: actions/setup-node@v3
37 | with:
38 | node-version: '16'
39 | cache: 'npm'
40 |
41 | - name: Install dependencies
42 | run: npm install --frozen-lockfile
43 |
44 | - name: Build App
45 | run: npm run build
46 |
47 | - name: Setup Pages
48 | uses: actions/configure-pages@v2
49 | - name: Upload artifact
50 | uses: actions/upload-pages-artifact@v1
51 | with:
52 | # Upload entire repository
53 | path: './docs/'
54 | - name: Deploy to GitHub Pages
55 | id: deployment
56 | uses: actions/deploy-pages@v1
57 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 | /docs
5 |
6 | # Logs
7 | logs
8 | *.log
9 | npm-debug.log*
10 | yarn-debug.log*
11 | yarn-error.log*
12 |
13 | # node-waf configuration
14 | .lock-wscript
15 |
16 | # Compiled binary addons (https://nodejs.org/api/addons.html)
17 | build/Release
18 |
19 | # Dependency directories
20 | node_modules/
21 | jspm_packages/
22 |
23 | # TypeScript v1 declaration files
24 | typings/
25 |
26 | # TypeScript cache
27 | *.tsbuildinfo
28 |
29 | # Optional npm cache directory
30 | .npm
31 |
32 | # Editor directories and files
33 | .idea
34 | .vscode
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2013-present, zhangchi
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # aregrid-mindnote
2 |
3 | a powelful mindnote by vue + javascript
4 |
5 | # preview
6 |
7 | https://aregrid.github.io/aregrid-mindnote/#/
8 |
9 | # quick start
10 |
11 | ```
12 | npm i
13 | npm run dev
14 | npm run build
15 | ```
16 |
17 | # License
18 |
19 | [MIT](https://opensource.org/licenses/MIT)
20 |
21 | Copyright (c) 2013-present, aregrid
22 |
--------------------------------------------------------------------------------
/git-history.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | git filter-branch --commit-filter '
4 | OLD_EMAIL="956238702@qq.com"
5 | CORRECT_NAME="tzhangchi"
6 | CORRECT_EMAIL="terry.zhangchi@outlook.com"
7 | if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
8 | then
9 | export GIT_COMMITTER_NAME="$CORRECT_NAME"
10 | export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
11 | fi' HEAD
12 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | mindnote
8 |
9 |
10 |
11 |
12 |
13 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mindnote",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "mindnote",
9 | "version": "1.0.0",
10 | "dependencies": {
11 | "@blocksuite/editor": "^0.5.0-20230326033652-70ca43c",
12 | "vue": "^3.0.5",
13 | "vue-router": "^4.0.0-rc.2",
14 | "vuex": "^4.0.0-rc.1"
15 | },
16 | "devDependencies": {
17 | "@vitejs/plugin-vue": "^1.1.5",
18 | "@vue/compiler-sfc": "^3.0.5",
19 | "dotenv": "^8.2.0",
20 | "less": "^3.13.0",
21 | "vite": "^2.0.4"
22 | }
23 | },
24 | "node_modules/@babel/parser": {
25 | "version": "7.13.11",
26 | "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.13.11.tgz?cache=0&sync_timestamp=1615820421062&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.13.11.tgz",
27 | "integrity": "sha1-+T6/yZ0hwXcq+7qhU/R+fOL1C4g=",
28 | "bin": {
29 | "parser": "bin/babel-parser.js"
30 | },
31 | "engines": {
32 | "node": ">=6.0.0"
33 | }
34 | },
35 | "node_modules/@babel/types": {
36 | "version": "7.13.0",
37 | "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.13.0.tgz?cache=0&sync_timestamp=1614034819122&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.13.0.tgz",
38 | "integrity": "sha1-dEJNKBbwFxtBAPCrNOmjdO/ff4A=",
39 | "dependencies": {
40 | "@babel/helper-validator-identifier": "^7.12.11",
41 | "lodash": "^4.17.19",
42 | "to-fast-properties": "^2.0.0"
43 | }
44 | },
45 | "node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": {
46 | "version": "7.12.11",
47 | "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.12.11.tgz",
48 | "integrity": "sha1-yaHwIZF9y1zPDU5FPjmQIpgfye0="
49 | },
50 | "node_modules/@babel/types/node_modules/lodash": {
51 | "version": "4.17.21",
52 | "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz",
53 | "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw="
54 | },
55 | "node_modules/@blocksuite/blocks": {
56 | "version": "0.5.0-20230326033652-70ca43c",
57 | "resolved": "https://registry.npmjs.org/@blocksuite/blocks/-/blocks-0.5.0-20230326033652-70ca43c.tgz",
58 | "integrity": "sha512-pfpPKdfiA8JZSwjwRQAy2ltGeySjcwNqApGT9k0ELVVmH2gNszMsEglZwQVkNXZxA+t/7OX6fnhIEjD3zpksfQ==",
59 | "peer": true,
60 | "dependencies": {
61 | "@blocksuite/global": "0.5.0-20230326033652-70ca43c",
62 | "@blocksuite/phasor": "0.5.0-20230326033652-70ca43c",
63 | "@blocksuite/virgo": "0.5.0-20230326033652-70ca43c",
64 | "@popperjs/core": "^2.11.6",
65 | "hotkeys-js": "^3.10.1",
66 | "lit": "^2.6.1",
67 | "marked": "^4.2.12",
68 | "shiki": "^0.14.1",
69 | "turndown": "^7.1.1",
70 | "zod": "^3.21.4"
71 | },
72 | "peerDependencies": {
73 | "@blocksuite/store": "0.5.0-20230326033652-70ca43c"
74 | }
75 | },
76 | "node_modules/@blocksuite/blocks/node_modules/@blocksuite/phasor": {
77 | "version": "0.5.0-20230326033652-70ca43c",
78 | "resolved": "https://registry.npmjs.org/@blocksuite/phasor/-/phasor-0.5.0-20230326033652-70ca43c.tgz",
79 | "integrity": "sha512-t95D1Y/sPII1PgyOqf8AGLkcp5RLQFSApTj/kjDgvzqetCHn81qUc47o99eb2uHC8yY0TlxgaHmZsnIRspP9nQ==",
80 | "peer": true,
81 | "dependencies": {
82 | "@blocksuite/global": "0.5.0-20230326033652-70ca43c",
83 | "fractional-indexing": "^3.2.0",
84 | "perfect-freehand": "^1.2.0"
85 | },
86 | "peerDependencies": {
87 | "nanoid": "^4",
88 | "yjs": "^13"
89 | }
90 | },
91 | "node_modules/@blocksuite/blocks/node_modules/nanoid": {
92 | "version": "4.0.2",
93 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
94 | "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
95 | "funding": [
96 | {
97 | "type": "github",
98 | "url": "https://github.com/sponsors/ai"
99 | }
100 | ],
101 | "peer": true,
102 | "bin": {
103 | "nanoid": "bin/nanoid.js"
104 | },
105 | "engines": {
106 | "node": "^14 || ^16 || >=18"
107 | }
108 | },
109 | "node_modules/@blocksuite/editor": {
110 | "version": "0.5.0-20230326033652-70ca43c",
111 | "resolved": "https://registry.npmjs.org/@blocksuite/editor/-/editor-0.5.0-20230326033652-70ca43c.tgz",
112 | "integrity": "sha512-a9NGmui19veF5VOVFsp1H71yjlVzObMwSzV6Kjt21ADyPmV3d7OZ4Wbf9daEJrTujzMoo11Rk+WePy0mUFqDvQ==",
113 | "dependencies": {
114 | "@blocksuite/global": "0.5.0-20230326033652-70ca43c",
115 | "lit": "^2.6.1",
116 | "marked": "^4.2.12",
117 | "turndown": "^7.1.1"
118 | },
119 | "peerDependencies": {
120 | "@blocksuite/blocks": "0.5.0-20230326033652-70ca43c",
121 | "@blocksuite/store": "0.5.0-20230326033652-70ca43c"
122 | }
123 | },
124 | "node_modules/@blocksuite/global": {
125 | "version": "0.5.0-20230326033652-70ca43c",
126 | "resolved": "https://registry.npmjs.org/@blocksuite/global/-/global-0.5.0-20230326033652-70ca43c.tgz",
127 | "integrity": "sha512-KEtU8L6szoHv5lnJYz4thk8QeRLWIzHnGdYlL/W131UFEOtg1/hQ+SUilFjX+JFQIi3692zdUg9KBywPHl6bfw==",
128 | "dependencies": {
129 | "ansi-colors": "^4.1.3",
130 | "zod": "^3.21.4"
131 | },
132 | "peerDependencies": {
133 | "lit": "^2.6"
134 | },
135 | "peerDependenciesMeta": {
136 | "lit": {
137 | "optional": true
138 | }
139 | }
140 | },
141 | "node_modules/@blocksuite/store": {
142 | "version": "0.5.0-20230326033652-70ca43c",
143 | "resolved": "https://registry.npmjs.org/@blocksuite/store/-/store-0.5.0-20230326033652-70ca43c.tgz",
144 | "integrity": "sha512-m30GJI9Vuj9vEk3d5fqHU3tv4A4E4+eu2yUjDBYXORYG+YcmKu1c+aUTXR6iLoZv/77ju0XZnxjAnylln1y6Fw==",
145 | "peer": true,
146 | "dependencies": {
147 | "@blocksuite/global": "0.5.0-20230326033652-70ca43c",
148 | "@blocksuite/virgo": "0.5.0-20230326033652-70ca43c",
149 | "@types/flexsearch": "^0.7.3",
150 | "buffer": "^6.0.3",
151 | "flexsearch": "0.7.21",
152 | "idb-keyval": "^6.2.0",
153 | "ky": "^0.33.3",
154 | "lib0": "^0.2.68",
155 | "merge": "^2.1.1",
156 | "nanoid": "^4.0.1",
157 | "y-protocols": "^1.0.5",
158 | "y-webrtc": "^10.2.5",
159 | "zod": "^3.21.4"
160 | },
161 | "peerDependencies": {
162 | "yjs": "^13"
163 | }
164 | },
165 | "node_modules/@blocksuite/store/node_modules/nanoid": {
166 | "version": "4.0.2",
167 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
168 | "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
169 | "funding": [
170 | {
171 | "type": "github",
172 | "url": "https://github.com/sponsors/ai"
173 | }
174 | ],
175 | "peer": true,
176 | "bin": {
177 | "nanoid": "bin/nanoid.js"
178 | },
179 | "engines": {
180 | "node": "^14 || ^16 || >=18"
181 | }
182 | },
183 | "node_modules/@blocksuite/virgo": {
184 | "version": "0.5.0-20230326033652-70ca43c",
185 | "resolved": "https://registry.npmjs.org/@blocksuite/virgo/-/virgo-0.5.0-20230326033652-70ca43c.tgz",
186 | "integrity": "sha512-sUKStWCkoZ3NOc93Y2tBQzzmUVf+aERCGCP1HLFawW4yTNd55VTRAgJe65+fj4J3r/CORvv+YM8TFzH8wfBmwQ==",
187 | "peer": true,
188 | "dependencies": {
189 | "@blocksuite/global": "0.5.0-20230326033652-70ca43c",
190 | "zod": "^3.21.4"
191 | },
192 | "peerDependencies": {
193 | "lit": "^2",
194 | "yjs": "^13"
195 | }
196 | },
197 | "node_modules/@lit-labs/ssr-dom-shim": {
198 | "version": "1.1.0",
199 | "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.0.tgz",
200 | "integrity": "sha512-92uQ5ARf7UXYrzaFcAX3T2rTvaS9Z1//ukV+DqjACM4c8s0ZBQd7ayJU5Dh2AFLD/Ayuyz4uMmxQec8q3U4Ong=="
201 | },
202 | "node_modules/@lit/reactive-element": {
203 | "version": "1.6.1",
204 | "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.1.tgz",
205 | "integrity": "sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==",
206 | "dependencies": {
207 | "@lit-labs/ssr-dom-shim": "^1.0.0"
208 | }
209 | },
210 | "node_modules/@popperjs/core": {
211 | "version": "2.11.7",
212 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz",
213 | "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==",
214 | "peer": true,
215 | "funding": {
216 | "type": "opencollective",
217 | "url": "https://opencollective.com/popperjs"
218 | }
219 | },
220 | "node_modules/@types/flexsearch": {
221 | "version": "0.7.3",
222 | "resolved": "https://registry.npmjs.org/@types/flexsearch/-/flexsearch-0.7.3.tgz",
223 | "integrity": "sha512-HXwADeHEP4exXkCIwy2n1+i0f1ilP1ETQOH5KDOugjkTFZPntWo0Gr8stZOaebkxsdx+k0X/K6obU/+it07ocg==",
224 | "peer": true
225 | },
226 | "node_modules/@types/trusted-types": {
227 | "version": "2.0.3",
228 | "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz",
229 | "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g=="
230 | },
231 | "node_modules/@vitejs/plugin-vue": {
232 | "version": "1.1.5",
233 | "resolved": "https://registry.npm.taobao.org/@vitejs/plugin-vue/download/@vitejs/plugin-vue-1.1.5.tgz",
234 | "integrity": "sha1-+h6OXgScNeITZy4z9z/oFwatXb4=",
235 | "dev": true,
236 | "engines": {
237 | "node": ">=12.0.0"
238 | },
239 | "peerDependencies": {
240 | "@vue/compiler-sfc": "^3.0.6"
241 | }
242 | },
243 | "node_modules/@vue/compiler-core": {
244 | "version": "3.0.7",
245 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-core/download/@vue/compiler-core-3.0.7.tgz?cache=0&sync_timestamp=1614619144678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-core%2Fdownload%2F%40vue%2Fcompiler-core-3.0.7.tgz",
246 | "integrity": "sha1-QheCpMZ8w/K3wwRX70RtdPhST3Q=",
247 | "dependencies": {
248 | "@babel/parser": "^7.12.0",
249 | "@babel/types": "^7.12.0",
250 | "@vue/shared": "3.0.7",
251 | "estree-walker": "^2.0.1",
252 | "source-map": "^0.6.1"
253 | }
254 | },
255 | "node_modules/@vue/compiler-dom": {
256 | "version": "3.0.7",
257 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-dom/download/@vue/compiler-dom-3.0.7.tgz?cache=0&sync_timestamp=1614619147363&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-dom%2Fdownload%2F%40vue%2Fcompiler-dom-3.0.7.tgz",
258 | "integrity": "sha1-VNLhL7mnr/U6vRnawsJnlTPwyRk=",
259 | "dependencies": {
260 | "@vue/compiler-core": "3.0.7",
261 | "@vue/shared": "3.0.7"
262 | }
263 | },
264 | "node_modules/@vue/compiler-sfc": {
265 | "version": "3.0.7",
266 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-sfc/download/@vue/compiler-sfc-3.0.7.tgz?cache=0&sync_timestamp=1614619149945&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-sfc%2Fdownload%2F%40vue%2Fcompiler-sfc-3.0.7.tgz",
267 | "integrity": "sha1-kAQUdQzHJlU7hwSQ9IBzRR/RTwc=",
268 | "dev": true,
269 | "dependencies": {
270 | "@babel/parser": "^7.12.0",
271 | "@babel/types": "^7.12.0",
272 | "@vue/compiler-core": "3.0.7",
273 | "@vue/compiler-dom": "3.0.7",
274 | "@vue/compiler-ssr": "3.0.7",
275 | "@vue/shared": "3.0.7",
276 | "consolidate": "^0.16.0",
277 | "estree-walker": "^2.0.1",
278 | "hash-sum": "^2.0.0",
279 | "lru-cache": "^5.1.1",
280 | "magic-string": "^0.25.7",
281 | "merge-source-map": "^1.1.0",
282 | "postcss": "^8.1.10",
283 | "postcss-modules": "^4.0.0",
284 | "postcss-selector-parser": "^6.0.4",
285 | "source-map": "^0.6.1"
286 | },
287 | "peerDependencies": {
288 | "vue": "3.0.7"
289 | }
290 | },
291 | "node_modules/@vue/compiler-sfc/node_modules/consolidate": {
292 | "version": "0.16.0",
293 | "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.16.0.tgz?cache=0&sync_timestamp=1599597070540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconsolidate%2Fdownload%2Fconsolidate-0.16.0.tgz",
294 | "integrity": "sha1-oRhkdokw8vGUMWYKZZBmaPX73BY=",
295 | "dev": true,
296 | "dependencies": {
297 | "bluebird": "^3.7.2"
298 | },
299 | "engines": {
300 | "node": ">= 0.10.0"
301 | }
302 | },
303 | "node_modules/@vue/compiler-sfc/node_modules/hash-sum": {
304 | "version": "2.0.0",
305 | "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-2.0.0.tgz",
306 | "integrity": "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=",
307 | "dev": true
308 | },
309 | "node_modules/@vue/compiler-sfc/node_modules/postcss-selector-parser": {
310 | "version": "6.0.4",
311 | "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.4.tgz",
312 | "integrity": "sha1-VgdaE4CgRgTDiwY+p3Z6Epr1wrM=",
313 | "dev": true,
314 | "dependencies": {
315 | "cssesc": "^3.0.0",
316 | "indexes-of": "^1.0.1",
317 | "uniq": "^1.0.1",
318 | "util-deprecate": "^1.0.2"
319 | },
320 | "engines": {
321 | "node": ">=4"
322 | }
323 | },
324 | "node_modules/@vue/compiler-ssr": {
325 | "version": "3.0.7",
326 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-ssr/download/@vue/compiler-ssr-3.0.7.tgz?cache=0&sync_timestamp=1614619154952&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-ssr%2Fdownload%2F%40vue%2Fcompiler-ssr-3.0.7.tgz",
327 | "integrity": "sha1-KLhdSXOB11/kQjQFexQLAGXKnb8=",
328 | "dev": true,
329 | "dependencies": {
330 | "@vue/compiler-dom": "3.0.7",
331 | "@vue/shared": "3.0.7"
332 | }
333 | },
334 | "node_modules/@vue/reactivity": {
335 | "version": "3.0.7",
336 | "resolved": "https://registry.npm.taobao.org/@vue/reactivity/download/@vue/reactivity-3.0.7.tgz?cache=0&sync_timestamp=1614619152518&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Freactivity%2Fdownload%2F%40vue%2Freactivity-3.0.7.tgz",
337 | "integrity": "sha1-5szHvvf8ELCXLk2XS61xZ507Jq0=",
338 | "dependencies": {
339 | "@vue/shared": "3.0.7"
340 | }
341 | },
342 | "node_modules/@vue/runtime-core": {
343 | "version": "3.0.7",
344 | "resolved": "https://registry.npm.taobao.org/@vue/runtime-core/download/@vue/runtime-core-3.0.7.tgz?cache=0&sync_timestamp=1614619157934&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fruntime-core%2Fdownload%2F%40vue%2Fruntime-core-3.0.7.tgz",
345 | "integrity": "sha1-1EwLClfX45KRKoc2KkQwzPRG7Oo=",
346 | "dependencies": {
347 | "@vue/reactivity": "3.0.7",
348 | "@vue/shared": "3.0.7"
349 | }
350 | },
351 | "node_modules/@vue/runtime-dom": {
352 | "version": "3.0.7",
353 | "resolved": "https://registry.npm.taobao.org/@vue/runtime-dom/download/@vue/runtime-dom-3.0.7.tgz?cache=0&sync_timestamp=1614619164786&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fruntime-dom%2Fdownload%2F%40vue%2Fruntime-dom-3.0.7.tgz",
354 | "integrity": "sha1-twZo1ykCC8StYIwgNnIj8llXa6Y=",
355 | "dependencies": {
356 | "@vue/runtime-core": "3.0.7",
357 | "@vue/shared": "3.0.7",
358 | "csstype": "^2.6.8"
359 | }
360 | },
361 | "node_modules/@vue/shared": {
362 | "version": "3.0.7",
363 | "resolved": "https://registry.npm.taobao.org/@vue/shared/download/@vue/shared-3.0.7.tgz?cache=0&sync_timestamp=1614619160213&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fshared%2Fdownload%2F%40vue%2Fshared-3.0.7.tgz",
364 | "integrity": "sha1-ltUpiO/AdETBCMfGgDunzJPkAEU="
365 | },
366 | "node_modules/ansi-colors": {
367 | "version": "4.1.3",
368 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
369 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
370 | "engines": {
371 | "node": ">=6"
372 | }
373 | },
374 | "node_modules/ansi-sequence-parser": {
375 | "version": "1.1.0",
376 | "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz",
377 | "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==",
378 | "peer": true
379 | },
380 | "node_modules/base64-js": {
381 | "version": "1.5.1",
382 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
383 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
384 | "funding": [
385 | {
386 | "type": "github",
387 | "url": "https://github.com/sponsors/feross"
388 | },
389 | {
390 | "type": "patreon",
391 | "url": "https://www.patreon.com/feross"
392 | },
393 | {
394 | "type": "consulting",
395 | "url": "https://feross.org/support"
396 | }
397 | ],
398 | "peer": true
399 | },
400 | "node_modules/big.js": {
401 | "version": "5.2.2",
402 | "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz",
403 | "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=",
404 | "dev": true,
405 | "engines": {
406 | "node": "*"
407 | }
408 | },
409 | "node_modules/bluebird": {
410 | "version": "3.7.2",
411 | "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz",
412 | "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=",
413 | "dev": true
414 | },
415 | "node_modules/buffer": {
416 | "version": "6.0.3",
417 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
418 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
419 | "funding": [
420 | {
421 | "type": "github",
422 | "url": "https://github.com/sponsors/feross"
423 | },
424 | {
425 | "type": "patreon",
426 | "url": "https://www.patreon.com/feross"
427 | },
428 | {
429 | "type": "consulting",
430 | "url": "https://feross.org/support"
431 | }
432 | ],
433 | "peer": true,
434 | "dependencies": {
435 | "base64-js": "^1.3.1",
436 | "ieee754": "^1.2.1"
437 | }
438 | },
439 | "node_modules/copy-anything": {
440 | "version": "2.0.3",
441 | "resolved": "https://registry.npm.taobao.org/copy-anything/download/copy-anything-2.0.3.tgz",
442 | "integrity": "sha1-hCQHugJGaw34RIGbvjuuu+XUXYc=",
443 | "dev": true,
444 | "dependencies": {
445 | "is-what": "^3.12.0"
446 | }
447 | },
448 | "node_modules/cssesc": {
449 | "version": "3.0.0",
450 | "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz",
451 | "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=",
452 | "dev": true,
453 | "bin": {
454 | "cssesc": "bin/cssesc"
455 | },
456 | "engines": {
457 | "node": ">=4"
458 | }
459 | },
460 | "node_modules/csstype": {
461 | "version": "2.6.16",
462 | "resolved": "https://registry.npm.taobao.org/csstype/download/csstype-2.6.16.tgz?cache=0&sync_timestamp=1614159885468&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsstype%2Fdownload%2Fcsstype-2.6.16.tgz",
463 | "integrity": "sha1-VE1p9UcBO4WkDRW/912zjzT+nDk="
464 | },
465 | "node_modules/debug": {
466 | "version": "4.3.4",
467 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
468 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
469 | "peer": true,
470 | "dependencies": {
471 | "ms": "2.1.2"
472 | },
473 | "engines": {
474 | "node": ">=6.0"
475 | },
476 | "peerDependenciesMeta": {
477 | "supports-color": {
478 | "optional": true
479 | }
480 | }
481 | },
482 | "node_modules/domino": {
483 | "version": "2.1.6",
484 | "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz",
485 | "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ=="
486 | },
487 | "node_modules/dotenv": {
488 | "version": "8.2.0",
489 | "resolved": "https://registry.npm.taobao.org/dotenv/download/dotenv-8.2.0.tgz",
490 | "integrity": "sha1-l+YZJZradQ7qPk6j4mvO6lQksWo=",
491 | "dev": true,
492 | "engines": {
493 | "node": ">=8"
494 | }
495 | },
496 | "node_modules/emojis-list": {
497 | "version": "3.0.0",
498 | "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz",
499 | "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=",
500 | "dev": true,
501 | "engines": {
502 | "node": ">= 4"
503 | }
504 | },
505 | "node_modules/err-code": {
506 | "version": "3.0.1",
507 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz",
508 | "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==",
509 | "peer": true
510 | },
511 | "node_modules/errno": {
512 | "version": "0.1.7",
513 | "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz",
514 | "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=",
515 | "dev": true,
516 | "optional": true,
517 | "dependencies": {
518 | "prr": "~1.0.1"
519 | },
520 | "bin": {
521 | "errno": "cli.js"
522 | }
523 | },
524 | "node_modules/esbuild": {
525 | "version": "0.9.3",
526 | "resolved": "https://registry.npm.taobao.org/esbuild/download/esbuild-0.9.3.tgz?cache=0&sync_timestamp=1615968988121&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesbuild%2Fdownload%2Fesbuild-0.9.3.tgz",
527 | "integrity": "sha1-CSk6C4JBWcaqJIjRxsIvV9hEj3Q=",
528 | "dev": true,
529 | "hasInstallScript": true,
530 | "bin": {
531 | "esbuild": "bin/esbuild"
532 | }
533 | },
534 | "node_modules/estree-walker": {
535 | "version": "2.0.2",
536 | "resolved": "https://registry.npm.taobao.org/estree-walker/download/estree-walker-2.0.2.tgz",
537 | "integrity": "sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw="
538 | },
539 | "node_modules/flexsearch": {
540 | "version": "0.7.21",
541 | "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.21.tgz",
542 | "integrity": "sha512-W7cHV7Hrwjid6lWmy0IhsWDFQboWSng25U3VVywpHOTJnnAZNPScog67G+cVpeX9f7yDD21ih0WDrMMT+JoaYg==",
543 | "peer": true
544 | },
545 | "node_modules/fractional-indexing": {
546 | "version": "3.2.0",
547 | "resolved": "https://registry.npmjs.org/fractional-indexing/-/fractional-indexing-3.2.0.tgz",
548 | "integrity": "sha512-PcOxmqwYCW7O2ovKRU8OoQQj2yqTfEB/yeTYk4gPid6dN5ODRfU1hXd9tTVZzax/0NkO7AxpHykvZnT1aYp/BQ==",
549 | "peer": true,
550 | "engines": {
551 | "node": "^14.13.1 || >=16.0.0"
552 | }
553 | },
554 | "node_modules/function-bind": {
555 | "version": "1.1.1",
556 | "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz",
557 | "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=",
558 | "dev": true
559 | },
560 | "node_modules/generic-names": {
561 | "version": "2.0.1",
562 | "resolved": "https://registry.npm.taobao.org/generic-names/download/generic-names-2.0.1.tgz?cache=0&sync_timestamp=1603545201878&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgeneric-names%2Fdownload%2Fgeneric-names-2.0.1.tgz",
563 | "integrity": "sha1-+KN46tLMqno08DF7BVVIMq5BuHI=",
564 | "dev": true,
565 | "dependencies": {
566 | "loader-utils": "^1.1.0"
567 | }
568 | },
569 | "node_modules/get-browser-rtc": {
570 | "version": "1.1.0",
571 | "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz",
572 | "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==",
573 | "peer": true
574 | },
575 | "node_modules/graceful-fs": {
576 | "version": "4.2.4",
577 | "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgraceful-fs%2Fdownload%2Fgraceful-fs-4.2.4.tgz",
578 | "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=",
579 | "dev": true,
580 | "optional": true
581 | },
582 | "node_modules/has": {
583 | "version": "1.0.3",
584 | "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz",
585 | "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
586 | "dev": true,
587 | "dependencies": {
588 | "function-bind": "^1.1.1"
589 | },
590 | "engines": {
591 | "node": ">= 0.4.0"
592 | }
593 | },
594 | "node_modules/hotkeys-js": {
595 | "version": "3.10.1",
596 | "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.10.1.tgz",
597 | "integrity": "sha512-mshqjgTqx8ee0qryHvRgZaZDxTwxam/2yTQmQlqAWS3+twnq1jsY9Yng9zB7lWq6WRrjTbTOc7knNwccXQiAjQ==",
598 | "peer": true
599 | },
600 | "node_modules/icss-replace-symbols": {
601 | "version": "1.1.0",
602 | "resolved": "https://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz",
603 | "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
604 | "dev": true
605 | },
606 | "node_modules/idb-keyval": {
607 | "version": "6.2.0",
608 | "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.0.tgz",
609 | "integrity": "sha512-uw+MIyQn2jl3+hroD7hF8J7PUviBU7BPKWw4f/ISf32D4LoGu98yHjrzWWJDASu9QNrX10tCJqk9YY0ClWm8Ng==",
610 | "peer": true,
611 | "dependencies": {
612 | "safari-14-idb-fix": "^3.0.0"
613 | }
614 | },
615 | "node_modules/ieee754": {
616 | "version": "1.2.1",
617 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
618 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
619 | "funding": [
620 | {
621 | "type": "github",
622 | "url": "https://github.com/sponsors/feross"
623 | },
624 | {
625 | "type": "patreon",
626 | "url": "https://www.patreon.com/feross"
627 | },
628 | {
629 | "type": "consulting",
630 | "url": "https://feross.org/support"
631 | }
632 | ],
633 | "peer": true
634 | },
635 | "node_modules/image-size": {
636 | "version": "0.5.5",
637 | "resolved": "https://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz",
638 | "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
639 | "dev": true,
640 | "optional": true,
641 | "bin": {
642 | "image-size": "bin/image-size.js"
643 | },
644 | "engines": {
645 | "node": ">=0.10.0"
646 | }
647 | },
648 | "node_modules/indexes-of": {
649 | "version": "1.0.1",
650 | "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz",
651 | "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
652 | "dev": true
653 | },
654 | "node_modules/inherits": {
655 | "version": "2.0.4",
656 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
657 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
658 | "peer": true
659 | },
660 | "node_modules/is-core-module": {
661 | "version": "2.2.0",
662 | "resolved": "https://registry.npm.taobao.org/is-core-module/download/is-core-module-2.2.0.tgz?cache=0&sync_timestamp=1606413651726&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-core-module%2Fdownload%2Fis-core-module-2.2.0.tgz",
663 | "integrity": "sha1-lwN+89UiJNhRY/VZeytj2a/tmBo=",
664 | "dev": true,
665 | "dependencies": {
666 | "has": "^1.0.3"
667 | },
668 | "funding": {
669 | "url": "https://github.com/sponsors/ljharb"
670 | }
671 | },
672 | "node_modules/is-what": {
673 | "version": "3.14.1",
674 | "resolved": "https://registry.npm.taobao.org/is-what/download/is-what-3.14.1.tgz",
675 | "integrity": "sha1-4SIvRt3ahd6tD9HJ3xMXYOd3VcE=",
676 | "dev": true
677 | },
678 | "node_modules/isomorphic.js": {
679 | "version": "0.2.5",
680 | "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz",
681 | "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==",
682 | "peer": true,
683 | "funding": {
684 | "type": "GitHub Sponsors ❤",
685 | "url": "https://github.com/sponsors/dmonad"
686 | }
687 | },
688 | "node_modules/json5": {
689 | "version": "1.0.1",
690 | "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz",
691 | "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=",
692 | "dev": true,
693 | "dependencies": {
694 | "minimist": "^1.2.0"
695 | },
696 | "bin": {
697 | "json5": "lib/cli.js"
698 | }
699 | },
700 | "node_modules/jsonc-parser": {
701 | "version": "3.2.0",
702 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
703 | "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
704 | "peer": true
705 | },
706 | "node_modules/ky": {
707 | "version": "0.33.3",
708 | "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz",
709 | "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==",
710 | "peer": true,
711 | "engines": {
712 | "node": ">=14.16"
713 | },
714 | "funding": {
715 | "url": "https://github.com/sindresorhus/ky?sponsor=1"
716 | }
717 | },
718 | "node_modules/less": {
719 | "version": "3.13.1",
720 | "resolved": "https://registry.npm.taobao.org/less/download/less-3.13.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fless%2Fdownload%2Fless-3.13.1.tgz",
721 | "integrity": "sha1-DryR0qDpwMZzW4PUlrCrBYMHeQk=",
722 | "dev": true,
723 | "dependencies": {
724 | "copy-anything": "^2.0.1",
725 | "tslib": "^1.10.0"
726 | },
727 | "bin": {
728 | "lessc": "bin/lessc"
729 | },
730 | "engines": {
731 | "node": ">=6"
732 | },
733 | "optionalDependencies": {
734 | "errno": "^0.1.1",
735 | "graceful-fs": "^4.1.2",
736 | "image-size": "~0.5.0",
737 | "make-dir": "^2.1.0",
738 | "mime": "^1.4.1",
739 | "native-request": "^1.0.5",
740 | "source-map": "~0.6.0"
741 | }
742 | },
743 | "node_modules/less/node_modules/mime": {
744 | "version": "1.6.0",
745 | "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz",
746 | "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=",
747 | "dev": true,
748 | "optional": true,
749 | "bin": {
750 | "mime": "cli.js"
751 | },
752 | "engines": {
753 | "node": ">=4"
754 | }
755 | },
756 | "node_modules/lib0": {
757 | "version": "0.2.73",
758 | "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.73.tgz",
759 | "integrity": "sha512-aJJIElCLWnHMcYZPtsM07QoSfHwpxCy4VUzBYGXFYEmh/h2QS5uZNbCCfL0CqnkOE30b7Tp9DVfjXag+3qzZjQ==",
760 | "peer": true,
761 | "dependencies": {
762 | "isomorphic.js": "^0.2.4"
763 | },
764 | "bin": {
765 | "0gentesthtml": "bin/gentesthtml.js",
766 | "0serve": "bin/0serve.js"
767 | },
768 | "engines": {
769 | "node": ">=14"
770 | },
771 | "funding": {
772 | "type": "GitHub Sponsors ❤",
773 | "url": "https://github.com/sponsors/dmonad"
774 | }
775 | },
776 | "node_modules/lit": {
777 | "version": "2.7.0",
778 | "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.0.tgz",
779 | "integrity": "sha512-qSy2BAVA+OiWtNptP404egcC/izDdNRw6iHGIbUmkZtbMJvPKfNsaoKrNs8Zmsbjmv5ZX2tur1l9TfzkSWWT4g==",
780 | "dependencies": {
781 | "@lit/reactive-element": "^1.6.0",
782 | "lit-element": "^3.3.0",
783 | "lit-html": "^2.7.0"
784 | }
785 | },
786 | "node_modules/lit-element": {
787 | "version": "3.3.0",
788 | "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.0.tgz",
789 | "integrity": "sha512-M3OIoblNS7LZdRxOIk8g0wyLEA/lRw/UGJ1TX+767OpkuDsRdSoxBIvewpWqCo7sMd9xt1XedUNZIr9jUO1X3g==",
790 | "dependencies": {
791 | "@lit-labs/ssr-dom-shim": "^1.1.0",
792 | "@lit/reactive-element": "^1.3.0",
793 | "lit-html": "^2.7.0"
794 | }
795 | },
796 | "node_modules/lit-html": {
797 | "version": "2.7.0",
798 | "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.0.tgz",
799 | "integrity": "sha512-/zPOl8EfeB3HHpTzINSpnWgvgQ8N07g/j272EOAIyB0Ys2RzBqTVT23i+JZuUlNbB2WHHeSsTCFi92NtWrtpqQ==",
800 | "dependencies": {
801 | "@types/trusted-types": "^2.0.2"
802 | }
803 | },
804 | "node_modules/loader-utils": {
805 | "version": "1.4.0",
806 | "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz",
807 | "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=",
808 | "dev": true,
809 | "dependencies": {
810 | "big.js": "^5.2.2",
811 | "emojis-list": "^3.0.0",
812 | "json5": "^1.0.1"
813 | },
814 | "engines": {
815 | "node": ">=4.0.0"
816 | }
817 | },
818 | "node_modules/lodash.camelcase": {
819 | "version": "4.3.0",
820 | "resolved": "https://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz?cache=0&sync_timestamp=1577806297529&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash.camelcase%2Fdownload%2Flodash.camelcase-4.3.0.tgz",
821 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
822 | "dev": true
823 | },
824 | "node_modules/lru-cache": {
825 | "version": "5.1.1",
826 | "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz",
827 | "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
828 | "dev": true,
829 | "dependencies": {
830 | "yallist": "^3.0.2"
831 | }
832 | },
833 | "node_modules/magic-string": {
834 | "version": "0.25.7",
835 | "resolved": "https://registry.npm.taobao.org/magic-string/download/magic-string-0.25.7.tgz",
836 | "integrity": "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=",
837 | "dev": true,
838 | "dependencies": {
839 | "sourcemap-codec": "^1.4.4"
840 | }
841 | },
842 | "node_modules/make-dir": {
843 | "version": "2.1.0",
844 | "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz",
845 | "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=",
846 | "dev": true,
847 | "optional": true,
848 | "dependencies": {
849 | "pify": "^4.0.1",
850 | "semver": "^5.6.0"
851 | },
852 | "engines": {
853 | "node": ">=6"
854 | }
855 | },
856 | "node_modules/marked": {
857 | "version": "4.3.0",
858 | "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
859 | "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
860 | "bin": {
861 | "marked": "bin/marked.js"
862 | },
863 | "engines": {
864 | "node": ">= 12"
865 | }
866 | },
867 | "node_modules/merge": {
868 | "version": "2.1.1",
869 | "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz",
870 | "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==",
871 | "peer": true
872 | },
873 | "node_modules/merge-source-map": {
874 | "version": "1.1.0",
875 | "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz",
876 | "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=",
877 | "dev": true,
878 | "dependencies": {
879 | "source-map": "^0.6.1"
880 | }
881 | },
882 | "node_modules/minimist": {
883 | "version": "1.2.5",
884 | "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz",
885 | "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=",
886 | "dev": true
887 | },
888 | "node_modules/ms": {
889 | "version": "2.1.2",
890 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
891 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
892 | "peer": true
893 | },
894 | "node_modules/nanoid": {
895 | "version": "3.3.6",
896 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
897 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
898 | "dev": true,
899 | "funding": [
900 | {
901 | "type": "github",
902 | "url": "https://github.com/sponsors/ai"
903 | }
904 | ],
905 | "bin": {
906 | "nanoid": "bin/nanoid.cjs"
907 | },
908 | "engines": {
909 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
910 | }
911 | },
912 | "node_modules/native-request": {
913 | "version": "1.0.8",
914 | "resolved": "https://registry.npm.taobao.org/native-request/download/native-request-1.0.8.tgz?cache=0&sync_timestamp=1603412804149&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnative-request%2Fdownload%2Fnative-request-1.0.8.tgz",
915 | "integrity": "sha1-j2a/YG4PfqJ8DlmV6y9dA+M65vs=",
916 | "dev": true,
917 | "optional": true
918 | },
919 | "node_modules/path-parse": {
920 | "version": "1.0.6",
921 | "resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz",
922 | "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=",
923 | "dev": true
924 | },
925 | "node_modules/perfect-freehand": {
926 | "version": "1.2.0",
927 | "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.0.tgz",
928 | "integrity": "sha512-h/0ikF1M3phW7CwpZ5MMvKnfpHficWoOEyr//KVNTxV4F6deRK1eYMtHyBKEAKFK0aXIEUK9oBvlF6PNXMDsAw==",
929 | "peer": true
930 | },
931 | "node_modules/picocolors": {
932 | "version": "1.0.0",
933 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
934 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
935 | "dev": true
936 | },
937 | "node_modules/pify": {
938 | "version": "4.0.1",
939 | "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz",
940 | "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=",
941 | "dev": true,
942 | "optional": true,
943 | "engines": {
944 | "node": ">=6"
945 | }
946 | },
947 | "node_modules/postcss": {
948 | "version": "8.4.21",
949 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
950 | "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
951 | "dev": true,
952 | "funding": [
953 | {
954 | "type": "opencollective",
955 | "url": "https://opencollective.com/postcss/"
956 | },
957 | {
958 | "type": "tidelift",
959 | "url": "https://tidelift.com/funding/github/npm/postcss"
960 | }
961 | ],
962 | "dependencies": {
963 | "nanoid": "^3.3.4",
964 | "picocolors": "^1.0.0",
965 | "source-map-js": "^1.0.2"
966 | },
967 | "engines": {
968 | "node": "^10 || ^12 || >=14"
969 | }
970 | },
971 | "node_modules/postcss-modules": {
972 | "version": "4.0.0",
973 | "resolved": "https://registry.npm.taobao.org/postcss-modules/download/postcss-modules-4.0.0.tgz?cache=0&sync_timestamp=1606641122441&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules%2Fdownload%2Fpostcss-modules-4.0.0.tgz",
974 | "integrity": "sha1-K8fydquI8/Gw+t9svXdy1DtfO5s=",
975 | "dev": true,
976 | "dependencies": {
977 | "generic-names": "^2.0.1",
978 | "icss-replace-symbols": "^1.1.0",
979 | "lodash.camelcase": "^4.3.0",
980 | "postcss-modules-extract-imports": "^3.0.0",
981 | "postcss-modules-local-by-default": "^4.0.0",
982 | "postcss-modules-scope": "^3.0.0",
983 | "postcss-modules-values": "^4.0.0",
984 | "string-hash": "^1.1.1"
985 | },
986 | "peerDependencies": {
987 | "postcss": "^8.0.0"
988 | }
989 | },
990 | "node_modules/postcss-modules/node_modules/icss-utils": {
991 | "version": "5.1.0",
992 | "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-5.1.0.tgz?cache=0&sync_timestamp=1605801458520&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficss-utils%2Fdownload%2Ficss-utils-5.1.0.tgz",
993 | "integrity": "sha1-xr5oWKvQE9do6YNmrkfiXViHsa4=",
994 | "dev": true,
995 | "engines": {
996 | "node": "^10 || ^12 || >= 14"
997 | },
998 | "peerDependencies": {
999 | "postcss": "^8.1.0"
1000 | }
1001 | },
1002 | "node_modules/postcss-modules/node_modules/postcss-modules-extract-imports": {
1003 | "version": "3.0.0",
1004 | "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-3.0.0.tgz?cache=0&sync_timestamp=1602588202058&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-extract-imports%2Fdownload%2Fpostcss-modules-extract-imports-3.0.0.tgz",
1005 | "integrity": "sha1-zaHwR8CugMl9vijD52pDuIAldB0=",
1006 | "dev": true,
1007 | "engines": {
1008 | "node": "^10 || ^12 || >= 14"
1009 | },
1010 | "peerDependencies": {
1011 | "postcss": "^8.1.0"
1012 | }
1013 | },
1014 | "node_modules/postcss-modules/node_modules/postcss-modules-local-by-default": {
1015 | "version": "4.0.0",
1016 | "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-4.0.0.tgz?cache=0&sync_timestamp=1602587625149&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-4.0.0.tgz",
1017 | "integrity": "sha1-67tU+uFZjuz99pGgKz/zs5ClpRw=",
1018 | "dev": true,
1019 | "dependencies": {
1020 | "icss-utils": "^5.0.0",
1021 | "postcss-selector-parser": "^6.0.2",
1022 | "postcss-value-parser": "^4.1.0"
1023 | },
1024 | "engines": {
1025 | "node": "^10 || ^12 || >= 14"
1026 | },
1027 | "peerDependencies": {
1028 | "postcss": "^8.1.0"
1029 | }
1030 | },
1031 | "node_modules/postcss-modules/node_modules/postcss-modules-scope": {
1032 | "version": "3.0.0",
1033 | "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-3.0.0.tgz?cache=0&sync_timestamp=1602593133331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-scope%2Fdownload%2Fpostcss-modules-scope-3.0.0.tgz",
1034 | "integrity": "sha1-nvMVFFbTu/oSDKRImN/Kby+gHwY=",
1035 | "dev": true,
1036 | "dependencies": {
1037 | "postcss-selector-parser": "^6.0.4"
1038 | },
1039 | "engines": {
1040 | "node": "^10 || ^12 || >= 14"
1041 | },
1042 | "peerDependencies": {
1043 | "postcss": "^8.1.0"
1044 | }
1045 | },
1046 | "node_modules/postcss-modules/node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
1047 | "version": "6.0.4",
1048 | "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.4.tgz",
1049 | "integrity": "sha1-VgdaE4CgRgTDiwY+p3Z6Epr1wrM=",
1050 | "dev": true,
1051 | "dependencies": {
1052 | "cssesc": "^3.0.0",
1053 | "indexes-of": "^1.0.1",
1054 | "uniq": "^1.0.1",
1055 | "util-deprecate": "^1.0.2"
1056 | },
1057 | "engines": {
1058 | "node": ">=4"
1059 | }
1060 | },
1061 | "node_modules/postcss-modules/node_modules/postcss-modules-values": {
1062 | "version": "4.0.0",
1063 | "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-4.0.0.tgz?cache=0&sync_timestamp=1602586179271&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-values%2Fdownload%2Fpostcss-modules-values-4.0.0.tgz",
1064 | "integrity": "sha1-18Xn5ow7s8myfL9Iyguz/7RgLJw=",
1065 | "dev": true,
1066 | "dependencies": {
1067 | "icss-utils": "^5.0.0"
1068 | },
1069 | "engines": {
1070 | "node": "^10 || ^12 || >= 14"
1071 | },
1072 | "peerDependencies": {
1073 | "postcss": "^8.1.0"
1074 | }
1075 | },
1076 | "node_modules/postcss-modules/node_modules/postcss-value-parser": {
1077 | "version": "4.1.0",
1078 | "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz",
1079 | "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=",
1080 | "dev": true
1081 | },
1082 | "node_modules/postcss-selector-parser": {
1083 | "version": "6.0.2",
1084 | "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.2.tgz",
1085 | "integrity": "sha1-k0z3mdAWyDQRhZ4J3Oyt4BKG7Fw=",
1086 | "dev": true,
1087 | "dependencies": {
1088 | "cssesc": "^3.0.0",
1089 | "indexes-of": "^1.0.1",
1090 | "uniq": "^1.0.1"
1091 | },
1092 | "engines": {
1093 | "node": ">=4"
1094 | }
1095 | },
1096 | "node_modules/prr": {
1097 | "version": "1.0.1",
1098 | "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz",
1099 | "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
1100 | "dev": true,
1101 | "optional": true
1102 | },
1103 | "node_modules/queue-microtask": {
1104 | "version": "1.2.3",
1105 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1106 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1107 | "funding": [
1108 | {
1109 | "type": "github",
1110 | "url": "https://github.com/sponsors/feross"
1111 | },
1112 | {
1113 | "type": "patreon",
1114 | "url": "https://www.patreon.com/feross"
1115 | },
1116 | {
1117 | "type": "consulting",
1118 | "url": "https://feross.org/support"
1119 | }
1120 | ],
1121 | "peer": true
1122 | },
1123 | "node_modules/randombytes": {
1124 | "version": "2.1.0",
1125 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
1126 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
1127 | "peer": true,
1128 | "dependencies": {
1129 | "safe-buffer": "^5.1.0"
1130 | }
1131 | },
1132 | "node_modules/readable-stream": {
1133 | "version": "3.6.2",
1134 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
1135 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
1136 | "peer": true,
1137 | "dependencies": {
1138 | "inherits": "^2.0.3",
1139 | "string_decoder": "^1.1.1",
1140 | "util-deprecate": "^1.0.1"
1141 | },
1142 | "engines": {
1143 | "node": ">= 6"
1144 | }
1145 | },
1146 | "node_modules/rollup": {
1147 | "version": "2.41.5",
1148 | "resolved": "https://registry.npm.taobao.org/rollup/download/rollup-2.41.5.tgz",
1149 | "integrity": "sha1-55zvjMXBIWElKPWQMZY5sfMtotc=",
1150 | "dev": true,
1151 | "bin": {
1152 | "rollup": "dist/bin/rollup"
1153 | },
1154 | "engines": {
1155 | "node": ">=10.0.0"
1156 | },
1157 | "optionalDependencies": {
1158 | "fsevents": "~2.3.1"
1159 | }
1160 | },
1161 | "node_modules/rollup/node_modules/fsevents": {
1162 | "version": "2.3.2",
1163 | "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz?cache=0&sync_timestamp=1612536512306&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.3.2.tgz",
1164 | "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=",
1165 | "dev": true,
1166 | "hasInstallScript": true,
1167 | "optional": true,
1168 | "os": [
1169 | "darwin"
1170 | ],
1171 | "engines": {
1172 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1173 | }
1174 | },
1175 | "node_modules/safari-14-idb-fix": {
1176 | "version": "3.0.0",
1177 | "resolved": "https://registry.npmjs.org/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz",
1178 | "integrity": "sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog==",
1179 | "peer": true
1180 | },
1181 | "node_modules/safe-buffer": {
1182 | "version": "5.2.1",
1183 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1184 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1185 | "funding": [
1186 | {
1187 | "type": "github",
1188 | "url": "https://github.com/sponsors/feross"
1189 | },
1190 | {
1191 | "type": "patreon",
1192 | "url": "https://www.patreon.com/feross"
1193 | },
1194 | {
1195 | "type": "consulting",
1196 | "url": "https://feross.org/support"
1197 | }
1198 | ],
1199 | "peer": true
1200 | },
1201 | "node_modules/semver": {
1202 | "version": "5.7.1",
1203 | "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1606854493763&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz",
1204 | "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=",
1205 | "dev": true,
1206 | "optional": true,
1207 | "bin": {
1208 | "semver": "bin/semver"
1209 | }
1210 | },
1211 | "node_modules/shiki": {
1212 | "version": "0.14.1",
1213 | "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz",
1214 | "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==",
1215 | "peer": true,
1216 | "dependencies": {
1217 | "ansi-sequence-parser": "^1.1.0",
1218 | "jsonc-parser": "^3.2.0",
1219 | "vscode-oniguruma": "^1.7.0",
1220 | "vscode-textmate": "^8.0.0"
1221 | }
1222 | },
1223 | "node_modules/simple-peer": {
1224 | "version": "9.11.1",
1225 | "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz",
1226 | "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==",
1227 | "funding": [
1228 | {
1229 | "type": "github",
1230 | "url": "https://github.com/sponsors/feross"
1231 | },
1232 | {
1233 | "type": "patreon",
1234 | "url": "https://www.patreon.com/feross"
1235 | },
1236 | {
1237 | "type": "consulting",
1238 | "url": "https://feross.org/support"
1239 | }
1240 | ],
1241 | "peer": true,
1242 | "dependencies": {
1243 | "buffer": "^6.0.3",
1244 | "debug": "^4.3.2",
1245 | "err-code": "^3.0.1",
1246 | "get-browser-rtc": "^1.1.0",
1247 | "queue-microtask": "^1.2.3",
1248 | "randombytes": "^2.1.0",
1249 | "readable-stream": "^3.6.0"
1250 | }
1251 | },
1252 | "node_modules/source-map": {
1253 | "version": "0.6.1",
1254 | "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
1255 | "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
1256 | "engines": {
1257 | "node": ">=0.10.0"
1258 | }
1259 | },
1260 | "node_modules/source-map-js": {
1261 | "version": "1.0.2",
1262 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
1263 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
1264 | "dev": true,
1265 | "engines": {
1266 | "node": ">=0.10.0"
1267 | }
1268 | },
1269 | "node_modules/sourcemap-codec": {
1270 | "version": "1.4.8",
1271 | "resolved": "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz",
1272 | "integrity": "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=",
1273 | "deprecated": "Please use @jridgewell/sourcemap-codec instead",
1274 | "dev": true
1275 | },
1276 | "node_modules/string_decoder": {
1277 | "version": "1.3.0",
1278 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
1279 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
1280 | "peer": true,
1281 | "dependencies": {
1282 | "safe-buffer": "~5.2.0"
1283 | }
1284 | },
1285 | "node_modules/string-hash": {
1286 | "version": "1.1.3",
1287 | "resolved": "https://registry.npm.taobao.org/string-hash/download/string-hash-1.1.3.tgz",
1288 | "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=",
1289 | "dev": true
1290 | },
1291 | "node_modules/to-fast-properties": {
1292 | "version": "2.0.0",
1293 | "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz",
1294 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
1295 | "engines": {
1296 | "node": ">=4"
1297 | }
1298 | },
1299 | "node_modules/tslib": {
1300 | "version": "1.13.0",
1301 | "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.13.0.tgz?cache=0&sync_timestamp=1609887785854&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-1.13.0.tgz",
1302 | "integrity": "sha1-yIHhPMcBWJTtkUhi0nZDb6mkcEM=",
1303 | "dev": true
1304 | },
1305 | "node_modules/turndown": {
1306 | "version": "7.1.2",
1307 | "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.1.2.tgz",
1308 | "integrity": "sha512-ntI9R7fcUKjqBP6QU8rBK2Ehyt8LAzt3UBT9JR9tgo6GtuKvyUzpayWmeMKJw1DPdXzktvtIT8m2mVXz+bL/Qg==",
1309 | "dependencies": {
1310 | "domino": "^2.1.6"
1311 | }
1312 | },
1313 | "node_modules/uniq": {
1314 | "version": "1.0.1",
1315 | "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz",
1316 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
1317 | "dev": true
1318 | },
1319 | "node_modules/util-deprecate": {
1320 | "version": "1.0.2",
1321 | "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz",
1322 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1323 | },
1324 | "node_modules/vite": {
1325 | "version": "2.1.2",
1326 | "resolved": "https://registry.npm.taobao.org/vite/download/vite-2.1.2.tgz",
1327 | "integrity": "sha1-CuyvbTQRKyRTbfGhTNjXT9yrbiA=",
1328 | "dev": true,
1329 | "dependencies": {
1330 | "esbuild": "^0.9.3",
1331 | "postcss": "^8.2.1",
1332 | "resolve": "^1.19.0",
1333 | "rollup": "^2.38.5"
1334 | },
1335 | "bin": {
1336 | "vite": "bin/vite.js"
1337 | },
1338 | "engines": {
1339 | "node": ">=12.0.0"
1340 | },
1341 | "optionalDependencies": {
1342 | "fsevents": "~2.3.1"
1343 | }
1344 | },
1345 | "node_modules/vite/node_modules/fsevents": {
1346 | "version": "2.3.2",
1347 | "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz?cache=0&sync_timestamp=1612536512306&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.3.2.tgz",
1348 | "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=",
1349 | "dev": true,
1350 | "hasInstallScript": true,
1351 | "optional": true,
1352 | "os": [
1353 | "darwin"
1354 | ],
1355 | "engines": {
1356 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1357 | }
1358 | },
1359 | "node_modules/vite/node_modules/resolve": {
1360 | "version": "1.20.0",
1361 | "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz",
1362 | "integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=",
1363 | "dev": true,
1364 | "dependencies": {
1365 | "is-core-module": "^2.2.0",
1366 | "path-parse": "^1.0.6"
1367 | },
1368 | "funding": {
1369 | "url": "https://github.com/sponsors/ljharb"
1370 | }
1371 | },
1372 | "node_modules/vscode-oniguruma": {
1373 | "version": "1.7.0",
1374 | "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
1375 | "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
1376 | "peer": true
1377 | },
1378 | "node_modules/vscode-textmate": {
1379 | "version": "8.0.0",
1380 | "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz",
1381 | "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==",
1382 | "peer": true
1383 | },
1384 | "node_modules/vue": {
1385 | "version": "3.0.7",
1386 | "resolved": "https://registry.npm.taobao.org/vue/download/vue-3.0.7.tgz",
1387 | "integrity": "sha1-i8/1H4vlcPnkzozF9S4qsP48dKE=",
1388 | "dependencies": {
1389 | "@vue/compiler-dom": "3.0.7",
1390 | "@vue/runtime-dom": "3.0.7",
1391 | "@vue/shared": "3.0.7"
1392 | }
1393 | },
1394 | "node_modules/vue-router": {
1395 | "version": "4.0.5",
1396 | "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-4.0.5.tgz?cache=0&sync_timestamp=1615477493682&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-4.0.5.tgz",
1397 | "integrity": "sha1-3QpBNLyVDDeu9kuXPp7hAIQo2Po=",
1398 | "peerDependencies": {
1399 | "vue": "^3.0.0"
1400 | }
1401 | },
1402 | "node_modules/vuex": {
1403 | "version": "4.0.0",
1404 | "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-4.0.0.tgz",
1405 | "integrity": "sha1-rId6p2qcRTaMl5Rx5GG1INOObPU=",
1406 | "peerDependencies": {
1407 | "vue": "^3.0.2"
1408 | }
1409 | },
1410 | "node_modules/ws": {
1411 | "version": "7.5.9",
1412 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
1413 | "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
1414 | "optional": true,
1415 | "peer": true,
1416 | "engines": {
1417 | "node": ">=8.3.0"
1418 | },
1419 | "peerDependencies": {
1420 | "bufferutil": "^4.0.1",
1421 | "utf-8-validate": "^5.0.2"
1422 | },
1423 | "peerDependenciesMeta": {
1424 | "bufferutil": {
1425 | "optional": true
1426 | },
1427 | "utf-8-validate": {
1428 | "optional": true
1429 | }
1430 | }
1431 | },
1432 | "node_modules/y-protocols": {
1433 | "version": "1.0.5",
1434 | "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.5.tgz",
1435 | "integrity": "sha512-Wil92b7cGk712lRHDqS4T90IczF6RkcvCwAD0A2OPg+adKmOe+nOiT/N2hvpQIWS3zfjmtL4CPaH5sIW1Hkm/A==",
1436 | "peer": true,
1437 | "dependencies": {
1438 | "lib0": "^0.2.42"
1439 | },
1440 | "funding": {
1441 | "type": "GitHub Sponsors ❤",
1442 | "url": "https://github.com/sponsors/dmonad"
1443 | }
1444 | },
1445 | "node_modules/y-webrtc": {
1446 | "version": "10.2.5",
1447 | "resolved": "https://registry.npmjs.org/y-webrtc/-/y-webrtc-10.2.5.tgz",
1448 | "integrity": "sha512-ZyBNvTI5L28sQ2PQI0T/JvyWgvuTq05L21vGkIlcvNLNSJqAaLCBJRe3FHEqXoaogqWmRcEAKGfII4ErNXMnNw==",
1449 | "peer": true,
1450 | "dependencies": {
1451 | "lib0": "^0.2.42",
1452 | "simple-peer": "^9.11.0",
1453 | "y-protocols": "^1.0.5"
1454 | },
1455 | "bin": {
1456 | "y-webrtc-signaling": "bin/server.js"
1457 | },
1458 | "engines": {
1459 | "node": ">=12"
1460 | },
1461 | "funding": {
1462 | "type": "GitHub Sponsors ❤",
1463 | "url": "https://github.com/sponsors/dmonad"
1464 | },
1465 | "optionalDependencies": {
1466 | "ws": "^7.2.0"
1467 | }
1468 | },
1469 | "node_modules/yallist": {
1470 | "version": "3.1.1",
1471 | "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz",
1472 | "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=",
1473 | "dev": true
1474 | },
1475 | "node_modules/yjs": {
1476 | "version": "13.5.51",
1477 | "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.5.51.tgz",
1478 | "integrity": "sha512-F1Nb3z3TdandD80IAeQqgqy/2n9AhDLcXoBhZvCUX1dNVe0ef7fIwi6MjSYaGAYF2Ev8VcLcsGnmuGGOl7AWbw==",
1479 | "peer": true,
1480 | "dependencies": {
1481 | "lib0": "^0.2.72"
1482 | },
1483 | "engines": {
1484 | "node": ">=16.0.0",
1485 | "npm": ">=8.0.0"
1486 | },
1487 | "funding": {
1488 | "type": "GitHub Sponsors ❤",
1489 | "url": "https://github.com/sponsors/dmonad"
1490 | }
1491 | },
1492 | "node_modules/zod": {
1493 | "version": "3.21.4",
1494 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz",
1495 | "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==",
1496 | "funding": {
1497 | "url": "https://github.com/sponsors/colinhacks"
1498 | }
1499 | }
1500 | }
1501 | }
1502 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "aregrid-mindnote",
3 | "version": "1.0.0",
4 | "private": true,
5 | "author": "zhangchi",
6 | "scripts": {
7 | "dev": "NODE_ENV=development vite",
8 | "build": "NODE_ENV=production vite build",
9 | "docs": "NODE_ENV=production vite build && git add . && git commit -m 'docs pub' && git push origin master"
10 | },
11 | "dependencies": {
12 | "@blocksuite/editor": "^0.5.0-20230326033652-70ca43c",
13 | "vue": "^3.0.5",
14 | "vue-router": "^4.0.0-rc.2",
15 | "vuex": "^4.0.0-rc.1"
16 | },
17 | "devDependencies": {
18 | "@vitejs/plugin-vue": "^1.1.5",
19 | "@vue/compiler-sfc": "^3.0.5",
20 | "dotenv": "^8.2.0",
21 | "less": "^3.13.0",
22 | "vite": "^2.0.4"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/components/MindmapView/MindmapView.js:
--------------------------------------------------------------------------------
1 | import * as utils from "../../utils/util";
2 | import TreeNode from "./TreeNode.js";
3 | import treeProperties from "./TreeProperties.js";
4 | import parseList from "./Parser.js";
5 |
6 | function MindmapView(opts) {
7 | this.el = opts.el; // container
8 | this.currentTree = undefined;
9 | this.treeProperties = {};
10 | this.sourceCode = opts.sourceCode;
11 | for (var propName in treeProperties) {
12 | this.treeProperties[propName] = treeProperties[propName].val;
13 | }
14 | this.parseSource();
15 | }
16 | MindmapView.prototype = {
17 | parseSource: function () {
18 | console.log("Parsing...");
19 |
20 | try {
21 | console.log(222);
22 | console.log(this.sourceCode);
23 | var parsed = parseList(this.sourceCode);
24 | console.log(parsed);
25 | } catch (err) {
26 | console.log("Error sourceCode parse fail");
27 |
28 | return;
29 | }
30 |
31 | if (parsed.children.length == 0) return;
32 | parsed = parsed.children[0];
33 |
34 | try {
35 | if (treeProperties["textFilter"].val != "") {
36 | this.textFilter = new RegExp(treeProperties["textFilter"].val);
37 | } else {
38 | this.textFilter = new RegExp(".+");
39 | }
40 | } catch (err) {
41 | console.log(err);
42 | return;
43 | }
44 |
45 | this.currentTree = this.parseObjectBranch(parsed, true);
46 | this.regenerateDiagram();
47 | },
48 |
49 | parseObjectBranch: function (branch, isRoot = false) {
50 | var node = new TreeNode(branch.label, isRoot);
51 |
52 | for (var child of branch.children) {
53 | if (this.textFilter.test(child.label)) {
54 | node.addChild(this.parseObjectBranch(child, false));
55 | }
56 | }
57 |
58 | return node;
59 | },
60 |
61 | regenerateDiagram: function () {
62 | var canvas = this.el;
63 | var ctx = canvas.getContext("2d");
64 |
65 | if (!(this.currentTree instanceof TreeNode)) {
66 | console.log("Not a valid tree", this.currentTree);
67 | return;
68 | }
69 |
70 | //dDraw the mindmap
71 | var beautifulDrawing = this.currentTree.draw();
72 |
73 | // resize canvas to the size of the mindmap plus some margin
74 | canvas.width = beautifulDrawing.width + 25;
75 | canvas.height = beautifulDrawing.height + 25;
76 |
77 | // console.log("Canvas", canvas.width, canvas.height);
78 |
79 | // draw the mindmap onto the existing canvas
80 | ctx.drawImage(beautifulDrawing, 25, 25);
81 | },
82 |
83 | buildGlobalProperties: function () {
84 | for (var propName in treeProperties) {
85 | if ("textFilter" != propName) {
86 | treeProperties[propName].val = Number(this.treeProperties[propName]);
87 | } else {
88 | treeProperties[propName].val = this.treeProperties[propName];
89 | }
90 | }
91 | this.parseSource();
92 | },
93 | };
94 |
95 | export default MindmapView;
96 |
--------------------------------------------------------------------------------
/src/components/MindmapView/Parser.js:
--------------------------------------------------------------------------------
1 | export default function parseList(text) {
2 | var items = { label: "ROOT", children: [], depth: -1 };
3 | var lines = text.split("\n");
4 | lines = lines.filter((c) => !c.match(/^\s*$/)); // Remove blank lines
5 |
6 | var currentParent = items;
7 | var currentParentDepth = -1;
8 |
9 | var currentItemLabel = "";
10 | var currentItemDepth;
11 |
12 | for (var line of lines) {
13 | var itemMatch = line.match(/^( *)-\s*(.*)$/);
14 |
15 | // New item
16 | if (itemMatch) {
17 | // Store previous item (if any)
18 | if (currentItemLabel != "") {
19 | // Build the node for the previously read node
20 | var node = {
21 | label: currentItemLabel,
22 | children: [],
23 | parent: currentParent,
24 | depth: currentItemDepth,
25 | };
26 |
27 | // Store the node within its parent
28 | currentParent["children"].push(node);
29 |
30 | // Set the new "parent" to the previous item
31 | currentParent = node;
32 | currentParentDepth = node.depth;
33 | }
34 |
35 | // Fetch the data from the newly-read item
36 | currentItemDepth = itemMatch[1].length;
37 | currentItemLabel = itemMatch[2];
38 |
39 | // If the parent is deeper than the new item, switch the parent
40 | // to one with lower depth than current item
41 | while (currentItemDepth <= currentParentDepth) {
42 | currentParent = currentParent["parent"];
43 | currentParentDepth = currentParent["depth"];
44 | }
45 | }
46 | // Continued string from previous item
47 | else {
48 | currentItemLabel += "\n" + line;
49 | }
50 | }
51 |
52 | // Force insert last item
53 | if (currentItemLabel) {
54 | var node = {
55 | label: currentItemLabel,
56 | children: [],
57 | parent: currentParent,
58 | depth: currentParentDepth + 1,
59 | };
60 | currentParent["children"].push(node);
61 | }
62 |
63 | return items;
64 | }
65 |
--------------------------------------------------------------------------------
/src/components/MindmapView/TreeNode.js:
--------------------------------------------------------------------------------
1 | import * as utils from "../../utils/util";
2 | import treeProperties from "./TreeProperties";
3 |
4 | var fontFamily = "Open Sans";
5 |
6 | var labelPaddingBottom = 8;
7 | var labelPaddingRight = 10;
8 |
9 | var DEBUG = false;
10 |
11 | export default class TreeNode {
12 | constructor(label, isRoot = false) {
13 | this.label = label;
14 | this.labelLines = this.label.split("\n");
15 | this.isRoot = isRoot;
16 | this.parent = undefined;
17 | this.children = [];
18 | }
19 |
20 | get isLeaf() {
21 | return this.children.length == 0;
22 | }
23 |
24 | addChild(child) {
25 | child.parent = this;
26 | this.children.push(child);
27 | }
28 |
29 | addChildren(...children) {
30 | for (var child of children) {
31 | this.addChild(child);
32 | }
33 | }
34 |
35 | draw(currentBranchColor) {
36 | var that = this;
37 |
38 | var dl = function (x, y, c = "#00ff00", w = 100) {
39 | that.ctx.fillStyle = c;
40 | that.ctx.fillRect(x, y, w, 1);
41 | };
42 |
43 | var dr = function (x, y, w, h, c = "#00ff00") {
44 | that.ctx.lineWidth = 1;
45 | that.ctx.strokeStyle = c;
46 | that.ctx.rect(x, y, w, h);
47 | that.ctx.stroke();
48 | };
49 |
50 | this.canvas = document.createElement("canvas");
51 | this.ctx = this.canvas.getContext("2d");
52 |
53 | // The width of the label will be the width of the widest line
54 | this.ctx.font = treeProperties.fontSize.val + "px " + fontFamily;
55 |
56 | // The height of the lines of text (only)
57 | this.textHeight = treeProperties.fontSize.val * this.labelLines.length;
58 |
59 | // The height of the text + the separation from the line + the line height + the label margin
60 | this.composedHeight =
61 | this.textHeight +
62 | labelPaddingBottom +
63 | treeProperties.connectorLineWidth.val;
64 |
65 | // The composed height plus the margin
66 | this.paddedHeight = this.composedHeight + treeProperties.nodeMarginTop.val;
67 |
68 | this.labelHeight =
69 | treeProperties.nodeMarginTop.val + // top margin
70 | treeProperties.fontSize.val * (this.labelLines.length + 1) + // text lines' height
71 | treeProperties.nodeMarginBottom.val; // bottom margin
72 |
73 | this.labelWidth = Math.ceil(
74 | Math.max(...this.labelLines.map((c) => this.ctx.measureText(c).width))
75 | );
76 |
77 | if (this.isLeaf) {
78 | // Resize the canvas
79 | this.canvas.width = this.labelWidth + labelPaddingRight * 2;
80 | this.canvas.height = this.labelHeight;
81 |
82 | // Set the font
83 | this.ctx.font = treeProperties.fontSize.val + "px " + fontFamily;
84 |
85 | // Draw the text lines
86 | for (var i = 0; i < this.labelLines.length; i++) {
87 | this.ctx.fillText(
88 | this.labelLines[i],
89 | 0,
90 | treeProperties.fontSize.val * (i + 1) +
91 | treeProperties.nodeMarginTop.val
92 | );
93 | }
94 |
95 | // The anchorPoint defines where the line should start
96 | this.anchorPoint = {
97 | x: 0,
98 | y:
99 | this.labelLines.length * treeProperties.fontSize.val +
100 | labelPaddingBottom +
101 | treeProperties.nodeMarginTop.val,
102 | };
103 | } else {
104 | // If this is the root, we need to generate a random color for each branch
105 | if (this.isRoot) {
106 | var branchColors = this.children.map((c) =>
107 | utils.generateRandomColor(treeProperties.useGrayscale)
108 | );
109 | var canvases = this.children.map((c, i) => c.draw(branchColors[i]));
110 | }
111 |
112 | // Otherwise, use the received branchColor
113 | else {
114 | var canvases = this.children.map((c, i) => c.draw(currentBranchColor));
115 | }
116 |
117 | // Get the vertical positions for the children
118 | var childrenVerticalPositions = [0];
119 |
120 | // Each position is the sum of the acumulated heights of the previous elements
121 | for (var i = 0; i < canvases.length; i++) {
122 | childrenVerticalPositions[i + 1] =
123 | childrenVerticalPositions[i] + canvases[i].height;
124 | }
125 |
126 | let childrenHeight = childrenVerticalPositions[canvases.length];
127 |
128 | this.anchorPoint = { x: this.isRoot ? 10 : 0, y: 0 };
129 |
130 | /*
131 | If the height of the children is smaller than the height of the node, take the height of the node and
132 | don't center it vertically.
133 | Otherwise, take the max between 2*height of the node and the children height, and center it vertically.
134 | */
135 |
136 | if (
137 | childrenHeight <
138 | this.composedHeight + treeProperties.nodeMarginTop.val * 2
139 | ) {
140 | this.canvas.height =
141 | this.composedHeight + treeProperties.nodeMarginTop.val * 2;
142 | this.anchorPoint.y = this.canvas.height / 2 + this.composedHeight / 2;
143 | } else {
144 | this.canvas.height = Math.max(
145 | childrenVerticalPositions[canvases.length],
146 | this.composedHeight * 2
147 | );
148 | this.anchorPoint.y = this.canvas.height / 2;
149 | }
150 |
151 | console.log(
152 | this.label,
153 | this.canvas.height,
154 | childrenVerticalPositions[canvases.length]
155 | );
156 |
157 | // Compute left margin (label width + separation)
158 | var leftMargin = 10 + this.labelWidth + treeProperties.connectorWidth.val;
159 |
160 | // Set the width to the leftMargin plus the width of the widest child branch
161 | this.canvas.width =
162 | leftMargin + Math.max(...canvases.map((c) => c.width));
163 | this.ctx.font = treeProperties.fontSize.val + "px " + fontFamily;
164 |
165 | // Draw each child
166 | for (var i = 0; i < canvases.length; i++) {
167 | if (this.isRoot) {
168 | currentBranchColor = branchColors[i];
169 | }
170 |
171 | this.ctx.drawImage(
172 | canvases[i],
173 | leftMargin,
174 | childrenVerticalPositions[i]
175 | );
176 |
177 | var connector_a = {
178 | x: this.anchorPoint.x + this.labelWidth + labelPaddingRight,
179 | y: this.anchorPoint.y,
180 | };
181 |
182 | var connector_b = {
183 | x: leftMargin,
184 | y: childrenVerticalPositions[i] + this.children[i].anchorPoint.y,
185 | };
186 |
187 | this.ctx.beginPath();
188 | this.ctx.moveTo(connector_a.x, connector_a.y);
189 |
190 | this.ctx.bezierCurveTo(
191 | connector_a.x +
192 | treeProperties.connectorSteepness.val *
193 | treeProperties.connectorWidth.val,
194 | connector_a.y,
195 | connector_b.x -
196 | treeProperties.connectorSteepness.val *
197 | treeProperties.connectorWidth.val,
198 | connector_b.y,
199 | connector_b.x,
200 | connector_b.y
201 | );
202 |
203 | this.ctx.lineTo(
204 | connector_b.x + this.children[i].labelWidth + labelPaddingRight,
205 | connector_b.y
206 | );
207 | this.ctx.lineWidth = treeProperties.connectorLineWidth.val;
208 | this.ctx.lineCap = "round";
209 | this.ctx.strokeStyle = currentBranchColor;
210 | this.ctx.stroke();
211 | }
212 |
213 | // For the root node, print a containing rectangle and always center the text
214 | if (this.isRoot) {
215 | this.ctx.fillStyle = "#ffffff";
216 | this.ctx.lineWidth = 3;
217 | utils.roundRect(
218 | this.ctx,
219 | 2,
220 | this.canvas.height / 2 -
221 | this.labelLines.length * treeProperties.fontSize.val,
222 | this.labelWidth + 18,
223 | treeProperties.fontSize.val * (this.labelLines.length + 1.5),
224 | 5,
225 | true,
226 | true
227 | );
228 |
229 | this.ctx.fillStyle = "#000000";
230 |
231 | for (var i = 0; i < this.labelLines.length; i++) {
232 | this.ctx.fillText(
233 | this.labelLines[i],
234 | 10, // Fixed margin from the left
235 | this.canvas.height / 2 + // Vertical center
236 | treeProperties.fontSize.val / 2 - // Middle of the line height
237 | treeProperties.fontSize.val * (this.labelLines.length - i - 1) // Correctly account for multilines
238 | );
239 | }
240 | } else {
241 | this.ctx.fillStyle = "#000000";
242 |
243 | for (var i = 0; i < this.labelLines.length; i++) {
244 | this.ctx.fillText(
245 | this.labelLines[i],
246 | 10, // Fixed margin from the left
247 | this.anchorPoint.y - // From the anchor point
248 | labelPaddingBottom - // Move up the padding
249 | treeProperties.fontSize.val * (this.labelLines.length - i - 1)
250 | );
251 | }
252 | }
253 | }
254 |
255 | if (DEBUG) {
256 | dr(1, 1, this.canvas.width - 1, this.canvas.height - 1);
257 | }
258 |
259 | return this.canvas;
260 | }
261 | }
262 |
--------------------------------------------------------------------------------
/src/components/MindmapView/TreeProperties.js:
--------------------------------------------------------------------------------
1 | export default {
2 | textFilter: { label: "Text Filter (regex)", type: "text", val: "." },
3 | fontSize: { label: "Font size", model: "fontSize", min: 5, max: 50, val: 13 },
4 | connectorWidth: {
5 | label: "Connector width",
6 | model: "connectorWidth",
7 | min: 20,
8 | max: 100,
9 | val: 65,
10 | },
11 | connectorSteepness: {
12 | label: "Connector steepness",
13 | min: 0.1,
14 | max: 1,
15 | step: 0.01,
16 | val: 0.65,
17 | },
18 | connectorLineWidth: {
19 | label: "Line width",
20 | min: 0.5,
21 | max: 10,
22 | step: 0.25,
23 | val: 4.5,
24 | },
25 | nodeMarginTop: { label: " Top margin", min: 0, max: 50, val: 5 },
26 | nodeMarginBottom: { label: " Bottom margin", min: 0, max: 50, val: 5 },
27 | useGrayscale: { label: "Use grayscale", type: "boolean", val: 0 },
28 | };
29 |
--------------------------------------------------------------------------------
/src/components/MindnoteBox.vue:
--------------------------------------------------------------------------------
1 |
2 |
28 |
29 |
30 |
167 |
168 |
182 |
--------------------------------------------------------------------------------
/src/components/MindnoteCard.vue:
--------------------------------------------------------------------------------
1 |
2 |
8 |
{{ title }}
9 |
10 | {{ content }}
11 |
12 |
18 | {{ btn }}
19 |
20 |
21 |
22 |
23 |
74 |
75 |
112 |
--------------------------------------------------------------------------------
/src/components/MindnoteInput.vue:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
16 |
82 |
83 |
92 |
--------------------------------------------------------------------------------
/src/components/MindnoteItem.vue:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
65 |
66 |
107 |
--------------------------------------------------------------------------------
/src/components/MindnotePage.vue:
--------------------------------------------------------------------------------
1 |
2 |
39 |
40 |
41 |
146 |
147 |
208 |
--------------------------------------------------------------------------------
/src/components/MindnotePageX.vue:
--------------------------------------------------------------------------------
1 |
2 |
21 |
22 |
23 |
168 |
169 |
209 |
--------------------------------------------------------------------------------
/src/components/SpacePage.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Mindnote
5 |
6 |
{{ msg }}
7 |
8 |
9 |
13 |
14 |
15 |
20 |
27 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
107 |
146 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | #app {
2 | font-family: SourceSansPro, -apple-system, "PingFang SC", "Apple Color Emoji",
3 | BlinkMacSystemFont, Helvetica, Arial, "Segoe UI Emoji", "Segoe UI Symbol",
4 | "Microsoft YaHei", 微软雅黑, 黑体, Heiti, sans-serif, SimSun, 宋体, serif;
5 | -webkit-font-smoothing: antialiased;
6 | -moz-osx-font-smoothing: grayscale;
7 | background-color: #f7f7f7;
8 | }
9 |
10 | :root {
11 | --footer-color: #229999;
12 | --block-border-color: #888;
13 | --block-bg-color: #ffffff;
14 | --block-shadow: 0px 0.5px 2px rgba(0, 0, 0, 0.3);
15 | --block-title-color: #333;
16 | --block-time-color: #555;
17 | }
18 |
19 | * {
20 | margin: 0;
21 | padding: 0;
22 | }
23 | * {
24 | box-sizing: border-box;
25 | }
26 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | import router from './router'
2 |
3 | import { createApp } from 'vue'
4 |
5 | import App from './App.vue'
6 | import './index.css'
7 |
8 |
9 | var app = createApp(App);
10 | app.use(router);
11 |
12 | app.mount('#app')
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/router/index.js:
--------------------------------------------------------------------------------
1 | import { createRouter, createWebHistory } from "vue-router";
2 |
3 | const routes = [
4 | {
5 | path: "/",
6 | name: "SpacePage",
7 | component: () => import("../components/SpacePage.vue"),
8 | },
9 | {
10 | path: "/mindnote/:mindnoteId",
11 | name: "MindnotePage",
12 | component: () => import("../components/MindnotePageX.vue"),
13 | },
14 | ];
15 |
16 | export default createRouter({
17 | // mode: "history",
18 | history: createWebHistory("/aregrid-mindnote/#/"), //
19 | routes,
20 | });
21 |
--------------------------------------------------------------------------------
/src/utils/util.js:
--------------------------------------------------------------------------------
1 | let keyVersion = "1.0.0";
2 | let buildTrueKey = (key) => {
3 | return key + keyVersion;
4 | };
5 | export function setLocalStorage(key, value) {
6 | return localStorage.setItem(buildTrueKey(key), JSON.stringify(value));
7 | }
8 |
9 | export function getLocalStorage(key) {
10 | return JSON.parse(localStorage.getItem(buildTrueKey(key)));
11 | }
12 | export function uniqueid() {
13 | return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
14 | const r = (Math.random() * 16) | 0,
15 | v = c == "x" ? r : (r & 0x3) | 0x8;
16 | return v.toString(16);
17 | });
18 | }
19 |
20 | /**
21 | * Draws a rounded rectangle using the current state of the canvas.
22 | * If you omit the last three params, it will draw a rectangle
23 | * outline with a 5 pixel border radius
24 | * @param {CanvasRenderingContext2D} ctx
25 | * @param {Number} x The top left x coordinate
26 | * @param {Number} y The top left y coordinate
27 | * @param {Number} width The width of the rectangle
28 | * @param {Number} height The height of the rectangle
29 | * @param {Number} [radius = 5] The corner radius; It can also be an object
30 | * to specify different radii for corners
31 | * @param {Number} [radius.tl = 0] Top left
32 | * @param {Number} [radius.tr = 0] Top right
33 | * @param {Number} [radius.br = 0] Bottom right
34 | * @param {Number} [radius.bl = 0] Bottom left
35 | * @param {Boolean} [fill = false] Whether to fill the rectangle.
36 | * @param {Boolean} [stroke = true] Whether to stroke the rectangle.
37 | */
38 | export function roundRect(ctx, x, y, width, height, radius, fill, stroke) {
39 | if (typeof stroke == "undefined") {
40 | stroke = true;
41 | }
42 | if (typeof radius === "undefined") {
43 | radius = 5;
44 | }
45 | if (typeof radius === "number") {
46 | radius = {
47 | tl: radius,
48 | tr: radius,
49 | br: radius,
50 | bl: radius,
51 | };
52 | } else {
53 | var defaultRadius = {
54 | tl: 0,
55 | tr: 0,
56 | br: 0,
57 | bl: 0,
58 | };
59 | for (var side in defaultRadius) {
60 | radius[side] = radius[side] || defaultRadius[side];
61 | }
62 | }
63 | ctx.beginPath();
64 | ctx.moveTo(x + radius.tl, y);
65 | ctx.lineTo(x + width - radius.tr, y);
66 | ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);
67 | ctx.lineTo(x + width, y + height - radius.br);
68 | ctx.quadraticCurveTo(
69 | x + width,
70 | y + height,
71 | x + width - radius.br,
72 | y + height
73 | );
74 | ctx.lineTo(x + radius.bl, y + height);
75 | ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);
76 | ctx.lineTo(x, y + radius.tl);
77 | ctx.quadraticCurveTo(x, y, x + radius.tl, y);
78 | ctx.closePath();
79 | if (fill) {
80 | ctx.fill();
81 | }
82 | if (stroke) {
83 | ctx.stroke();
84 | }
85 | }
86 |
87 | export function getRandomInt(min, max) {
88 | return Math.floor(Math.random() * (max - min)) + min;
89 | }
90 |
91 | function componentToHex(c) {
92 | var hex = c.toString(16);
93 | return hex.length == 1 ? "0" + hex : hex;
94 | }
95 |
96 | function rgbToHex(r, g, b) {
97 | return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
98 | }
99 |
100 | export function generateRandomColor(useGrayscale) {
101 | var baseColor = [256, 256, 256];
102 | var red = getRandomInt(0, 256);
103 | var green = getRandomInt(0, 256);
104 | var blue = getRandomInt(0, 256);
105 |
106 | // mix the color
107 |
108 | var mixture = 0.7;
109 |
110 | red = Math.round(red * mixture + baseColor[0] * (1 - mixture));
111 | green = Math.round(green * mixture + baseColor[1] * (1 - mixture));
112 | blue = Math.round(blue * mixture + baseColor[2] * (1 - mixture));
113 |
114 | if (useGrayscale.val == 1) {
115 | return rgbToHex(red, red, red);
116 | } else {
117 | return rgbToHex(red, green, blue);
118 | }
119 | }
120 |
121 | export function getLoremIpsum(numWords = 5) {
122 | var baseText =
123 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus gravida eu leo vitae imperdiet. Nam pulvinar luctus arcu, vel semper ligula efficitur in. Mauris non semper ante. Nullam scelerisque hendrerit urna, lacinia egestas enim laoreet vitae. Aliquam erat volutpat. Duis posuere magna libero, vel rhoncus nisl ullamcorper eu. Etiam ac libero consectetur, congue nisi quis, vulputate erat.";
124 | var sentences = baseText.split(".");
125 | var sentences_words = sentences.map((s) => s.split(/[\s\.,]/));
126 |
127 | var chosenSentenceNumber = getRandomInt(0, sentences.length - 1);
128 | var chosenWords = sentences_words[chosenSentenceNumber]
129 | .slice(0, numWords)
130 | .join(" ");
131 |
132 | return chosenWords;
133 | }
134 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 | import { defineConfig } from "vite";
4 | import vue from "@vitejs/plugin-vue";
5 |
6 | // https://vitejs.dev/config/
7 |
8 | // Dotenv 是一个零依赖的模块,它能将环境变量中的变量从 .env 文件加载到 process.env 中
9 | const dotenv = require("dotenv");
10 |
11 | const envFiles = [
12 | /** default file */ `.env`,
13 | /** mode file */ `.env.${process.env.NODE_ENV}`,
14 | ];
15 |
16 | for (const file of envFiles) {
17 | const envConfig = dotenv.parse(fs.readFileSync(file));
18 | for (const k in envConfig) {
19 | process.env[k] = envConfig[k];
20 | }
21 | }
22 | module.exports = defineConfig({
23 | base: process.env.VITE_BASE_URL,
24 | build: process.env.VITE_OUTPUT_DIR
25 | ? {
26 | outDir: process.env.VITE_OUTPUT_DIR,
27 | }
28 | : null,
29 | plugins: [vue()],
30 | });
31 |
--------------------------------------------------------------------------------