diff --git a/README.md b/README.md index 28c79f39..2b896b79 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ Cloud IDE 代码在线预览地址:[https://idegitee.com/dromara/go-view](http | 名称 | 版本 | 名称 | 版本 | | ------------------- | ----- | ----------- | ------ | | Vue | 3.2.x | TypeScript4 | 4.6.x | -| Vite | 2.9.x | NaiveUI | 2.27.x | +| Vite | 4.2.x | NaiveUI | 2.34.x | | ECharts | 5.3.x | Pinia | 2.0.x | | 详见 `package.json` | 😁 | 🥰 | 🤗 | @@ -137,7 +137,7 @@ Cloud IDE 代码在线预览地址:[https://idegitee.com/dromara/go-view](http | 名称 | 版本 | 名称 | 版本 | | ---- | ------- | ------- | ----- | -| node | 16.14.x | npm | 8.5.x | +| node | 16.16.x | npm | 8.5.x | | pnpm | 7.1.x | windows | 11 | 已完成图表: diff --git a/package.json b/package.json index 745e5239..22dfcdd4 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "highlight.js": "^11.5.0", "html2canvas": "^1.4.1", "keymaster": "^1.6.2", + "mitt": "^3.0.0", "monaco-editor": "^0.33.0", "naive-ui": "2.34.3", "pinia": "^2.0.13", @@ -49,14 +50,16 @@ "devDependencies": { "@commitlint/cli": "^17.0.2", "@commitlint/config-conventional": "^17.0.2", + "@iconify/types": "^2.0.0", + "@iconify/vue": "^4.1.1", "@types/node": "^16.11.26", "@types/three": "^0.144.0", "@typescript-eslint/eslint-plugin": "^5.18.0", "@typescript-eslint/parser": "^5.18.0", "@vicons/carbon": "^0.12.0", "@vicons/ionicons5": "~0.11.0", - "@vitejs/plugin-vue": "^1.10.2", - "@vitejs/plugin-vue-jsx": "^1.3.9", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", "@vue/compiler-sfc": "^3.2.31", "@vueuse/core": "^7.7.1", "commitlint": "^17.0.2", @@ -75,7 +78,7 @@ "sass": "^1.49.11", "sass-loader": "^12.6.0", "typescript": "4.6.3", - "vite": "4.2.1", + "vite": "4.3.6", "vite-plugin-compression": "^0.5.1", "vite-plugin-importer": "^0.2.5", "vite-plugin-mock": "^2.9.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec89572e..e1d3498b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,6 +58,9 @@ dependencies: keymaster: specifier: ^1.6.2 version: 1.6.2 + mitt: + specifier: ^3.0.0 + version: 3.0.0 monaco-editor: specifier: ^0.33.0 version: 0.33.0 @@ -102,6 +105,12 @@ devDependencies: '@commitlint/config-conventional': specifier: ^17.0.2 version: 17.0.2 + '@iconify/types': + specifier: ^2.0.0 + version: 2.0.0 + '@iconify/vue': + specifier: ^4.1.1 + version: 4.1.1(vue@3.2.37) '@types/node': specifier: ^16.11.26 version: 16.11.40 @@ -121,11 +130,11 @@ devDependencies: specifier: ~0.11.0 version: 0.11.0 '@vitejs/plugin-vue': - specifier: ^1.10.2 - version: 1.10.2(vite@4.2.1) + specifier: ^4.2.3 + version: 4.2.3(vite@4.3.6)(vue@3.2.37) '@vitejs/plugin-vue-jsx': - specifier: ^1.3.9 - version: 1.3.10 + specifier: ^3.0.1 + version: 3.0.1(vite@4.3.6)(vue@3.2.37) '@vue/compiler-sfc': specifier: ^3.2.31 version: 3.2.37 @@ -176,22 +185,22 @@ devDependencies: version: 1.52.3 sass-loader: specifier: ^12.6.0 - version: 12.6.0(sass@1.52.3)(webpack@5.77.0) + version: 12.6.0(sass@1.52.3)(webpack@5.82.1) typescript: specifier: 4.6.3 version: 4.6.3 vite: - specifier: 4.2.1 - version: 4.2.1(@types/node@16.11.40)(sass@1.52.3) + specifier: 4.3.6 + version: 4.3.6(@types/node@16.11.40)(sass@1.52.3) vite-plugin-compression: specifier: ^0.5.1 - version: 0.5.1(vite@4.2.1) + version: 0.5.1(vite@4.3.6) vite-plugin-importer: specifier: ^0.2.5 version: 0.2.5 vite-plugin-mock: specifier: ^2.9.6 - version: 2.9.6(mockjs@1.1.0)(rollup@2.79.1)(vite@4.2.1) + version: 2.9.6(mockjs@1.1.0)(rollup@2.79.1)(vite@4.3.6) vite-plugin-monaco-editor: specifier: ^1.1.0 version: 1.1.0(monaco-editor@0.33.0) @@ -217,18 +226,25 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.18 dev: true /@babel/code-frame@7.16.7: resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.17.12 + '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data@7.18.5: - resolution: {integrity: sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==} + /@babel/code-frame@7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/compat-data@7.21.7: + resolution: {integrity: sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==} engines: {node: '>=6.9.0'} dev: true @@ -255,20 +271,53 @@ packages: - supports-color dev: true + /@babel/core@7.21.8: + resolution: {integrity: sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.5 + '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.21.8) + '@babel/helper-module-transforms': 7.21.5 + '@babel/helpers': 7.21.5 + '@babel/parser': 7.21.8 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.5 + '@babel/types': 7.21.5 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator@7.18.2: resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.4 - '@jridgewell/gen-mapping': 0.3.1 + '@babel/types': 7.21.5 + '@jridgewell/gen-mapping': 0.3.3 jsesc: 2.5.2 dev: true - /@babel/helper-annotate-as-pure@7.16.7: - resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} + /@babel/generator@7.21.5: + resolution: {integrity: sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.4 + '@babel/types': 7.21.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure@7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 dev: true /@babel/helper-compilation-targets@7.18.2(@babel/core@7.18.5): @@ -277,86 +326,132 @@ packages: peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.18.5 + '@babel/compat-data': 7.21.7 '@babel/core': 7.18.5 - '@babel/helper-validator-option': 7.16.7 - browserslist: 4.20.4 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.5 semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin@7.18.0(@babel/core@7.18.5): - resolution: {integrity: sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==} + /@babel/helper-compilation-targets@7.21.5(@babel/core@7.21.8): + resolution: {integrity: sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.18.5 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-environment-visitor': 7.18.2 - '@babel/helper-function-name': 7.17.9 - '@babel/helper-member-expression-to-functions': 7.17.7 - '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/helper-replace-supers': 7.18.2 - '@babel/helper-split-export-declaration': 7.16.7 + '@babel/compat-data': 7.21.7 + '@babel/core': 7.21.8 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.5 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-create-class-features-plugin@7.21.8(@babel/core@7.21.8): + resolution: {integrity: sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.8 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.21.5 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.21.5 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.21.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-split-export-declaration': 7.18.6 + semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-environment-visitor@7.18.2: - resolution: {integrity: sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==} + /@babel/helper-environment-visitor@7.21.5: + resolution: {integrity: sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name@7.17.9: - resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==} + /@babel/helper-function-name@7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.16.7 - '@babel/types': 7.18.4 + '@babel/template': 7.20.7 + '@babel/types': 7.21.5 dev: true /@babel/helper-hoist-variables@7.16.7: resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.4 + '@babel/types': 7.21.5 dev: true - /@babel/helper-member-expression-to-functions@7.17.7: - resolution: {integrity: sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==} + /@babel/helper-hoist-variables@7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.4 + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-member-expression-to-functions@7.21.5: + resolution: {integrity: sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 dev: true /@babel/helper-module-imports@7.16.7: resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.4 + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-module-imports@7.21.4: + resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 dev: true /@babel/helper-module-transforms@7.18.0: resolution: {integrity: sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.18.2 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-simple-access': 7.18.2 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/helper-validator-identifier': 7.16.7 - '@babel/template': 7.16.7 - '@babel/traverse': 7.18.5 - '@babel/types': 7.18.4 + '@babel/helper-environment-visitor': 7.21.5 + '@babel/helper-module-imports': 7.21.4 + '@babel/helper-simple-access': 7.21.5 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.5 + '@babel/types': 7.21.5 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-optimise-call-expression@7.16.7: - resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==} + /@babel/helper-module-transforms@7.21.5: + resolution: {integrity: sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.4 + '@babel/helper-environment-visitor': 7.21.5 + '@babel/helper-module-imports': 7.21.4 + '@babel/helper-simple-access': 7.21.5 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.5 + '@babel/types': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-optimise-call-expression@7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 dev: true /@babel/helper-plugin-utils@7.17.12: @@ -364,39 +459,62 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-replace-supers@7.18.2: - resolution: {integrity: sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==} + /@babel/helper-plugin-utils@7.21.5: + resolution: {integrity: sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-replace-supers@7.21.5: + resolution: {integrity: sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.18.2 - '@babel/helper-member-expression-to-functions': 7.17.7 - '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/traverse': 7.18.5 - '@babel/types': 7.18.4 + '@babel/helper-environment-visitor': 7.21.5 + '@babel/helper-member-expression-to-functions': 7.21.5 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.5 + '@babel/types': 7.21.5 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-simple-access@7.18.2: - resolution: {integrity: sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==} + /@babel/helper-simple-access@7.21.5: + resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.4 + '@babel/types': 7.21.5 dev: true - /@babel/helper-split-export-declaration@7.16.7: - resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.4 + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-split-export-declaration@7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-string-parser@7.21.5: + resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + engines: {node: '>=6.9.0'} dev: true /@babel/helper-validator-identifier@7.16.7: resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.16.7: - resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.21.0: + resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} dev: true @@ -404,18 +522,29 @@ packages: resolution: {integrity: sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.16.7 - '@babel/traverse': 7.18.5 - '@babel/types': 7.18.4 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.5 + '@babel/types': 7.21.5 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight@7.17.12: - resolution: {integrity: sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==} + /@babel/helpers@7.21.5: + resolution: {integrity: sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.16.7 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.5 + '@babel/types': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 chalk: 2.4.2 js-tokens: 4.0.0 dev: true @@ -427,6 +556,14 @@ packages: dependencies: '@babel/types': 7.18.4 + /@babel/parser@7.21.8: + resolution: {integrity: sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.5 + dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.5): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -436,36 +573,37 @@ packages: '@babel/helper-plugin-utils': 7.17.12 dev: true - /@babel/plugin-syntax-jsx@7.17.12(@babel/core@7.18.5): + /@babel/plugin-syntax-jsx@7.17.12(@babel/core@7.21.8): resolution: {integrity: sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.5 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/core': 7.21.8 + '@babel/helper-plugin-utils': 7.21.5 dev: true - /@babel/plugin-syntax-typescript@7.17.12(@babel/core@7.18.5): - resolution: {integrity: sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==} + /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.21.8): + resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.5 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/core': 7.21.8 + '@babel/helper-plugin-utils': 7.21.5 dev: true - /@babel/plugin-transform-typescript@7.18.4(@babel/core@7.18.5): - resolution: {integrity: sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==} + /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.21.8): + resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.5 - '@babel/helper-create-class-features-plugin': 7.18.0(@babel/core@7.18.5) - '@babel/helper-plugin-utils': 7.17.12 - '@babel/plugin-syntax-typescript': 7.17.12(@babel/core@7.18.5) + '@babel/core': 7.21.8 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.21.8(@babel/core@7.21.8) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.8) transitivePeerDependencies: - supports-color dev: true @@ -481,23 +619,50 @@ packages: resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.16.7 - '@babel/parser': 7.18.5 - '@babel/types': 7.18.4 + '@babel/code-frame': 7.21.4 + '@babel/parser': 7.21.8 + '@babel/types': 7.21.5 + dev: true + + /@babel/template@7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/parser': 7.21.8 + '@babel/types': 7.21.5 dev: true /@babel/traverse@7.18.5: resolution: {integrity: sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.18.2 - '@babel/helper-environment-visitor': 7.18.2 - '@babel/helper-function-name': 7.17.9 + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.5 + '@babel/helper-environment-visitor': 7.21.5 + '@babel/helper-function-name': 7.21.0 '@babel/helper-hoist-variables': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/parser': 7.18.5 - '@babel/types': 7.18.4 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.8 + '@babel/types': 7.21.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/traverse@7.21.5: + resolution: {integrity: sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.5 + '@babel/helper-environment-visitor': 7.21.5 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.8 + '@babel/types': 7.21.5 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -511,6 +676,15 @@ packages: '@babel/helper-validator-identifier': 7.16.7 to-fast-properties: 2.0.0 + /@babel/types@7.21.5: + resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: true + /@commitlint/cli@17.0.2: resolution: {integrity: sha512-Axe89Js0YzGGd4gxo3JLlF7yIdjOVpG1LbOorGc6PfYF+drBh14PvarSDLzyd2TNqdylUCq9wb9/A88ZjIdyhA==} engines: {node: '>=v14'} @@ -714,8 +888,8 @@ packages: resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} dev: false - /@esbuild/android-arm64@0.17.14: - resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -723,8 +897,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.17.14: - resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -732,8 +906,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.14: - resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -741,8 +915,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.14: - resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -750,8 +924,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.14: - resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -759,8 +933,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.14: - resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -768,8 +942,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.14: - resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -777,8 +951,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.17.14: - resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -786,8 +960,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.17.14: - resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -795,8 +969,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.14: - resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -804,8 +978,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.17.14: - resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -813,8 +987,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.14: - resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -822,8 +996,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.14: - resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -831,8 +1005,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.14: - resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -840,8 +1014,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.14: - resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -849,8 +1023,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.14: - resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==} + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -858,8 +1032,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.14: - resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -867,8 +1041,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.14: - resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -876,8 +1050,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.14: - resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -885,8 +1059,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.14: - resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -894,8 +1068,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.14: - resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -903,8 +1077,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.14: - resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -944,6 +1118,19 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + dev: true + + /@iconify/vue@4.1.1(vue@3.2.37): + resolution: {integrity: sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==} + peerDependencies: + vue: '>=3' + dependencies: + '@iconify/types': 2.0.0 + vue: 3.2.37 + dev: true + /@intlify/core-base@9.2.2: resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==} engines: {node: '>= 14'} @@ -986,31 +1173,17 @@ packages: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': 1.1.1 - '@jridgewell/sourcemap-codec': 1.4.13 + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@jridgewell/gen-mapping@0.3.1: - resolution: {integrity: sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.1 - '@jridgewell/sourcemap-codec': 1.4.13 - '@jridgewell/trace-mapping': 0.3.13 - dev: true - - /@jridgewell/gen-mapping@0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.17 - dev: true - - /@jridgewell/resolve-uri@3.0.7: - resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==} - engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 dev: true /@jridgewell/resolve-uri@3.1.0: @@ -1018,40 +1191,28 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array@1.1.1: - resolution: {integrity: sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==} - engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/source-map@0.3.2: - resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} + /@jridgewell/source-map@0.3.3: + resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - dev: true - - /@jridgewell/sourcemap-codec@1.4.13: - resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==} + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 dev: true /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping@0.3.13: - resolution: {integrity: sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==} - dependencies: - '@jridgewell/resolve-uri': 3.0.7 - '@jridgewell/sourcemap-codec': 1.4.13 + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 @@ -1060,8 +1221,8 @@ packages: /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.0.7 - '@jridgewell/sourcemap-codec': 1.4.13 + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@juggle/resize-observer@3.3.1: @@ -1116,14 +1277,6 @@ packages: rollup: 2.79.1 dev: true - /@rollup/pluginutils@4.2.1: - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} - dependencies: - estree-walker: 2.0.2 - picomatch: 2.3.1 - dev: true - /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true @@ -1164,13 +1317,13 @@ packages: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.37.0 - '@types/estree': 0.0.51 + '@types/estree': 1.0.1 dev: true /@types/eslint@8.37.0: resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} dependencies: - '@types/estree': 0.0.51 + '@types/estree': 1.0.1 '@types/json-schema': 7.0.11 dev: true @@ -1178,8 +1331,8 @@ packages: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true - /@types/estree@0.0.51: - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} dev: true /@types/fined@1.1.3: @@ -1405,27 +1558,31 @@ packages: resolution: {integrity: sha512-4IWamqtXUsuCdlW6NQc2xyoJ+PUXGMwzSrppQbdVCYg0pjYld89jOfLOIkuTWq8o2XUa+Q1/78jzWBtXMTojNg==} dev: true - /@vitejs/plugin-vue-jsx@1.3.10: - resolution: {integrity: sha512-Cf5zznh4yNMiEMBfTOztaDVDmK1XXfgxClzOSUVUc8WAmHzogrCUeM8B05ABzuGtg0D1amfng+mUmSIOFGP3Pw==} - engines: {node: '>=12.0.0'} + /@vitejs/plugin-vue-jsx@3.0.1(vite@4.3.6)(vue@3.2.37): + resolution: {integrity: sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.0.0 dependencies: - '@babel/core': 7.18.5 - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.5) - '@babel/plugin-transform-typescript': 7.18.4(@babel/core@7.18.5) - '@rollup/pluginutils': 4.2.1 - '@vue/babel-plugin-jsx': 1.1.1(@babel/core@7.18.5) - hash-sum: 2.0.0 + '@babel/core': 7.21.8 + '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.8) + '@vue/babel-plugin-jsx': 1.1.1(@babel/core@7.21.8) + vite: 4.3.6(@types/node@16.11.40)(sass@1.52.3) + vue: 3.2.37 transitivePeerDependencies: - supports-color dev: true - /@vitejs/plugin-vue@1.10.2(vite@4.2.1): - resolution: {integrity: sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==} - engines: {node: '>=12.0.0'} + /@vitejs/plugin-vue@4.2.3(vite@4.3.6)(vue@3.2.37): + resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^2.5.10 + vite: ^4.0.0 + vue: ^3.2.25 dependencies: - vite: 4.2.1(@types/node@16.11.40)(sass@1.52.3) + vite: 4.3.6(@types/node@16.11.40)(sass@1.52.3) + vue: 3.2.37 dev: true /@volar/code-gen@0.28.10: @@ -1480,11 +1637,11 @@ packages: resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==} dev: true - /@vue/babel-plugin-jsx@1.1.1(@babel/core@7.18.5): + /@vue/babel-plugin-jsx@1.1.1(@babel/core@7.21.8): resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} dependencies: '@babel/helper-module-imports': 7.16.7 - '@babel/plugin-syntax-jsx': 7.17.12(@babel/core@7.18.5) + '@babel/plugin-syntax-jsx': 7.17.12(@babel/core@7.21.8) '@babel/template': 7.16.7 '@babel/traverse': 7.18.5 '@babel/types': 7.18.4 @@ -1609,109 +1766,109 @@ packages: vue-demi: 0.13.1(vue@3.2.37) dev: true - /@webassemblyjs/ast@1.11.1: - resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} dependencies: - '@webassemblyjs/helper-numbers': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.1: - resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} dev: true - /@webassemblyjs/helper-api-error@1.11.1: - resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} dev: true - /@webassemblyjs/helper-buffer@1.11.1: - resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} dev: true - /@webassemblyjs/helper-numbers@1.11.1: - resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.1: - resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} dev: true - /@webassemblyjs/helper-wasm-section@1.11.1: - resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 dev: true - /@webassemblyjs/ieee754@1.11.1: - resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} dependencies: '@xtuc/ieee754': 1.2.0 dev: true - /@webassemblyjs/leb128@1.11.1: - resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} dependencies: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/utf8@1.11.1: - resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} dev: true - /@webassemblyjs/wasm-edit@1.11.1: - resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/helper-wasm-section': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-opt': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - '@webassemblyjs/wast-printer': 1.11.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 dev: true - /@webassemblyjs/wasm-gen@1.11.1: - resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 dev: true - /@webassemblyjs/wasm-opt@1.11.1: - resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 dev: true - /@webassemblyjs/wasm-parser@1.11.1: - resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 dev: true - /@webassemblyjs/wast-printer@1.11.1: - resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} dependencies: - '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 dev: true @@ -1731,8 +1888,8 @@ packages: through: 2.3.8 dev: true - /acorn-import-assertions@1.8.0(acorn@8.8.2): - resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} + /acorn-import-assertions@1.9.0(acorn@8.8.2): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: @@ -1926,7 +2083,7 @@ packages: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/types': 7.18.4 + '@babel/types': 7.21.5 dev: true /balanced-match@1.0.2: @@ -1981,27 +2138,15 @@ packages: fill-range: 7.0.1 dev: true - /browserslist@4.20.4: - resolution: {integrity: sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001354 - electron-to-chromium: 1.4.155 - escalade: 3.1.1 - node-releases: 2.0.5 - picocolors: 1.0.0 - dev: true - /browserslist@4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001473 - electron-to-chromium: 1.4.348 + caniuse-lite: 1.0.30001487 + electron-to-chromium: 1.4.396 node-releases: 2.0.10 - update-browserslist-db: 1.0.10(browserslist@4.21.5) + update-browserslist-db: 1.0.11(browserslist@4.21.5) dev: true /buffer-from@1.1.2: @@ -2065,12 +2210,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001354: - resolution: {integrity: sha512-mImKeCkyGDAHNywYFA4bqnLAzTUvVkqPvhY4DV47X+Gl2c5Z8c3KNETnXp14GQt11LvxE8AwjzGxJ+rsikiOzg==} - dev: true - - /caniuse-lite@1.0.30001473: - resolution: {integrity: sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==} + /caniuse-lite@1.0.30001487: + resolution: {integrity: sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==} dev: true /capital-case@1.0.4: @@ -2288,8 +2429,8 @@ packages: /constantinople@4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} dependencies: - '@babel/parser': 7.18.5 - '@babel/types': 7.18.4 + '@babel/parser': 7.21.8 + '@babel/types': 7.21.5 dev: true /conventional-changelog-angular@5.0.13: @@ -2628,12 +2769,8 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true - /electron-to-chromium@1.4.155: - resolution: {integrity: sha512-niPzKBSYPG06gxLKO0c2kEmgdRMTtIbNrBlvD31Ld8Q57b/K0218U4j8u/OOt25XE1eFOn47FcmQVdx9R1qqxA==} - dev: true - - /electron-to-chromium@1.4.348: - resolution: {integrity: sha512-gM7TdwuG3amns/1rlgxMbeeyNoBFPa+4Uu0c7FeROWh4qWmvSOnvcslKmWy51ggLKZ2n/F/4i2HJ+PVNxH9uCQ==} + /electron-to-chromium@1.4.396: + resolution: {integrity: sha512-pqKTdqp/c5vsrc0xUPYXTDBo9ixZuGY8es4ZOjjd6HD6bFYbu5QA09VoW3fkY4LF1T0zYk86lN6bZnNlBuOpdQ==} dev: true /emmet@2.3.6: @@ -2652,8 +2789,8 @@ packages: engines: {node: '>= 0.8'} dev: true - /enhanced-resolve@5.12.0: - resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} + /enhanced-resolve@5.14.0: + resolution: {integrity: sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 @@ -2704,8 +2841,8 @@ packages: unbox-primitive: 1.0.2 dev: true - /es-module-lexer@0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + /es-module-lexer@1.2.1: + resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} dev: true /es-shim-unscopables@1.0.0: @@ -2729,34 +2866,34 @@ packages: requiresBuild: true dev: true - /esbuild@0.17.14: - resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.17.14 - '@esbuild/android-arm64': 0.17.14 - '@esbuild/android-x64': 0.17.14 - '@esbuild/darwin-arm64': 0.17.14 - '@esbuild/darwin-x64': 0.17.14 - '@esbuild/freebsd-arm64': 0.17.14 - '@esbuild/freebsd-x64': 0.17.14 - '@esbuild/linux-arm': 0.17.14 - '@esbuild/linux-arm64': 0.17.14 - '@esbuild/linux-ia32': 0.17.14 - '@esbuild/linux-loong64': 0.17.14 - '@esbuild/linux-mips64el': 0.17.14 - '@esbuild/linux-ppc64': 0.17.14 - '@esbuild/linux-riscv64': 0.17.14 - '@esbuild/linux-s390x': 0.17.14 - '@esbuild/linux-x64': 0.17.14 - '@esbuild/netbsd-x64': 0.17.14 - '@esbuild/openbsd-x64': 0.17.14 - '@esbuild/sunos-x64': 0.17.14 - '@esbuild/win32-arm64': 0.17.14 - '@esbuild/win32-ia32': 0.17.14 - '@esbuild/win32-x64': 0.17.14 + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 dev: true /escalade@3.1.1: @@ -3463,10 +3600,6 @@ packages: function-bind: 1.1.1 dev: true - /hash-sum@2.0.0: - resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} - dev: true - /header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} dependencies: @@ -3914,6 +4047,12 @@ packages: hasBin: true dev: true + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + /jsonc-parser@2.3.1: resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} dev: true @@ -3927,7 +4066,7 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /jsonparse@1.3.1: @@ -4046,6 +4185,12 @@ packages: tslib: 2.4.0 dev: true + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -4157,6 +4302,10 @@ packages: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} dev: true + /mitt@3.0.0: + resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} + dev: false + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -4264,10 +4413,6 @@ packages: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true - /node-releases@2.0.5: - resolution: {integrity: sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==} - dev: true - /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -4516,7 +4661,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.16.7 + '@babel/code-frame': 7.21.4 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -4648,8 +4793,8 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 - /postcss@8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + /postcss@8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 @@ -4957,8 +5102,8 @@ packages: fsevents: 2.3.2 dev: true - /rollup@3.20.2: - resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + /rollup@3.21.8: + resolution: {integrity: sha512-SSFV2T2fWtQ/vvBip85u2Nr0GNKireabH9d7nXswBg+XSH+jbVDSYptRAEbCEsquhs503rpPA9POYAp0/Jhasw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -4994,7 +5139,7 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /sass-loader@12.6.0(sass@1.52.3)(webpack@5.77.0): + /sass-loader@12.6.0(sass@1.52.3)(webpack@5.82.1): resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -5016,7 +5161,7 @@ packages: klona: 2.0.5 neo-async: 2.6.2 sass: 1.52.3 - webpack: 5.77.0 + webpack: 5.82.1 dev: true /sass@1.52.3: @@ -5029,8 +5174,8 @@ packages: source-map-js: 1.0.2 dev: true - /schema-utils@3.1.1: - resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} + /schema-utils@3.1.2: + resolution: {integrity: sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.11 @@ -5283,8 +5428,8 @@ packages: engines: {node: '>=6'} dev: true - /terser-webpack-plugin@5.3.7(webpack@5.77.0): - resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} + /terser-webpack-plugin@5.3.8(webpack@5.82.1): + resolution: {integrity: sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -5299,20 +5444,20 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.18 jest-worker: 27.5.1 - schema-utils: 3.1.1 + schema-utils: 3.1.2 serialize-javascript: 6.0.1 - terser: 5.16.8 - webpack: 5.77.0 + terser: 5.17.3 + webpack: 5.82.1 dev: true - /terser@5.16.8: - resolution: {integrity: sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==} + /terser@5.17.3: + resolution: {integrity: sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.2 + '@jridgewell/source-map': 0.3.3 acorn: 8.8.2 commander: 2.20.3 source-map-support: 0.5.21 @@ -5525,8 +5670,8 @@ packages: engines: {node: '>=4'} dev: true - /update-browserslist-db@1.0.10(browserslist@4.21.5): - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + /update-browserslist-db@1.0.11(browserslist@4.21.5): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5598,7 +5743,7 @@ packages: vue: 3.2.37 dev: false - /vite-plugin-compression@0.5.1(vite@4.2.1): + /vite-plugin-compression@0.5.1(vite@4.3.6): resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} peerDependencies: vite: '>=2.0.0' @@ -5606,7 +5751,7 @@ packages: chalk: 4.1.2 debug: 4.3.4 fs-extra: 10.1.0 - vite: 4.2.1(@types/node@16.11.40)(sass@1.52.3) + vite: 4.3.6(@types/node@16.11.40)(sass@1.52.3) transitivePeerDependencies: - supports-color dev: true @@ -5621,7 +5766,7 @@ packages: - supports-color dev: true - /vite-plugin-mock@2.9.6(mockjs@1.1.0)(rollup@2.79.1)(vite@4.2.1): + /vite-plugin-mock@2.9.6(mockjs@1.1.0)(rollup@2.79.1)(vite@4.3.6): resolution: {integrity: sha512-/Rm59oPppe/ncbkSrUuAxIQihlI2YcBmnbR4ST1RA2VzM1C0tEQc1KlbQvnUGhXECAGTaQN2JyasiwXP6EtKgg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -5638,7 +5783,7 @@ packages: fast-glob: 3.2.11 mockjs: 1.1.0 path-to-regexp: 6.2.1 - vite: 4.2.1(@types/node@16.11.40)(sass@1.52.3) + vite: 4.3.6(@types/node@16.11.40)(sass@1.52.3) transitivePeerDependencies: - rollup - supports-color @@ -5652,8 +5797,8 @@ packages: monaco-editor: 0.33.0 dev: true - /vite@4.2.1(@types/node@16.11.40)(sass@1.52.3): - resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + /vite@4.3.6(@types/node@16.11.40)(sass@1.52.3): + resolution: {integrity: sha512-cqIyLSbA6gornMS659AXTVKF7cvSHMdKmJJwQ9DXq3lwsT1uZSdktuBRlpHQ8VnOWx0QHtjDwxPpGtyo9Fh/Qg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -5678,10 +5823,9 @@ packages: optional: true dependencies: '@types/node': 16.11.40 - esbuild: 0.17.14 - postcss: 8.4.21 - resolve: 1.22.1 - rollup: 3.20.2 + esbuild: 0.17.19 + postcss: 8.4.23 + rollup: 3.21.8 sass: 1.52.3 optionalDependencies: fsevents: 2.3.2 @@ -5991,8 +6135,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.77.0: - resolution: {integrity: sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==} + /webpack@5.82.1: + resolution: {integrity: sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -6002,16 +6146,16 @@ packages: optional: true dependencies: '@types/eslint-scope': 3.7.4 - '@types/estree': 0.0.51 - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/wasm-edit': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 acorn: 8.8.2 - acorn-import-assertions: 1.8.0(acorn@8.8.2) + acorn-import-assertions: 1.9.0(acorn@8.8.2) browserslist: 4.21.5 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.12.0 - es-module-lexer: 0.9.3 + enhanced-resolve: 5.14.0 + es-module-lexer: 1.2.1 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -6020,9 +6164,9 @@ packages: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.1.1 + schema-utils: 3.1.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(webpack@5.77.0) + terser-webpack-plugin: 5.3.8(webpack@5.82.1) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -6060,8 +6204,8 @@ packages: resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/parser': 7.18.5 - '@babel/types': 7.18.4 + '@babel/parser': 7.21.8 + '@babel/types': 7.21.5 assert-never: 1.2.1 babel-walk: 3.0.0-canary-5 dev: true @@ -6093,6 +6237,10 @@ packages: engines: {node: '>=10'} dev: true + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true diff --git a/src/assets/images/chart/decorates/Pipeline_H.png b/src/assets/images/chart/decorates/Pipeline_H.png new file mode 100644 index 00000000..f28bac9a Binary files /dev/null and b/src/assets/images/chart/decorates/Pipeline_H.png differ diff --git a/src/assets/images/chart/decorates/Pipeline_V.png b/src/assets/images/chart/decorates/Pipeline_V.png new file mode 100644 index 00000000..cffc5d8d Binary files /dev/null and b/src/assets/images/chart/decorates/Pipeline_V.png differ diff --git a/src/assets/images/chart/icons/icon.png b/src/assets/images/chart/icons/icon.png new file mode 100644 index 00000000..06b3ef9a Binary files /dev/null and b/src/assets/images/chart/icons/icon.png differ diff --git a/src/assets/images/chart/photos/upload.png b/src/assets/images/chart/photos/upload.png new file mode 100644 index 00000000..2207bf5c Binary files /dev/null and b/src/assets/images/chart/photos/upload.png differ diff --git a/src/components/Pages/ChartItemSetting/GlobalSetting.vue b/src/components/Pages/ChartItemSetting/GlobalSetting.vue index a416e69c..81f9d3d7 100644 --- a/src/components/Pages/ChartItemSetting/GlobalSetting.vue +++ b/src/components/Pages/ChartItemSetting/GlobalSetting.vue @@ -257,9 +257,36 @@ <n-switch v-model:value="legend.show" size="small"></n-switch> </template> <setting-item-box name="图例文字"> - <setting-item> + <setting-item name="颜色"> <n-color-picker size="small" v-model:value="legend.textStyle.color"></n-color-picker> </setting-item> + <setting-item name="大小"> + <n-input-number v-model:value="legend.textStyle.fontSize" :min="1" size="small"></n-input-number> + </setting-item> + </setting-item-box> + <setting-item-box name="图例位置"> + <setting-item name="x轴"> + <n-select v-model:value="legend.x" size="small" :options="legendConfig.lengendX" /> + </setting-item> + <setting-item name="y轴"> + <n-select v-model:value="legend.y" size="small" :options="legendConfig.lengendY" /> + </setting-item> + </setting-item-box> + <setting-item-box name="图例信息"> + <setting-item name="方向"> + <n-select v-model:value="legend.orient" size="small" :options="legendConfig.orient" /> + </setting-item> + <setting-item name="形状"> + <n-select v-model:value="legend.icon" size="small" :options="legendConfig.shape" /> + </setting-item> + </setting-item-box> + <setting-item-box name="图例大小"> + <setting-item name="宽"> + <n-input-number v-model:value="legend.itemWidth" :min="1" size="small"></n-input-number> + </setting-item> + <setting-item name="高"> + <n-input-number v-model:value="legend.itemHeight" :min="1" size="small"></n-input-number> + </setting-item> </setting-item-box> </collapse-item> @@ -309,9 +336,9 @@ </template> <script setup lang="ts"> -import { PropType, computed } from 'vue' +import { PropType, computed, watch } from 'vue' import { GlobalThemeJsonType } from '@/settings/chartThemes/index' -import { axisConfig } from '@/packages/chartConfiguration/echarts/index' +import { axisConfig, legendConfig } from '@/packages/chartConfiguration/echarts/index' import { CollapseItem, SettingItemBox, SettingItem, GlobalSettingPosition } from '@/components/Pages/ChartItemSetting' import { icon } from '@/plugins' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' @@ -360,4 +387,14 @@ const grid = computed(() => { const visualMap = computed(() => { return props.optionData.visualMap }) + +// 监听legend color颜色改变type = scroll的颜色 +watch(() => legend.value && legend.value.textStyle.color, (newVal) => { + if (legend.value && newVal) { + legend.value.pageTextStyle.color = newVal + } +}, { + immediate: true, + deep: true, +}) </script> diff --git a/src/components/Pages/Flipper/index.vue b/src/components/Pages/Flipper/index.vue index 9b2c6282..1bd23996 100644 --- a/src/components/Pages/Flipper/index.vue +++ b/src/components/Pages/Flipper/index.vue @@ -1,13 +1,13 @@ <template> - <div class="go-Flipper" :class="[flipType, { go: isFlipping }]"> + <div class="go-flipper" :class="[flipType, { go: isFlipping }]"> <div class="digital front" :data-front="frontTextFromData"></div> <div class="digital back" :data-back="backTextFromData"></div> </div> </template> <script lang="ts" setup> -import { ref, PropType, watch } from 'vue' -import { FlipType } from './index' +import { ref, PropType, watch, nextTick } from 'vue' +import { FlipType } from './index' const props = defineProps({ flipType: { @@ -43,6 +43,10 @@ const props = defineProps({ backColor: { type: String, default: '#000000' + }, + borderWidth: { + type: Number, + default: 2 } }) @@ -50,19 +54,27 @@ const isFlipping = ref(false) const frontTextFromData = ref(props.count || 0) const backTextFromData = ref(props.count || 0) +let timeoutID: any = 0 + // 翻牌 -const flip = (front: string | number, back: string | number) => { +const flip = async (front: string | number, back: string | number) => { // 如果处于翻转中,则不执行 - if (isFlipping.value) return + if (isFlipping.value) { + isFlipping.value = false // 立即结束此次动画 + clearTimeout(timeoutID) // 清除上一个计时器任务 + await nextTick() + await flip(front, back) // 开始最后一次翻牌任务 + return + } + // 设置翻盘前后数据 backTextFromData.value = back frontTextFromData.value = front - // 设置翻转状态为true isFlipping.value = true // 翻牌结束的行为 - setTimeout(() => { + timeoutID = setTimeout(() => { isFlipping.value = false // 设置翻转状态为false frontTextFromData.value = back }, props.duration) @@ -86,6 +98,7 @@ $radius: v-bind('`${props.radius}px`'); $width: v-bind('`${props.width}px`'); $height: v-bind('`${props.height}px`'); $perspective: v-bind('`${props.height * 2}px`'); +$borderWidth: v-bind('`${props.borderWidth * 2}px`'); $speed: v-bind('`${props.duration / 1000}s`'); $shadowColor: #000000; $lineColor: #4a9ef8; @@ -125,13 +138,12 @@ $lineColor: #4a9ef8; } // #endregion -.go-Flipper { +.go-flipper { display: inline-block; position: relative; width: $width; height: $height; line-height: $height; - border: solid 1px $backColor; border-radius: $radius; background: $frontColor; font-size: $width; @@ -139,6 +151,17 @@ $lineColor: #4a9ef8; box-shadow: 0 0 6px rgba($color: $shadowColor, $alpha: 0.5); // 阴影部分 text-align: center; // font-family: 'Helvetica Neue'; + &::after { + content: ''; + position: absolute; + z-index: 10; + left: 0; + top: 0; + right: 0; + bottom: 0; + box-shadow: inset 0 0 $borderWidth 0 $frontColor; // 内测阴影部分 + border-radius: $radius; + } .digital:before, .digital:after { @@ -186,11 +209,13 @@ $lineColor: #4a9ef8; &.down.go .front:before { transform-origin: 50% 100%; animation: frontFlipDown $speed ease-in-out both; - box-shadow: 0 -2px 6px rgba($color: $lineColor, $alpha: 0.3); + box-shadow: 0 -2px $borderWidth 0 $frontColor; backface-visibility: hidden; } &.down.go .back:after { animation: backFlipDown $speed ease-in-out both; + box-shadow: 0 2px $borderWidth 0 $frontColor; + backface-visibility: hidden; } /*向上翻*/ &.up .front:after { @@ -208,11 +233,13 @@ $lineColor: #4a9ef8; &.up.go .front:after { transform-origin: 50% 0; animation: frontFlipUp $speed ease-in-out both; - box-shadow: 0 2px 6px rgba($color: $lineColor, $alpha: 0.3); + box-shadow: 0 2px $borderWidth 0 $frontColor; backface-visibility: hidden; } &.up.go .back:before { animation: backFlipUp $speed ease-in-out both; + box-shadow: 0 -2px $borderWidth 0 $frontColor; + backface-visibility: hidden; } } </style> diff --git a/src/enums/storageEnum.ts b/src/enums/storageEnum.ts index b0818a24..4482f069 100644 --- a/src/enums/storageEnum.ts +++ b/src/enums/storageEnum.ts @@ -12,5 +12,7 @@ export enum StorageEnum { // 工作台布局配置 GO_CHART_LAYOUT_STORE = 'GO_CHART_LAYOUT', // 工作台需要保存的数据 - GO_CHART_STORAGE_LIST = 'GO_CHART_STORAGE_LIST' + GO_CHART_STORAGE_LIST = 'GO_CHART_STORAGE_LIST', + // 用户存储的图片媒体 + GO_USER_MEDIA_PHOTOS = 'GO_USER_MEDIA_PHOTOS' } diff --git a/src/packages/chartConfiguration/echarts/index.ts b/src/packages/chartConfiguration/echarts/index.ts index 29fa8f02..a8604e33 100644 --- a/src/packages/chartConfiguration/echarts/index.ts +++ b/src/packages/chartConfiguration/echarts/index.ts @@ -1,3 +1,4 @@ export * from './axis' export * from './line' -export * from './label' \ No newline at end of file +export * from './label' +export * from './legend' \ No newline at end of file diff --git a/src/packages/chartConfiguration/echarts/legend.ts b/src/packages/chartConfiguration/echarts/legend.ts new file mode 100644 index 00000000..c243431d --- /dev/null +++ b/src/packages/chartConfiguration/echarts/legend.ts @@ -0,0 +1,70 @@ +export const legendConfig = { + // X轴位置 + lengendX: [ + { + label: '靠左', + value: 'left' + }, + { + label: '居中', + value: 'center' + }, + { + label: '靠右', + value: 'right' + } + ], + // y轴位置 + lengendY: [ + { + label: '靠上', + value: 'top' + }, + { + label: '居中', + value: 'center' + }, + { + label: '靠下', + value: 'bottom' + } + ], + // 排列方向 + orient: [ + { + label: '水平', + value: 'horizontal' + }, + { + label: '垂直', + value: 'vertical' + } + ], + // 形状 + shape: [ + { + label: '圆形', + value: 'circle' + }, + { + label: '方形', + value: 'rect' + }, + { + label: '圆角方形', + value: 'roundRect' + }, + { + label: '三角形', + value: 'triangle' + }, + { + label: '钢笔形', + value: 'pin' + }, + { + label: '箭头形', + value: 'arrow' + } + ] +} diff --git a/src/packages/components/Charts/Pies/PieCommon/config.ts b/src/packages/components/Charts/Pies/PieCommon/config.ts index 73505883..1f999a51 100644 --- a/src/packages/components/Charts/Pies/PieCommon/config.ts +++ b/src/packages/components/Charts/Pies/PieCommon/config.ts @@ -18,7 +18,14 @@ export const PieTypeObject = { [PieTypeEnum.ROSE]: 'rose' } +// 其它配置 +const otherConfig = { + // 轮播动画 + isCarousel: false, +} + const option = { + ...otherConfig, type: 'ring', tooltip: { show: true, diff --git a/src/packages/components/Charts/Pies/PieCommon/config.vue b/src/packages/components/Charts/Pies/PieCommon/config.vue index eaa91dd1..2dd38301 100644 --- a/src/packages/components/Charts/Pies/PieCommon/config.vue +++ b/src/packages/components/Charts/Pies/PieCommon/config.vue @@ -1,88 +1,99 @@ -<template> - <!-- Echarts 全局设置 --> - <global-setting :optionData="optionData"></global-setting> - <CollapseItem name="饼图配置" :expanded="true"> - <SettingItemBox name="类型"> - <SettingItem> - <n-select v-model:value="optionData.type" size="small" :options="fontWeightOptions" /> - </SettingItem> - </SettingItemBox> - <SettingItemBox name="标签"> - <SettingItem> - <n-space> - <n-switch v-model:value="optionData.series[0].label.show" size="small"></n-switch> - <n-text>展示标签</n-text> - </n-space> - </SettingItem> - <setting-item> - <n-space> - <n-switch v-model:value="optionData.series[0].labelLine.show" size="small"></n-switch> - <n-text>引导线</n-text> - </n-space> - </setting-item> - <SettingItem name="位置"> - <n-select v-model:value="optionData.series[0].label.position" size="small" :options="labelConfig.position" /> - </SettingItem> - <setting-item name="展示类型"> - <n-select v-model:value="optionData.series[0].label.formatter" size="small" :options="labelFormatterOptions" /> - </setting-item> - </SettingItemBox> - <setting-item-box name="圆角"> - <setting-item> - <n-space> - <n-input-number - v-model:value="optionData.series[0].itemStyle.borderRadius" - size="small" - :min="0" - ></n-input-number> - <n-text>圆角大小</n-text> - </n-space> - </setting-item> - <setting-item> - <n-space> - <n-input-number - v-model:value="optionData.series[0].itemStyle.borderWidth" - size="small" - :min="0" - ></n-input-number> - <n-text>线条宽度</n-text> - </n-space> - </setting-item> - </setting-item-box> - </CollapseItem> -</template> - -<script setup lang="ts"> -import { PropType, watch } from 'vue' -import { GlobalThemeJsonType } from '@/settings/chartThemes/index' -import { GlobalSetting, CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' -import { PieTypeObject, PieTypeEnum } from './config' -import { labelConfig } from '@/packages/chartConfiguration/echarts' - -const props = defineProps({ - optionData: { - type: Object as PropType<GlobalThemeJsonType>, - required: true - } -}) -const fontWeightOptions = [ - { - label: PieTypeEnum.NORMAL, - value: PieTypeObject[PieTypeEnum.NORMAL] - }, - { - label: PieTypeEnum.RING, - value: PieTypeObject[PieTypeEnum.RING] - }, - { - label: PieTypeEnum.ROSE, - value: PieTypeObject[PieTypeEnum.ROSE] - } -] - -const labelFormatterOptions = [ - { label: '数据名', value: '{b}' }, - { label: '百分比', value: '{d}' }, - { label: '列名:百分比', value: '{b}:{d}%' } -] -</script> +<template> + <!-- Echarts 全局设置 --> + <global-setting :optionData="optionData"></global-setting> + <CollapseItem name="饼图配置" :expanded="true"> + <SettingItemBox name="类型"> + <SettingItem> + <n-select v-model:value="optionData.type" size="small" :options="fontWeightOptions" /> + </SettingItem> + </SettingItemBox> + <SettingItemBox name="动画" :alone="true"> + <SettingItem> + <n-space> + <n-switch v-model:value="optionData.isCarousel" size="small"></n-switch> + <n-text>开启<n-text :depth="3">(将自动隐藏图例)</n-text></n-text> + </n-space> + </SettingItem> + <SettingItem> + <n-text :depth="3">无鼠标点击图例场景时,可强行打开图例</n-text> + </SettingItem> + </SettingItemBox> + <SettingItemBox name="标签"> + <SettingItem> + <n-space> + <n-switch v-model:value="optionData.series[0].label.show" size="small"></n-switch> + <n-text>展示标签</n-text> + </n-space> + </SettingItem> + <setting-item> + <n-space> + <n-switch v-model:value="optionData.series[0].labelLine.show" size="small"></n-switch> + <n-text>引导线</n-text> + </n-space> + </setting-item> + <SettingItem name="位置"> + <n-select v-model:value="optionData.series[0].label.position" size="small" :options="labelConfig.position" /> + </SettingItem> + <setting-item name="展示类型"> + <n-select v-model:value="optionData.series[0].label.formatter" size="small" :options="labelFormatterOptions" /> + </setting-item> + </SettingItemBox> + <setting-item-box name="圆角"> + <setting-item> + <n-space> + <n-input-number + v-model:value="optionData.series[0].itemStyle.borderRadius" + size="small" + :min="0" + ></n-input-number> + <n-text>圆角大小</n-text> + </n-space> + </setting-item> + <setting-item> + <n-space> + <n-input-number + v-model:value="optionData.series[0].itemStyle.borderWidth" + size="small" + :min="0" + ></n-input-number> + <n-text>线条宽度</n-text> + </n-space> + </setting-item> + </setting-item-box> + </CollapseItem> +</template> + +<script setup lang="ts"> +import { PropType, watch } from 'vue' +import { GlobalThemeJsonType } from '@/settings/chartThemes/index' +import { GlobalSetting, CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' +import { PieTypeObject, PieTypeEnum } from './config' +import { labelConfig } from '@/packages/chartConfiguration/echarts' + +const props = defineProps({ + optionData: { + type: Object as PropType<GlobalThemeJsonType>, + required: true + } +}) +const fontWeightOptions = [ + { + label: PieTypeEnum.NORMAL, + value: PieTypeObject[PieTypeEnum.NORMAL] + }, + { + label: PieTypeEnum.RING, + value: PieTypeObject[PieTypeEnum.RING] + }, + { + label: PieTypeEnum.ROSE, + value: PieTypeObject[PieTypeEnum.ROSE] + } +] + +const labelFormatterOptions = [ + { label: '数据名', value: '{b}' }, + { label: '百分比', value: '{d}' }, + { label: '列名:百分比', value: '{b}:{d}%' } +] +</script> diff --git a/src/packages/components/Charts/Pies/PieCommon/index.vue b/src/packages/components/Charts/Pies/PieCommon/index.vue index f8706ad4..a662df38 100644 --- a/src/packages/components/Charts/Pies/PieCommon/index.vue +++ b/src/packages/components/Charts/Pies/PieCommon/index.vue @@ -1,64 +1,146 @@ -<template> - <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart> -</template> - -<script setup lang="ts"> -import { computed, PropType, reactive, watch } from 'vue' -import VChart from 'vue-echarts' -import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook' -import { use } from 'echarts/core' -import { CanvasRenderer } from 'echarts/renderers' -import { PieChart } from 'echarts/charts' -import { mergeTheme } from '@/packages/public/chart' -import config, { includes } from './config' -import { useChartDataFetch } from '@/hooks' -import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' -import { isPreview } from '@/utils' -import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' - -const props = defineProps({ - themeSetting: { - type: Object, - required: true - }, - themeColor: { - type: Object, - required: true - }, - chartConfig: { - type: Object as PropType<config>, - required: true - } -}) - -const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting) - -use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent]) - -const option = computed(() => { - return mergeTheme(props.chartConfig.option, props.themeSetting, includes) -}) - -watch( - () => props.chartConfig.option.type, - newData => { - try { - if (newData === 'nomal') { - props.chartConfig.option.series[0].radius = '70%' - props.chartConfig.option.series[0].roseType = false - } else if (newData === 'ring') { - props.chartConfig.option.series[0].radius = ['40%', '65%'] - props.chartConfig.option.series[0].roseType = false - } else { - props.chartConfig.option.series[0].radius = '70%' - props.chartConfig.option.series[0].roseType = true - } - } catch (error) { - console.log(error) - } - }, - { deep: false, immediate: true } -) - -const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore) -</script> +<template> + <v-chart + ref="vChartRef" + autoresize + :init-options="initOptions" + :theme="themeColor" + :option="option" + :manual-update="isPreview()" + @mouseover="handleHighlight" + @mouseout="handleDownplay" + ></v-chart> +</template> + +<script setup lang="ts"> +import { computed, PropType, onMounted, watch } from 'vue' +import VChart from 'vue-echarts' +import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook' +import { use } from 'echarts/core' +import { CanvasRenderer } from 'echarts/renderers' +import { PieChart } from 'echarts/charts' +import { mergeTheme } from '@/packages/public/chart' +import config, { includes } from './config' +import { useChartDataFetch } from '@/hooks' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { isPreview } from '@/utils' +import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' +import dataJson from './data.json' + +const props = defineProps({ + themeSetting: { + type: Object, + required: true + }, + themeColor: { + type: Object, + required: true + }, + chartConfig: { + type: Object as PropType<config>, + required: true + } +}) +const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting) +let seriesDataNum = -1 +let seriesDataMaxLength = 0 +let intervalInstance: any = null + +use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent]) + +const option = computed(() => { + return mergeTheme(props.chartConfig.option, props.themeSetting, includes) +}) + +// 会重新选择需要选中和展示的数据 +const handleSeriesData = () => { + if (seriesDataNum > -1) { + vChartRef.value?.dispatchAction({ + type: 'downplay', + dataIndex: seriesDataNum + }) + } + seriesDataNum = seriesDataNum >= seriesDataMaxLength - 1 ? 0 : seriesDataNum + 1 + vChartRef.value?.dispatchAction({ + type: 'highlight', + dataIndex: seriesDataNum + }) +} + +// 新增轮播 +const addPieInterval = (newData?: typeof dataJson, skipPre = false) => { + if (!skipPre && !Array.isArray(newData?.source)) return + if (!skipPre) seriesDataMaxLength = newData?.source.length || 0 + clearInterval(intervalInstance) + intervalInstance = setInterval(() => { + handleSeriesData() + }, 1000) +} + +// 取消轮播 +const clearPieInterval = () => { + vChartRef.value?.dispatchAction({ + type: 'downplay', + dataIndex: seriesDataNum + }) + clearInterval(intervalInstance) + intervalInstance = null +} + +// 处理鼠标聚焦高亮内容 +const handleHighlight = () => { + clearPieInterval() +} + +// 处理鼠标取消悬浮 +const handleDownplay = () => { + if (props.chartConfig.option.isCarousel && !intervalInstance) { + // 恢复轮播 + addPieInterval(undefined, true) + } +} + +watch( + () => props.chartConfig.option.type, + newData => { + try { + if (newData === 'nomal') { + props.chartConfig.option.series[0].radius = '70%' + props.chartConfig.option.series[0].roseType = false + } else if (newData === 'ring') { + props.chartConfig.option.series[0].radius = ['40%', '65%'] + props.chartConfig.option.series[0].roseType = false + } else { + props.chartConfig.option.series[0].radius = '70%' + props.chartConfig.option.series[0].roseType = true + } + } catch (error) { + console.log(error) + } + }, + { deep: false, immediate: true } +) + +watch( + () => props.chartConfig.option.isCarousel, + newData => { + if (newData) { + addPieInterval(undefined, true) + props.chartConfig.option.legend.show = false + } else { + props.chartConfig.option.legend.show = true + clearPieInterval() + } + } +) + +const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore, (newData: typeof dataJson) => { + addPieInterval(newData) +}) + +onMounted(() => { + seriesDataMaxLength = dataJson.source.length + if (props.chartConfig.option.isCarousel) { + addPieInterval(undefined, true) + } +}) +</script> diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/config.ts b/src/packages/components/Decorates/Mores/FlipperNumber/config.ts index 36a04377..44856128 100644 --- a/src/packages/components/Decorates/Mores/FlipperNumber/config.ts +++ b/src/packages/components/Decorates/Mores/FlipperNumber/config.ts @@ -16,6 +16,7 @@ export interface OptionType { flipperGap: number flipperType: FlipType flipperSpeed: number + flipperBorderWidth: number } export const option: OptionType = { @@ -28,7 +29,8 @@ export const option: OptionType = { flipperRadius: 5, flipperGap: 10, flipperType: 'down', - flipperSpeed: 450 + flipperSpeed: 450, + flipperBorderWidth: 0, } export default class Config extends PublicConfigClass implements CreateComponentType { diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/config.vue b/src/packages/components/Decorates/Mores/FlipperNumber/config.vue index f2c65a96..91d4450a 100644 --- a/src/packages/components/Decorates/Mores/FlipperNumber/config.vue +++ b/src/packages/components/Decorates/Mores/FlipperNumber/config.vue @@ -16,12 +16,16 @@ <setting-item name="高度"> <n-input-number v-model:value="optionData.flipperHeight" size="small" :min="1"></n-input-number> </setting-item> - <setting-item name="间隔"> - <n-input-number v-model:value="optionData.flipperGap" size="small" :min="0"></n-input-number> + <setting-item name="边框"> + <n-input-number v-model:value="optionData.flipperBorderWidth" size="small" :min="0" :max="10"></n-input-number> </setting-item> <setting-item name="圆角"> <n-input-number v-model:value="optionData.flipperRadius" size="small" :min="0"></n-input-number> </setting-item> + <setting-item name="翻牌间隔"> + <n-input-number v-model:value="optionData.flipperGap" size="small" :min="0"></n-input-number> + </setting-item> + <setting-item /> <setting-item name="背景色"> <n-color-picker size="small" diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/index.vue b/src/packages/components/Decorates/Mores/FlipperNumber/index.vue index 8743fdbd..9e5c0ca2 100644 --- a/src/packages/components/Decorates/Mores/FlipperNumber/index.vue +++ b/src/packages/components/Decorates/Mores/FlipperNumber/index.vue @@ -9,6 +9,7 @@ :radius="flipperRadius" :flip-type="flipperType" :duration="flipperSpeed" + :border-width="flipperBorderWidth" v-for="(item, index) in flipperData" :key="index" class="go-d-block" @@ -42,7 +43,8 @@ const { flipperRadius, flipperGap, flipperType, - flipperSpeed + flipperSpeed, + flipperBorderWidth } = toRefs(props.chartConfig.option as OptionType) const flipperData = ref<string[] | number[]>([]) diff --git a/src/packages/components/Decorates/Mores/PipelineH/config.ts b/src/packages/components/Decorates/Mores/PipelineH/config.ts new file mode 100644 index 00000000..6df11312 --- /dev/null +++ b/src/packages/components/Decorates/Mores/PipelineH/config.ts @@ -0,0 +1,19 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { chartInitConfig } from '@/settings/designSetting' +import { PipelineHConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' + +export const option = { + color_type: 1, + o_color: '#0a7ae2', + i_color: '#119bfa', + line_class: 'svg_ani_flow' +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = PipelineHConfig.key + public attr = { ...chartInitConfig, w: 500, h: 15, zIndex: -1 } + public chartConfig = cloneDeep(PipelineHConfig) + public option = cloneDeep(option) +} diff --git a/src/packages/components/Decorates/Mores/PipelineH/config.vue b/src/packages/components/Decorates/Mores/PipelineH/config.vue new file mode 100644 index 00000000..bc039e8e --- /dev/null +++ b/src/packages/components/Decorates/Mores/PipelineH/config.vue @@ -0,0 +1,77 @@ +<template> + <CollapseItem name="管道" :expanded="true"> + <SettingItemBox name="默认颜色"> + <SettingItem> + <n-select v-model:value="optionData.color_type" :options="colorOptions" @update:value="handleColorChange" /> + </SettingItem> + </SettingItemBox> + <SettingItemBox name="管道颜色"> + <SettingItem> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.o_color"></n-color-picker> + </SettingItem> + </SettingItemBox> + <SettingItemBox name="水流颜色"> + <SettingItem> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.i_color"></n-color-picker> + </SettingItem> + </SettingItemBox> + <SettingItemBox name="流向"> + <SettingItem> + <n-select v-model:value="optionData.line_class" :options="options" /> + </SettingItem> + </SettingItemBox> + </CollapseItem> +</template> + +<script setup lang="ts"> +import { PropType, ref } from 'vue' +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' +import { option } from './config' + +const props = defineProps({ + optionData: { + type: Object as PropType<typeof option>, + required: true + } +}) + +const options = ref([ + { + value: 'svg_ani_flow', + label: '正向' + }, + { + value: 'svg_ani_flow_back', + label: '反向' + }, + { + value: 'svg_ani_flow_stop', + label: '停止' + } +]) + +const colorOptions = ref([ + { + value: 1, + label: '蓝' + }, + { + value: 2, + label: '黄' + } +]) + +// 默认颜色 +const handleColorChange = (e: number) => { + switch (e) { + case 1: + props.optionData.o_color = '#0a7ae2' + props.optionData.i_color = '#119bfa' + break + case 2: + props.optionData.o_color = '#ff9d00' + props.optionData.i_color = '#f7ea37' + break + } +} +</script> diff --git a/src/packages/components/Decorates/Mores/PipelineH/index.ts b/src/packages/components/Decorates/Mores/PipelineH/index.ts new file mode 100644 index 00000000..5f612871 --- /dev/null +++ b/src/packages/components/Decorates/Mores/PipelineH/index.ts @@ -0,0 +1,13 @@ +import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const PipelineHConfig: ConfigType = { + key: 'PipelineH', + chartKey: 'VPipelineH', + conKey: 'VCPipelineH', + title: '管道-横向', + category: ChatCategoryEnum.MORE, + categoryName: ChatCategoryEnumName.MORE, + package: PackagesCategoryEnum.DECORATES, + image: 'Pipeline_H.png' +} diff --git a/src/packages/components/Decorates/Mores/PipelineH/index.vue b/src/packages/components/Decorates/Mores/PipelineH/index.vue new file mode 100644 index 00000000..15da8449 --- /dev/null +++ b/src/packages/components/Decorates/Mores/PipelineH/index.vue @@ -0,0 +1,141 @@ +<template> + <div class="go-decorates-line"> + <svg :width="w" :height="h"> + <line :x1="0" :y1="h / 2" :x2="w" :y2="h / 2" :stroke="o_color" :stroke-width="h"></line> + <line :x1="0" :y1="h / 2" :x2="w" :y2="h / 2" :stroke="i_color" :stroke-width="h / 2" :class="line_class"></line> + </svg> + </div> +</template> + +<script setup lang="ts"> +import { PropType, toRefs } from 'vue' +import { CreateComponentType } from '@/packages/index.d' + +const props = defineProps({ + chartConfig: { + type: Object as PropType<CreateComponentType>, + required: true + } +}) + +const { w, h } = toRefs(props.chartConfig.attr) +const { o_color, i_color, line_class } = toRefs(props.chartConfig.option) +</script> + +<style lang="scss" scoped> +.go-decorates-line { + font-size: 0; +} + +/* 正向流动效果 */ +.svg_ani_flow { + stroke-dasharray: 1000; + stroke-dashoffset: 1000; + animation: ani_flow 10s linear infinite; + animation-fill-mode: forwards; + -webkit-animation: ani_flow 10s linear infinite; + -webkit-animation-fill-mode: forwards; +} + +@keyframes ani_flow { + from { + stroke-dasharray: 10, 5; + } + + to { + stroke-dasharray: 13, 5; + } +} +@-webkit-keyframes ani_flow { + from { + stroke-dasharray: 10, 5; + } + + to { + stroke-dasharray: 13, 5; + } +} + +/* 停止流动效果 */ +.svg_ani_flow_stop { + stroke-dasharray: 1000; + stroke-dashoffset: 1000; + animation: ani_flow_stop 10s linear infinite; + animation-fill-mode: forwards; + -webkit-animation: ani_flow_stop 10s linear infinite; + -webkit-animation-fill-mode: forwards; +} + +@keyframes ani_flow_stop { + from { + stroke-dasharray: 10, 5; + } + + to { + stroke-dasharray: 10, 5; + } +} +@-webkit-keyframes ani_flow_stop { + from { + stroke-dasharray: 10, 5; + } + + to { + stroke-dasharray: 10, 5; + } +} +/* 反向流动效果 */ +.svg_ani_flow_back { + stroke-dasharray: 1000; + stroke-dashoffset: 1000; + animation: ani_flow_back 10s linear infinite; + animation-fill-mode: forwards; + -webkit-animation: ani_flow_back 10s linear infinite; + -webkit-animation-fill-mode: forwards; +} + +@keyframes ani_flow_back { + from { + stroke-dasharray: 13, 5; + } + + to { + stroke-dasharray: 10, 5; + } +} +@-webkit-keyframes ani_flow_stop { + from { + stroke-dasharray: 10, 5; + } + + to { + stroke-dasharray: 10, 5; + } +} +/* 以最大40高度填充 */ +.svg_ani_fill_h40 { + animation: ani_fill_h40 5s linear infinite; + animation-fill-mode: forwards; + -webkit-animation: ani_fill_h40 5s linear infinite; + -webkit-animation-fill-mode: forwards; +} + +@keyframes ani_fill_h40 { + from { + height: 0px; + } + + to { + height: 40px; + } +} +@-webkit-keyframes ani_flow_stop { + from { + stroke-dasharray: 10, 5; + } + + to { + stroke-dasharray: 10, 5; + } +} +</style> diff --git a/src/packages/components/Decorates/Mores/PipelineV/config.ts b/src/packages/components/Decorates/Mores/PipelineV/config.ts new file mode 100644 index 00000000..e3029751 --- /dev/null +++ b/src/packages/components/Decorates/Mores/PipelineV/config.ts @@ -0,0 +1,19 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { chartInitConfig } from '@/settings/designSetting' +import { PipelineVConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' + +export const option = { + color_type: 1, + o_color: '#0a7ae2', + i_color: '#119bfa', + line_class: 'svg_ani_flow' +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = PipelineVConfig.key + public attr = { ...chartInitConfig, w: 15, h: 500, zIndex: -1 } + public chartConfig = cloneDeep(PipelineVConfig) + public option = cloneDeep(option) +} diff --git a/src/packages/components/Decorates/Mores/PipelineV/config.vue b/src/packages/components/Decorates/Mores/PipelineV/config.vue new file mode 100644 index 00000000..bc039e8e --- /dev/null +++ b/src/packages/components/Decorates/Mores/PipelineV/config.vue @@ -0,0 +1,77 @@ +<template> + <CollapseItem name="管道" :expanded="true"> + <SettingItemBox name="默认颜色"> + <SettingItem> + <n-select v-model:value="optionData.color_type" :options="colorOptions" @update:value="handleColorChange" /> + </SettingItem> + </SettingItemBox> + <SettingItemBox name="管道颜色"> + <SettingItem> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.o_color"></n-color-picker> + </SettingItem> + </SettingItemBox> + <SettingItemBox name="水流颜色"> + <SettingItem> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.i_color"></n-color-picker> + </SettingItem> + </SettingItemBox> + <SettingItemBox name="流向"> + <SettingItem> + <n-select v-model:value="optionData.line_class" :options="options" /> + </SettingItem> + </SettingItemBox> + </CollapseItem> +</template> + +<script setup lang="ts"> +import { PropType, ref } from 'vue' +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' +import { option } from './config' + +const props = defineProps({ + optionData: { + type: Object as PropType<typeof option>, + required: true + } +}) + +const options = ref([ + { + value: 'svg_ani_flow', + label: '正向' + }, + { + value: 'svg_ani_flow_back', + label: '反向' + }, + { + value: 'svg_ani_flow_stop', + label: '停止' + } +]) + +const colorOptions = ref([ + { + value: 1, + label: '蓝' + }, + { + value: 2, + label: '黄' + } +]) + +// 默认颜色 +const handleColorChange = (e: number) => { + switch (e) { + case 1: + props.optionData.o_color = '#0a7ae2' + props.optionData.i_color = '#119bfa' + break + case 2: + props.optionData.o_color = '#ff9d00' + props.optionData.i_color = '#f7ea37' + break + } +} +</script> diff --git a/src/packages/components/Decorates/Mores/PipelineV/index.ts b/src/packages/components/Decorates/Mores/PipelineV/index.ts new file mode 100644 index 00000000..e99f81a1 --- /dev/null +++ b/src/packages/components/Decorates/Mores/PipelineV/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const PipelineVConfig: ConfigType = { + key: 'PipelineV', + chartKey: 'VPipelineV', + conKey: 'VCPipelineV', + title: '管道-纵向', + category: ChatCategoryEnum.MORE, + categoryName: ChatCategoryEnumName.MORE, + package: PackagesCategoryEnum.DECORATES, + image: 'Pipeline_V.png' +} + diff --git a/src/packages/components/Decorates/Mores/PipelineV/index.vue b/src/packages/components/Decorates/Mores/PipelineV/index.vue new file mode 100644 index 00000000..108a3c1f --- /dev/null +++ b/src/packages/components/Decorates/Mores/PipelineV/index.vue @@ -0,0 +1,115 @@ +<template> + <div class="go-decorates-line"> + <svg :width="w" :height="h"> + <line :x1="w / 2" :y1="0" :x2="w / 2" :y2="h" :stroke="o_color" :stroke-width="w"></line> + <line :x1="w / 2" :y1="0" :x2="w / 2" :y2="h" :stroke="i_color" :stroke-width="w / 2" :class="line_class"></line> + </svg> + </div> +</template> + +<script setup lang="ts"> +import { PropType, toRefs } from 'vue' +import { CreateComponentType } from '@/packages/index.d' + +const props = defineProps({ + chartConfig: { + type: Object as PropType<CreateComponentType>, + required: true + } +}) + +const { w, h } = toRefs(props.chartConfig.attr) +const { o_color, i_color, line_class } = toRefs(props.chartConfig.option) +</script> + +<style lang="scss" scoped> +.go-decorates-line { + font-size: 0; +} + +/* 正向流动效果 */ +.svg_ani_flow { + stroke-dasharray: 1000; + stroke-dashoffset: 1000; + animation: ani_flow 10s linear infinite; + animation-fill-mode: forwards; + -webkit-animation: ani_flow 10s linear infinite; + -webkit-animation-fill-mode: forwards; +} + +@keyframes ani_flow { + from { + stroke-dasharray: 10, 5; + } + + to { + stroke-dasharray: 13, 5; + } +} +@-webkit-keyframes ani_flow { + from { + stroke-dasharray: 10, 5; + } + + to { + stroke-dasharray: 13, 5; + } +} + +/* 停止流动效果 */ +.svg_ani_flow_stop { + stroke-dasharray: 1000; + stroke-dashoffset: 1000; + animation: ani_flow_stop 10s linear infinite; + animation-fill-mode: forwards; + -webkit-animation: ani_flow_stop 10s linear infinite; + -webkit-animation-fill-mode: forwards; +} + +@keyframes ani_flow_stop { + from { + stroke-dasharray: 10, 5; + } + + to { + stroke-dasharray: 10, 5; + } +} +@-webkit-keyframes ani_flow_stop { + from { + stroke-dasharray: 10, 5; + } + + to { + stroke-dasharray: 10, 5; + } +} +/* 反向流动效果 */ +.svg_ani_flow_back { + stroke-dasharray: 1000; + stroke-dashoffset: 1000; + animation: ani_flow_back 10s linear infinite; + animation-fill-mode: forwards; + -webkit-animation: ani_flow_back 10s linear infinite; + -webkit-animation-fill-mode: forwards; +} + +@keyframes ani_flow_back { + from { + stroke-dasharray: 13, 5; + } + + to { + stroke-dasharray: 10, 5; + } +} +@-webkit-keyframes ani_flow_back { + from { + stroke-dasharray: 13, 5; + } + + to { + stroke-dasharray: 10, 5; + } +} +</style> diff --git a/src/packages/components/Decorates/Mores/index.ts b/src/packages/components/Decorates/Mores/index.ts index 855f6e27..7223832b 100644 --- a/src/packages/components/Decorates/Mores/index.ts +++ b/src/packages/components/Decorates/Mores/index.ts @@ -3,5 +3,7 @@ import { TimeCommonConfig } from './TimeCommon/index' import { ClockConfig } from './Clock/index' import { CountDownConfig } from './CountDown/index' import { FlipperNumberConfig } from './FlipperNumber' +import { PipelineHConfig } from './PipelineH/index' +import { PipelineVConfig } from './PipelineV/index' -export default [NumberConfig, FlipperNumberConfig, TimeCommonConfig, CountDownConfig, ClockConfig] +export default [NumberConfig, FlipperNumberConfig, TimeCommonConfig, CountDownConfig, ClockConfig, PipelineHConfig, PipelineVConfig] diff --git a/src/packages/components/Decorates/Three/ThreeEarth01/code/Utils/arc.ts b/src/packages/components/Decorates/Three/ThreeEarth01/code/Utils/arc.ts index 76db98fc..cc328529 100644 --- a/src/packages/components/Decorates/Three/ThreeEarth01/code/Utils/arc.ts +++ b/src/packages/components/Decorates/Three/ThreeEarth01/code/Utils/arc.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-nocheck import { ArcCurve, diff --git a/src/packages/components/Icons/Common/index.ts b/src/packages/components/Icons/Common/index.ts new file mode 100644 index 00000000..86560d70 --- /dev/null +++ b/src/packages/components/Icons/Common/index.ts @@ -0,0 +1,84 @@ +import { IconConfig } from '../Default/Icon/index' +import { PackagesCategoryEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../index.d' + +const iconNames = [ + 'uim:adobe', + 'uim:airplay', + 'uim:align', + 'uim:angle-double-down', + 'uim:angle-double-left', + 'uim:angle-double-right', + 'uim:angle-double-up', + 'uim:angle-down', + 'uim:angle-left', + 'uim:angle-right', + 'uim:angle-up', + 'uim:android-alt', + 'uim:apple', + 'uim:apps', + 'uim:bag', + 'uim:battery-bolt', + 'uim:bing', + 'uim:box', + 'uim:briefcase', + 'uim:calender', + 'uim:chart', + 'uim:chart-pie', + 'uim:circle-layer', + 'uim:clinic-medical', + 'uim:clock', + 'uim:comment-alt', + 'uim:comment-alt-dots', + 'uim:docker', + 'uim:download-alt', + 'uim:dribbble', + 'uim:dropbox', + 'uim:entry', + 'uim:exclamation-circle', + 'uim:exclamation-triangle', + 'uim:exit', + 'uim:facebook', + 'uim:facebook-messenger', + 'uim:facebook-messenger-alt', + 'uim:google-drive', + 'uim:google-play', + 'uim:graph-bar', + 'uim:head-side-mask', + 'uim:horizontal-align-left', + 'uim:hospital', + 'uim:house-user', + 'uim:image-v', + 'uim:key-skeleton', + 'uim:layer-group', + 'uim:layers-alt', + 'uim:link-h', + 'uim:microscope', + 'uim:microsoft', + 'uim:object-group', + 'uim:object-ungroup', + 'uim:paypal', + 'uim:refresh', + 'uim:repeat', + 'uim:right-indent-alt', + 'uim:rocket', + 'uim:shield-plus', + 'uim:social-distancing', + 'uim:telegram-alt', + 'uim:user-md', + 'uim:toilet-paper', + 'uim:youtube' +] +const iconList = iconNames.map(name => ({ + ...IconConfig, + category: ChatCategoryEnum.COMMON, + categoryName: ChatCategoryEnumName.COMMON, + package: PackagesCategoryEnum.ICONS, + image: name, + icon: name, + dataset: name, + title: name.replace('uim:', ''), + redirectComponent: `${IconConfig.package}/${IconConfig.category}/${IconConfig.key}` // 跳转组件路径规则:packageName/categoryName/componentKey +})) + +export default iconList diff --git a/src/packages/components/Icons/Default/Icon/config.ts b/src/packages/components/Icons/Default/Icon/config.ts new file mode 100644 index 00000000..677fef67 --- /dev/null +++ b/src/packages/components/Icons/Default/Icon/config.ts @@ -0,0 +1,20 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { chartInitConfig } from '@/settings/designSetting' +import { IconConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' + +export const option = { + // 图标名称 + dataset: 'uim:apple', + color: '#03A9F4', + size: 64, + rotate: 0 // 旋转角度 +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = IconConfig.key + public attr = { ...chartInitConfig, w: 64, h: 64, zIndex: 1 } + public chartConfig = cloneDeep(IconConfig) + public option = cloneDeep(option) +} diff --git a/src/packages/components/Icons/Default/Icon/config.vue b/src/packages/components/Icons/Default/Icon/config.vue new file mode 100644 index 00000000..961f6baa --- /dev/null +++ b/src/packages/components/Icons/Default/Icon/config.vue @@ -0,0 +1,50 @@ +<template> + <collapse-item name="属性" :expanded="true"> + <setting-item-box name="样式"> + <setting-item name="颜色"> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.color"></n-color-picker> + </setting-item> + <setting-item name="尺寸"> + <n-input-number v-model:value="optionData.size" size="small" :min="0" placeholder="尺寸"></n-input-number> + </setting-item> + </setting-item-box> + <setting-item-box name="旋转"> + <setting-item name="旋转"> + <n-select v-model:value="optionData.rotate" size="small" :options="rotateMode"></n-select> + </setting-item> + </setting-item-box> + </collapse-item> +</template> + +<script setup lang="ts"> +import { PropType } from 'vue' +import { option } from './config' +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' + +const props = defineProps({ + optionData: { + type: Object as PropType<typeof option>, + required: true + } +}) + +// 旋转方式 +const rotateMode = [ + { + value: 0, + label: '0°' + }, + { + value: 1, + label: '90°' + }, + { + value: 2, + label: '180°' + }, + { + value: 3, + label: '270°' + } +] +</script> diff --git a/src/packages/components/Icons/Default/Icon/index.ts b/src/packages/components/Icons/Default/Icon/index.ts new file mode 100644 index 00000000..47af1f9f --- /dev/null +++ b/src/packages/components/Icons/Default/Icon/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const IconConfig: ConfigType = { + key: 'Icon', + chartKey: 'VIcon', + conKey: 'VCIcon', + title: '图标', + category: ChatCategoryEnum.DEFAULT, + categoryName: ChatCategoryEnumName.DEFAULT, + package: PackagesCategoryEnum.ICONS, + chartFrame: ChartFrameEnum.STATIC, + image: 'icon.png' +} diff --git a/src/packages/components/Icons/Default/Icon/index.vue b/src/packages/components/Icons/Default/Icon/index.vue new file mode 100644 index 00000000..2c139a8a --- /dev/null +++ b/src/packages/components/Icons/Default/Icon/index.vue @@ -0,0 +1,31 @@ +<template> + <div class="go-icon-box"> + <Icon :icon="((dataset || '') as string)" :color="color" :width="size" :rotate="rotate" /> + </div> +</template> + +<script setup lang="ts"> +import { PropType, toRefs } from 'vue' +import { CreateComponentType } from '@/packages/index.d' +import { Icon } from '@iconify/vue' + +const props = defineProps({ + chartConfig: { + type: Object as PropType<CreateComponentType>, + required: true + } +}) + +const { w, h } = toRefs(props.chartConfig.attr) +const { dataset, color, size, rotate } = toRefs(props.chartConfig.option) +</script> + +<style lang="scss" scoped> +@include go('icon-box') { + display: flex; + align-items: center; + justify-content: center; + width: v-bind('`${w}px`'); + height: v-bind('`${h}px`'); +} +</style> diff --git a/src/packages/components/Icons/MaterialLine/index.ts b/src/packages/components/Icons/MaterialLine/index.ts new file mode 100644 index 00000000..adeac127 --- /dev/null +++ b/src/packages/components/Icons/MaterialLine/index.ts @@ -0,0 +1,45 @@ +import { IconConfig } from '../Default/Icon/index' +import { PackagesCategoryEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../index.d' + +const iconNames = [ + 'line-md:beer-alt-filled-loop', + 'line-md:beer-alt-twotone-loop', + 'line-md:cloud-braces-loop', + 'line-md:cloud-download-loop', + 'line-md:cloud-download-outline-loop', + 'line-md:cloud-upload-loop', + 'line-md:cloud-upload-outline-loop', + 'line-md:coffee-half-empty-twotone-loop', + 'line-md:coffee-loop', + 'line-md:coffee-twotone-loop', + 'line-md:downloading-loop', + 'line-md:github-loop', + 'line-md:light-dark-loop', + 'line-md:loading-alt-loop', + 'line-md:loading-loop', + 'line-md:loading-twotone-loop', + 'line-md:moon-alt-loop', + 'line-md:moon-alt-to-sunny-outline-loop-transition', + 'line-md:moon-filled-loop', + 'line-md:moon-filled-to-sunny-filled-loop-transition', + 'line-md:star-pulsating-filled-loop', + 'line-md:star-pulsating-loop', + 'line-md:star-pulsating-twotone-loop', + 'line-md:upload-loop', + 'line-md:upload-outline-loop', + 'line-md:uploading-loop' +] +const iconList = iconNames.map(name => ({ + ...IconConfig, + category: ChatCategoryEnum.ML, + categoryName: ChatCategoryEnumName.ML, + package: PackagesCategoryEnum.ICONS, + image: name, + icon: name, + dataset: name, + title: name.replace('line-md:', ''), + redirectComponent: `${IconConfig.package}/${IconConfig.category}/${IconConfig.key}` // 跳转组件路径规则:packageName/categoryName/componentKey +})) + +export default iconList diff --git a/src/packages/components/Icons/Weather/index.ts b/src/packages/components/Icons/Weather/index.ts new file mode 100644 index 00000000..f8ead1a1 --- /dev/null +++ b/src/packages/components/Icons/Weather/index.ts @@ -0,0 +1,53 @@ +import { IconConfig } from '../Default/Icon/index' +import { PackagesCategoryEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../index.d' + +const iconNames = [ + 'wi:cloud', + 'wi:cloudy', + 'wi:cloudy-gusts', + 'wi:cloudy-windy', + 'wi:day-cloudy', + 'wi:day-cloudy-high', + 'wi:day-hail', + 'wi:day-haze', + 'wi:day-light-wind', + 'wi:day-lightning', + 'wi:day-rain', + 'wi:day-rain-mix', + 'wi:day-rain-wind', + 'wi:day-showers', + 'wi:day-sleet', + 'wi:day-sleet-storm', + 'wi:day-snow', + 'wi:day-snow-thunderstorm', + 'wi:day-snow-wind', + 'wi:day-sprinkle', + 'wi:day-storm-showers', + 'wi:day-sunny', + 'wi:day-sunny-overcast', + 'wi:hail', + 'wi:horizon', + 'wi:horizon-alt', + 'wi:hot', + 'wi:lightning', + 'wi:night-alt-cloudy', + 'wi:night-alt-cloudy-gusts', + 'wi:night-alt-cloudy-high', + 'wi:night-alt-hail', + 'wi:night-alt-lightning', + 'wi:umbrella' +] +const iconList = iconNames.map(name => ({ + ...IconConfig, + category: ChatCategoryEnum.WEATHER, + categoryName: ChatCategoryEnumName.WEATHER, + package: PackagesCategoryEnum.ICONS, + image: name, + icon: name, + dataset: name, + title: name.replace('wi:', ''), + redirectComponent: `${IconConfig.package}/${IconConfig.category}/${IconConfig.key}` // 跳转组件路径规则:packageName/categoryName/componentKey +})) + +export default iconList diff --git a/src/packages/components/Icons/index.d.ts b/src/packages/components/Icons/index.d.ts new file mode 100644 index 00000000..a7f74a94 --- /dev/null +++ b/src/packages/components/Icons/index.d.ts @@ -0,0 +1,13 @@ +export enum ChatCategoryEnum { + ML = 'MaterialLine', + COMMON = 'Common', + WEATHER = 'Weather', + DEFAULT = 'Default' // 这个仅用来表示组件分类目录,不要在 index.ts 中导入 +} + +export enum ChatCategoryEnumName { + ML = '动画', + COMMON = '通用', + WEATHER = '天气', + DEFAULT = '默认' +} diff --git a/src/packages/components/Icons/index.ts b/src/packages/components/Icons/index.ts new file mode 100644 index 00000000..4c126002 --- /dev/null +++ b/src/packages/components/Icons/index.ts @@ -0,0 +1,5 @@ +import MaterialLine from './MaterialLine' +import Common from './Common' +import Weather from './Weather' + +export const IconList = [...MaterialLine, ...Weather, ...Common] diff --git a/src/packages/components/Informations/Inputs/InputsDate/config.ts b/src/packages/components/Informations/Inputs/InputsDate/config.ts index 72e9cfc0..e8f1d233 100644 --- a/src/packages/components/Informations/Inputs/InputsDate/config.ts +++ b/src/packages/components/Informations/Inputs/InputsDate/config.ts @@ -12,7 +12,9 @@ export const option = { [COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATE, // 下拉展示 isPanel: 0, - dataset: dayjs().valueOf() + dataset: dayjs().valueOf(), + differValue: 0 + } export default class Config extends PublicConfigClass implements CreateComponentType { diff --git a/src/packages/components/Informations/Inputs/InputsDate/config.vue b/src/packages/components/Informations/Inputs/InputsDate/config.vue index 5b906750..0d806518 100644 --- a/src/packages/components/Informations/Inputs/InputsDate/config.vue +++ b/src/packages/components/Informations/Inputs/InputsDate/config.vue @@ -1,31 +1,36 @@ <template> <collapse-item name="展示方式" :expanded="true"> <setting-item-box name="选择方式"> - <n-select - v-model:value="optionData.isPanel" - size="small" - :options="panelOptions" - /> + <n-select v-model:value="optionData.isPanel" size="small" :options="panelOptions" /> </setting-item-box> </collapse-item> <collapse-item name="时间配置" :expanded="true"> <setting-item-box name="基础"> <setting-item name="类型"> - <n-select - v-model:value="optionData.componentInteractEventKey" - size="small" - :options="datePickerTypeOptions" - /> + <n-select v-model:value="optionData.componentInteractEventKey" size="small" :options="datePickerTypeOptions" /> </setting-item> </setting-item-box> <setting-item-box name="默认值" :alone="true"> - <n-date-picker - size="small" - v-model:value="optionData.dataset" - :type="optionData.componentInteractEventKey" - /> + <n-date-picker size="small" v-model:value="optionData.dataset" :type="optionData.componentInteractEventKey" /> + </setting-item-box> + + <setting-item-box :alone="true"> + <template #name> + <n-text>动态</n-text> + <n-tooltip trigger="hover"> + <template #trigger> + <n-icon size="21" :depth="3"> + <help-outline-icon></help-outline-icon> + </n-icon> + </template> + <n-text>动态值不为0时,默认值:取当天时间相加当前值</n-text> + </n-tooltip> + </template> + <n-input-number v-model:value="optionData.differValue" class="input-num-width" size="small" :min="-40" :max="40"> + <template #suffix> 天 </template> + </n-input-number> </setting-item-box> </collapse-item> </template> diff --git a/src/packages/components/Informations/Inputs/InputsDate/index.vue b/src/packages/components/Informations/Inputs/InputsDate/index.vue index 506d03a8..3800590f 100644 --- a/src/packages/components/Informations/Inputs/InputsDate/index.vue +++ b/src/packages/components/Informations/Inputs/InputsDate/index.vue @@ -39,9 +39,9 @@ const onChange = (v: number | number[]) => { props.chartConfig, useChartEditStore, { - [ComponentInteractParamsEnum.DATE_START]: v[0] | dayjs().valueOf(), - [ComponentInteractParamsEnum.DATE_END]: v[1] | dayjs().valueOf(), - [ComponentInteractParamsEnum.DATE_RANGE]: `${v[0]}-${v[1]}` + [ComponentInteractParamsEnum.DATE_START]: v[0] || dayjs().valueOf(), + [ComponentInteractParamsEnum.DATE_END]: v[1] || dayjs().valueOf(), + [ComponentInteractParamsEnum.DATE_RANGE]: `${v[0] || dayjs().valueOf()}-${v[1] || dayjs().valueOf()}` }, InteractEventOn.CHANGE ) @@ -50,13 +50,12 @@ const onChange = (v: number | number[]) => { useChartInteract( props.chartConfig, useChartEditStore, - { [ComponentInteractParamsEnum.DATE]: v }, + { [ComponentInteractParamsEnum.DATE]: v || dayjs().valueOf() }, InteractEventOn.CHANGE ) } } -// 手动更新 watch( () => props.chartConfig.option.dataset, (newData: number | number[]) => { @@ -68,6 +67,25 @@ watch( immediate: true } ) + +// 手动更新 +watch( + () => props.chartConfig.option.differValue, + (newData: number) => { + if (props.chartConfig.option.differValue === 0) return + if (typeof option.dataset === 'object') { + option.dataset[0] = dayjs().add(newData, 'day').valueOf() + option.dataset[1] = dayjs().add(newData, 'day').valueOf() + } else { + option.dataset = dayjs().add(newData, 'day').valueOf() + } + // 关联目标组件首次请求带上默认内容 + onChange(newData) + }, + { + immediate: true + } +) </script> <style lang="scss" scoped> diff --git a/src/packages/components/Informations/Mores/Image/index.vue b/src/packages/components/Informations/Mores/Image/index.vue index fc3b98f4..db15b561 100644 --- a/src/packages/components/Informations/Mores/Image/index.vue +++ b/src/packages/components/Informations/Mores/Image/index.vue @@ -7,7 +7,8 @@ :fallback-src="requireErrorImg()" :width="w" :height="h" - ></n-image> + lazy + /> </div> </template> diff --git a/src/packages/components/Photos/Private/index.ts b/src/packages/components/Photos/Private/index.ts new file mode 100644 index 00000000..a975a41e --- /dev/null +++ b/src/packages/components/Photos/Private/index.ts @@ -0,0 +1,91 @@ +import { ChartFrameEnum, ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ImageConfig } from '@/packages/components/Informations/Mores/Image/index' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../index.d' +import { setLocalStorage, getLocalStorage, goDialog } from '@/utils' +import { StorageEnum } from '@/enums/storageEnum' +import { FileTypeEnum } from '@/enums/fileTypeEnum' +import { backgroundImageSize } from '@/settings/designSetting' +import { usePackagesStore } from '@/store/modules/packagesStore/packagesStore' + +const StoreKey = StorageEnum.GO_USER_MEDIA_PHOTOS + +/** + * 上传完成事件类型 + */ +type UploadCompletedEventType = { + fileName: string + url: string +} + +const userPhotosList: ConfigType[] = getLocalStorage(StoreKey) || [] + +const uploadFile = (callback: Function | null = null) => { + const input = document.createElement('input') + input.type = 'file' + input.accept = '.png,.jpg,.jpeg,.gif' // 这里只允许部分图片类型 + input.onchange = async () => { + if (!input.files || !input.files.length) return + const file = input.files[0] + const { name, size, type } = file + if (size > 1024 * 1024 * backgroundImageSize) { + window['$message'].warning(`图片超出 ${backgroundImageSize}M 限制,请重新上传!`) + return false + } + if (type !== FileTypeEnum.PNG && type !== FileTypeEnum.JPEG && type !== FileTypeEnum.GIF) { + window['$message'].warning('文件格式不符合,请重新上传!') + return false + } + const reader = new FileReader() + reader.onload = () => { + const eventObj: UploadCompletedEventType = { fileName: name, url: reader.result as string } + callback && callback(eventObj) + } + reader.readAsDataURL(file) + } + input.click() +} + +const addConfig = { + ...ImageConfig, + category: ChatCategoryEnum.PRIVATE, + categoryName: ChatCategoryEnumName.PRIVATE, + package: PackagesCategoryEnum.PHOTOS, + chartFrame: ChartFrameEnum.STATIC, + title: '点击上传图片', + image: 'upload.png', + redirectComponent: `${ImageConfig.package}/${ImageConfig.category}/${ImageConfig.key}`, // 跳转组件路径规则:packageName/categoryName/componentKey + disabled: true, + configEvents: { + // 点击上传事件 + addHandle: (photoConfig: ConfigType) => { + goDialog({ + message: `图片需小于 ${backgroundImageSize}M 且只暂存在浏览器中。当前图片暂存上限5M,超过不再缓存新图片,请自行对接后端接口!现编译成 base64 进行渲染,对接后端后请使用【URL地址】进行交互!`, + transformOrigin: 'center', + onPositiveCallback: () => { + uploadFile((e: UploadCompletedEventType) => { + // 和上传组件一样配置,更换标题,图片,预设数据 + const packagesStore = usePackagesStore() + const newPhoto = { + ...ImageConfig, + category: ChatCategoryEnum.PRIVATE, + categoryName: ChatCategoryEnumName.PRIVATE, + package: PackagesCategoryEnum.PHOTOS, + chartFrame: ChartFrameEnum.STATIC, + title: e.fileName, + image: e.url, + dataset: e.url, + redirectComponent: `${ImageConfig.package}/${ImageConfig.category}/${ImageConfig.key}` // 跳转组件路径规则:packageName/categoryName/componentKey + } + userPhotosList.unshift(newPhoto) + // 存储在本地数据中 + setLocalStorage(StoreKey, userPhotosList) + // 插入到上传按钮前的位置 + packagesStore.addPhotos(newPhoto, 1) + }) + } + }) + } + } +} + +export default [addConfig, ...userPhotosList] diff --git a/src/packages/components/Photos/Share/index.ts b/src/packages/components/Photos/Share/index.ts new file mode 100644 index 00000000..a2735f6c --- /dev/null +++ b/src/packages/components/Photos/Share/index.ts @@ -0,0 +1,23 @@ +import { ChartFrameEnum, PackagesCategoryEnum } from '@/packages/index.d' +import { ImageConfig } from '@/packages/components/Informations/Mores/Image/index' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../index.d' + +// 远程共享库(调接口获取图像列表) +const imageList = [ + { imageName: 'carousel1', imageUrl: 'https://naive-ui.oss-cn-beijing.aliyuncs.com/carousel-img/carousel1.jpeg' }, + { imageName: 'carousel2', imageUrl: 'https://naive-ui.oss-cn-beijing.aliyuncs.com/carousel-img/carousel2.jpeg' } +] + +const photoConfigList = imageList.map(i => ({ + ...ImageConfig, + category: ChatCategoryEnum.SHARE, + categoryName: ChatCategoryEnumName.SHARE, + package: PackagesCategoryEnum.PHOTOS, + chartFrame: ChartFrameEnum.STATIC, + image: i.imageUrl, + dataset: i.imageUrl, + title: i.imageName, + redirectComponent: `${ImageConfig.package}/${ImageConfig.category}/${ImageConfig.key}` // 跳转组件路径规则:packageName/categoryName/componentKey +})) + +export default photoConfigList diff --git a/src/packages/components/Photos/index.d.ts b/src/packages/components/Photos/index.d.ts new file mode 100644 index 00000000..011ec15c --- /dev/null +++ b/src/packages/components/Photos/index.d.ts @@ -0,0 +1,9 @@ +export enum ChatCategoryEnum { + PRIVATE = 'Private', + SHARE = 'Share' +} + +export enum ChatCategoryEnumName { + PRIVATE = '私有图', + SHARE = '共享图' +} diff --git a/src/packages/components/Photos/index.ts b/src/packages/components/Photos/index.ts new file mode 100644 index 00000000..1bc6f703 --- /dev/null +++ b/src/packages/components/Photos/index.ts @@ -0,0 +1,4 @@ +import Private from './Private' +import Share from './Share' + +export const PhotoList = [...Private, ...Share] diff --git a/src/packages/index.d.ts b/src/packages/index.d.ts index f37f7d99..3be43105 100644 --- a/src/packages/index.d.ts +++ b/src/packages/index.d.ts @@ -15,15 +15,34 @@ export enum ChartFrameEnum { // 组件配置 export type ConfigType = { + // 组件 key key: string + // 画布组件 key chartKey: string + // 右侧设置面板组件 key conKey: string + // 标题 title: string + // 分类 category: string + // 分类名称 categoryName: string + // 所属包 package: string + // 归类 chartFrame?: ChartFrameEnum + // 预览图 image: string + // 从指定路径创建创建该组件 + redirectComponent?: string + // 组件预设的 dataset 值(图片/图标) + dataset?: any + // 禁用 拖拽或双击生成组件 + disabled?: boolean + // 图标 + icon?: string + // 事件 + configEvents?: { [T: string]: Function } } // 数据请求 @@ -120,7 +139,7 @@ export interface PublicConfigType { } filter?: string status: StatusType - interactActions?: InteractActionsType[], + interactActions?: InteractActionsType[] events: { baseEvent: { [K in BaseEvent]?: string @@ -140,6 +159,7 @@ export interface CreateComponentType extends PublicConfigType, requestConfig { key: string chartConfig: ConfigType option: GlobalThemeJsonType + groupList?: Array<CreateComponentType> } // 组件成组实例类 @@ -155,6 +175,8 @@ export enum PackagesCategoryEnum { CHARTS = 'Charts', TABLES = 'Tables', INFORMATIONS = 'Informations', + PHOTOS = 'Photos', + ICONS = 'Icons', DECORATES = 'Decorates' } @@ -163,6 +185,8 @@ export enum PackagesCategoryName { CHARTS = '图表', TABLES = '列表', INFORMATIONS = '信息', + PHOTOS = '图片', + ICONS = '图标', DECORATES = '小组件' } @@ -177,5 +201,7 @@ export type PackagesType = { [PackagesCategoryEnum.CHARTS]: ConfigType[] [PackagesCategoryEnum.INFORMATIONS]: ConfigType[] [PackagesCategoryEnum.TABLES]: ConfigType[] + [PackagesCategoryEnum.PHOTOS]: ConfigType[] + [PackagesCategoryEnum.ICONS]: ConfigType[] [PackagesCategoryEnum.DECORATES]: ConfigType[] } diff --git a/src/packages/index.ts b/src/packages/index.ts index 131fad80..20bc8535 100644 --- a/src/packages/index.ts +++ b/src/packages/index.ts @@ -1,87 +1,99 @@ -import { ChartList } from '@/packages/components/Charts/index' -import { DecorateList } from '@/packages/components/Decorates/index' -import { InformationList } from '@/packages/components/Informations/index' -import { TableList } from '@/packages/components/Tables/index' -import { PackagesCategoryEnum, PackagesType, ConfigType, FetchComFlagType } from '@/packages/index.d' - -const configModules: Record<string, { default: string }> = import.meta.glob('./components/**/config.vue', { - eager: true -}) -const indexModules: Record<string, { default: string }> = import.meta.glob('./components/**/index.vue', { - eager: true -}) -const imagesModules: Record<string, { default: string }> = import.meta.glob('../assets/images/chart/**', { - eager: true -}) - -// * 所有图表 -export let packagesList: PackagesType = { - [PackagesCategoryEnum.CHARTS]: ChartList, - [PackagesCategoryEnum.INFORMATIONS]: InformationList, - [PackagesCategoryEnum.TABLES]: TableList, - [PackagesCategoryEnum.DECORATES]: DecorateList -} - -/** - * * 获取目标组件配置信息 - * @param targetData - */ -export const createComponent = async (targetData: ConfigType) => { - const { category, key } = targetData - const chart = await import(`./components/${targetData.package}/${category}/${key}/config.ts`) - return new chart.default() -} - -/** - * * 获取组件 - * @param {string} chartName 名称 - * @param {FetchComFlagType} flag 标识 0为展示组件, 1为配置组件 - */ -const fetchComponent = (chartName: string, flag: FetchComFlagType) => { - const module = flag === FetchComFlagType.VIEW ? indexModules : configModules - for (const key in module) { - const urlSplit = key.split('/') - if (urlSplit[urlSplit.length - 2] === chartName) { - return module[key] - } - } -} - -/** - * * 获取展示组件 - * @param {ConfigType} dropData 配置项 - */ -export const fetchChartComponent = (dropData: ConfigType) => { - const { key } = dropData - return fetchComponent(key, FetchComFlagType.VIEW)?.default -} - -/** - * * 获取配置组件 - * @param {ConfigType} dropData 配置项 - */ -export const fetchConfigComponent = (dropData: ConfigType) => { - const { key } = dropData - return fetchComponent(key, FetchComFlagType.CONFIG)?.default -} - -/** - * * 获取图片内容 - * @param {ConfigType} targetData 配置项 - */ -export const fetchImages = async (targetData?: ConfigType) => { - if (!targetData) return '' - // 新数据动态处理 - const { image, package: targetDataPackage } = targetData - // 兼容旧数据 - if (image.includes('@') || image.includes('base64')) return image - - const imageName = image.substring(image.lastIndexOf('/') + 1) - for (const key in imagesModules) { - const urlSplit = key.split('/') - if (urlSplit[urlSplit.length - 1] === imageName) { - return imagesModules[key]?.default - } - } - return '' -} +import { ChartList } from '@/packages/components/Charts/index' +import { DecorateList } from '@/packages/components/Decorates/index' +import { InformationList } from '@/packages/components/Informations/index' +import { TableList } from '@/packages/components/Tables/index' +import { PhotoList } from '@/packages/components/Photos/index' +import { IconList } from '@/packages/components/Icons/index' +import { PackagesCategoryEnum, PackagesType, ConfigType, FetchComFlagType } from '@/packages/index.d' + +const configModules: Record<string, { default: string }> = import.meta.glob('./components/**/config.vue', { + eager: true +}) +const indexModules: Record<string, { default: string }> = import.meta.glob('./components/**/index.vue', { + eager: true +}) +const imagesModules: Record<string, { default: string }> = import.meta.glob('../assets/images/chart/**', { + eager: true +}) + +// * 所有图表 +export let packagesList: PackagesType = { + [PackagesCategoryEnum.CHARTS]: ChartList, + [PackagesCategoryEnum.INFORMATIONS]: InformationList, + [PackagesCategoryEnum.TABLES]: TableList, + [PackagesCategoryEnum.DECORATES]: DecorateList, + [PackagesCategoryEnum.PHOTOS]: PhotoList, + [PackagesCategoryEnum.ICONS]: IconList +} + +/** + * * 获取目标组件配置信息 + * @param targetData + */ +export const createComponent = async (targetData: ConfigType) => { + const { redirectComponent, category, key } = targetData + // redirectComponent 是给图片组件库和图标组件库使用的 + if (redirectComponent) { + const [packageName, categoryName, keyName] = redirectComponent.split('/') + const redirectChart = await import(`./components/${packageName}/${categoryName}/${keyName}/config.ts`) + return new redirectChart.default() + } + const chart = await import(`./components/${targetData.package}/${category}/${key}/config.ts`) + return new chart.default() +} + +/** + * * 获取组件 + * @param {string} chartName 名称 + * @param {FetchComFlagType} flag 标识 0为展示组件, 1为配置组件 + */ +const fetchComponent = (chartName: string, flag: FetchComFlagType) => { + const module = flag === FetchComFlagType.VIEW ? indexModules : configModules + for (const key in module) { + const urlSplit = key.split('/') + if (urlSplit[urlSplit.length - 2] === chartName) { + return module[key] + } + } +} + +/** + * * 获取展示组件 + * @param {ConfigType} dropData 配置项 + */ +export const fetchChartComponent = (dropData: ConfigType) => { + const { key } = dropData + return fetchComponent(key, FetchComFlagType.VIEW)?.default +} + +/** + * * 获取配置组件 + * @param {ConfigType} dropData 配置项 + */ +export const fetchConfigComponent = (dropData: ConfigType) => { + const { key } = dropData + return fetchComponent(key, FetchComFlagType.CONFIG)?.default +} + +/** + * * 获取图片内容 + * @param {ConfigType} targetData 配置项 + */ +export const fetchImages = async (targetData?: ConfigType) => { + if (!targetData) return '' + // 正则判断图片是否为 url,是则直接返回该 url + if (/^(http|https):\/\/([\w.]+\/?)\S*/.test(targetData.image)) return targetData.image + // 新数据动态处理 + const { image, package: targetDataPackage } = targetData + // 兼容旧数据 + if (image.includes('@') || image.includes('base64')) return image + + const imageName = image.substring(image.lastIndexOf('/') + 1) + for (const key in imagesModules) { + const urlSplit = key.split('/') + if (urlSplit[urlSplit.length - 1] === imageName) { + return imagesModules[key]?.default + } + } + return '' +} diff --git a/src/plugins/icon.ts b/src/plugins/icon.ts index e8979e07..22a149c8 100644 --- a/src/plugins/icon.ts +++ b/src/plugins/icon.ts @@ -61,13 +61,14 @@ import { Pulse as PulseIcon, Folder as FolderIcon, FolderOpen as FolderOpenIcon, - Image as ImageIcon, + ImageOutline as ImageIcon, Images as ImagesIcon, List as ListIcon, EyeOutline as EyeOutlineIcon, EyeOffOutline as EyeOffOutlineIcon, Albums as AlbumsIcon, - Analytics as AnalyticsIcon + Analytics as AnalyticsIcon, + AirplaneOutline as AirPlaneOutlineIcon } from '@vicons/ionicons5' import { @@ -238,10 +239,12 @@ const ionicons5 = { // 眼睛 EyeOutlineIcon, EyeOffOutlineIcon, - // 图表列表 + // 图表列表 AlbumsIcon, // 分析 - AnalyticsIcon + AnalyticsIcon, + // 飞机 + AirPlaneOutlineIcon } const carbon = { diff --git a/src/settings/chartThemes/global.theme.json b/src/settings/chartThemes/global.theme.json index 1c099af8..0fd24712 100644 --- a/src/settings/chartThemes/global.theme.json +++ b/src/settings/chartThemes/global.theme.json @@ -86,8 +86,18 @@ }, "legend": { "show": true, - "top": "5%", + "type": "scroll", + "x": "center", + "y": "top", + "icon": "circle", + "orient": "horizontal", "textStyle": { + "color": "#B9B8CE", + "fontSize": 18 + }, + "itemHeight": 15, + "itemWidth": 15, + "pageTextStyle": { "color": "#B9B8CE" } }, diff --git a/src/settings/designColor.json b/src/settings/designColor.json index 77ddf15d..e9ae55bf 100644 --- a/src/settings/designColor.json +++ b/src/settings/designColor.json @@ -2212,9 +2212,9 @@ "pinyin": "tengluozi" }, { - "CMYK": [57, 62, 16, 2], - "RGB": [128, 109, 158], - "hex": "#806d9e", + "CMYK": [34, 39, 0, 24], + "RGB": [128, 118, 195], + "hex": "#8076c3", "name": "槿紫", "pinyin": "jinzi" }, diff --git a/src/store/modules/packagesStore/packagesStore.d.ts b/src/store/modules/packagesStore/packagesStore.d.ts index 3dcbf547..fd1baea2 100644 --- a/src/store/modules/packagesStore/packagesStore.d.ts +++ b/src/store/modules/packagesStore/packagesStore.d.ts @@ -1,8 +1,9 @@ -import { PackagesType, ConfigType } from '@/packages/index.d' - -export { ConfigType } - -export { PackagesType } -export interface PackagesStoreType { - packagesList: PackagesType -} +import { PackagesType, ConfigType } from '@/packages/index.d' + +export { ConfigType } + +export { PackagesType } +export interface PackagesStoreType { + packagesList: PackagesType, + newPhoto?: ConfigType +} diff --git a/src/store/modules/packagesStore/packagesStore.ts b/src/store/modules/packagesStore/packagesStore.ts index 0e7254db..f765ae71 100644 --- a/src/store/modules/packagesStore/packagesStore.ts +++ b/src/store/modules/packagesStore/packagesStore.ts @@ -1,16 +1,32 @@ -import { defineStore } from 'pinia' -import { PackagesStoreType, PackagesType } from './packagesStore.d' -import { packagesList } from '@/packages/index' - -// 组件 pakages -export const usePackagesStore = defineStore({ - id: 'usePackagesStore', - state: (): PackagesStoreType => ({ - packagesList: Object.freeze(packagesList) - }), - getters: { - getPackagesList(): PackagesType { - return this.packagesList - } - } -}) +import { defineStore } from 'pinia' +import { ConfigType, PackagesStoreType, PackagesType } from './packagesStore.d' +import { packagesList } from '@/packages/index' +import { StorageEnum } from '@/enums/storageEnum' +import { getLocalStorage, setLocalStorage } from '@/utils' + +// 组件 packages +export const usePackagesStore = defineStore({ + id: 'usePackagesStore', + state: (): PackagesStoreType => ({ + packagesList: Object.freeze(packagesList), + newPhoto: undefined + }), + getters: { + getPackagesList(): PackagesType { + return this.packagesList + } + }, + actions: { + addPhotos(newPhoto: ConfigType, index: number) { + this.newPhoto = newPhoto + this.packagesList.Photos.splice(index, 0, newPhoto) + }, + deletePhotos(photoInfo: ConfigType, index: number) { + this.packagesList.Photos.splice(index, 1) + const StoreKey = StorageEnum.GO_USER_MEDIA_PHOTOS + const userPhotosList = getLocalStorage(StoreKey) + userPhotosList.splice(index - 1, 1) + setLocalStorage(StoreKey, userPhotosList) + } + } +}) diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 9d0302ba..70a68cb3 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -314,6 +314,11 @@ export const JSONStringify = <T>(data: T) => { ) } +export const evalFn = (fn: string) => { + var Fun = Function // 一个变量指向Function,防止前端编译工具报错 + return new Fun('return ' + fn)() +} + /** * * JSON反序列化,支持函数和 undefined * @param data @@ -329,12 +334,12 @@ export const JSONParse = (data: string) => { } // 还原函数值 if (typeof v === 'string' && v.indexOf && (v.indexOf('function') > -1 || v.indexOf('=>') > -1)) { - return eval(`(function(){return ${v}})()`) + return evalFn(`(function(){return ${v}})()`) } else if (typeof v === 'string' && v.indexOf && v.indexOf('return ') > -1) { const baseLeftIndex = v.indexOf('(') if (baseLeftIndex > -1) { const newFn = `function ${v.substring(baseLeftIndex)}` - return eval(`(function(){return ${newFn}})()`) + return evalFn(`(function(){return ${newFn}})()`) } } return v diff --git a/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue b/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue index 7ca3b1b0..a4179686 100644 --- a/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue +++ b/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue @@ -9,11 +9,12 @@ <div class="item-box" v-for="(item, index) in menuOptions" - :key="index" + :key="item.title" draggable - @dragstart="dragStartHandle($event, item)" - @dragend="dragendHandle" + @dragstart="!item.disabled && dragStartHandle($event, item)" + @dragend="!item.disabled && dragendHandle" @dblclick="dblclickHandle(item)" + @click="clickHandle(item)" > <div class="list-header"> <mac-os-control-btn class="list-header-control-btn" :mini="true" :disabled="true"></mac-os-control-btn> @@ -21,14 +22,28 @@ <n-ellipsis>{{ item.title }}</n-ellipsis> </n-text> </div> - <div class="list-center go-flex-center go-transition"> - <chart-glob-image class="list-img" :chartConfig="item"></chart-glob-image> + <div class="list-center go-flex-center go-transition" draggable="true"> + <Icon v-if="item.icon" class="list-img" :icon="item.icon" color="#999" width="48" /> + <chart-glob-image v-else class="list-img" :chartConfig="item" /> </div> <div class="list-bottom"> <n-text class="list-bottom-text" depth="3"> <n-ellipsis style="max-width: 90%">{{ item.title }}</n-ellipsis> </n-text> </div> + <!-- 遮罩 --> + <div v-if="item.disabled" class="list-model"></div> + <!-- 工具栏 --> + <div v-if="isShowTools(item)" class="list-tools go-transition" @click="deleteHandle(item, index)"> + <n-button text type="default" color="#ffffff"> + <template #icon> + <n-icon> + <TrashIcon /> + </n-icon> + </template> + <span>删除</span> + </n-button> + </div> </div> </div> </div> @@ -42,17 +57,23 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d' import { ChartModeEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore' -import { componentInstall, loadingStart, loadingFinish, loadingError, JSONStringify } from '@/utils' +import { usePackagesStore } from '@/store/modules/packagesStore/packagesStore' +import { componentInstall, loadingStart, loadingFinish, loadingError, JSONStringify, goDialog } from '@/utils' import { DragKeyEnum } from '@/enums/editPageEnum' import { createComponent } from '@/packages' -import { ConfigType, CreateComponentType } from '@/packages/index.d' +import { ConfigType, CreateComponentType, PackagesCategoryEnum } from '@/packages/index.d' +import { ChatCategoryEnum } from '@/packages/components/Photos/index.d' import { fetchConfigComponent, fetchChartComponent } from '@/packages/index' +import { Icon } from '@iconify/vue' +import { icon } from '@/plugins' import omit from 'lodash/omit' const chartEditStore = useChartEditStore() +const { TrashIcon } = icon.ionicons5 -defineProps({ +const emit = defineEmits(['deletePhoto']) +const props = defineProps({ menuOptions: { type: Array as PropType<ConfigType[]>, default: () => [] @@ -62,6 +83,11 @@ defineProps({ const chartLayoutStore = useChartLayoutStore() const contentChartsItemBoxRef = ref() +// 判断工具栏展示 +const isShowTools = (item: ConfigType) => { + return !item.disabled && item.package === PackagesCategoryEnum.PHOTOS && item.category === ChatCategoryEnum.PRIVATE +} + // 组件展示状态 const chartMode: Ref<ChartModeEnum> = computed(() => { return chartLayoutStore.getChartType @@ -69,6 +95,7 @@ const chartMode: Ref<ChartModeEnum> = computed(() => { // 拖拽处理 const dragStartHandle = (e: DragEvent, item: ConfigType) => { + if (item.disabled) return // 动态注册图表组件 componentInstall(item.chartKey, fetchChartComponent(item)) componentInstall(item.conKey, fetchConfigComponent(item)) @@ -85,6 +112,7 @@ const dragendHandle = () => { // 双击添加 const dblclickHandle = async (item: ConfigType) => { + if (item.disabled) return try { loadingStart() // 动态注册图表组件 @@ -92,6 +120,11 @@ const dblclickHandle = async (item: ConfigType) => { componentInstall(item.conKey, fetchConfigComponent(item)) // 创建新图表组件 let newComponent: CreateComponentType = await createComponent(item) + if (item.redirectComponent) { + item.dataset && (newComponent.option.dataset = item.dataset) + newComponent.chartConfig.title = item.title + newComponent.chartConfig.chartFrame = item.chartFrame + } // 添加 chartEditStore.addComponentList(newComponent, false, true) // 选中 @@ -103,6 +136,23 @@ const dblclickHandle = async (item: ConfigType) => { } } +// 单击事件 +const clickHandle = (item: ConfigType) => { + item?.configEvents?.addHandle(item) +} + +const deleteHandle = (item: ConfigType, index: number) => { + goDialog({ + message: '是否删除此图片?', + transformOrigin: 'center', + onPositiveCallback: () => { + const packagesStore = usePackagesStore() + emit('deletePhoto', item, index) + packagesStore.deletePhotos(item, index) + } + }) +} + watch( () => chartMode.value, (newValue: ChartModeEnum) => { @@ -135,6 +185,7 @@ $halfCenterHeight: 50px; gap: 9px; transition: all 0.7s linear; .item-box { + position: relative; margin: 0; width: $itemWidth; overflow: hidden; @@ -145,7 +196,10 @@ $halfCenterHeight: 50px; &:hover { @include hover-border-color('background-color4'); .list-img { - transform: scale(1.1); + transform: scale(1.08); + } + .list-tools { + opacity: 1; } } .list-header { @@ -157,6 +211,7 @@ $halfCenterHeight: 50px; &-text { font-size: 12px; margin-left: 8px; + user-select: none; } } .list-center { @@ -165,7 +220,7 @@ $halfCenterHeight: 50px; overflow: hidden; .list-img { height: 100px; - width: 140px; + max-width: 140px; border-radius: 6px; @extend .go-transition; } @@ -177,6 +232,33 @@ $halfCenterHeight: 50px; padding-left: 5px; } } + .list-model { + z-index: 1; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0); + } + .list-tools { + position: absolute; + display: flex; + justify-content: center; + align-items: center; + bottom: 0; + left: 0; + margin: 0 4px 2px; + height: 26px; + width: calc(100% - 8px); + opacity: 0; + border-radius: 6px; + backdrop-filter: blur(20px); + background-color: rgba(255, 255, 255, 0.15); + &:hover { + background-color: rgba(232, 128, 128, 0.7); + } + } } &.single { .item-box { @@ -196,6 +278,9 @@ $halfCenterHeight: 50px; .item-box { width: $halfItemWidth; max-width: $maxItemWidth; + .list-img { + max-width: 76px; + } } .list-center { height: $halfCenterHeight; diff --git a/src/views/chart/ContentCharts/components/ChartsOptionContent/index.vue b/src/views/chart/ContentCharts/components/ChartsOptionContent/index.vue index 4b887f27..72e0a379 100644 --- a/src/views/chart/ContentCharts/components/ChartsOptionContent/index.vue +++ b/src/views/chart/ContentCharts/components/ChartsOptionContent/index.vue @@ -11,8 +11,8 @@ @update:value="clickItemHandle" ></n-menu> <div class="chart-content-list"> - <n-scrollbar> - <charts-item-box :menuOptions="packages.selectOptions"></charts-item-box> + <n-scrollbar trigger="none"> + <charts-item-box :menuOptions="packages.selectOptions" @deletePhoto="deleteHandle"></charts-item-box> </n-scrollbar> </div> </div> @@ -23,8 +23,11 @@ import { ref, watch, computed, reactive } from 'vue' import { ConfigType } from '@/packages/index.d' import { useSettingStore } from '@/store/modules/settingStore/settingStore' import { loadAsyncComponent } from '@/utils' +import { usePackagesStore } from '@/store/modules/packagesStore/packagesStore' +import { PackagesCategoryEnum } from '@/packages/index.d' const ChartsItemBox = loadAsyncComponent(() => import('../ChartsItemBox/index.vue')) +const packagesStore = usePackagesStore() const props = defineProps({ selectOptions: { @@ -61,7 +64,7 @@ let packages = reactive<{ saveSelectOptions: {} }) -const selectValue = ref<string>() +const selectValue = ref<string>('all') // 设置初始列表 const setSelectOptions = (categorys: any) => { @@ -79,7 +82,6 @@ watch( if (!newData) return newData.list.forEach((e: ConfigType) => { const value: ConfigType[] = (packages.categorys as any)[e.category] - // @ts-ignore packages.categorys[e.category] = value && value.length ? [...value, e] : [e] packages.categoryNames[e.category] = e.categoryName packages.categorys['all'].push(e) @@ -100,6 +102,22 @@ watch( } ) +watch( + () => packagesStore.newPhoto, + newPhoto => { + if (!newPhoto) return + const newPhotoCategory = newPhoto.category + packages.categorys[newPhotoCategory].splice(1, 0, newPhoto) + packages.categorys['all'].splice(1, 0, newPhoto) + } +) + +// 删除图片 +const deleteHandle = (item: ConfigType, index: number) => { + packages.categorys[item.category].splice(index, 1) + packages.categorys['all'].splice(index, 1) +} + // 处理点击事件 const clickItemHandle = (key: string) => { packages.selectOptions = packages.categorys[key] @@ -119,6 +137,7 @@ $menuWidth: 65px; @include fetch-bg-color('background-color2-shallow'); } .chart-content-list { + width: 200px; flex: 1; display: flex; flex-direction: column; diff --git a/src/views/chart/ContentCharts/components/ChartsSearch/index.vue b/src/views/chart/ContentCharts/components/ChartsSearch/index.vue index f1a25ddd..f90536a8 100644 --- a/src/views/chart/ContentCharts/components/ChartsSearch/index.vue +++ b/src/views/chart/ContentCharts/components/ChartsSearch/index.vue @@ -37,7 +37,8 @@ :title="item.title" @click="selectChartHandle(item)" > - <chart-glob-image class="list-item-img" :chartConfig="item"></chart-glob-image> + <Icon v-if="item.icon" class="list-img" :icon="item.icon" color="#999" width="20" /> + <chart-glob-image v-else class="list-item-img" :chartConfig="item" /> <n-text class="list-item-fs" depth="2">{{ item.title }}</n-text> </div> </n-scrollbar> @@ -70,7 +71,7 @@ import { ref, onUnmounted } from 'vue' import { icon } from '@/plugins' import { createComponent } from '@/packages' import { ConfigType, CreateComponentType } from '@/packages/index.d' -import { themeColor, MenuOptionsType } from '../../hooks/useAside.hook' +import { themeColor } from '../../hooks/useLayout.hook' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { ChartModeEnum, ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore' @@ -78,6 +79,7 @@ import { isString, addEventListener, removeEventListener } from '@/utils' import { fetchConfigComponent, fetchChartComponent } from '@/packages/index' import { componentInstall, loadingStart, loadingFinish, loadingError } from '@/utils' import { ChartGlobImage } from '@/components/Pages/ChartGlobImage' +import { Icon } from '@iconify/vue' const props = defineProps({ menuOptions: { @@ -129,7 +131,9 @@ const searchHandle = (key: string | null) => { } loading.value = true showPopover.value = true - searchRes.value = List.filter((e: ConfigType) => !key || e.title.toLowerCase().includes(key.toLowerCase())) + searchRes.value = List.filter( + (e: ConfigType) => !e.disabled && (!key || e.title.toLowerCase().includes(key.toLowerCase())) + ) setTimeout(() => { loading.value = undefined }, 500) @@ -146,6 +150,7 @@ const listenerCloseHandle = (e: Event) => { // 选择处理 const selectChartHandle = async (item: ConfigType) => { + if (item.disabled) return try { loadingStart() // 动态注册图表组件 @@ -153,6 +158,11 @@ const selectChartHandle = async (item: ConfigType) => { componentInstall(item.conKey, fetchConfigComponent(item)) // 创建新图表组件 let newComponent: CreateComponentType = await createComponent(item) + if (item.redirectComponent) { + item.dataset && (newComponent.option.dataset = item.dataset) + newComponent.chartConfig.title = item.title + newComponent.chartConfig.chartFrame = item.chartFrame + } // 添加 chartEditStore.addComponentList(newComponent, false, true) // 选中 @@ -221,10 +231,16 @@ $searchWidth: 176px; font-size: 12px; } &-img { - height: 28px; + height: 20px; + max-width: 30px; margin-right: 5px; border-radius: 5px; } + & > svg { + min-width: 20px; + min-height: 20px; + margin-right: 5px; + } &:hover { &::before { content: ''; diff --git a/src/views/chart/ContentCharts/hooks/useAside.hook.ts b/src/views/chart/ContentCharts/hooks/useAside.hook.ts index 45c7c609..539087ec 100644 --- a/src/views/chart/ContentCharts/hooks/useAside.hook.ts +++ b/src/views/chart/ContentCharts/hooks/useAside.hook.ts @@ -1,92 +1,95 @@ -import { shallowReactive, ref } from 'vue' -import { icon } from '@/plugins' -import { renderLang, renderIcon } from '@/utils' -import { themeColor, setItem, getCharts } from './useLayout.hook' -import { PackagesCategoryEnum, PackagesCategoryName, PackagesType } from '@/packages/index.d' -// 图表 -import { usePackagesStore } from '@/store/modules/packagesStore/packagesStore' -import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' -// 图标 -const { BarChartIcon } = icon.ionicons5 -const { - TableSplitIcon, - RoadmapIcon, - SpellCheckIcon, - GraphicalDataFlowIcon, -} = icon.carbon - - -// 图表 -export type MenuOptionsType = { - key: string - icon: ReturnType<typeof renderIcon> - label: ReturnType<typeof renderLang> - list: PackagesType -} - -const { getPackagesList } = usePackagesStore() -const menuOptions: MenuOptionsType[] = [] - -const packagesListObj = { - [PackagesCategoryEnum.CHARTS]: { - icon: renderIcon(RoadmapIcon), - label: PackagesCategoryName.CHARTS, - }, - [PackagesCategoryEnum.INFORMATIONS]: { - icon: renderIcon(SpellCheckIcon), - label: PackagesCategoryName.INFORMATIONS, - }, - [PackagesCategoryEnum.TABLES]: { - icon: renderIcon(TableSplitIcon), - label: PackagesCategoryName.TABLES, - }, - [PackagesCategoryEnum.DECORATES]: { - icon: renderIcon(GraphicalDataFlowIcon), - label: PackagesCategoryName.DECORATES, - }, -} - -// 处理列表 -const handlePackagesList = () => { - for (const val in getPackagesList) { - menuOptions.push({ - key: val, - // @ts-ignore - icon: packagesListObj[val].icon, - // @ts-ignore - label: packagesListObj[val].label, - // @ts-ignore - list: getPackagesList[val], - }) - } -} -handlePackagesList() - -// 记录选中值 -let beforeSelect: string = menuOptions[0]['key'] -const selectValue = ref<string>(menuOptions[0]['key']) - -// 选中的对象值 -const selectOptions = ref(menuOptions[0]) - -// 点击 item -const clickItemHandle = (key: string, item: any) => { - selectOptions.value = item - // 处理折叠 - if (beforeSelect === key) { - setItem(ChartLayoutStoreEnum.CHARTS, !getCharts.value, false) - } else { - setItem(ChartLayoutStoreEnum.CHARTS, true, false) - } - beforeSelect = key -} - -export { - getCharts, - BarChartIcon, - themeColor, - selectOptions, - selectValue, - clickItemHandle, - menuOptions, -} +import { ref, watch, computed } from 'vue' +import { icon } from '@/plugins' +import { renderLang, renderIcon } from '@/utils' +import { themeColor, setItem, getCharts } from './useLayout.hook' +import { PackagesCategoryEnum, PackagesCategoryName, ConfigType } from '@/packages/index.d' +import { usePackagesStore } from '@/store/modules/packagesStore/packagesStore' +import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' +// 图标 +const { AirPlaneOutlineIcon, ImageIcon, BarChartIcon } = icon.ionicons5 +const { TableSplitIcon, RoadmapIcon, SpellCheckIcon, GraphicalDataFlowIcon } = icon.carbon + +// 图表 +export type MenuOptionsType = { + key: string + icon: ReturnType<typeof renderIcon> + label: ReturnType<typeof renderLang> + list: ConfigType[] +} + +const packagesListObj = { + [PackagesCategoryEnum.CHARTS]: { + icon: renderIcon(RoadmapIcon), + label: PackagesCategoryName.CHARTS + }, + [PackagesCategoryEnum.INFORMATIONS]: { + icon: renderIcon(SpellCheckIcon), + label: PackagesCategoryName.INFORMATIONS + }, + [PackagesCategoryEnum.TABLES]: { + icon: renderIcon(TableSplitIcon), + label: PackagesCategoryName.TABLES + }, + [PackagesCategoryEnum.DECORATES]: { + icon: renderIcon(GraphicalDataFlowIcon), + label: PackagesCategoryName.DECORATES + }, + [PackagesCategoryEnum.PHOTOS]: { + icon: renderIcon(ImageIcon), + label: PackagesCategoryName.PHOTOS + }, + [PackagesCategoryEnum.ICONS]: { + icon: renderIcon(AirPlaneOutlineIcon), + label: PackagesCategoryName.ICONS + } +} + +export const useAsideHook = () => { + const packagesStore = usePackagesStore() + const menuOptions: MenuOptionsType[] = [] + + // 处理列表 + const handlePackagesList = () => { + for (const val in packagesStore.getPackagesList) { + menuOptions.push({ + key: val, + // @ts-ignore + icon: packagesListObj[val].icon, + // @ts-ignore + label: packagesListObj[val].label, + // @ts-ignore + list: packagesStore.getPackagesList[val] + }) + } + } + handlePackagesList() + + // 记录选中值 + let beforeSelect: string = menuOptions[0]['key'] + const selectValue = ref<string>(menuOptions[0]['key']) + + // 选中的对象值 + const selectOptions = ref(menuOptions[0]) + + // 点击 item + const clickItemHandle = (key: string, item: any) => { + selectOptions.value = item + // 处理折叠 + if (beforeSelect === key) { + setItem(ChartLayoutStoreEnum.CHARTS, !getCharts.value, false) + } else { + setItem(ChartLayoutStoreEnum.CHARTS, true, false) + } + beforeSelect = key + } + + return { + getCharts, + BarChartIcon, + themeColor, + selectOptions, + selectValue, + clickItemHandle, + menuOptions + } +} diff --git a/src/views/chart/ContentCharts/index.vue b/src/views/chart/ContentCharts/index.vue index 3f81d049..b0e4cc6f 100644 --- a/src/views/chart/ContentCharts/index.vue +++ b/src/views/chart/ContentCharts/index.vue @@ -1,123 +1,105 @@ -<template> - <!-- 左侧所有组件的展示列表 --> - <content-box - class="go-content-charts" - :class="{ scoped: !getCharts }" - title="组件" - :depth="1" - :backIcon="false" - > - <template #icon> - <n-icon size="14" :depth="2"> - <bar-chart-icon></bar-chart-icon> - </n-icon> - </template> - - <template #top-right> - <charts-search v-show="getCharts" :menuOptions="menuOptions"></charts-search> - </template> - <!-- 图表 --> - <aside> - <div class="menu-width-box"> - <n-menu - class="menu-width" - v-model:value="selectValue" - :options="menuOptions" - :icon-size="16" - :indent="18" - @update:value="clickItemHandle" - ></n-menu> - <div class="menu-component-box"> - <go-skeleton - :load="!selectOptions" - round - text - :repeat="2" - style="width: 90%" - ></go-skeleton> - <charts-option-content - v-if="selectOptions" - :selectOptions="selectOptions" - :key="selectValue" - ></charts-option-content> - </div> - </div> - </aside> - </content-box> -</template> - -<script setup lang="ts"> -import { ContentBox } from '../ContentBox/index' -import { ChartsOptionContent } from './components/ChartsOptionContent' -import { ChartsSearch } from './components/ChartsSearch' -import { - getCharts, - BarChartIcon, - themeColor, - selectOptions, - selectValue, - clickItemHandle, - menuOptions, -} from './hooks/useAside.hook' -</script> - -<style lang="scss" scoped> -/* 整体宽度 */ -$width: 330px; -/* 列表的宽度 */ -$widthScoped: 65px; -/* 此高度与 ContentBox 组件关联 */ -$topHeight: 40px; - -@include go(content-charts) { - width: $width; - @extend .go-transition; - &.scoped, - .menu-width { - width: $widthScoped; - } - .menu-width-box { - display: flex; - height: calc(100vh - #{$--header-height} - #{$topHeight}); - .menu-width { - flex-shrink: 0; - @include fetch-bg-color('background-color2'); - } - .menu-component-box { - flex-shrink: 0; - width: $width - $widthScoped; - overflow: hidden; - } - } - @include deep() { - .menu-width { - .n-menu-item { - height: auto !important; - &.n-menu-item--selected { - &::after { - content: ''; - position: absolute; - left: 2px; - top: 0; - height: 100%; - width: 3px; - background-color: v-bind('themeColor'); - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - } - } - .n-menu-item-content { - display: flex; - flex-direction: column; - padding: 6px 12px !important; - font-size: 14px !important; - } - .n-menu-item-content__icon { - font-size: 18px !important; - margin-right: 0 !important; - } - } - } - } -} -</style> +<template> + <!-- 左侧所有组件的展示列表 --> + <content-box class="go-content-charts" :class="{ scoped: !getCharts }" title="组件" :depth="1" :backIcon="false"> + <template #icon> + <n-icon size="14" :depth="2"> + <bar-chart-icon></bar-chart-icon> + </n-icon> + </template> + + <template #top-right> + <charts-search v-show="getCharts" :menuOptions="menuOptions"></charts-search> + </template> + <!-- 图表 --> + <aside> + <div class="menu-width-box"> + <n-menu + class="menu-width" + v-model:value="selectValue" + :options="menuOptions" + :icon-size="16" + :indent="18" + @update:value="clickItemHandle" + ></n-menu> + <div class="menu-component-box"> + <go-skeleton :load="!selectOptions" round text :repeat="2" style="width: 90%"></go-skeleton> + <charts-option-content + v-if="selectOptions" + :selectOptions="selectOptions" + :key="selectValue" + ></charts-option-content> + </div> + </div> + </aside> + </content-box> +</template> + +<script setup lang="ts"> +import { ContentBox } from '../ContentBox/index' +import { ChartsOptionContent } from './components/ChartsOptionContent' +import { ChartsSearch } from './components/ChartsSearch' +import { useAsideHook } from './hooks/useAside.hook' + +const { getCharts, BarChartIcon, themeColor, selectOptions, selectValue, clickItemHandle, menuOptions } = useAsideHook() +</script> + +<style lang="scss" scoped> +/* 整体宽度 */ +$width: 330px; +/* 列表的宽度 */ +$widthScoped: 65px; +/* 此高度与 ContentBox 组件关联 */ +$topHeight: 40px; + +@include go(content-charts) { + width: $width; + @extend .go-transition; + &.scoped, + .menu-width { + width: $widthScoped; + } + .menu-width-box { + display: flex; + height: calc(100vh - #{$--header-height} - #{$topHeight}); + .menu-width { + flex-shrink: 0; + @include fetch-bg-color('background-color2'); + } + .menu-component-box { + flex-shrink: 0; + width: $width - $widthScoped; + overflow: hidden; + } + } + @include deep() { + .menu-width { + .n-menu-item { + height: auto !important; + &.n-menu-item--selected { + &::after { + content: ''; + position: absolute; + left: 2px; + top: 0; + height: 100%; + width: 3px; + background-color: v-bind('themeColor'); + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + } + } + .n-menu-item-content { + display: flex; + flex-direction: column; + padding: 6px 12px !important; + font-size: 14px !important; + } + .n-menu-item-content__icon { + font-size: 18px !important; + margin-right: 0 !important; + } + } + } + } +} +</style> diff --git a/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventInteraction/index.vue b/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventInteraction/index.vue index 636414ed..b5a74bd4 100644 --- a/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventInteraction/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventInteraction/index.vue @@ -58,7 +58,7 @@ <help-outline-icon></help-outline-icon> </n-icon> </template> - <n-text>不支持「静态组件」和「分组」</n-text> + <n-text>不支持「静态组件」</n-text> </n-tooltip> </template> <n-select @@ -169,7 +169,27 @@ const fnDimensionsAndSource = (interactOn: InteractEventOn | undefined) => { // 绑定组件列表 const fnEventsOptions = (): Array<SelectOption | SelectGroupOption> => { - const filterOptionList = chartEditStore.componentList.filter(item => { + // 扁平化树形数据 + const fnFlattern = ( + data: Array<CreateComponentType | CreateComponentGroupType> + ): Array<CreateComponentType | CreateComponentGroupType> => { + return data.reduce( + ( + iter: Array<CreateComponentType | CreateComponentGroupType>, + val: CreateComponentType | CreateComponentGroupType + ) => { + if (val.groupList && val.groupList.length > 0) { + iter.push(val) + } else { + iter.push(val) + } + return val.groupList ? [...iter, ...fnFlattern(val.groupList)] : iter + }, + [] + ) + } + + const filterOptionList = fnFlattern(chartEditStore.componentList).filter(item => { // 排除自己 const isNotSelf = item.id !== targetData.value.id // 排除静态组件 diff --git a/src/views/chart/ContentEdit/hooks/useDrag.hook.ts b/src/views/chart/ContentEdit/hooks/useDrag.hook.ts index 3aae5547..2796f471 100644 --- a/src/views/chart/ContentEdit/hooks/useDrag.hook.ts +++ b/src/views/chart/ContentEdit/hooks/useDrag.hook.ts @@ -29,9 +29,15 @@ export const dragHandle = async (e: DragEvent) => { // 修改状态 chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_CREATE, false) const dropData: Exclude<ConfigType, ['image']> = JSONParse(drayDataString) + if (dropData.disabled) return // 创建新图表组件 let newComponent: CreateComponentType = await createComponent(dropData) + if (dropData.redirectComponent) { + dropData.dataset && (newComponent.option.dataset = dropData.dataset) + newComponent.chartConfig.title = dropData.title + newComponent.chartConfig.chartFrame = dropData.chartFrame + } setComponentPosition(newComponent, e.offsetX - newComponent.attr.w / 2, e.offsetY - newComponent.attr.h / 2) chartEditStore.addComponentList(newComponent, false, true) diff --git a/src/views/chart/ContentLayers/components/LayersListItem/index.vue b/src/views/chart/ContentLayers/components/LayersListItem/index.vue index d77ed451..0901e26f 100644 --- a/src/views/chart/ContentLayers/components/LayersListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersListItem/index.vue @@ -1,159 +1,159 @@ -<template> - <div class="go-content-layers-list-item" :class="{ hover, select, 'list-mini': selectText }"> - <div class="go-flex-center item-content"> - <n-image - class="list-img" - object-fit="contain" - preview-disabled - :src="imageInfo" - :fallback-src="requireErrorImg()" - ></n-image> - <n-ellipsis style="margin-right: auto"> - <span class="list-text"> - {{ props.componentData.chartConfig.title }} - </span> - </n-ellipsis> - <layers-status :isGroup="isGroup" :hover="hover" :status="status"></layers-status> - </div> - <div :class="{ 'select-modal': select }"></div> - </div> -</template> - -<script setup lang="ts"> -import { computed, PropType, ref, watch } from 'vue' -import { requireErrorImg } from '@/utils' -import { useDesignStore } from '@/store/modules/designStore/designStore' -import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' -import { LayerModeEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' -import { fetchImages } from '@/packages' -import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' -import { LayersStatus } from '../LayersStatus/index' - -const props = defineProps({ - componentData: { - type: Object as PropType<CreateComponentType | CreateComponentGroupType>, - required: true - }, - isGroup: { - type: Boolean, - default: false - }, - layerMode: { - type: String as PropType<LayerModeEnum>, - default: LayerModeEnum.THUMBNAIL - } -}) - -// 全局颜色 -const designStore = useDesignStore() -const chartEditStore = useChartEditStore() -const imageInfo = ref('') - -// 获取图片 -const fetchImageUrl = async () => { - imageInfo.value = await fetchImages(props.componentData.chartConfig) -} -fetchImageUrl() - -// 颜色 -const themeColor = computed(() => { - return designStore.getAppTheme -}) - -// 计算当前选中目标 -const select = computed(() => { - const id = props.componentData.id - return chartEditStore.getTargetChart.selectId.find((e: string) => e === id) -}) - -// 悬浮对象 -const hover = computed(() => { - return props.componentData.id === chartEditStore.getTargetChart.hoverId -}) - -// 组件状态 隐藏/锁定 -const status = computed(() => { - return props.componentData.status -}) - -// 是否选中文本 -const selectText = computed(() => { - return props.layerMode === LayerModeEnum.TEXT -}) -</script> - -<style lang="scss" scoped> -$centerHeight: 52px; -$centerMiniHeight: 28px; -$textSize: 10px; - -@include go(content-layers-list-item) { - position: relative; - height: $centerHeight; - width: 90%; - margin: 5px 5%; - margin-bottom: 5px; - border-radius: 5px; - cursor: pointer; - border: 1px solid rgba(0, 0, 0, 0); - @extend .go-transition-quick; - &.hover, - &:hover { - @include fetch-bg-color('background-color4'); - } - &:hover { - @include deep() { - .icon-item { - opacity: 1; - } - } - } - - .select-modal, - .item-content { - position: absolute; - top: 0; - left: 0; - } - .item-content { - z-index: 1; - padding: 6px 5px; - justify-content: start !important; - width: calc(100% - 10px); - height: calc(100% - 10px); - } - - .select-modal { - width: 100%; - height: 100%; - opacity: 0.3; - background-color: v-bind('themeColor'); - } - - .list-img { - flex-shrink: 0; - height: $centerHeight; - border-radius: 5px; - overflow: hidden; - border: none !important; - padding: 2px; - @include hover-border-color('hover-border-color'); - } - - .list-text { - padding-left: 6px; - font-size: $textSize; - } - - /* 选中样式 */ - &.select { - border: 1px solid v-bind('themeColor'); - background-color: rgba(0, 0, 0, 0); - } - - // mini样式 - &.list-mini { - height: $centerMiniHeight; - } -} -</style> +<template> + <div class="go-content-layers-list-item" :class="{ hover, select, 'list-mini': selectText }"> + <div class="go-flex-center item-content"> + <n-image + class="list-img" + object-fit="contain" + preview-disabled + :src="imageInfo" + :fallback-src="requireErrorImg()" + ></n-image> + <n-ellipsis style="margin-right: auto"> + <span class="list-text"> + {{ props.componentData.chartConfig.title }} + </span> + </n-ellipsis> + <layers-status :isGroup="isGroup" :hover="hover" :status="status"></layers-status> + </div> + <div :class="{ 'select-modal': select }"></div> + </div> +</template> + +<script setup lang="ts"> +import { computed, PropType, ref } from 'vue' +import { requireErrorImg } from '@/utils' +import { useDesignStore } from '@/store/modules/designStore/designStore' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { LayerModeEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' +import { fetchImages } from '@/packages' +import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' +import { LayersStatus } from '../LayersStatus/index' + +const props = defineProps({ + componentData: { + type: Object as PropType<CreateComponentType | CreateComponentGroupType>, + required: true + }, + isGroup: { + type: Boolean, + default: false + }, + layerMode: { + type: String as PropType<LayerModeEnum>, + default: LayerModeEnum.THUMBNAIL + } +}) + +// 全局颜色 +const designStore = useDesignStore() +const chartEditStore = useChartEditStore() +const imageInfo = ref('') + +// 获取图片 +const fetchImageUrl = async () => { + imageInfo.value = await fetchImages(props.componentData.chartConfig) +} +fetchImageUrl() + +// 颜色 +const themeColor = computed(() => { + return designStore.getAppTheme +}) + +// 计算当前选中目标 +const select = computed(() => { + const id = props.componentData.id + return chartEditStore.getTargetChart.selectId.find((e: string) => e === id) +}) + +// 悬浮对象 +const hover = computed(() => { + return props.componentData.id === chartEditStore.getTargetChart.hoverId +}) + +// 组件状态 隐藏/锁定 +const status = computed(() => { + return props.componentData.status +}) + +// 是否选中文本 +const selectText = computed(() => { + return props.layerMode === LayerModeEnum.TEXT +}) +</script> + +<style lang="scss" scoped> +$centerHeight: 52px; +$centerMiniHeight: 28px; +$textSize: 10px; + +@include go(content-layers-list-item) { + position: relative; + height: $centerHeight; + width: 90%; + margin: 5px 5%; + margin-bottom: 5px; + border-radius: 5px; + cursor: pointer; + border: 1px solid rgba(0, 0, 0, 0); + @extend .go-transition-quick; + &.hover, + &:hover { + @include fetch-bg-color('background-color4'); + } + &:hover { + @include deep() { + .icon-item { + opacity: 1; + } + } + } + + .select-modal, + .item-content { + position: absolute; + top: 0; + left: 0; + } + .item-content { + z-index: 1; + padding: 6px 5px; + justify-content: start !important; + width: calc(100% - 10px); + height: calc(100% - 10px); + } + + .select-modal { + width: 100%; + height: 100%; + opacity: 0.3; + background-color: v-bind('themeColor'); + } + + .list-img { + flex-shrink: 0; + height: $centerHeight; + border-radius: 5px; + overflow: hidden; + border: none !important; + padding: 2px; + @include hover-border-color('hover-border-color'); + } + + .list-text { + padding-left: 6px; + font-size: $textSize; + } + + /* 选中样式 */ + &.select { + border: 1px solid v-bind('themeColor'); + background-color: rgba(0, 0, 0, 0); + } + + // mini样式 + &.list-mini { + height: $centerMiniHeight; + } +} +</style> diff --git a/src/views/chart/hooks/useSync.hook.ts b/src/views/chart/hooks/useSync.hook.ts index 97221f19..b97fd4e5 100644 --- a/src/views/chart/hooks/useSync.hook.ts +++ b/src/views/chart/hooks/useSync.hook.ts @@ -132,6 +132,11 @@ export const useSync = () => { ) => { // 补充 class 上的方法 let newComponent: CreateComponentType = await createComponent(_componentInstance.chartConfig) + if (_componentInstance.chartConfig.redirectComponent) { + _componentInstance.chartConfig.dataset && (newComponent.option.dataset = _componentInstance.chartConfig.dataset) + newComponent.chartConfig.title = _componentInstance.chartConfig.title + newComponent.chartConfig.chartFrame = _componentInstance.chartConfig.chartFrame + } if (callBack) { if (changeId) { callBack(componentMerge(newComponent, { ..._componentInstance, id: getUUID() })) @@ -156,7 +161,7 @@ export const useSync = () => { // 组件 if (key === ChartEditStoreEnum.COMPONENT_LIST) { let loadIndex = 0 - const listLength = projectData[key].length; + const listLength = projectData[key].length for (const comItem of projectData[key]) { // 设置加载数量 let percentage = parseInt((parseFloat(`${++loadIndex / listLength}`) * 100).toString())