diff --git a/console/.eslintrc.cjs b/console/.eslintrc.cjs
index a718c90..6b7235f 100644
--- a/console/.eslintrc.cjs
+++ b/console/.eslintrc.cjs
@@ -2,14 +2,14 @@
require("@rushstack/eslint-patch/modern-module-resolution");
module.exports = {
- "root": true,
- "extends": [
+ root: true,
+ extends: [
"plugin:vue/vue3-essential",
"eslint:recommended",
"@vue/eslint-config-typescript/recommended",
- "@vue/eslint-config-prettier"
+ "@vue/eslint-config-prettier",
],
- "env": {
- "vue/setup-compiler-macros": true
- }
-}
+ env: {
+ "vue/setup-compiler-macros": true,
+ },
+};
diff --git a/console/package.json b/console/package.json
index c3d84d8..b8b9aaf 100644
--- a/console/package.json
+++ b/console/package.json
@@ -13,10 +13,13 @@
"dependencies": {
"@halo-dev/components": "^1.0.0",
"@halo-dev/console-shared": "^2.0.0",
+ "canvas-confetti": "^1.6.0",
"vue": "^3.2.41"
},
"devDependencies": {
+ "@iconify/json": "^2.2.18",
"@rushstack/eslint-patch": "^1.2.0",
+ "@types/canvas-confetti": "^1.6.0",
"@types/jsdom": "^20.0.0",
"@types/node": "^16.18.0",
"@vitejs/plugin-vue": "^3.1.2",
@@ -30,7 +33,9 @@
"jsdom": "^19.0.0",
"npm-run-all": "^4.1.5",
"prettier": "^2.7.1",
+ "sass": "^1.58.0",
"typescript": "~4.7.4",
+ "unplugin-icons": "^0.15.2",
"vite": "^3.1.8",
"vitest": "^0.24.3",
"vue-tsc": "^1.0.9"
diff --git a/console/pnpm-lock.yaml b/console/pnpm-lock.yaml
index 2feb029..cab5fd5 100644
--- a/console/pnpm-lock.yaml
+++ b/console/pnpm-lock.yaml
@@ -3,7 +3,9 @@ lockfileVersion: 5.4
specifiers:
'@halo-dev/components': ^1.0.0
'@halo-dev/console-shared': ^2.0.0
+ '@iconify/json': ^2.2.18
'@rushstack/eslint-patch': ^1.2.0
+ '@types/canvas-confetti': ^1.6.0
'@types/jsdom': ^20.0.0
'@types/node': ^16.18.0
'@vitejs/plugin-vue': ^3.1.2
@@ -12,12 +14,15 @@ specifiers:
'@vue/eslint-config-typescript': ^11.0.2
'@vue/test-utils': ^2.2.0
'@vue/tsconfig': ^0.1.3
+ canvas-confetti: ^1.6.0
eslint: ^8.26.0
eslint-plugin-vue: ^9.6.0
jsdom: ^19.0.0
npm-run-all: ^4.1.5
prettier: ^2.7.1
+ sass: ^1.58.0
typescript: ~4.7.4
+ unplugin-icons: ^0.15.2
vite: ^3.1.8
vitest: ^0.24.3
vue: ^3.2.41
@@ -26,10 +31,13 @@ specifiers:
dependencies:
'@halo-dev/components': 1.0.0_vue@3.2.41
'@halo-dev/console-shared': 2.0.0_vue@3.2.41
+ canvas-confetti: 1.6.0
vue: 3.2.41
devDependencies:
+ '@iconify/json': 2.2.18
'@rushstack/eslint-patch': 1.2.0
+ '@types/canvas-confetti': 1.6.0
'@types/jsdom': 20.0.0
'@types/node': 16.18.0
'@vitejs/plugin-vue': 3.1.2_vite@3.1.8+vue@3.2.41
@@ -43,9 +51,11 @@ devDependencies:
jsdom: 19.0.0
npm-run-all: 4.1.5
prettier: 2.7.1
+ sass: 1.58.0
typescript: 4.7.4
- vite: 3.1.8
- vitest: 0.24.3_jsdom@19.0.0
+ unplugin-icons: 0.15.2
+ vite: 3.1.8_sass@1.58.0
+ vitest: 0.24.3_jsdom@19.0.0+sass@1.58.0
vue-tsc: 1.0.9_typescript@4.7.4
packages:
@@ -58,6 +68,17 @@ packages:
'@jridgewell/trace-mapping': 0.3.13
dev: true
+ /@antfu/install-pkg/0.1.1:
+ resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==}
+ dependencies:
+ execa: 5.1.1
+ find-up: 5.0.0
+ dev: true
+
+ /@antfu/utils/0.7.2:
+ resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==}
+ dev: true
+
/@babel/code-frame/7.18.6:
resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
engines: {node: '>=6.9.0'}
@@ -629,6 +650,30 @@ packages:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
dev: true
+ /@iconify/json/2.2.18:
+ resolution: {integrity: sha512-lYVcJFBtczKiYC9kd2TZW9CNV2PVEYjxLayPicI5EM5qFYZxrtmvSL6Nq3sc8XiuAFAMfBvIOjQDjZkf6dIgUA==}
+ dependencies:
+ '@iconify/types': 2.0.0
+ pathe: 1.1.0
+ dev: true
+
+ /@iconify/types/2.0.0:
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+ dev: true
+
+ /@iconify/utils/2.1.1:
+ resolution: {integrity: sha512-H8xz74JDzDw8f0qLxwIaxFMnFkbXTZNWEufOk3WxaLFHV4h0A2FjIDgNk5LzC0am4jssnjdeJJdRs3UFu3582Q==}
+ dependencies:
+ '@antfu/install-pkg': 0.1.1
+ '@antfu/utils': 0.7.2
+ '@iconify/types': 2.0.0
+ debug: 4.3.4
+ kolorist: 1.7.0
+ local-pkg: 0.4.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@jridgewell/gen-mapping/0.1.1:
resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==}
engines: {node: '>=6.0.0'}
@@ -742,6 +787,10 @@ packages:
engines: {node: '>= 10'}
dev: true
+ /@types/canvas-confetti/1.6.0:
+ resolution: {integrity: sha512-Yq6rIccwcco0TLD5SMUrIM7Fk7Fe/C0jmNRxJJCLtAF6gebDkPuUjK5EHedxecm69Pi/aA+It39Ux4OHmFhjRw==}
+ dev: true
+
/@types/chai-subset/1.3.3:
resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==}
dependencies:
@@ -909,7 +958,7 @@ packages:
'@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.19.6
'@babel/plugin-transform-typescript': 7.19.3_@babel+core@7.19.6
'@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.19.6
- vite: 3.1.8
+ vite: 3.1.8_sass@1.58.0
vue: 3.2.41
transitivePeerDependencies:
- supports-color
@@ -922,7 +971,7 @@ packages:
vite: ^3.0.0
vue: ^3.2.25
dependencies:
- vite: 3.1.8
+ vite: 3.1.8_sass@1.58.0
vue: 3.2.41
dev: true
@@ -1191,6 +1240,14 @@ packages:
color-convert: 2.0.1
dev: true
+ /anymatch/3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
/argparse/2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: true
@@ -1212,6 +1269,11 @@ packages:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: true
+ /binary-extensions/2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+ dev: true
+
/boolbase/1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
dev: true
@@ -1272,6 +1334,10 @@ packages:
resolution: {integrity: sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==}
dev: true
+ /canvas-confetti/1.6.0:
+ resolution: {integrity: sha512-ej+w/m8Jzpv9Z7W7uJZer14Ke8P2ogsjg4ZMGIuq4iqUOqY2Jq8BNW42iGmNfRwREaaEfFIczLuZZiEVSYNHAA==}
+ dev: false
+
/chai/4.3.6:
resolution: {integrity: sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==}
engines: {node: '>=4'}
@@ -1306,6 +1372,21 @@ packages:
resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==}
dev: true
+ /chokidar/3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
/codemirror/6.0.1:
resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==}
dependencies:
@@ -1944,6 +2025,21 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /execa/5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+ dev: true
+
/fast-deep-equal/3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
dev: true
@@ -2071,6 +2167,11 @@ packages:
has-symbols: 1.0.3
dev: true
+ /get-stream/6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+ dev: true
+
/get-symbol-description/1.0.0:
resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
engines: {node: '>= 0.4'}
@@ -2217,6 +2318,11 @@ packages:
- supports-color
dev: true
+ /human-signals/2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+ dev: true
+
/iconv-lite/0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
@@ -2229,6 +2335,10 @@ packages:
engines: {node: '>= 4'}
dev: true
+ /immutable/4.2.4:
+ resolution: {integrity: sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==}
+ dev: true
+
/import-fresh/3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'}
@@ -2272,6 +2382,13 @@ packages:
has-bigints: 1.0.2
dev: true
+ /is-binary-path/2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.2.0
+ dev: true
+
/is-boolean-object/1.1.2:
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
engines: {node: '>= 0.4'}
@@ -2350,6 +2467,11 @@ packages:
call-bind: 1.0.2
dev: true
+ /is-stream/2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+ dev: true
+
/is-string/1.0.7:
resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
engines: {node: '>= 0.4'}
@@ -2455,6 +2577,10 @@ packages:
hasBin: true
dev: true
+ /kolorist/1.7.0:
+ resolution: {integrity: sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==}
+ dev: true
+
/levn/0.3.0:
resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==}
engines: {node: '>= 0.8.0'}
@@ -2524,6 +2650,10 @@ packages:
engines: {node: '>= 0.10.0'}
dev: true
+ /merge-stream/2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+
/merge2/1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
@@ -2549,6 +2679,11 @@ packages:
mime-db: 1.52.0
dev: true
+ /mimic-fn/2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+ dev: true
+
/minimatch/3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
dependencies:
@@ -2596,6 +2731,11 @@ packages:
validate-npm-package-license: 3.0.4
dev: true
+ /normalize-path/3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/npm-run-all/4.1.5:
resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==}
engines: {node: '>= 4'}
@@ -2612,6 +2752,13 @@ packages:
string.prototype.padend: 3.1.3
dev: true
+ /npm-run-path/4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+ dev: true
+
/nth-check/2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
dependencies:
@@ -2647,6 +2794,13 @@ packages:
wrappy: 1.0.2
dev: true
+ /onetime/5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+ dev: true
+
/optionator/0.8.3:
resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
engines: {node: '>= 0.8.0'}
@@ -2746,6 +2900,10 @@ packages:
engines: {node: '>=8'}
dev: true
+ /pathe/1.1.0:
+ resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==}
+ dev: true
+
/pathval/1.1.1:
resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
dev: true
@@ -2839,6 +2997,13 @@ packages:
path-type: 3.0.0
dev: true
+ /readdirp/3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: true
+
/regexp.prototype.flags/1.4.3:
resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
engines: {node: '>= 0.4'}
@@ -2910,6 +3075,16 @@ packages:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: true
+ /sass/1.58.0:
+ resolution: {integrity: sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg==}
+ engines: {node: '>=12.0.0'}
+ hasBin: true
+ dependencies:
+ chokidar: 3.5.3
+ immutable: 4.2.4
+ source-map-js: 1.0.2
+ dev: true
+
/saxes/5.0.1:
resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==}
engines: {node: '>=10'}
@@ -2971,6 +3146,10 @@ packages:
object-inspect: 1.12.2
dev: true
+ /signal-exit/3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ dev: true
+
/slash/3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
@@ -3046,6 +3225,11 @@ packages:
engines: {node: '>=4'}
dev: true
+ /strip-final-newline/2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+ dev: true
+
/strip-json-comments/3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
@@ -3191,6 +3375,43 @@ packages:
engines: {node: '>= 4.0.0'}
dev: true
+ /unplugin-icons/0.15.2:
+ resolution: {integrity: sha512-oWTTdLMuqfEYfZcko+KZHDEOIsqT4OeyJB1e4U7luCOo9gto/JLyHkqfbqjmjkjdQqA3DNHS18WOKh5esqQM5g==}
+ peerDependencies:
+ '@svgr/core': '>=5.5.0'
+ '@vue/compiler-sfc': ^3.0.2 || ^2.7.0
+ vue-template-compiler: ^2.6.12
+ vue-template-es2015-compiler: ^1.9.0
+ peerDependenciesMeta:
+ '@svgr/core':
+ optional: true
+ '@vue/compiler-sfc':
+ optional: true
+ vue-template-compiler:
+ optional: true
+ vue-template-es2015-compiler:
+ optional: true
+ dependencies:
+ '@antfu/install-pkg': 0.1.1
+ '@antfu/utils': 0.7.2
+ '@iconify/utils': 2.1.1
+ debug: 4.3.4
+ kolorist: 1.7.0
+ local-pkg: 0.4.2
+ unplugin: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /unplugin/1.0.1:
+ resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==}
+ dependencies:
+ acorn: 8.8.1
+ chokidar: 3.5.3
+ webpack-sources: 3.2.3
+ webpack-virtual-modules: 0.5.0
+ dev: true
+
/update-browserslist-db/1.0.10_browserslist@4.21.4:
resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
hasBin: true
@@ -3219,7 +3440,7 @@ packages:
spdx-expression-parse: 3.0.1
dev: true
- /vite/3.1.8:
+ /vite/3.1.8_sass@1.58.0:
resolution: {integrity: sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@@ -3242,11 +3463,12 @@ packages:
postcss: 8.4.18
resolve: 1.22.1
rollup: 2.78.1
+ sass: 1.58.0
optionalDependencies:
fsevents: 2.3.2
dev: true
- /vitest/0.24.3_jsdom@19.0.0:
+ /vitest/0.24.3_jsdom@19.0.0+sass@1.58.0:
resolution: {integrity: sha512-aM0auuPPgMSstWvr851hB74g/LKaKBzSxcG3da7ejfZbx08Y21JpZmbmDYrMTCGhVZKqTGwzcnLMwyfz2WzkhQ==}
engines: {node: '>=v14.16.0'}
hasBin: true
@@ -3279,7 +3501,7 @@ packages:
tinybench: 2.3.1
tinypool: 0.3.0
tinyspy: 1.0.2
- vite: 3.1.8
+ vite: 3.1.8_sass@1.58.0
transitivePeerDependencies:
- less
- sass
@@ -3355,6 +3577,15 @@ packages:
engines: {node: '>=12'}
dev: true
+ /webpack-sources/3.2.3:
+ resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+ engines: {node: '>=10.13.0'}
+ dev: true
+
+ /webpack-virtual-modules/0.5.0:
+ resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==}
+ dev: true
+
/whatwg-encoding/2.0.0:
resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
engines: {node: '>=12'}
diff --git a/console/src/components/HelloWorld.vue b/console/src/components/HelloWorld.vue
deleted file mode 100644
index 5fe321e..0000000
--- a/console/src/components/HelloWorld.vue
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- {{ msg }}
-
diff --git a/console/src/index.ts b/console/src/index.ts
index b9e6c27..81d53fb 100644
--- a/console/src/index.ts
+++ b/console/src/index.ts
@@ -1,42 +1,34 @@
-import {definePlugin} from "@halo-dev/console-shared";
-import DefaultView from "./views/DefaultView.vue";
-import {IconGrid} from "@halo-dev/components";
-import "./styles/index.css";
-import {markRaw} from "vue";
+import { definePlugin } from "@halo-dev/console-shared";
+import HomeView from "./views/HomeView.vue";
+import { IconPlug } from "@halo-dev/components";
+import { markRaw } from "vue";
export default definePlugin({
- name: "PluginStarter",
- components: [],
+ components: {},
routes: [
{
parentName: "Root",
- route:
- {
- path: "/hello-world",
- children: [
- {
- path: "",
- name: "HelloWorld",
- component: DefaultView,
- meta: {
- permissions: ["plugin:apples:view"],
- title: "HelloWorld",
- searchable: true,
- menu: {
- name: "PluginStarter",
- group: "From PluginStarter",
- icon: markRaw(IconGrid),
- priority: 0,
- },
+ route: {
+ path: "/example",
+ children: [
+ {
+ path: "",
+ name: "Example",
+ component: HomeView,
+ meta: {
+ title: "示例页面",
+ searchable: true,
+ menu: {
+ name: "示例页面",
+ group: "示例分组",
+ icon: markRaw(IconPlug),
+ priority: 0,
},
},
- ],
- },
- }
+ },
+ ],
+ },
+ },
],
extensionPoints: {},
- activated() {
- },
- deactivated() {
- },
});
diff --git a/console/src/styles/index.css b/console/src/styles/index.css
deleted file mode 100644
index 855b30e..0000000
--- a/console/src/styles/index.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.title {
- font-size: 20px;
-}
diff --git a/console/src/views/DefaultView.vue b/console/src/views/DefaultView.vue
deleted file mode 100644
index c5a5665..0000000
--- a/console/src/views/DefaultView.vue
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
Hello World
-
![logo]()
-
-
-
diff --git a/console/src/views/HomeView.vue b/console/src/views/HomeView.vue
new file mode 100644
index 0000000..9b9cb0a
--- /dev/null
+++ b/console/src/views/HomeView.vue
@@ -0,0 +1,169 @@
+
+
+
+
+
+
你已经成功运行起了插件!
+
你可以点击下方文档继续下一步
+
+
+
+
+
+
diff --git a/console/tsconfig.app.json b/console/tsconfig.app.json
index 96a5c6c..54eb857 100644
--- a/console/tsconfig.app.json
+++ b/console/tsconfig.app.json
@@ -7,6 +7,7 @@
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
- }
+ },
+ "types": ["unplugin-icons/types/vue"]
}
}
diff --git a/console/vite.config.ts b/console/vite.config.ts
index eccd703..0ebcfc6 100644
--- a/console/vite.config.ts
+++ b/console/vite.config.ts
@@ -1,14 +1,15 @@
import { fileURLToPath, URL } from "url";
import { defineConfig } from "vite";
-import vue from "@vitejs/plugin-vue";
-import vueJsx from "@vitejs/plugin-vue-jsx";
+import Vue from "@vitejs/plugin-vue";
+import VueJsx from "@vitejs/plugin-vue-jsx";
+import Icons from "unplugin-icons/vite";
-const pluginEntryName = "PluginStarter"
+const pluginEntryName = "PluginStarter";
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue(), vueJsx()],
+ plugins: [Vue(), VueJsx(), Icons({ compiler: "vue3" })],
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url)),
@@ -28,7 +29,7 @@ export default defineConfig({
rollupOptions: {
external: [
"vue",
- "@halo-dev/shared",
+ "@halo-dev/console-shared",
"@halo-dev/components",
"vue-router",
],
diff --git a/src/main/resources/console/main.js b/src/main/resources/console/main.js
index 004de06..52f2b29 100644
--- a/src/main/resources/console/main.js
+++ b/src/main/resources/console/main.js
@@ -1 +1,2 @@
-this.PluginStarter=function(M,w){"use strict";function u(j){return j}const D="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAyMTQ0IDg3NyIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij48cGF0aCBkPSJNMTAyOC4xNiwzMzkuMzMxYzE0OC4yNDksMCAyNjguNjA5LDEyMC4zNiAyNjguNjA5LDI2OC42MDljLTAsMTQ4LjI0OSAtMTIwLjM2LDI2OC42MDggLTI2OC42MDksMjY4LjYwOGMtMTQ4LjI0OSwwIC0yNjguNjA4LC0xMjAuMzU5IC0yNjguNjA4LC0yNjguNjA4Yy0wLC0xNDguMjQ5IDEyMC4zNTksLTI2OC42MDkgMjY4LjYwOCwtMjY4LjYwOVptMCwxMTkuMTUyYzgyLjQ4OCwwIDE0OS40NTcsNjYuOTY5IDE0OS40NTcsMTQ5LjQ1N2MtMCw4Mi40ODcgLTY2Ljk2OSwxNDkuNDU2IC0xNDkuNDU3LDE0OS40NTZjLTgyLjQ4NywwIC0xNDkuNDU2LC02Ni45NjkgLTE0OS40NTYsLTE0OS40NTZjLTAsLTgyLjQ4OCA2Ni45NjksLTE0OS40NTcgMTQ5LjQ1NiwtMTQ5LjQ1N1oiIHN0eWxlPSJmaWxsOnVybCgjX0xpbmVhcjEpOyIvPjxwYXRoIGQ9Ik0xODc0LjU4LDMzOS4zMzFjMTQ4LjI0OSwwIDI2OC42MDgsMTIwLjM2IDI2OC42MDgsMjY4LjYwOWMwLDE0OC4yNDkgLTEyMC4zNTksMjY4LjYwOCAtMjY4LjYwOCwyNjguNjA4Yy0xNDguMjQ5LDAgLTI2OC42MDksLTEyMC4zNTkgLTI2OC42MDksLTI2OC42MDhjMCwtMTQ4LjI0OSAxMjAuMzYsLTI2OC42MDkgMjY4LjYwOSwtMjY4LjYwOVptLTAsMTE5LjE1MmM4Mi40ODcsMCAxNDkuNDU2LDY2Ljk2OSAxNDkuNDU2LDE0OS40NTdjMCw4Mi40ODcgLTY2Ljk2OSwxNDkuNDU2IC0xNDkuNDU2LDE0OS40NTZjLTgyLjQ4OCwwIC0xNDkuNDU3LC02Ni45NjkgLTE0OS40NTcsLTE0OS40NTZjMCwtODIuNDg4IDY2Ljk2OSwtMTQ5LjQ1NyAxNDkuNDU3LC0xNDkuNDU3WiIgc3R5bGU9ImZpbGw6dXJsKCNfTGluZWFyMik7Ii8+PHBhdGggZD0iTTEzMDkuMjcsMzc3LjU4NWMtMCwtMTAuMDgzIC03LjIyMiwtMTguNzE5IC0xNy4xNDYsLTIwLjUwNGMtMTkuNjE4LC0zLjUyOCAtNTEuOSwtOS4zMzQgLTc0LjE3MiwtMTMuMzRjLTYuMDczLC0xLjA5MiAtMTIuMzE4LDAuNTY0IC0xNy4wNTIsNC41MjJjLTQuNzM0LDMuOTU5IC03LjQ2OSw5LjgxMiAtNy40NjksMTUuOTgzYy0wLDkxLjM3NCAtMCw0MDcuMTUzIC0wLDQ5MS40NjljLTAsNS41MjUgMi4xOTUsMTAuODI0IDYuMTAyLDE0LjczMWMzLjkwNywzLjkwNyA5LjIwNiw2LjEwMiAxNC43MzEsNi4xMDJjMjAuOTg3LDAgNTMuMTg2LDAgNzQuMTczLDBjNS41MjUsMCAxMC44MjQsLTIuMTk1IDE0LjczMSwtNi4xMDJjMy45MDcsLTMuOTA3IDYuMTAyLC05LjIwNiA2LjEwMiwtMTQuNzMxYy0wLC04NC40MjUgLTAsLTQwMC4yODYgLTAsLTQ3OC4xM1oiIHN0eWxlPSJmaWxsOnVybCgjX0xpbmVhcjMpOyIvPjxwYXRoIGQ9Ik0xNTQyLjU5LDcyLjAzM2MwLC04LjI4OCAtMy4yOTIsLTE2LjIzNyAtOS4xNTMsLTIyLjA5N2MtNS44NiwtNS44NjEgLTEzLjgwOSwtOS4xNTMgLTIyLjA5NywtOS4xNTNjLTIzLjg2NywtMCAtNTYuNjA5LC0wIC04MC40NzcsLTBjLTguMjg4LC0wIC0xNi4yMzYsMy4yOTIgLTIyLjA5Nyw5LjE1M2MtNS44Niw1Ljg2IC05LjE1MywxMy44MDkgLTkuMTUzLDIyLjA5N2MwLDEzMS43OSAwLDY0MS40NzUgMCw3NzMuMjY1YzAsOC4yODggMy4yOTMsMTYuMjM3IDkuMTUzLDIyLjA5N2M1Ljg2MSw1Ljg2MSAxMy44MDksOS4xNTMgMjIuMDk3LDkuMTUzYzIzLjg2OCwwIDU2LjYxLDAgODAuNDc3LDBjOC4yODgsMCAxNi4yMzcsLTMuMjkyIDIyLjA5NywtOS4xNTNjNS44NjEsLTUuODYgOS4xNTMsLTEzLjgwOSA5LjE1MywtMjIuMDk3YzAsLTEzMS43OSAwLC02NDEuNDc1IDAsLTc3My4yNjVaIiBzdHlsZT0iZmlsbDp1cmwoI19MaW5lYXI0KTtmaWxsLXJ1bGU6bm9uemVybzsiLz48Zz48cGF0aCBkPSJNNTA2LjQwOSw4MjIuMDYzYy0wLDEzLjgxNSA1LjQ5NCwyNy4wNjIgMTUuMjcxLDM2LjgyMWM5Ljc3Nyw5Ljc2IDIzLjAzNCwxNS4yMyAzNi44NDgsMTUuMjA2YzE4LjY3NCwtMC4wMzQgMzkuNzExLC0wLjA3MiA1OC4zNjksLTAuMTA1YzI4LjY5NiwtMC4wNTIgNTEuOTMyLC0yMy4zMjkgNTEuOTMyLC01Mi4wMjZsMCwtNzY5LjU4NmMwLC0xMy43OTggLTUuNDgxLC0yNy4wMzEgLTE1LjIzOCwtMzYuNzg4Yy05Ljc1NiwtOS43NTcgLTIyLjk5LC0xNS4yMzggLTM2Ljc4OCwtMTUuMjM4bC01OC4zNjgsLTBjLTEzLjc5OCwtMCAtMjcuMDMxLDUuNDgxIC0zNi43ODgsMTUuMjM4Yy05Ljc1Nyw5Ljc1NyAtMTUuMjM4LDIyLjk5IC0xNS4yMzgsMzYuNzg4Yy0wLDE1NS4yODYgLTAsNjE0LjI4MyAtMCw3NjkuNjlaIiBzdHlsZT0iZmlsbDp1cmwoI19MaW5lYXI1KTtmaWxsLXJ1bGU6bm9uemVybzsiLz48cGF0aCBkPSJNNjE2Ljc0NiwzMjIuNjYyYzEzLjgxMywwIDI3LjA2MSw1LjQ4NyAzNi44MjksMTUuMjU1YzkuNzY3LDkuNzY4IDE1LjI1NCwyMy4wMTUgMTUuMjU0LDM2LjgyOWMwLDEwNS4xODUgMCwzNDEuODc3IDAsNDQ3LjA2MmMwLDEzLjgxNCAtNS40ODcsMjcuMDYxIC0xNS4yNTQsMzYuODI5Yy05Ljc2OCw5Ljc2NyAtMjMuMDE2LDE1LjI1NSAtMzYuODI5LDE1LjI1NWMtMTguNjMyLC0wIC0zOS42MjIsLTAgLTU4LjI1NCwtMGMtMTMuODEzLC0wIC0yNy4wNjEsLTUuNDg4IC0zNi44MjgsLTE1LjI1NWMtOS43NjgsLTkuNzY4IC0xNS4yNTUsLTIzLjAxNSAtMTUuMjU1LC0zNi44MjljLTAsLTY4LjIyMyAtMCwtMTg3LjE1OSAtMCwtMjU1LjM4M2MtMCwtMTMuODEzIC01LjQ4NywtMjcuMDYxIC0xNS4yNTUsLTM2LjgyOGMtOS43NjcsLTkuNzY4IC0yMy4wMTUsLTE1LjI1NSAtMzYuODI4LC0xNS4yNTVjLTEyOS4yNDksLTAgLTQ1NC4zMjYsLTAgLTQ1NC4zMjYsLTBsMCwtMTkxLjY4bDYxNi43NDYsMFoiIHN0eWxlPSJmaWxsOiMwMDUxYjA7ZmlsbC1ydWxlOm5vbnplcm87Ii8+PHBhdGggZD0iTS0wLDgyMi4xMDFjMCwxMy44MTcgNS40OTcsMjcuMDY3IDE1LjI3NywzNi44MjdjOS43ODEsOS43NiAyMy4wNDMsMTUuMjI5IDM2Ljg2LDE1LjE5OWMxOC42NzUsLTAuMDQgMzkuNzEzLC0wLjA4NSA1OC4zNjgsLTAuMTI0YzI4LjY5LC0wLjA2MiA1MS45MTYsLTIzLjMzNyA1MS45MTYsLTUyLjAyN2MtMCwtMTU1LjIwNSAtMCwtNjE0LjUwOSAtMCwtNzY5LjcxNGMtMCwtMjguNjkgLTIzLjIyNiwtNTEuOTY1IC01MS45MTYsLTUyLjAyNmMtMTguNjU1LC0wLjA0IC0zOS42OTMsLTAuMDg1IC01OC4zNjgsLTAuMTI1Yy0xMy44MTcsLTAuMDI5IC0yNy4wNzksNS40MzkgLTM2Ljg2LDE1LjE5OWMtOS43OCw5Ljc2IC0xNS4yNzcsMjMuMDEgLTE1LjI3NywzNi44MjdsLTAsNzY5Ljk2NFoiIHN0eWxlPSJmaWxsOnVybCgjX0xpbmVhcjYpO2ZpbGwtcnVsZTpub256ZXJvOyIvPjwvZz48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9Il9MaW5lYXIxIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4xOTgxNGUtMTQsLTg0OC45MjEsODQ4LjkyMSw1LjE5ODE0ZS0xNCwxMzA4LjgsODc1LjM5NykiPjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwNTBiNTtzdG9wLW9wYWNpdHk6MSIvPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzBiODdmZDtzdG9wLW9wYWNpdHk6MSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJfTGluZWFyMiIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMTk4MTRlLTE0LC04NDguOTIxLDg0OC45MjEsNS4xOTgxNGUtMTQsMTMwOC44LDg3NS4zOTcpIj48c3RvcCBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDUwYjU7c3RvcC1vcGFjaXR5OjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwYjg3ZmQ7c3RvcC1vcGFjaXR5OjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iX0xpbmVhcjMiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjE5ODE0ZS0xNCwtODQ4LjkyMSw4NDguOTIxLDUuMTk4MTRlLTE0LDEzMDguOCw4NzUuMzk3KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDA1MGI1O3N0b3Atb3BhY2l0eToxIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMGI4N2ZkO3N0b3Atb3BhY2l0eToxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9Il9MaW5lYXI0IiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4xOTgxNGUtMTQsLTg0OC45MjEsODQ4LjkyMSw1LjE5ODE0ZS0xNCwxMzA4LjgsODc1LjM5NykiPjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwNTBiNTtzdG9wLW9wYWNpdHk6MSIvPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzBiODdmZDtzdG9wLW9wYWNpdHk6MSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJfTGluZWFyNSIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0zLjkxODg1ZS0xMyw0NzIuNDU5LC00NzMuODk1LC0zLjkwNjk4ZS0xMyw1ODcuNjE5LC0wLjg2MTY1MSkiPjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwNDhhZjtzdG9wLW9wYWNpdHk6MSIvPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzAwMzU4MDtzdG9wLW9wYWNpdHk6MSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJfTGluZWFyNiIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuNTE4NDhlLTE0LDg5OC41MDYsLTkwMS4yMzYsNS41MDE3NmUtMTQsMTYyLjQyMSwtMTIuMTMzNykiPjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBiODlmZjtzdG9wLW9wYWNpdHk6MSIvPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzAwNGViMjtzdG9wLW9wYWNpdHk6MSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvc3ZnPg==",y=M.defineComponent({name:"DefaultView",setup(){return{logo:D}}}),S="",i=(j,N)=>{const L=j.__vccOpts||j;for(const[I,T]of N)L[I]=T;return L},t=j=>(M.pushScopeId("data-v-d2e9f81a"),j=j(),M.popScopeId(),j),z={class:"app"},c=t(()=>M.createElementVNode("div",{class:"title"},"Hello World",-1)),C=["src"];function g(j,N,L,I,T,A){const O=M.resolveDirective("permission");return M.openBlock(),M.createElementBlock("div",z,[c,M.withDirectives(M.createElementVNode("img",{src:j.logo,alt:"logo"},null,8,C),[[O,["plugin:apples:view"]]])])}const s=i(y,[["render",g],["__scopeId","data-v-d2e9f81a"]]),x="";return{name:"PluginStarter",components:[],routes:[{parentName:"Root",route:{path:"/hello-world",children:[{path:"",name:"HelloWorld",component:s,meta:{permissions:["plugin:apples:view"],title:"HelloWorld",searchable:!0,menu:{name:"PluginStarter",group:"From PluginStarter",icon:M.markRaw(w.IconGrid),priority:0}}}]}}],extensionPoints:{},activated(){},deactivated(){}}}(Vue,HaloComponents);
+this.PluginStarter=function(W,r,U){"use strict";var N={};(function _(h,E,x,M){var S=!!(h.Worker&&h.Blob&&h.Promise&&h.OffscreenCanvas&&h.OffscreenCanvasRenderingContext2D&&h.HTMLCanvasElement&&h.HTMLCanvasElement.prototype.transferControlToOffscreen&&h.URL&&h.URL.createObjectURL);function L(){}function F(t){var e=E.exports.Promise,i=e!==void 0?e:h.Promise;return typeof i=="function"?new i(t):(t(L,L),null)}var k=function(){var t=Math.floor(16.666666666666668),e,i,n={},s=0;return typeof requestAnimationFrame=="function"&&typeof cancelAnimationFrame=="function"?(e=function(c){var o=Math.random();return n[o]=requestAnimationFrame(function a(u){s===u||s+t-1(r.pushScopeId("data-v-daace2a2"),_=_(),r.popScopeId(),_),ue={id:"plugin-starter"},he={class:"wrapper"},me=v(()=>r.createElementVNode("span",{class:"title"}," \u4F60\u5DF2\u7ECF\u6210\u529F\u8FD0\u884C\u8D77\u4E86\u63D2\u4EF6\uFF01 ",-1)),_e=v(()=>r.createElementVNode("span",{class:"message"},"\u4F60\u53EF\u4EE5\u70B9\u51FB\u4E0B\u65B9\u6587\u6863\u7EE7\u7EED\u4E0B\u4E00\u6B65",-1)),fe={class:"docs"},ge={href:"https://docs.halo.run/developer-guide/plugin/publish",class:"docs__box",target:"_blank"},pe={class:"docs__box-title"},Ee=v(()=>r.createElementVNode("span",{class:"docs__box-message"}," \u4E86\u89E3\u5982\u4F55\u4E0E\u6211\u4EEC\u7684\u793E\u533A\u5206\u4EAB\u60A8\u7684\u6269\u5C55\u3002 ",-1)),be={class:"docs__box-arrow"},ve={href:"https://docs.halo.run/developer-guide/plugin/structure",class:"docs__box",target:"_blank"},Me={class:"docs__box-title"},we=v(()=>r.createElementVNode("span",{class:"docs__box-message"}," \u4E86\u89E3\u63D2\u4EF6\u7684\u9879\u76EE\u7ED3\u6784\u3001\u751F\u547D\u5468\u671F\u3001\u8D44\u6E90\u914D\u7F6E\u7B49\u3002 ",-1)),ye={class:"docs__box-arrow"},xe={href:"https://docs.halo.run/developer-guide/plugin/examples/todolist",class:"docs__box group",target:"_blank"},Ve={class:"docs__box-title"},Ce=v(()=>r.createElementVNode("span",{class:"docs__box-message"},"\u5E2E\u52A9\u4F60\u4ECE 0 \u5230 1 \u5B8C\u6210\u4E00\u4E2A\u63D2\u4EF6\u3002",-1)),Ne={class:"docs__box-arrow"},Fe={href:"https://docs.halo.run/developer-guide/plugin/api-reference/extension",class:"docs__box",target:"_blank"},ke={class:"docs__box-title"},Be=v(()=>r.createElementVNode("span",{class:"docs__box-message"},"\u63D2\u4EF6\u4E2D\u7684 API \u5217\u8868\u3002",-1)),Ie={class:"docs__box-arrow"},Te=r.defineComponent({__name:"HomeView",setup(_){return r.onMounted(()=>{Z({particleCount:100,spread:70,origin:{y:.6,x:.58}})}),(h,E)=>(r.openBlock(),r.createElementBlock("section",ue,[r.createElementVNode("div",he,[me,_e,r.createElementVNode("div",fe,[r.createElementVNode("a",ge,[r.createElementVNode("h2",pe,[r.createVNode(r.unref(j)),r.createTextVNode("\u53D1\u5E03\u4E00\u4E2A\u63D2\u4EF6")]),Ee,r.createElementVNode("span",be,[r.createVNode(r.unref(y))])]),r.createElementVNode("a",ve,[r.createElementVNode("h2",Me,[r.createVNode(r.unref(ce)),r.createTextVNode("\u57FA\u7840\u6982\u89C8")]),we,r.createElementVNode("span",ye,[r.createVNode(r.unref(y))])]),r.createElementVNode("a",xe,[r.createElementVNode("h2",Ve,[r.createVNode(r.unref(ne)),r.createTextVNode("\u793A\u4F8B\u63D2\u4EF6")]),Ce,r.createElementVNode("span",Ne,[r.createVNode(r.unref(y))])]),r.createElementVNode("a",Fe,[r.createElementVNode("h2",ke,[r.createVNode(r.unref(Q)),r.createTextVNode("API \u53C2\u8003")]),Be,r.createElementVNode("span",Ie,[r.createVNode(r.unref(y))])])])])]))}}),st="",Ae=((_,h)=>{const E=_.__vccOpts||_;for(const[x,M]of h)E[x]=M;return E})(Te,[["__scopeId","data-v-daace2a2"]]);return W.definePlugin({components:{},routes:[{parentName:"Root",route:{path:"/example",children:[{path:"",name:"Example",component:Ae,meta:{title:"\u793A\u4F8B\u9875\u9762",searchable:!0,menu:{name:"\u793A\u4F8B\u9875\u9762",group:"\u793A\u4F8B\u5206\u7EC4",icon:r.markRaw(U.IconPlug),priority:0}}}]}}],extensionPoints:{}})}(HaloConsoleShared,Vue,HaloComponents);
diff --git a/src/main/resources/console/style.css b/src/main/resources/console/style.css
index f480525..4803cfc 100644
--- a/src/main/resources/console/style.css
+++ b/src/main/resources/console/style.css
@@ -1 +1 @@
-.app[data-v-d2e9f81a]{background-color:#fff;min-height:100%;width:100%}.title[data-v-d2e9f81a]{color:red}img[data-v-d2e9f81a]{width:64px}.title{font-size:20px}
+#plugin-starter[data-v-daace2a2]{height:100vh;background-color:#f8fafc}.wrapper[data-v-daace2a2]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100vh;gap:1.5rem}.wrapper .title[data-v-daace2a2]{font-weight:700;font-size:1.25rem;line-height:1.75rem}.wrapper .message[data-v-daace2a2]{font-size:.875rem;line-height:1.25rem;color:#4b5563}.wrapper .docs[data-v-daace2a2]{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));gap:1rem;max-width:48rem}.wrapper .docs .docs__box[data-v-daace2a2]{background-color:#fff;border-radius:.375rem;padding:.75rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s;cursor:pointer;filter:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06))}.wrapper .docs .docs__box[data-v-daace2a2]:hover{box-shadow:0 0 #fff,0 0 0 1px #3b82f680,0 0 #0000}.wrapper .docs .docs__box .docs__box-title[data-v-daace2a2]{display:flex;flex-direction:row;font-size:1.125rem;line-height:1.75rem;font-weight:700;margin-bottom:2rem;gap:.5rem;align-items:center}.wrapper .docs .docs__box .docs__box-message[data-v-daace2a2]{font-size:.875rem;line-height:1.25rem;color:#4b5563}.wrapper .docs .docs__box .docs__box-arrow[data-v-daace2a2]{pointer-events:none;position:absolute;top:1rem;right:1rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;color:#d1d5db}.wrapper .docs .docs__box:hover .docs__box-arrow[data-v-daace2a2]{color:#9ca3af;transform:translate(.375rem) rotate(0) skew(0) skewY(0) scaleX(1) scaleY(1)}@media (min-width: 640px){.wrapper .docs[data-v-daace2a2]{grid-template-columns:repeat(2,minmax(0,1fr))}}