diff --git a/common/config/rush/pnpm-config.json b/common/config/rush/pnpm-config.json index a808e3ca48..ed75cc2fbe 100644 --- a/common/config/rush/pnpm-config.json +++ b/common/config/rush/pnpm-config.json @@ -86,10 +86,11 @@ "@visactor/vutils": "1.0.2", "@visactor/vlayouts": "1.0.2", "@visactor/vdataset": "1.0.2", - "@visactor/vscale": "1.0.2" - // "@visactor/vrender-core": "0.22.8", - // "@visactor/vrender-kits": "0.22.8", - // "@visactor/vrender-components": "0.22.8" + "@visactor/vscale": "1.0.2", + "@visactor/vrender-core": "1.0.0-alpha.7", + "@visactor/vrender-kits": "1.0.0-alpha.7", + "@visactor/vrender-animate": "1.0.0-alpha.7", + "@visactor/vrender-components": "1.0.0-alpha.7" }, /** * The `globalPeerDependencyRules` setting provides various settings for suppressing validation errors diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index cd49f00c7a..cd053d4d05 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -5,6 +5,10 @@ overrides: '@visactor/vlayouts': 1.0.2 '@visactor/vdataset': 1.0.2 '@visactor/vscale': 1.0.2 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 + '@visactor/vrender-animate': 1.0.0-alpha.7 + '@visactor/vrender-components': 1.0.0-alpha.7 importers: @@ -28,8 +32,8 @@ importers: '@visactor/vchart-extension': workspace:1.13.9 '@visactor/vchart-theme': ~1.6.6 '@visactor/vmind': 1.2.4-alpha.5 - '@visactor/vrender': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vtable': 1.12.0 '@visactor/vtable-calendar': 1.12.0 '@visactor/vtable-editors': 1.12.0 @@ -58,25 +62,25 @@ importers: vite: 3.2.6 yargs: ^17.1.1 dependencies: - '@arco-design/web-react': 2.46.1_ck2ap7ofk76kidkkm4uczg65xi + '@arco-design/web-react': 2.46.1_xyeeynaru3mn4yiy6efov6jlji '@visactor/openinula-vchart': link:../packages/openinula-vchart '@visactor/react-vchart': link:../packages/react-vchart '@visactor/vchart': link:../packages/vchart '@visactor/vchart-extension': link:../packages/vchart-extension '@visactor/vchart-theme': 1.6.9 '@visactor/vmind': 1.2.4-alpha.5 - '@visactor/vrender': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vtable': 1.12.0 '@visactor/vtable-calendar': 1.12.0 '@visactor/vtable-editors': 1.12.0 '@visactor/vtable-gantt': 1.12.0 '@visactor/vutils': 1.0.2 - axios: 1.7.9 + axios: 1.9.0 buble: 0.20.0 highlight.js: 11.11.1 markdown-it: 13.0.2 - openinula: 0.1.3 + openinula: 1.0.0 react: 18.3.1 react-dom: 18.3.1_react@18.3.1 react-router-dom: 6.9.0_nnrd3gsncyragczmpvfhocinkq @@ -87,8 +91,8 @@ importers: '@types/buble': 0.20.5 '@types/highlightjs': 9.12.6 '@types/markdown-it': 13.0.9 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5_@types+react@18.3.18 + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7_@types+react@18.3.21 '@vitejs/plugin-react': 3.1.0_vite@3.2.6 canvas: 2.11.2 chalk: 3.0.0 @@ -150,8 +154,8 @@ importers: '@types/offscreencanvas': 2019.6.4 '@types/react-is': ^17.0.3 '@visactor/vchart': workspace:1.13.9 - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vutils': 1.0.2 '@vitejs/plugin-react': 3.1.0 eslint: ~8.18.0 @@ -170,8 +174,8 @@ importers: vite: 3.2.6 dependencies: '@visactor/vchart': link:../vchart - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vutils': 1.0.2 react-is: 18.3.1 devDependencies: @@ -181,7 +185,7 @@ importers: '@rollup/plugin-typescript': 11.1.0_3riap2emcx3rezd3j6fqob2ipq '@rushstack/eslint-patch': 1.1.4 '@types/jest': 26.0.24 - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/offscreencanvas': 2019.6.4 '@types/react-is': 17.0.7 '@vitejs/plugin-react': 3.1.0_vite@3.2.6 @@ -192,12 +196,12 @@ importers: eslint-plugin-prettier: 4.2.1_ohknqdiadpdc4n44qqsbqlxxwa eslint-plugin-react: 7.30.1_eslint@8.18.0 jest: 26.6.3 - openinula: 0.1.3 + openinula: 1.0.0 rollup: 3.20.5 ts-jest: 26.5.6_xuote2qreek47x2di7kesslrai tslib: 2.3.1 typescript: 4.9.5 - vite: 3.2.6_@types+node@22.10.9 + vite: 3.2.6_@types+node@22.15.14 ../../packages/react-vchart: specifiers: @@ -213,8 +217,8 @@ importers: '@types/react-dom': ^18.0.0 '@types/react-is': ^17.0.3 '@visactor/vchart': workspace:1.13.9 - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vutils': 1.0.2 '@vitejs/plugin-react': 3.1.0 eslint: ~8.18.0 @@ -234,8 +238,8 @@ importers: vite: 3.2.6 dependencies: '@visactor/vchart': link:../vchart - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vutils': 1.0.2 react-is: 18.3.1 devDependencies: @@ -245,10 +249,10 @@ importers: '@rollup/plugin-typescript': 11.1.0_3riap2emcx3rezd3j6fqob2ipq '@rushstack/eslint-patch': 1.1.4 '@types/jest': 26.0.24 - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/offscreencanvas': 2019.6.4 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5_@types+react@18.3.18 + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7_@types+react@18.3.21 '@types/react-is': 17.0.7 '@vitejs/plugin-react': 3.1.0_vite@3.2.6 eslint: 8.18.0 @@ -264,7 +268,7 @@ importers: ts-jest: 26.5.6_xuote2qreek47x2di7kesslrai tslib: 2.3.1 typescript: 4.9.5 - vite: 3.2.6_@types+node@22.10.9 + vite: 3.2.6_@types+node@22.15.14 ../../packages/taro-vchart: specifiers: @@ -334,8 +338,8 @@ importers: '@tarojs/runtime': 3.3.17 '@tarojs/taro': 3.3.17 '@tarojs/webpack-runner': 3.3.17 - '@types/react': 18.3.18 - '@types/webpack-env': 1.18.5 + '@types/react': 18.3.21 + '@types/webpack-env': 1.18.8 '@typescript-eslint/eslint-plugin': 5.30.0_cow5zg7tx6c3eisi5a4ud5kwia '@typescript-eslint/parser': 5.30.0_vwud3sodsb5zxmzckoj7rdwdbq '@vitejs/plugin-react': 3.1.0_vite@3.2.6 @@ -373,9 +377,10 @@ importers: '@types/offscreencanvas': 2019.6.4 '@visactor/vdataset': 1.0.2 '@visactor/vlayouts': 1.0.2 - '@visactor/vrender-components': 0.22.10 - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender-animate': 1.0.0-alpha.7 + '@visactor/vrender-components': 1.0.0-alpha.7 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vscale': 1.0.2 '@visactor/vutils': 1.0.2 '@visactor/vutils-extension': workspace:1.13.9 @@ -414,9 +419,10 @@ importers: dependencies: '@visactor/vdataset': 1.0.2 '@visactor/vlayouts': 1.0.2 - '@visactor/vrender-components': 0.22.10 - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender-animate': 1.0.0-alpha.7 + '@visactor/vrender-components': 1.0.0-alpha.7 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vscale': 1.0.2 '@visactor/vutils': 1.0.2 '@visactor/vutils-extension': link:../vutils-extension @@ -430,7 +436,7 @@ importers: '@rushstack/eslint-patch': 1.1.4 '@size-limit/file': 9.0.0_size-limit@9.0.0 '@types/jest': 26.0.24 - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/offscreencanvas': 2019.6.4 canvas: 2.11.2 cross-env: 7.0.3 @@ -440,7 +446,7 @@ importers: d3-hexbin: 0.2.2 d3-hierarchy: 3.1.2 eslint: 8.18.0 - form-data: 4.0.1 + form-data: 4.0.2 husky: 7.0.4 jest: 26.6.3_xxvpynkn5i4ehycnunrxxsezu4 jest-electron: 0.1.12_jest@26.6.3 @@ -459,11 +465,11 @@ importers: size-limit: 9.0.0 ts-jest: 26.5.6_xuote2qreek47x2di7kesslrai ts-loader: 8.0.2_typescript@4.9.5 - ts-node: 10.9.0_jk2urypwexmnq64epyki3pm4ga + ts-node: 10.9.0_y4ydw5z7fjlzrnucxl3mepieeu tslib: 2.3.1 tslint: 5.12.1_typescript@4.9.5 typescript: 4.9.5 - vite: 3.2.6_@types+node@22.10.9 + vite: 3.2.6_@types+node@22.15.14 ../../packages/vchart-extension: specifiers: @@ -477,9 +483,9 @@ importers: '@types/react-dom': ^18.0.0 '@visactor/vchart': workspace:1.13.9 '@visactor/vdataset': 1.0.2 - '@visactor/vrender-components': 0.22.10 - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender-components': 1.0.0-alpha.7 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vutils': 1.0.2 '@vitejs/plugin-react': 3.1.0 canvas: 2.11.2 @@ -500,19 +506,19 @@ importers: dependencies: '@visactor/vchart': link:../vchart '@visactor/vdataset': 1.0.2 - '@visactor/vrender-components': 0.22.10 - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender-components': 1.0.0-alpha.7 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vutils': 1.0.2 devDependencies: '@internal/bundler': link:../../tools/bundler '@internal/eslint-config': link:../../share/eslint-config '@internal/ts-config': link:../../share/ts-config '@rushstack/eslint-patch': 1.1.4 - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/offscreencanvas': 2019.6.4 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5_@types+react@18.3.18 + '@types/react': 18.3.21 + '@types/react-dom': 18.3.7_@types+react@18.3.21 '@vitejs/plugin-react': 3.1.0_vite@3.2.6 canvas: 2.11.2 eslint: 8.18.0 @@ -526,9 +532,9 @@ importers: rollup-plugin-sizes: 1.0.5_rollup@3.20.5 rollup-plugin-visualizer: 5.9.2_rollup@3.20.5 ts-loader: 8.0.2_typescript@4.9.5 - ts-node: 10.9.0_jk2urypwexmnq64epyki3pm4ga + ts-node: 10.9.0_y4ydw5z7fjlzrnucxl3mepieeu typescript: 4.9.5 - vite: 3.2.6_@types+node@22.10.9 + vite: 3.2.6_@types+node@22.15.14 ../../packages/vchart-schema: specifiers: @@ -603,7 +609,7 @@ importers: '@internal/ts-config': link:../../share/ts-config '@rushstack/eslint-patch': 1.1.4 '@types/jest': 26.0.24 - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/offscreencanvas': 2019.6.4 eslint: 8.18.0 husky: 7.0.4 @@ -615,11 +621,11 @@ importers: react-device-detect: 2.2.3 ts-jest: 26.5.6_xuote2qreek47x2di7kesslrai ts-loader: 8.0.2_typescript@4.9.5 - ts-node: 10.9.0_jk2urypwexmnq64epyki3pm4ga + ts-node: 10.9.0_y4ydw5z7fjlzrnucxl3mepieeu tslib: 2.3.1 tslint: 5.12.1_typescript@4.9.5 typescript: 4.9.5 - vite: 3.2.6_@types+node@22.10.9 + vite: 3.2.6_@types+node@22.15.14 ../../packages/wx-vchart: specifiers: @@ -705,13 +711,13 @@ importers: '@internal/eslint-config': link:../../share/eslint-config '@internal/ts-config': link:../../share/ts-config '@rushstack/eslint-patch': 1.1.4 - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/node-fetch': 2.6.4 cross-env: 7.0.3 eslint: 8.18.0 - form-data: 4.0.1 + form-data: 4.0.2 node-fetch: 2.6.7 - ts-node: 10.9.0_jk2urypwexmnq64epyki3pm4ga + ts-node: 10.9.0_y4ydw5z7fjlzrnucxl3mepieeu typescript: 4.9.5 ../../tools/bundler: @@ -850,7 +856,7 @@ importers: '@types/merge2': 1.4.0 '@types/minimist': 1.2.2 '@types/ms': 0.7.31 - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/semver': 7.3.12 '@types/terser': 3.12.0 '@types/through2': 2.0.38 @@ -859,7 +865,7 @@ importers: '@types/yargs-parser': 21.0.0 eslint: 8.18.0 rimraf: 3.0.2 - ts-node: 10.9.0_jk2urypwexmnq64epyki3pm4ga + ts-node: 10.9.0_y4ydw5z7fjlzrnucxl3mepieeu typescript: 4.9.5 vitest: 0.30.1_less@4.1.3+terser@5.17.1 @@ -874,9 +880,9 @@ importers: '@typescript-eslint/eslint-plugin': 5.30.0 '@typescript-eslint/parser': 5.30.0 '@visactor/vchart': workspace:1.13.9 - '@visactor/vrender': 0.22.10 - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender': 1.0.0-alpha.7 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vutils': 1.0.2 cross-env: ^7.0.3 eslint: ~8.18.0 @@ -889,9 +895,9 @@ importers: vite: 3.2.6 dependencies: '@visactor/vchart': link:../../packages/vchart - '@visactor/vrender': 0.22.10 - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender': 1.0.0-alpha.7 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vutils': 1.0.2 devDependencies: '@internal/bundler': link:../bundler @@ -899,7 +905,7 @@ importers: '@internal/ts-config': link:../../share/ts-config '@rushstack/eslint-patch': 1.1.4 '@types/jest': 26.0.24 - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@typescript-eslint/eslint-plugin': 5.30.0_cow5zg7tx6c3eisi5a4ud5kwia '@typescript-eslint/parser': 5.30.0_vwud3sodsb5zxmzckoj7rdwdbq cross-env: 7.0.3 @@ -907,10 +913,10 @@ importers: jest: 26.6.3_ts-node@10.9.0 prettier: 2.6.1 ts-jest: 26.5.6_xuote2qreek47x2di7kesslrai - ts-node: 10.9.0_jk2urypwexmnq64epyki3pm4ga + ts-node: 10.9.0_y4ydw5z7fjlzrnucxl3mepieeu tslint-config-prettier: 1.18.0 typescript: 4.9.5 - vite: 3.2.6_@types+node@22.10.9 + vite: 3.2.6_@types+node@22.15.14 ../../tools/typescript-json-schema: specifiers: @@ -933,11 +939,11 @@ importers: yargs: ^17.1.1 dependencies: '@types/json-schema': 7.0.15 - '@types/node': 22.10.9 + '@types/node': 22.15.14 glob: 7.2.3 path-equal: 1.2.5 safe-stable-stringify: 2.5.0 - ts-node: 10.9.0_jk2urypwexmnq64epyki3pm4ga + ts-node: 10.9.0_y4ydw5z7fjlzrnucxl3mepieeu typescript: 4.9.5 yargs: 17.7.2 devDependencies: @@ -966,7 +972,7 @@ packages: color: 3.2.1 dev: false - /@arco-design/web-react/2.46.1_ck2ap7ofk76kidkkm4uczg65xi: + /@arco-design/web-react/2.46.1_xyeeynaru3mn4yiy6efov6jlji: resolution: {integrity: sha512-XjG44rODJklDu++OApvxjt/TbRrgkNqVq6grt/H+9skysm46jFn2SwhuSljBHmjo11LtIeB1m/OMPMaFtafeYg==} peerDependencies: react: '>=16' @@ -982,7 +988,7 @@ packages: number-precision: 1.6.0 react: 18.3.1 react-dom: 18.3.1_react@18.3.1 - react-focus-lock: 2.13.5_x25zuu6u7xhdvbznsywf7wxevq + react-focus-lock: 2.13.6_3nlyxfmlf5egaoiyklpqyxqsd4 react-transition-group: 4.4.5_nnrd3gsncyragczmpvfhocinkq resize-observer-polyfill: 1.5.1 scroll-into-view-if-needed: 2.2.20 @@ -997,16 +1003,16 @@ packages: '@babel/highlight': 7.0.0-beta.44 dev: true - /@babel/code-frame/7.26.2: - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + /@babel/code-frame/7.27.1: + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - /@babel/compat-data/7.26.5: - resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} + /@babel/compat-data/7.27.2: + resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} engines: {node: '>=6.9.0'} /@babel/core/7.20.12: @@ -1014,15 +1020,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@babel/generator': 7.21.1 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0_@babel+core@7.20.12 - '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.5 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.1_@babel+core@7.20.12 + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -1045,62 +1051,62 @@ packages: resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - /@babel/generator/7.26.5: - resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + /@babel/generator/7.27.1: + resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - /@babel/helper-annotate-as-pure/7.25.9: - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + /@babel/helper-annotate-as-pure/7.27.1: + resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 - /@babel/helper-compilation-targets/7.26.5: - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + /@babel/helper-compilation-targets/7.27.2: + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + '@babel/compat-data': 7.27.2 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.5 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + /@babel/helper-create-class-features-plugin/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5_@babel+core@7.20.12 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1_@babel+core@7.20.12 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/helper-create-regexp-features-plugin/7.26.3_@babel+core@7.20.12: - resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} + /@babel/helper-create-regexp-features-plugin/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-annotate-as-pure': 7.27.1 regexpu-core: 6.2.0 semver: 6.3.1 @@ -1110,8 +1116,8 @@ packages: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.10 @@ -1123,7 +1129,7 @@ packages: resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 /@babel/helper-function-name/7.0.0-beta.44: resolution: {integrity: sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==} @@ -1139,79 +1145,79 @@ packages: '@babel/types': 7.0.0-beta.44 dev: true - /@babel/helper-member-expression-to-functions/7.25.9: - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + /@babel/helper-member-expression-to-functions/7.27.1: + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/helper-module-imports/7.25.9: - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + /@babel/helper-module-imports/7.27.1: + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms/7.26.0_@babel+core@7.20.12: - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + /@babel/helper-module-transforms/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/helper-optimise-call-expression/7.25.9: - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + /@babel/helper-optimise-call-expression/7.27.1: + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 - /@babel/helper-plugin-utils/7.26.5: - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + /@babel/helper-plugin-utils/7.27.1: + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + /@babel/helper-remap-async-to-generator/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/helper-replace-supers/7.26.5_@babel+core@7.20.12: - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + /@babel/helper-replace-supers/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/helper-skip-transparent-expression-wrappers/7.25.9: - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + /@babel/helper-skip-transparent-expression-wrappers/7.27.1: + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -1221,34 +1227,34 @@ packages: '@babel/types': 7.0.0-beta.44 dev: true - /@babel/helper-string-parser/7.25.9: - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + /@babel/helper-string-parser/7.27.1: + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier/7.25.9: - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + /@babel/helper-validator-identifier/7.27.1: + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option/7.25.9: - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + /@babel/helper-validator-option/7.27.1: + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - /@babel/helper-wrap-function/7.25.9: - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + /@babel/helper-wrap-function/7.27.1: + resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/helpers/7.26.0: - resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + /@babel/helpers/7.27.1: + resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 /@babel/highlight/7.0.0-beta.44: resolution: {integrity: sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==} @@ -1258,32 +1264,32 @@ packages: js-tokens: 3.0.2 dev: true - /@babel/parser/7.26.5: - resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} + /@babel/parser/7.27.2: + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1_@babel+core@7.20.12 transitivePeerDependencies: - supports-color @@ -1296,8 +1302,8 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1_@babel+core@7.20.12 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 transitivePeerDependencies: - supports-color @@ -1309,8 +1315,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.25.9_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color dev: true @@ -1323,8 +1329,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.25.9_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color @@ -1336,8 +1342,8 @@ packages: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.25.9_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 transitivePeerDependencies: - supports-color @@ -1348,9 +1354,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.25.9_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-decorators': 7.25.9_@babel+core@7.20.12 + '@babel/helper-create-class-features-plugin': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1_@babel+core@7.20.12 transitivePeerDependencies: - supports-color dev: true @@ -1363,7 +1369,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 /@babel/plugin-proposal-export-default-from/7.18.10_@babel+core@7.20.12: @@ -1373,8 +1379,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-export-default-from': 7.25.9_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-export-default-from': 7.27.1_@babel+core@7.20.12 /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.12: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} @@ -1384,7 +1390,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.12: @@ -1395,7 +1401,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.20.12: @@ -1406,7 +1412,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.12: @@ -1417,7 +1423,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.12: @@ -1428,7 +1434,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 /@babel/plugin-proposal-object-rest-spread/7.14.7_@babel+core@7.20.12: @@ -1438,12 +1444,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.26.5 + '@babel/compat-data': 7.27.2 '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-transform-parameters': 7.27.1_@babel+core@7.20.12 dev: true /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.20.12: @@ -1453,12 +1459,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.26.5 + '@babel/compat-data': 7.27.2 '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-transform-parameters': 7.27.1_@babel+core@7.20.12 /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} @@ -1468,7 +1474,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.20.12: @@ -1479,8 +1485,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 transitivePeerDependencies: - supports-color @@ -1493,8 +1499,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.25.9_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color @@ -1506,9 +1512,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 transitivePeerDependencies: - supports-color @@ -1521,8 +1527,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.26.3_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.12: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -1530,7 +1536,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.12: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} @@ -1538,7 +1544,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 dev: true /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.12: @@ -1547,7 +1553,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.12: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -1556,16 +1562,16 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-decorators/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} + /@babel/plugin-syntax-decorators/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 dev: true /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.12: @@ -1574,16 +1580,16 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-export-default-from/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ==} + /@babel/plugin-syntax-export-default-from/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.12: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -1591,35 +1597,35 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-flow/7.26.0_@babel+core@7.20.12: - resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} + /@babel/plugin-syntax-flow/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-import-assertions/7.26.0_@babel+core@7.20.12: - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + /@babel/plugin-syntax-import-assertions/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-import-attributes/7.26.0_@babel+core@7.20.12: - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + /@babel/plugin-syntax-import-attributes/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 dev: true /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.12: @@ -1628,7 +1634,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 dev: true /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.12: @@ -1637,16 +1643,16 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-jsx/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + /@babel/plugin-syntax-jsx/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.12: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -1654,7 +1660,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.12: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -1662,7 +1668,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.12: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -1670,7 +1676,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.12: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -1678,7 +1684,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.12: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -1686,7 +1692,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.12: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -1694,7 +1700,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.12: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -1703,7 +1709,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.12: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -1712,378 +1718,377 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-typescript/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + /@babel/plugin-syntax-typescript/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-arrow-functions/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + /@babel/plugin-transform-arrow-functions/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-async-to-generator/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + /@babel/plugin-transform-async-to-generator/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9_@babel+core@7.20.12 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1_@babel+core@7.20.12 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-block-scoped-functions/7.26.5_@babel+core@7.20.12: - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + /@babel/plugin-transform-block-scoped-functions/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-block-scoping/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + /@babel/plugin-transform-block-scoping/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-classes/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + /@babel/plugin-transform-classes/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5_@babel+core@7.20.12 - '@babel/traverse': 7.26.5 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1_@babel+core@7.20.12 + '@babel/traverse': 7.27.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-computed-properties/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + /@babel/plugin-transform-computed-properties/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 - /@babel/plugin-transform-destructuring/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + /@babel/plugin-transform-destructuring/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-dotall-regex/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + /@babel/plugin-transform-dotall-regex/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.26.3_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-duplicate-keys/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + /@babel/plugin-transform-duplicate-keys/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-exponentiation-operator/7.26.3_@babel+core@7.20.12: - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + /@babel/plugin-transform-exponentiation-operator/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-flow-strip-types/7.26.5_@babel+core@7.20.12: - resolution: {integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==} + /@babel/plugin-transform-flow-strip-types/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-flow': 7.26.0_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1_@babel+core@7.20.12 dev: true - /@babel/plugin-transform-for-of/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} + /@babel/plugin-transform-for-of/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-function-name/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + /@babel/plugin-transform-function-name/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-literals/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + /@babel/plugin-transform-literals/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-member-expression-literals/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + /@babel/plugin-transform-member-expression-literals/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-modules-amd/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + /@babel/plugin-transform-modules-amd/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.26.0_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs/7.26.3_@babel+core@7.20.12: - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + /@babel/plugin-transform-modules-commonjs/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.26.0_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-systemjs/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + /@babel/plugin-transform-modules-systemjs/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.26.0_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/helper-module-transforms': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-umd/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + /@babel/plugin-transform-modules-umd/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.26.0_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-named-capturing-groups-regex/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + /@babel/plugin-transform-named-capturing-groups-regex/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.26.3_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-new-target/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + /@babel/plugin-transform-new-target/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-object-assign/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-I/Vl1aQnPsrrn837oLbo+VQtkNcjuuiATqwmuweg4fTauwHHQoxyjmjjOVKyO8OaTxgqYTKW3LuQsykXjDf5Ag==} + /@babel/plugin-transform-object-assign/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-LP6tsnirA6iy13uBKiYgjJsfQrodmlSrpZModtlo1Vk8sOO68gfo7dfA9TGJyEgxTiO7czK4EGZm8FJEZtk4kQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-transform-object-super/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + /@babel/plugin-transform-object-super/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1_@babel+core@7.20.12 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-optional-chaining/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + /@babel/plugin-transform-optional-chaining/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-parameters/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + /@babel/plugin-transform-parameters/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-property-literals/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + /@babel/plugin-transform-property-literals/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-react-display-name/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + /@babel/plugin-transform-react-display-name/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-react-jsx-development/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + /@babel/plugin-transform-react-jsx-development/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/plugin-transform-react-jsx': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx': 7.27.1_@babel+core@7.20.12 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-react-jsx-self/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + /@babel/plugin-transform-react-jsx-self/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-transform-react-jsx-source/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + /@babel/plugin-transform-react-jsx-source/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-transform-react-jsx/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + /@babel/plugin-transform-react-jsx/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx': 7.25.9_@babel+core@7.20.12 - '@babel/types': 7.26.5 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1_@babel+core@7.20.12 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-react-pure-annotations/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + /@babel/plugin-transform-react-pure-annotations/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-regenerator/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + /@babel/plugin-transform-regenerator/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-reserved-words/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + /@babel/plugin-transform-reserved-words/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-transform-runtime/7.11.0_@babel+core@7.20.12: resolution: {integrity: sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==} @@ -2091,95 +2096,95 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 resolve: 1.22.10 semver: 5.7.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-shorthand-properties/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + /@babel/plugin-transform-shorthand-properties/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-spread/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + /@babel/plugin-transform-spread/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-sticky-regex/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + /@babel/plugin-transform-sticky-regex/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-template-literals/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} + /@babel/plugin-transform-template-literals/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-typeof-symbol/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} + /@babel/plugin-transform-typeof-symbol/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-typescript/7.26.5_@babel+core@7.20.12: - resolution: {integrity: sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==} + /@babel/plugin-transform-typescript/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9_@babel+core@7.20.12 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1_@babel+core@7.20.12 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-unicode-escapes/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + /@babel/plugin-transform-unicode-escapes/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-unicode-regex/7.25.9_@babel+core@7.20.12: - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + /@babel/plugin-transform-unicode-regex/7.27.1_@babel+core@7.20.12: + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.26.3_@babel+core@7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 /@babel/preset-env/7.20.2_@babel+core@7.20.12: resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} @@ -2187,13 +2192,13 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.26.5 + '@babel/compat-data': 7.27.2 '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1_@babel+core@7.20.12 '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.20.12 '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.12 '@babel/plugin-proposal-class-static-block': 7.21.0_@babel+core@7.20.12 @@ -2214,7 +2219,7 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-import-assertions': 7.26.0_@babel+core@7.20.12 + '@babel/plugin-syntax-import-assertions': 7.27.1_@babel+core@7.20.12 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 @@ -2224,44 +2229,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-transform-arrow-functions': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-async-to-generator': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-block-scoped-functions': 7.26.5_@babel+core@7.20.12 - '@babel/plugin-transform-block-scoping': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-classes': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-computed-properties': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-destructuring': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-dotall-regex': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-duplicate-keys': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-exponentiation-operator': 7.26.3_@babel+core@7.20.12 - '@babel/plugin-transform-for-of': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-function-name': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-literals': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-member-expression-literals': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-modules-amd': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-modules-commonjs': 7.26.3_@babel+core@7.20.12 - '@babel/plugin-transform-modules-systemjs': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-modules-umd': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-new-target': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-object-super': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-property-literals': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-regenerator': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-reserved-words': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-shorthand-properties': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-spread': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-sticky-regex': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-template-literals': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-typeof-symbol': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-unicode-escapes': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-unicode-regex': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-transform-arrow-functions': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-async-to-generator': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-block-scoped-functions': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-block-scoping': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-classes': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-computed-properties': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-destructuring': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-dotall-regex': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-duplicate-keys': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-exponentiation-operator': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-for-of': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-function-name': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-literals': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-member-expression-literals': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-modules-amd': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-modules-commonjs': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-modules-systemjs': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-modules-umd': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-new-target': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-object-super': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-parameters': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-property-literals': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-regenerator': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-reserved-words': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-shorthand-properties': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-spread': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-sticky-regex': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-template-literals': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-typeof-symbol': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-unicode-escapes': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-unicode-regex': 7.27.1_@babel+core@7.20.12 '@babel/preset-modules': 0.1.6_@babel+core@7.20.12 - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.12 babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.12 babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.12 - core-js-compat: 3.40.0 + core-js-compat: 3.42.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -2272,10 +2277,10 @@ packages: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-dotall-regex': 7.25.9_@babel+core@7.20.12 - '@babel/types': 7.26.5 + '@babel/plugin-transform-dotall-regex': 7.27.1_@babel+core@7.20.12 + '@babel/types': 7.27.1 esutils: 2.0.3 /@babel/preset-react/7.12.13_@babel+core@7.20.12: @@ -2284,11 +2289,11 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-display-name': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-react-jsx': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-react-jsx-development': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-react-pure-annotations': 7.25.9_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-development': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-pure-annotations': 7.27.1_@babel+core@7.20.12 transitivePeerDependencies: - supports-color dev: true @@ -2300,12 +2305,12 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-react-display-name': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-react-jsx': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-react-jsx-development': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-react-pure-annotations': 7.25.9_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-development': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-pure-annotations': 7.27.1_@babel+core@7.20.12 transitivePeerDependencies: - supports-color dev: false @@ -2316,9 +2321,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-typescript': 7.26.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-typescript': 7.27.1_@babel+core@7.20.12 transitivePeerDependencies: - supports-color dev: true @@ -2330,9 +2335,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-typescript': 7.26.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-typescript': 7.27.1_@babel+core@7.20.12 transitivePeerDependencies: - supports-color dev: false @@ -2347,16 +2352,15 @@ packages: clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 - pirates: 4.0.6 + pirates: 4.0.7 source-map-support: 0.5.21 dev: true - /@babel/runtime-corejs3/7.26.0: - resolution: {integrity: sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==} + /@babel/runtime-corejs3/7.27.1: + resolution: {integrity: sha512-909rVuj3phpjW6y0MCXAZ5iNeORePa6ldJvp2baWGcTjwqbBDDz6xoS5JHJ7lS88NlwLYj07ImL/8IUMtDZzTA==} engines: {node: '>=6.9.0'} dependencies: - core-js-pure: 3.40.0 - regenerator-runtime: 0.14.1 + core-js-pure: 3.42.0 dev: true /@babel/runtime/7.17.0: @@ -2374,13 +2378,13 @@ packages: lodash: 4.17.21 dev: true - /@babel/template/7.25.9: - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + /@babel/template/7.27.2: + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 /@babel/traverse/7.0.0-beta.44: resolution: {integrity: sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==} @@ -2397,15 +2401,15 @@ packages: lodash: 4.17.21 dev: true - /@babel/traverse/7.26.5: - resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} + /@babel/traverse/7.27.1: + resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/parser': 7.26.5 - '@babel/template': 7.25.9 - '@babel/types': 7.26.5 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -2419,12 +2423,12 @@ packages: to-fast-properties: 2.0.0 dev: true - /@babel/types/7.26.5: - resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + /@babel/types/7.27.1: + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 /@bcoe/v8-coverage/0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -2505,7 +2509,7 @@ packages: espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 @@ -2640,7 +2644,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 chalk: 4.1.2 jest-message-util: 26.6.2 jest-util: 26.6.2 @@ -2656,7 +2660,7 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 ansi-escapes: 4.3.2 chalk: 4.1.2 exit: 0.1.2 @@ -2696,7 +2700,7 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 ansi-escapes: 4.3.2 chalk: 4.1.2 exit: 0.1.2 @@ -2709,7 +2713,7 @@ packages: jest-resolve: 26.6.2 jest-resolve-dependencies: 26.6.3 jest-runner: 26.6.3_ts-node@10.9.0 - jest-runtime: 26.6.3_ts-node@10.9.0 + jest-runtime: 26.6.3 jest-snapshot: 26.6.2 jest-util: 26.6.2 jest-validate: 26.6.2 @@ -2736,7 +2740,7 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 ansi-escapes: 4.3.2 chalk: 4.1.2 exit: 0.1.2 @@ -2749,7 +2753,7 @@ packages: jest-resolve: 26.6.2 jest-resolve-dependencies: 26.6.3 jest-runner: 26.6.3_xxvpynkn5i4ehycnunrxxsezu4 - jest-runtime: 26.6.3_xxvpynkn5i4ehycnunrxxsezu4 + jest-runtime: 26.6.3 jest-snapshot: 26.6.2 jest-util: 26.6.2 jest-validate: 26.6.2 @@ -2785,7 +2789,7 @@ packages: dependencies: '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 jest-mock: 26.6.2 dev: true @@ -2804,7 +2808,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@sinonjs/fake-timers': 6.0.1 - '@types/node': 22.10.9 + '@types/node': 22.15.14 jest-message-util: 26.6.2 jest-mock: 26.6.2 jest-util: 26.6.2 @@ -2927,7 +2931,7 @@ packages: graceful-fs: 4.2.11 jest-haste-map: 26.6.2 jest-runner: 26.6.3_ts-node@10.9.0 - jest-runtime: 26.6.3_ts-node@10.9.0 + jest-runtime: 26.6.3 transitivePeerDependencies: - bufferutil - canvas @@ -2944,7 +2948,7 @@ packages: graceful-fs: 4.2.11 jest-haste-map: 26.6.2 jest-runner: 26.6.3_xxvpynkn5i4ehycnunrxxsezu4 - jest-runtime: 26.6.3_xxvpynkn5i4ehycnunrxxsezu4 + jest-runtime: 26.6.3 transitivePeerDependencies: - bufferutil - canvas @@ -2968,7 +2972,7 @@ packages: jest-regex-util: 24.9.0 jest-util: 24.9.0 micromatch: 3.1.10 - pirates: 4.0.6 + pirates: 4.0.7 realpath-native: 1.1.0 slash: 2.0.0 source-map: 0.6.1 @@ -2992,7 +2996,7 @@ packages: jest-regex-util: 26.0.0 jest-util: 26.6.2 micromatch: 4.0.8 - pirates: 4.0.6 + pirates: 4.0.7 slash: 3.0.0 source-map: 0.6.1 write-file-atomic: 3.0.3 @@ -3015,7 +3019,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/yargs': 15.0.19 chalk: 4.1.2 dev: true @@ -3061,14 +3065,14 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true dependencies: - detect-libc: 2.0.3 + detect-libc: 2.0.4 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.6.7 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.6.3 + semver: 7.7.1 tar: 6.2.1 transitivePeerDependencies: - encoding @@ -3104,13 +3108,13 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.19.1 /@npmcli/fs/1.1.1: resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} dependencies: '@gar/promisify': 1.1.3 - semver: 7.6.3 + semver: 7.7.1 dev: true /@npmcli/move-file/1.1.2: @@ -3317,7 +3321,7 @@ packages: optional: true dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.25.9 + '@babel/helper-module-imports': 7.27.1 '@rollup/pluginutils': 5.1.4_rollup@3.20.5 '@types/babel__core': 7.20.0 rollup: 3.20.5 @@ -3339,7 +3343,7 @@ packages: optional: true dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.25.9 + '@babel/helper-module-imports': 7.27.1 '@rollup/pluginutils': 5.1.4_rollup@3.20.5 rollup: 3.20.5 transitivePeerDependencies: @@ -3503,7 +3507,7 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 rollup: 3.20.5 @@ -3943,7 +3947,7 @@ packages: resolution: {integrity: sha512-zt6QGPmYM0SnpG+1DtQpmHJxYVi3kGXkw+UFs26s7w/W/zv0VDHv+97Qbjv3P+wjmo4Hkz2vOlkCAnaDBSl60A==} dependencies: '@tarojs/helper': 3.3.17 - acorn: 8.14.0 + acorn: 8.14.1 acorn-walk: 8.3.4 loader-utils: 1.4.2 transitivePeerDependencies: @@ -3961,7 +3965,7 @@ packages: /@tarojs/taroize/3.3.17: resolution: {integrity: sha512-h2wZ5ztwuK7mLEWs8GZdyWGNa/vOff6QFhO/7alcBzdARH2A5HJ1QQ8ZSvDmCsa6EM46tAjkDNi6pZ6lTBR7FA==} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 babel-core: 6.26.3 babel-generator: 6.26.1 babel-template: 6.26.0 @@ -3977,7 +3981,7 @@ packages: /@tarojs/transformer-wx/2.2.22: resolution: {integrity: sha512-JZxD8vWLQfoydKR6uJMlo6dw5Rp5jCJeR6Gh4aerBqakCjAtfrAPV5g1XAIHeLVHJwvCtaP8bYXlJYIPChwJHg==} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 babel-core: 6.26.3 babel-eslint: 8.2.6 babel-helper-evaluate-path: 0.5.0 @@ -4145,27 +4149,27 @@ packages: /@types/babel__core/7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 - '@types/babel__generator': 7.6.8 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.20.7 - /@types/babel__generator/7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + /@types/babel__generator/7.27.0: + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 /@types/babel__template/7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 - /@types/babel__traverse/7.20.6: - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + /@types/babel__traverse/7.20.7: + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 /@types/buble/0.20.5: resolution: {integrity: sha512-CNpql2WPrZloamMweLkyM42nPsUVa10NDurkhTB5+tGu8SstDd568dothJi7tFSAsbqJK0rSb83W9ZwGt8My/A==} @@ -4177,8 +4181,10 @@ packages: resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} dev: true - /@types/chai-subset/1.3.5: - resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} + /@types/chai-subset/1.3.6_@types+chai@4.3.20: + resolution: {integrity: sha512-m8lERkkQj+uek18hXOZuec3W/fCRTrU4hrnXjH3qhHy96ytuPaPiWGgu7sJb7tZxZonO75vYAjCvpe/e4VUwRw==} + peerDependencies: + '@types/chai': <5.2.0 dependencies: '@types/chai': 4.3.20 dev: true @@ -4190,7 +4196,7 @@ packages: /@types/clean-css/4.2.6: resolution: {integrity: sha512-Ze1tf+LnGPmG6hBFMi0B4TEB0mhF7EiMM5oyjLDNPE9hxrPU0W+5+bHvO+eFPA+bt0iC1zkQMoU/iGdRVjcRbw==} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 source-map: 0.6.1 dev: true @@ -4200,8 +4206,8 @@ packages: '@types/ms': 0.7.31 dev: true - /@types/estree/1.0.6: - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + /@types/estree/1.0.7: + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} /@types/expect/1.20.4: resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} @@ -4209,46 +4215,46 @@ packages: /@types/fs-extra/8.1.5: resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 dev: true /@types/fs-extra/9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 dev: true - /@types/glob-stream/8.0.2: - resolution: {integrity: sha512-kyuRfGE+yiSJWzSO3t74rXxdZNdYfLcllO0IUha4eX1fl40pm9L02Q/TEc3mykTLjoWz4STBNwYnUWdFu3I0DA==} + /@types/glob-stream/8.0.3: + resolution: {integrity: sha512-vctgrT9AH/GK3TRaIbRUU0TZn12GBU4kzelZdPyJp1Sc8L/6Wrq21UrtN4+x4saqTg6COUIUtFV6JSYcVln/EQ==} dependencies: - '@types/node': 22.10.9 - '@types/picomatch': 3.0.2 + '@types/node': 22.15.14 + '@types/picomatch': 4.0.0 '@types/streamx': 2.9.5 dev: true /@types/glob-watcher/5.0.2: resolution: {integrity: sha512-MZeh2nIzibl/euv5UV0femkGzcKTSE4G2+zv48d6ymeitWwCx52+4X+FqzML9oH2mQnPs+N/JHp3CsBPj1x1Ug==} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 dev: true /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 dev: true /@types/graceful-fs/4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 dev: true /@types/gulp-if/0.0.34: resolution: {integrity: sha512-r2A04hHDC+ZWMRAm+3q6/UeC3ggvl+TZm9P1+2umnp4q9bOlBmUQnR178Io3c0DkZPQAwup8VNtOvmvaWCpP5w==} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/vinyl': 2.0.7 dev: true @@ -4262,7 +4268,7 @@ packages: /@types/gulp-sourcemaps/0.0.35: resolution: {integrity: sha512-vUBuizwA4CAV3Mke0DJYHQxyN4YOB1aAql284qAO7Et7fe0hmnPi/R9Fhu2UhxMuSxAwFktsJUOQk5dJHOU1eA==} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/vinyl': 2.0.7 dev: true @@ -4270,7 +4276,7 @@ packages: resolution: {integrity: sha512-spgZHJFqiEJGwqGlf7T/k4nkBpBcLgP7T0EfN6G2vvnhUfvd4uO1h8RwpXOE8x/54DVYUs1XCAtBHkX/R3axAQ==} dependencies: '@types/undertaker': 1.2.8 - '@types/vinyl-fs': 3.0.5 + '@types/vinyl-fs': 3.0.6 chokidar: 3.6.0 dev: true @@ -4353,7 +4359,7 @@ packages: /@types/merge2/1.4.0: resolution: {integrity: sha512-MRHDvln2ldZELrUC8n1PGaQzZ33aNh8uDcsGehREW0zR1Fr818a4/JTZjO9eloHPPxnpUp8fz/YFTRc5CWm7Xw==} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 dev: true /@types/minimatch/3.0.5: @@ -4379,8 +4385,8 @@ packages: /@types/node-fetch/2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 22.10.9 - form-data: 3.0.2 + '@types/node': 22.15.14 + form-data: 3.0.3 dev: true /@types/node/12.20.55: @@ -4395,10 +4401,10 @@ packages: resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} dev: true - /@types/node/22.10.9: - resolution: {integrity: sha512-Ir6hwgsKyNESl/gLOcEz3krR4CBGgliDqBQ2ma4wIhEx0w+xnoeTq3tdrNw15kU3SxogDjOgv9sqdtLW8mIHaw==} + /@types/node/22.15.14: + resolution: {integrity: sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==} dependencies: - undici-types: 6.20.0 + undici-types: 6.21.0 /@types/normalize-package-data/2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -4412,8 +4418,8 @@ packages: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} dev: true - /@types/picomatch/3.0.2: - resolution: {integrity: sha512-n0i8TD3UDB7paoMMxA3Y65vUncFJXjcUf7lQY7YyKGl6031FNjfsLs6pdLFCy2GNFxItPJG8GvvpbZc2skH7WA==} + /@types/picomatch/4.0.0: + resolution: {integrity: sha512-J1Bng+wlyEERWSgJQU1Pi0HObCLVcr994xT/M+1wcl/yNRTGBupsCxthgkdYG+GCOMaQH7iSVUY3LJVBBqG7MQ==} dev: true /@types/prettier/2.7.3: @@ -4423,30 +4429,30 @@ packages: /@types/prop-types/15.7.14: resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - /@types/react-dom/18.3.5_@types+react@18.3.18: - resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + /@types/react-dom/18.3.7_@types+react@18.3.21: + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} peerDependencies: '@types/react': ^18.0.0 dependencies: - '@types/react': 18.3.18 + '@types/react': 18.3.21 dev: true /@types/react-is/17.0.7: resolution: {integrity: sha512-WrTEiT+c6rgq36QApoy0063uAOdltCrhF0QMXLIgYPaTvIdQhAB8hPb5oGGqX18xToElNILS9UprwU6GyINcJg==} dependencies: - '@types/react': 17.0.83 + '@types/react': 17.0.85 dev: true - /@types/react/17.0.83: - resolution: {integrity: sha512-l0m4ArKJvmFtR4e8UmKrj1pB4tUgOhJITf+mADyF/p69Ts1YAR/E+G9XEM0mHXKVRa1dQNHseyyDNzeuAXfXQw==} + /@types/react/17.0.85: + resolution: {integrity: sha512-5oBDUsRDsrYq4DdyHaL99gE1AJCfuDhyxqF6/55fvvOIRkp1PpKuwJ+aMiGJR+GJt7YqMNclPROTHF20vY2cXA==} dependencies: '@types/prop-types': 15.7.14 '@types/scheduler': 0.16.8 csstype: 3.1.3 dev: true - /@types/react/18.3.18: - resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + /@types/react/18.3.21: + resolution: {integrity: sha512-gXLBtmlcRJeT09/sI4PxVwyrku6SaNUj/6cMubjE6T6XdY1fDmBL7r0nX0jbSZPU/Xr0KuwLLZh6aOYY5d91Xw==} dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 @@ -4455,9 +4461,9 @@ packages: resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} dependencies: '@types/caseless': 0.12.5 - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/tough-cookie': 4.0.5 - form-data: 2.5.2 + form-data: 2.5.3 dev: true /@types/resolve/1.20.2: @@ -4489,7 +4495,7 @@ packages: /@types/streamx/2.9.5: resolution: {integrity: sha512-IHYsa6jYrck8VEdSwpY141FTTf6D7boPeMq9jy4qazNrFMA4VbRz/sw5LSsfR7jwdDcx0QKWkUexZvsWBC2eIQ==} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 dev: true /@types/terser/3.12.0: @@ -4502,7 +4508,7 @@ packages: /@types/through2/2.0.38: resolution: {integrity: sha512-YFu+nHmjxMurkH1BSzA0Z1WrKDAY8jUKPZctNQn7mc+/KKtp2XxnclHFXxdB1m7Iqnzb5aywgP8TMK283LezGQ==} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 dev: true /@types/tough-cookie/4.0.5: @@ -4516,7 +4522,7 @@ packages: /@types/undertaker/1.2.8: resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/undertaker-registry': 1.0.4 async-done: 1.3.2 dev: true @@ -4525,11 +4531,11 @@ packages: resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} dev: true - /@types/vinyl-fs/3.0.5: - resolution: {integrity: sha512-ckYz9giHgV6U10RFuf9WsDQ3X86EFougapxHmmoxLK7e6ICQqO8CE+4V/3lBN148V5N1pb4nQMmMjyScleVsig==} + /@types/vinyl-fs/3.0.6: + resolution: {integrity: sha512-e9GHnmABNUnJ4D99OjVO5s87TfYpmEs7/VKbVS/rt0KkZnKA2vIMyEC5K0H7W/XBiRUO4pdaZxvVUmzjRnrydA==} dependencies: - '@types/glob-stream': 8.0.2 - '@types/node': 22.10.9 + '@types/glob-stream': 8.0.3 + '@types/node': 22.15.14 '@types/vinyl': 2.0.7 dev: true @@ -4537,10 +4543,10 @@ packages: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: '@types/expect': 1.20.4 - '@types/node': 22.10.9 + '@types/node': 22.15.14 - /@types/webpack-env/1.18.5: - resolution: {integrity: sha512-wz7kjjRRj8/Lty4B+Kr0LN6Ypc/3SymeCCGSbaXp2leH0ZVg/PriNiOwNj4bD4uphI7A8NXS4b6Gl373sfO5mA==} + /@types/webpack-env/1.18.8: + resolution: {integrity: sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==} dev: true /@types/yargs-parser/21.0.0: @@ -4579,7 +4585,7 @@ packages: functional-red-black-tree: 1.0.1 ignore: 5.3.2 regexpp: 3.2.0 - semver: 7.6.3 + semver: 7.7.1 tsutils: 3.21.0_typescript@4.9.5 typescript: 4.9.5 transitivePeerDependencies: @@ -4700,7 +4706,7 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.3 + semver: 7.7.1 tsutils: 3.21.0_typescript@4.9.5 typescript: 4.9.5 transitivePeerDependencies: @@ -4721,7 +4727,7 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.3 + semver: 7.7.1 tsutils: 3.21.0_typescript@4.9.5 typescript: 4.9.5 transitivePeerDependencies: @@ -4796,7 +4802,7 @@ packages: path-browserify: 1.0.1 pbf: 3.3.0 point-at-length: 1.1.0 - simple-statistics: 7.8.7 + simple-statistics: 7.8.8 simplify-geojson: 1.0.5 topojson-client: 3.1.0 dev: false @@ -4818,7 +4824,7 @@ packages: '@visactor/chart-advisor': 0.1.10 '@visactor/vdataset': 1.0.2 '@visactor/vutils': 1.0.2 - axios: 1.7.9 + axios: 1.9.0 dayjs: 1.11.13 exceljs: 4.4.0 js-yaml: 4.1.0 @@ -4829,64 +4835,47 @@ packages: - debug dev: false - /@visactor/vrender-components/0.21.0-alpha.4: - resolution: {integrity: sha512-vVI/Xt0qK50FeTloLfczEMr9CBnpzoRNAsKPZvUgh67i1mBiefJouQSpxQcpWeGrKO8WHNBPVFsQqQBoutmLkQ==} + /@visactor/vrender-animate/1.0.0-alpha.7: + resolution: {integrity: sha512-2qO/9AlMCWJ8xpz6+zQbH8UDGpmdOg+kADmPw0p/AcG64JcC4C8k+ZxdRdwaXEAxF6LToHLOcvU4spWq1Jv/ew==} dependencies: - '@visactor/vrender-core': 0.21.0-alpha.4 - '@visactor/vrender-kits': 0.21.0-alpha.4 - '@visactor/vscale': 1.0.2 + '@visactor/vrender-core': 1.0.0-alpha.7 '@visactor/vutils': 1.0.2 - gifuct-js: 2.1.2 dev: false - /@visactor/vrender-components/0.22.10: - resolution: {integrity: sha512-rfsci9y9AkEp/TCqCs0wpYdmPYqRnViEZ3EF9yiKhuFMExzdO8opga7JPfHJSbGCMoaqU5mWVCiEALsQkFuRQg==} + /@visactor/vrender-components/1.0.0-alpha.7: + resolution: {integrity: sha512-upju8GJOHaqyhktWcJAkAmPjAMNpQFCRaArtYTXY/5LwVs+oPVgL7NJ74QDHMYM/Ut4MVtokmjpK7mjsbQHyyA==} dependencies: - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender-animate': 1.0.0-alpha.7 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vscale': 1.0.2 '@visactor/vutils': 1.0.2 dev: false - /@visactor/vrender-core/0.21.0-alpha.4: - resolution: {integrity: sha512-kZk5HiJSvAfZLb3GZXvRykFWjhTXlpt0i/+e5kU8AoLYt9T15H9xRv/w7jYEe94dBXd+yCVH4soN2Ad4YXQO6g==} - dependencies: - '@visactor/vutils': 1.0.2 - color-convert: 2.0.1 - dev: false - - /@visactor/vrender-core/0.22.10: - resolution: {integrity: sha512-I2+/odcPphPujZtA26S4RG8Yn9BNPt4jlcsbOPwDGP5MvN7oLkWTSMgu4C9r0/lWYvfkwi5JpaoU8lLBZT7e6w==} + /@visactor/vrender-core/1.0.0-alpha.7: + resolution: {integrity: sha512-tx8E9VyU2azmWpEch5uQDztja8/bEOW+Z9PbnbtJf9x0UItShK/A+DHoqXAyZF55vPSDNvft24ytiYEDGK/gcA==} dependencies: '@visactor/vutils': 1.0.2 color-convert: 2.0.1 dev: false - /@visactor/vrender-kits/0.21.0-alpha.4: - resolution: {integrity: sha512-OCFruyiXBjrxDulbRcmphMCzzMFFJK7gN1C25M1YwsM43bKA18olr/0HL7fQt0zQZUcTPmVHDVuOTi55YARVCg==} - dependencies: - '@resvg/resvg-js': 2.4.1 - '@visactor/vrender-core': 0.21.0-alpha.4 - '@visactor/vutils': 1.0.2 - roughjs: 4.5.2 - dev: false - - /@visactor/vrender-kits/0.22.10: - resolution: {integrity: sha512-XjhThrOLvd1m7+o2jKNGKZSSAlHQG4cIm7H6BV2ew9/eQ532Fj8Vd7N17KU8bBnXzPulCmPpnEFj++E4Mnoqpg==} + /@visactor/vrender-kits/1.0.0-alpha.7: + resolution: {integrity: sha512-FZsNwPWfOOvPOPcWZpgm9klNLCSBNDI04UAurtPulhb6MN7h8sr3UQo7TbWs1Xc/bXJQl3ki7h/BWQF971tVhg==} dependencies: '@resvg/resvg-js': 2.4.1 - '@visactor/vrender-core': 0.22.10 + '@visactor/vrender-core': 1.0.0-alpha.7 '@visactor/vutils': 1.0.2 gifuct-js: 2.1.2 lottie-web: 5.12.2 roughjs: 4.5.2 dev: false - /@visactor/vrender/0.22.10: - resolution: {integrity: sha512-YHk/MWJUnsrv2KKOSN1/METsOXC0ejrBS6tmgwTfJJy724gW472qv1vpU87zLHOI8lcNEzREOWddH8cQxlQmFg==} + /@visactor/vrender/1.0.0-alpha.7: + resolution: {integrity: sha512-0VIfw6A9UcfggJJG4zvaqT37wiAWzWoVElox1XEDvQ4iRXYsqDeysjkFGjTYODkOU+uvUf9w9T0IXs3TFmiIeA==} dependencies: - '@visactor/vrender-core': 0.22.10 - '@visactor/vrender-kits': 0.22.10 + '@visactor/vrender-animate': 1.0.0-alpha.7 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 dev: false /@visactor/vscale/1.0.2: @@ -4922,9 +4911,9 @@ packages: resolution: {integrity: sha512-yK33y0RP/K3SNPJMJ3nb6dPyWtBXXJy39RvkJYOa7yqb6c46o+/lP9d1fxdBXDgxNkNuIOPC2pVqyEhOiq3XGw==} dependencies: '@visactor/vdataset': 1.0.2 - '@visactor/vrender-components': 0.21.0-alpha.4 - '@visactor/vrender-core': 0.21.0-alpha.4 - '@visactor/vrender-kits': 0.21.0-alpha.4 + '@visactor/vrender-components': 1.0.0-alpha.7 + '@visactor/vrender-core': 1.0.0-alpha.7 + '@visactor/vrender-kits': 1.0.0-alpha.7 '@visactor/vscale': 1.0.2 '@visactor/vtable-editors': 1.12.0 '@visactor/vutils': 1.0.2 @@ -4955,8 +4944,8 @@ packages: vite: ^4.1.0-beta.0 dependencies: '@babel/core': 7.20.12 - '@babel/plugin-transform-react-jsx-self': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-react-jsx-source': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-self': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-source': 7.27.1_@babel+core@7.20.12 magic-string: 0.27.0 react-refresh: 0.14.2 vite: 3.2.6 @@ -5007,12 +4996,12 @@ packages: resolution: {integrity: sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==} dev: true - /@vue/babel-helper-vue-transform-on/1.2.5: - resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==} + /@vue/babel-helper-vue-transform-on/1.4.0: + resolution: {integrity: sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==} dev: true - /@vue/babel-plugin-jsx/1.2.5_@babel+core@7.20.12: - resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==} + /@vue/babel-plugin-jsx/1.4.0_@babel+core@7.20.12: + resolution: {integrity: sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==} peerDependencies: '@babel/core': ^7.0.0-0 peerDependenciesMeta: @@ -5020,30 +5009,29 @@ packages: optional: true dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx': 7.25.9_@babel+core@7.20.12 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 - '@vue/babel-helper-vue-transform-on': 1.2.5 - '@vue/babel-plugin-resolve-type': 1.2.5_@babel+core@7.20.12 - html-tags: 3.3.1 - svg-tags: 1.0.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1_@babel+core@7.20.12 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + '@vue/babel-helper-vue-transform-on': 1.4.0 + '@vue/babel-plugin-resolve-type': 1.4.0_@babel+core@7.20.12 + '@vue/shared': 3.5.13 transitivePeerDependencies: - supports-color dev: true - /@vue/babel-plugin-resolve-type/1.2.5_@babel+core@7.20.12: - resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==} + /@vue/babel-plugin-resolve-type/1.4.0_@babel+core@7.20.12: + resolution: {integrity: sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/parser': 7.26.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.27.2 '@vue/compiler-sfc': 3.5.13 transitivePeerDependencies: - supports-color @@ -5055,8 +5043,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9_@babel+core@7.20.12 + '@babel/helper-module-imports': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1_@babel+core@7.20.12 '@vue/babel-helper-vue-jsx-merge-props': 1.4.0 html-tags: 2.0.0 lodash.kebabcase: 4.1.1 @@ -5093,7 +5081,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/plugin-syntax-jsx': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-syntax-jsx': 7.27.1_@babel+core@7.20.12 dev: true /@vue/babel-sugar-composition-api-render-instance/1.4.0_@babel+core@7.20.12: @@ -5102,7 +5090,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/plugin-syntax-jsx': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-syntax-jsx': 7.27.1_@babel+core@7.20.12 dev: true /@vue/babel-sugar-functional-vue/1.4.0_@babel+core@7.20.12: @@ -5111,7 +5099,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/plugin-syntax-jsx': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-syntax-jsx': 7.27.1_@babel+core@7.20.12 dev: true /@vue/babel-sugar-inject-h/1.4.0_@babel+core@7.20.12: @@ -5120,7 +5108,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/plugin-syntax-jsx': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-syntax-jsx': 7.27.1_@babel+core@7.20.12 dev: true /@vue/babel-sugar-v-model/1.4.0_@babel+core@7.20.12: @@ -5129,7 +5117,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/plugin-syntax-jsx': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-syntax-jsx': 7.27.1_@babel+core@7.20.12 '@vue/babel-helper-vue-jsx-merge-props': 1.4.0 '@vue/babel-plugin-transform-vue-jsx': 1.4.0_@babel+core@7.20.12 camelcase: 5.3.1 @@ -5145,7 +5133,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/plugin-syntax-jsx': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-syntax-jsx': 7.27.1_@babel+core@7.20.12 '@vue/babel-plugin-transform-vue-jsx': 1.4.0_@babel+core@7.20.12 camelcase: 5.3.1 transitivePeerDependencies: @@ -5155,7 +5143,7 @@ packages: /@vue/compiler-core/3.5.13: resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} dependencies: - '@babel/parser': 7.26.5 + '@babel/parser': 7.27.2 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -5172,14 +5160,14 @@ packages: /@vue/compiler-sfc/3.5.13: resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} dependencies: - '@babel/parser': 7.26.5 + '@babel/parser': 7.27.2 '@vue/compiler-core': 3.5.13 '@vue/compiler-dom': 3.5.13 '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.5.1 + postcss: 8.5.3 source-map-js: 1.2.1 dev: true @@ -5388,12 +5376,12 @@ packages: acorn: 7.4.1 dev: true - /acorn-jsx/5.3.2_acorn@8.14.0: + /acorn-jsx/5.3.2_acorn@8.14.1: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.14.0 + acorn: 8.14.1 /acorn-walk/6.2.0: resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} @@ -5409,7 +5397,7 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} dependencies: - acorn: 8.14.0 + acorn: 8.14.1 /acorn/5.7.4: resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} @@ -5428,8 +5416,8 @@ packages: hasBin: true dev: true - /acorn/8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + /acorn/8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true @@ -5443,7 +5431,7 @@ packages: engines: {node: '>=8.9'} dependencies: loader-utils: 2.0.4 - regex-parser: 2.3.0 + regex-parser: 2.3.1 dev: true /adjust-sourcemap-loader/4.0.0: @@ -5451,7 +5439,7 @@ packages: engines: {node: '>=8.9'} dependencies: loader-utils: 2.0.4 - regex-parser: 2.3.0 + regex-parser: 2.3.1 dev: true /adm-zip/0.4.16: @@ -5823,7 +5811,7 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-array-buffer: 3.0.5 /array-differ/3.0.0: @@ -5861,7 +5849,7 @@ packages: define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-string: 1.1.1 /array-initial/1.1.0: @@ -5927,16 +5915,17 @@ packages: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} - /array.prototype.findlastindex/1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + /array.prototype.findlastindex/1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 dev: true /array.prototype.flat/1.3.3: @@ -5946,7 +5935,7 @@ packages: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 /array.prototype.flatmap/1.3.3: resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} @@ -5955,13 +5944,14 @@ packages: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 - /array.prototype.reduce/1.0.7: - resolution: {integrity: sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==} + /array.prototype.reduce/1.0.8: + resolution: {integrity: sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.23.9 es-array-method-boxes-properly: 1.0.0 @@ -5979,7 +5969,7 @@ packages: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 /arrify/1.0.1: @@ -5999,7 +5989,7 @@ packages: /asn1.js/4.10.1: resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 inherits: 2.0.4 minimalistic-assert: 1.0.1 dev: true @@ -6071,12 +6061,6 @@ packages: async-done: 1.3.2 dev: false - /async/2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - dependencies: - lodash: 4.17.21 - dev: true - /async/3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -6095,8 +6079,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001695 + browserslist: 4.24.5 + caniuse-lite: 1.0.30001717 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -6109,7 +6093,7 @@ packages: hasBin: true dependencies: browserslist: 3.2.8 - caniuse-lite: 1.0.30001695 + caniuse-lite: 1.0.30001717 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 6.0.23 @@ -6121,8 +6105,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001695 + browserslist: 4.24.5 + caniuse-lite: 1.0.30001717 chalk: 2.4.2 normalize-range: 0.1.2 num2fraction: 1.2.2 @@ -6134,8 +6118,8 @@ packages: resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} hasBin: true dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001695 + browserslist: 4.24.5 + caniuse-lite: 1.0.30001717 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -6147,7 +6131,7 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 /aws-sign2/0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} @@ -6157,16 +6141,16 @@ packages: resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} dev: true - /axe-core/4.10.2: - resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} + /axe-core/4.10.3: + resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} dev: true - /axios/1.7.9: - resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + /axios/1.9.0: + resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} dependencies: follow-redirects: 1.15.9 - form-data: 4.0.1 + form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -6250,10 +6234,10 @@ packages: peerDependencies: eslint: '>= 4.12.1' dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.5 - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 eslint: 6.8.0 eslint-visitor-keys: 1.3.0 resolve: 1.22.10 @@ -6268,10 +6252,10 @@ packages: peerDependencies: eslint: '>= 4.12.1' dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.5 - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 eslint: 8.18.0 eslint-visitor-keys: 1.3.0 resolve: 1.22.10 @@ -6424,7 +6408,7 @@ packages: /babel-plugin-import/1.13.6: resolution: {integrity: sha512-N7FYnGh0DFsvDRkAPsvFq/metVfVD7P2h1rokOPpEH4cZbdRHCW+2jbXt0nnuqowkm/xhh2ww1anIdEpfYa7ZA==} dependencies: - '@babel/helper-module-imports': 7.25.9 + '@babel/helper-module-imports': 7.27.1 transitivePeerDependencies: - supports-color dev: false @@ -6433,7 +6417,7 @@ packages: resolution: {integrity: sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==} engines: {node: '>=6'} dependencies: - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 find-up: 3.0.0 istanbul-lib-instrument: 3.3.0 test-exclude: 5.2.3 @@ -6445,7 +6429,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -6458,17 +6442,17 @@ packages: resolution: {integrity: sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==} engines: {node: '>= 6'} dependencies: - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.20.7 dev: true /babel-plugin-jest-hoist/26.6.2: resolution: {integrity: sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 '@types/babel__core': 7.20.0 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.20.7 dev: true /babel-plugin-jsx-attributes-array-to-object/0.3.0: @@ -6494,7 +6478,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.26.5 + '@babel/compat-data': 7.27.2 '@babel/core': 7.20.12 '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 semver: 6.3.1 @@ -6508,7 +6492,7 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 - core-js-compat: 3.40.0 + core-js-compat: 3.42.0 transitivePeerDependencies: - supports-color @@ -6645,7 +6629,7 @@ packages: '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.12 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-syntax-import-attributes': 7.26.0_@babel+core@7.20.12 + '@babel/plugin-syntax-import-attributes': 7.27.1_@babel+core@7.20.12 '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.12 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 @@ -6688,16 +6672,16 @@ packages: '@babel/core': 7.20.12 '@babel/plugin-proposal-class-properties': 7.10.4_@babel+core@7.20.12 '@babel/plugin-proposal-decorators': 7.10.5_@babel+core@7.20.12 - '@babel/plugin-syntax-jsx': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-syntax-jsx': 7.27.1_@babel+core@7.20.12 '@babel/plugin-transform-runtime': 7.11.0_@babel+core@7.20.12 '@babel/preset-env': 7.20.2_@babel+core@7.20.12 '@babel/preset-react': 7.12.13_@babel+core@7.20.12 '@babel/preset-typescript': 7.12.17_@babel+core@7.20.12 '@babel/runtime': 7.17.0 - '@babel/runtime-corejs3': 7.26.0 + '@babel/runtime-corejs3': 7.27.1 '@tarojs/helper': 3.3.17 '@tarojs/taro-h5': 3.3.17 - '@vue/babel-plugin-jsx': 1.2.5_@babel+core@7.20.12 + '@vue/babel-plugin-jsx': 1.4.0_@babel+core@7.20.12 '@vue/babel-preset-jsx': 1.4.0_@babel+core@7.20.12 babel-plugin-dynamic-import-node: 2.3.3 babel-plugin-global-define: 1.0.3 @@ -6705,7 +6689,7 @@ packages: babel-plugin-transform-imports-api: 1.0.0 babel-plugin-transform-react-jsx-to-rn-stylesheet: 3.3.17 babel-plugin-transform-taroapi: 3.3.17 - core-js: 3.40.0 + core-js: 3.42.0 metro-react-native-babel-preset: 0.66.2_@babel+core@7.20.12 react-refresh: 0.9.0 transitivePeerDependencies: @@ -6909,12 +6893,12 @@ packages: resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} dev: true - /bn.js/4.12.1: - resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + /bn.js/4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} dev: true - /bn.js/5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + /bn.js/5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} dev: true /body-parser/1.20.3: @@ -7060,7 +7044,7 @@ packages: resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} engines: {node: '>= 0.10'} dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 randombytes: 2.1.0 safe-buffer: 5.2.1 dev: true @@ -7069,7 +7053,7 @@ packages: resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} engines: {node: '>= 0.12'} dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 browserify-rsa: 4.1.1 create-hash: 1.2.0 create-hmac: 1.1.7 @@ -7091,19 +7075,19 @@ packages: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true dependencies: - caniuse-lite: 1.0.30001695 - electron-to-chromium: 1.5.86 + caniuse-lite: 1.0.30001717 + electron-to-chromium: 1.5.150 dev: true - /browserslist/4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + /browserslist/4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001695 - electron-to-chromium: 1.5.86 + caniuse-lite: 1.0.30001717 + electron-to-chromium: 1.5.150 node-releases: 2.0.19 - update-browserslist-db: 1.1.2_browserslist@4.24.4 + update-browserslist-db: 1.1.3_browserslist@4.24.5 /bs-logger/0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -7299,8 +7283,8 @@ packages: responselike: 1.0.2 dev: true - /call-bind-apply-helpers/1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + /call-bind-apply-helpers/1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 @@ -7310,17 +7294,17 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 - /call-bound/1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + /call-bound/1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.7 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 /call-me-maybe/1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} @@ -7426,8 +7410,8 @@ packages: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: true - /caniuse-lite/1.0.30001695: - resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==} + /caniuse-lite/1.0.30001717: + resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==} /canvas/2.11.2: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} @@ -7435,7 +7419,7 @@ packages: requiresBuild: true dependencies: '@mapbox/node-pre-gyp': 1.0.11 - nan: 2.22.0 + nan: 2.22.2 simple-get: 3.1.1 transitivePeerDependencies: - encoding @@ -8013,11 +7997,11 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} dependencies: - mime-db: 1.53.0 + mime-db: 1.54.0 dev: true - /compression/1.7.5: - resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} + /compression/1.8.0: + resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} engines: {node: '>= 0.8.0'} dependencies: bytes: 3.1.2 @@ -8226,13 +8210,13 @@ packages: webpack-log: 2.0.0 dev: true - /core-js-compat/3.40.0: - resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} + /core-js-compat/3.42.0: + resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==} dependencies: - browserslist: 4.24.4 + browserslist: 4.24.5 - /core-js-pure/3.40.0: - resolution: {integrity: sha512-AtDzVIgRrmRKQai62yuSIN5vNiQjcJakJb4fbhVw3ehxx7Lohphvw9SGNWKhLFqSxC4ilD0g/L1huAYFQU3Q6A==} + /core-js-pure/3.42.0: + resolution: {integrity: sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==} requiresBuild: true dev: true @@ -8242,8 +8226,8 @@ packages: requiresBuild: true dev: true - /core-js/3.40.0: - resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + /core-js/3.42.0: + resolution: {integrity: sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==} requiresBuild: true dev: true @@ -8279,7 +8263,7 @@ packages: engines: {node: '>=8'} dependencies: '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 @@ -8290,7 +8274,7 @@ packages: engines: {node: '>=10'} dependencies: '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 @@ -8313,7 +8297,7 @@ packages: /create-ecdh/4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 elliptic: 6.6.1 dev: true @@ -8701,7 +8685,7 @@ packages: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -8709,7 +8693,7 @@ packages: resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -8717,7 +8701,7 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -8821,6 +8805,19 @@ packages: supports-color: 9.4.0 dev: true + /debug/4.4.0_supports-color@6.1.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 6.1.0 + dev: true + /decamelize-keys/1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -8838,8 +8835,8 @@ packages: engines: {node: '>=10'} dev: true - /decimal.js/10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + /decimal.js/10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} dev: true /decode-uri-component/0.2.2: @@ -9045,8 +9042,8 @@ packages: engines: {node: '>=6'} hasBin: true dependencies: - '@babel/parser': 7.26.5 - '@babel/traverse': 7.26.5 + '@babel/parser': 7.27.2 + '@babel/traverse': 7.27.1 builtin-modules: 3.3.0 deprecate: 1.1.1 deps-regex: 0.1.4 @@ -9106,8 +9103,8 @@ packages: repeating: 2.0.1 dev: true - /detect-libc/2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + /detect-libc/2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} dev: true @@ -9164,7 +9161,7 @@ packages: /diffie-hellman/5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 miller-rabin: 4.0.1 randombytes: 2.1.0 dev: true @@ -9360,7 +9357,7 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 @@ -9431,8 +9428,8 @@ packages: jake: 10.9.2 dev: true - /electron-to-chromium/1.5.86: - resolution: {integrity: sha512-/D7GAAaCRBQFBBcop6SfAAGH37djtpWkOuYhyAajw0l5vsfeSsUQYxaFPwr1c/mC/flARCDdKFo5gpFqNI+18w==} + /electron-to-chromium/1.5.150: + resolution: {integrity: sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==} /electron/11.5.0: resolution: {integrity: sha512-WjNDd6lGpxyiNjE3LhnFCAk/D9GIj1rU3GSDealVShhkkkPR3Vh4q8ErXGDl1OAO/faomVa10KoFPUN/pLbNxg==} @@ -9450,7 +9447,7 @@ packages: /elliptic/6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -9575,7 +9572,7 @@ packages: arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 @@ -9585,7 +9582,7 @@ packages: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -9602,9 +9599,9 @@ packages: is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 - is-weakref: 1.1.0 + is-weakref: 1.1.1 math-intrinsics: 1.1.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 own-keys: 1.0.1 @@ -9621,7 +9618,7 @@ packages: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 /es-array-method-boxes-properly/1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} @@ -9646,12 +9643,13 @@ packages: engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - /es-shim-unscopables/1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + /es-shim-unscopables/1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} dependencies: hasown: 2.0.2 @@ -10033,7 +10031,7 @@ packages: dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 + array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 debug: 3.2.7 @@ -10061,7 +10059,7 @@ packages: dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 + array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 debug: 3.2.7 @@ -10091,7 +10089,7 @@ packages: array-includes: 3.1.8 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.10.2 + axe-core: 4.10.3 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 @@ -10173,7 +10171,7 @@ packages: estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.8 + object.entries: 1.1.9 object.fromentries: 2.0.8 object.hasown: 1.1.4 object.values: 1.2.1 @@ -10196,7 +10194,7 @@ packages: estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.8 + object.entries: 1.1.9 object.fromentries: 2.0.8 object.hasown: 1.1.4 object.values: 1.2.1 @@ -10306,7 +10304,7 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 ajv: 6.12.6 chalk: 2.4.2 cross-spawn: 6.0.6 @@ -10323,7 +10321,7 @@ packages: glob: 7.2.3 globals: 11.12.0 ignore: 4.0.6 - import-fresh: 3.3.0 + import-fresh: 3.3.1 imurmurhash: 0.1.4 inquirer: 6.5.2 js-yaml: 3.14.1 @@ -10352,7 +10350,7 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 ajv: 6.12.6 chalk: 2.4.2 cross-spawn: 6.0.6 @@ -10369,7 +10367,7 @@ packages: glob-parent: 5.1.2 globals: 12.4.0 ignore: 4.0.6 - import-fresh: 3.3.0 + import-fresh: 3.3.1 imurmurhash: 0.1.4 inquirer: 7.3.3 is-glob: 4.0.3 @@ -10419,7 +10417,7 @@ packages: glob-parent: 6.0.2 globals: 13.24.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 js-yaml: 4.1.0 @@ -10468,8 +10466,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2_acorn@8.14.0 + acorn: 8.14.1 + acorn-jsx: 5.3.2_acorn@8.14.1 eslint-visitor-keys: 3.4.3 /esprima/4.0.1: @@ -10751,7 +10749,7 @@ packages: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} engines: {node: '>=0.10.0'} dependencies: - mime-db: 1.53.0 + mime-db: 1.54.0 dev: true /ext-name/5.0.0: @@ -10908,10 +10906,10 @@ packages: resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} dev: true - /fastq/1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + /fastq/1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} dependencies: - reusify: 1.0.4 + reusify: 1.1.0 /faye-websocket/0.10.0: resolution: {integrity: sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==} @@ -11255,7 +11253,7 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 rimraf: 3.0.2 @@ -11268,8 +11266,8 @@ packages: resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} dev: true - /flatted/3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + /flatted/3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} /flush-write-stream/1.1.1: resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} @@ -11306,8 +11304,9 @@ packages: debug: 4.3.4_supports-color@6.1.0 dev: true - /for-each/0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + /for-each/0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} dependencies: is-callable: 1.2.7 @@ -11346,31 +11345,34 @@ packages: mime-types: 2.1.35 dev: true - /form-data/2.5.2: - resolution: {integrity: sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==} + /form-data/2.5.3: + resolution: {integrity: sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==} engines: {node: '>= 0.12'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 mime-types: 2.1.35 safe-buffer: 5.2.1 dev: true - /form-data/3.0.2: - resolution: {integrity: sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==} + /form-data/3.0.3: + resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} engines: {node: '>= 6'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 mime-types: 2.1.35 dev: true - /form-data/4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + /form-data/4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 mime-types: 2.1.35 /forwarded/0.2.0: @@ -11463,7 +11465,7 @@ packages: requiresBuild: true dependencies: bindings: 1.5.0 - nan: 2.22.0 + nan: 2.22.2 optional: true /fsevents/2.1.3: @@ -11500,7 +11502,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -11581,11 +11583,11 @@ packages: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true - /get-intrinsic/1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + /get-intrinsic/1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -11665,9 +11667,9 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 /get-value/2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} @@ -12139,7 +12141,7 @@ packages: resolution: {integrity: sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==} engines: {node: '>=10'} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 '@types/vinyl': 2.0.7 istextorbinary: 3.3.0 replacestream: 4.0.3 @@ -12557,8 +12559,8 @@ packages: toidentifier: 1.0.1 dev: true - /http-parser-js/0.5.9: - resolution: {integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==} + /http-parser-js/0.5.10: + resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} dev: true /http-proxy-agent/4.0.1: @@ -12702,8 +12704,8 @@ packages: resolve-from: 3.0.0 dev: true - /import-fresh/3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + /import-fresh/3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} dependencies: parent-module: 1.0.1 @@ -12962,7 +12964,7 @@ packages: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 dev: true @@ -12971,8 +12973,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 /is-arrayish/0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -12986,7 +12988,7 @@ packages: engines: {node: '>= 0.4'} dependencies: async-function: 1.0.0 - call-bound: 1.0.3 + call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -13010,11 +13012,11 @@ packages: binary-extensions: 2.3.0 dev: true - /is-boolean-object/1.2.1: - resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + /is-boolean-object/1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 /is-buffer/1.1.6: @@ -13065,15 +13067,15 @@ packages: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 /is-date-object/1.1.0: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 /is-decimal/1.0.4: @@ -13144,7 +13146,7 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 /is-finite/1.1.0: resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} @@ -13180,7 +13182,7 @@ packages: resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -13250,7 +13252,7 @@ packages: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 /is-number/2.1.0: @@ -13366,13 +13368,13 @@ packages: /is-reference/1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 /is-regex/1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -13406,7 +13408,7 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 /is-stream/1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} @@ -13422,7 +13424,7 @@ packages: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 /is-supported-regexp-flag/1.0.1: @@ -13434,7 +13436,7 @@ packages: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-symbols: 1.1.0 safe-regex-test: 1.1.0 @@ -13442,7 +13444,7 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 /is-typedarray/1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -13470,18 +13472,18 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - /is-weakref/1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + /is-weakref/1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 /is-weakset/2.0.4: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 /is-what/3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} @@ -13564,10 +13566,10 @@ packages: engines: {node: '>=6'} dependencies: '@babel/generator': 7.21.1 - '@babel/parser': 7.26.5 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 istanbul-lib-coverage: 2.0.5 semver: 6.3.1 transitivePeerDependencies: @@ -13591,7 +13593,7 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.20.12 - '@babel/parser': 7.26.5 + '@babel/parser': 7.27.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -13839,7 +13841,7 @@ packages: jest-validate: 26.6.2 micromatch: 4.0.8 pretty-format: 26.6.2 - ts-node: 10.9.0_jk2urypwexmnq64epyki3pm4ga + ts-node: 10.9.0_y4ydw5z7fjlzrnucxl3mepieeu transitivePeerDependencies: - bufferutil - canvas @@ -13874,7 +13876,7 @@ packages: jest-validate: 26.6.2 micromatch: 4.0.8 pretty-format: 26.6.2 - ts-node: 10.9.0_jk2urypwexmnq64epyki3pm4ga + ts-node: 10.9.0_y4ydw5z7fjlzrnucxl3mepieeu transitivePeerDependencies: - bufferutil - canvas @@ -13979,7 +13981,7 @@ packages: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 jest-mock: 26.6.2 jest-util: 26.6.2 jsdom: 16.7.0 @@ -13997,7 +13999,7 @@ packages: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 jest-mock: 26.6.2 jest-util: 26.6.2 jsdom: 16.7.0_canvas@2.11.2 @@ -14028,7 +14030,7 @@ packages: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 jest-mock: 26.6.2 jest-util: 26.6.2 dev: true @@ -14068,7 +14070,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.9 - '@types/node': 22.10.9 + '@types/node': 22.15.14 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -14087,7 +14089,7 @@ packages: resolution: {integrity: sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==} engines: {node: '>= 6'} dependencies: - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.27.1 '@jest/environment': 24.9.0 '@jest/test-result': 24.9.0 '@jest/types': 24.9.0 @@ -14111,12 +14113,12 @@ packages: resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.27.1 '@jest/environment': 26.6.2 '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 chalk: 4.1.2 co: 4.6.0 expect: 26.6.2 @@ -14141,12 +14143,12 @@ packages: resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.27.1 '@jest/environment': 26.6.2 '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 chalk: 4.1.2 co: 4.6.0 expect: 26.6.2 @@ -14171,12 +14173,12 @@ packages: resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.27.1 '@jest/environment': 26.6.2 '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 chalk: 4.1.2 co: 4.6.0 expect: 26.6.2 @@ -14237,7 +14239,7 @@ packages: resolution: {integrity: sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==} engines: {node: '>= 6'} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@jest/test-result': 24.9.0 '@jest/types': 24.9.0 '@types/stack-utils': 1.0.1 @@ -14251,7 +14253,7 @@ packages: resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@jest/types': 26.6.2 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -14274,7 +14276,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 dev: true /jest-pnp-resolver/1.2.3_jest-resolve@24.9.0: @@ -14380,7 +14382,7 @@ packages: '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 chalk: 4.1.2 emittery: 0.7.2 exit: 0.1.2 @@ -14412,7 +14414,7 @@ packages: '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 chalk: 4.1.2 emittery: 0.7.2 exit: 0.1.2 @@ -14423,7 +14425,7 @@ packages: jest-leak-detector: 26.6.2 jest-message-util: 26.6.2 jest-resolve: 26.6.2 - jest-runtime: 26.6.3_ts-node@10.9.0 + jest-runtime: 26.6.3 jest-util: 26.6.2 jest-worker: 26.6.2 source-map-support: 0.5.21 @@ -14444,7 +14446,7 @@ packages: '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 chalk: 4.1.2 emittery: 0.7.2 exit: 0.1.2 @@ -14455,7 +14457,7 @@ packages: jest-leak-detector: 26.6.2 jest-message-util: 26.6.2 jest-resolve: 26.6.2 - jest-runtime: 26.6.3_xxvpynkn5i4ehycnunrxxsezu4 + jest-runtime: 26.6.3 jest-util: 26.6.2 jest-worker: 26.6.2 source-map-support: 0.5.21 @@ -14629,7 +14631,7 @@ packages: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 graceful-fs: 4.2.11 dev: true @@ -14637,7 +14639,7 @@ packages: resolution: {integrity: sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==} engines: {node: '>= 6'} dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 '@jest/types': 24.9.0 chalk: 2.4.2 expect: 24.9.0 @@ -14656,9 +14658,9 @@ packages: resolution: {integrity: sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 '@jest/types': 26.6.2 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.20.7 '@types/prettier': 2.7.3 chalk: 4.1.2 expect: 26.6.2 @@ -14697,7 +14699,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 chalk: 4.1.2 graceful-fs: 4.2.11 is-ci: 2.0.0 @@ -14734,7 +14736,7 @@ packages: dependencies: '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.10.9 + '@types/node': 22.15.14 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 26.6.2 @@ -14753,7 +14755,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -14858,7 +14860,7 @@ packages: escodegen: 1.14.3 html-encoding-sniffer: 1.0.2 left-pad: 1.3.0 - nwsapi: 2.2.16 + nwsapi: 2.2.20 parse5: 4.0.0 pn: 1.1.0 request: 2.88.2 @@ -14894,7 +14896,7 @@ packages: domexception: 1.0.1 escodegen: 1.14.3 html-encoding-sniffer: 1.0.2 - nwsapi: 2.2.16 + nwsapi: 2.2.20 parse5: 5.1.0 pn: 1.1.0 request: 2.88.2 @@ -14925,20 +14927,20 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.14.0 + acorn: 8.14.1 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 data-urls: 2.0.0 - decimal.js: 10.4.3 + decimal.js: 10.5.0 domexception: 2.0.1 escodegen: 2.1.0 - form-data: 3.0.2 + form-data: 3.0.3 html-encoding-sniffer: 2.0.1 http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.16 + nwsapi: 2.2.20 parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 @@ -14967,21 +14969,21 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.14.0 + acorn: 8.14.1 acorn-globals: 6.0.0 canvas: 2.11.2 cssom: 0.4.4 cssstyle: 2.3.0 data-urls: 2.0.0 - decimal.js: 10.4.3 + decimal.js: 10.5.0 domexception: 2.0.1 escodegen: 2.1.0 - form-data: 3.0.2 + form-data: 3.0.3 html-encoding-sniffer: 2.0.1 http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.16 + nwsapi: 2.2.20 parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 @@ -15393,7 +15395,7 @@ packages: listr2: 4.0.5 micromatch: 4.0.8 normalize-path: 3.0.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 pidtree: 0.5.0 string-argv: 0.3.2 supports-color: 9.4.0 @@ -15420,7 +15422,7 @@ packages: log-update: 4.0.0 p-map: 4.0.0 rfdc: 1.4.1 - rxjs: 7.8.1 + rxjs: 7.8.2 through: 2.3.8 wrap-ansi: 7.0.0 dev: true @@ -15568,6 +15570,7 @@ packages: /lodash.isequal/4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. dev: false /lodash.isfunction/3.0.9: @@ -15765,7 +15768,7 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.6.3 + semver: 7.7.1 dev: true /make-error/1.3.6: @@ -16080,37 +16083,37 @@ packages: '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.12 '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.20.12 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-export-default-from': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-syntax-flow': 7.26.0_@babel+core@7.20.12 + '@babel/plugin-syntax-export-default-from': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-syntax-flow': 7.27.1_@babel+core@7.20.12 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-transform-arrow-functions': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-async-to-generator': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-block-scoping': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-classes': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-computed-properties': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-destructuring': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-exponentiation-operator': 7.26.3_@babel+core@7.20.12 - '@babel/plugin-transform-flow-strip-types': 7.26.5_@babel+core@7.20.12 - '@babel/plugin-transform-for-of': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-function-name': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-literals': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-modules-commonjs': 7.26.3_@babel+core@7.20.12 - '@babel/plugin-transform-object-assign': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-react-display-name': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-react-jsx': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-react-jsx-self': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-react-jsx-source': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-regenerator': 7.25.9_@babel+core@7.20.12 + '@babel/plugin-transform-arrow-functions': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-async-to-generator': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-block-scoping': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-classes': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-computed-properties': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-destructuring': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-exponentiation-operator': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-flow-strip-types': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-for-of': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-function-name': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-literals': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-modules-commonjs': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-object-assign': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-parameters': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-display-name': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-self': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-source': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-regenerator': 7.27.1_@babel+core@7.20.12 '@babel/plugin-transform-runtime': 7.11.0_@babel+core@7.20.12 - '@babel/plugin-transform-shorthand-properties': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-spread': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-sticky-regex': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-template-literals': 7.25.9_@babel+core@7.20.12 - '@babel/plugin-transform-typescript': 7.26.5_@babel+core@7.20.12 - '@babel/plugin-transform-unicode-regex': 7.25.9_@babel+core@7.20.12 - '@babel/template': 7.25.9 + '@babel/plugin-transform-shorthand-properties': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-spread': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-sticky-regex': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-template-literals': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-typescript': 7.27.1_@babel+core@7.20.12 + '@babel/plugin-transform-unicode-regex': 7.27.1_@babel+core@7.20.12 + '@babel/template': 7.27.2 react-refresh: 0.4.3 transitivePeerDependencies: - supports-color @@ -16173,7 +16176,7 @@ packages: resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} hasBin: true dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 brorand: 1.1.0 dev: true @@ -16181,8 +16184,8 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - /mime-db/1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + /mime-db/1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} dev: true @@ -16426,10 +16429,10 @@ packages: /mlly/1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} dependencies: - acorn: 8.14.0 - pathe: 2.0.2 + acorn: 8.14.1 + pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.5.4 + ufo: 1.6.1 dev: true /mobile-detect/1.4.5: @@ -16467,8 +16470,8 @@ packages: yargs-unparser: 2.0.0 dev: true - /module-details-from-path/1.0.3: - resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + /module-details-from-path/1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} dev: true /move-concurrently/1.0.1: @@ -16540,8 +16543,8 @@ packages: thenify-all: 1.6.0 dev: true - /nan/2.22.0: - resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} + /nan/2.22.2: + resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} /nanoid/3.3.1: resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} @@ -16549,8 +16552,8 @@ packages: hasBin: true dev: true - /nanoid/3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + /nanoid/3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -16875,8 +16878,8 @@ packages: resolution: {integrity: sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==} dev: false - /nwsapi/2.2.16: - resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + /nwsapi/2.2.20: + resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} dev: true /oauth-sign/0.9.0: @@ -16895,8 +16898,8 @@ packages: define-property: 0.2.5 kind-of: 3.2.2 - /object-inspect/1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + /object-inspect/1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} /object-is/1.1.6: @@ -16922,7 +16925,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 has-symbols: 1.1.0 @@ -16938,11 +16941,12 @@ packages: isobject: 3.0.1 dev: false - /object.entries/1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + /object.entries/1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -16959,7 +16963,7 @@ packages: resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} engines: {node: '>= 0.8'} dependencies: - array.prototype.reduce: 1.0.7 + array.prototype.reduce: 1.0.8 call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 @@ -17020,7 +17024,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -17086,8 +17090,8 @@ packages: is-wsl: 2.2.0 dev: true - /openinula/0.1.3: - resolution: {integrity: sha512-4jvbnbsLkXQtfGXEHSqMAdqYRyKKLtnn7ch2o9BvN2bL1RGCYXQWKkINHMf5LnoMjlz1NnBbhngj6/CmyvDCqg==} + /openinula/1.0.0: + resolution: {integrity: sha512-cBvWJp/9XEo5B3o62Zo5s0DfE5/hgMZinSeeaXn4/6m/ED4887EbQrxiO7I6i12I2n8ToF5x5ncB45Fn/MS/zw==} engines: {node: '>=0.10.0'} /opn/5.5.0: @@ -17198,7 +17202,7 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -17259,7 +17263,7 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - yocto-queue: 1.1.1 + yocto-queue: 1.2.1 dev: true /p-locate/2.0.0: @@ -17447,7 +17451,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -17611,8 +17615,8 @@ packages: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true - /pathe/2.0.2: - resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + /pathe/2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} dev: true /pathval/1.1.1: @@ -17689,8 +17693,8 @@ packages: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} - /pirates/4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + /pirates/4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} dev: true @@ -17720,7 +17724,7 @@ packages: dependencies: confbox: 0.1.8 mlly: 1.7.4 - pathe: 2.0.2 + pathe: 2.0.3 dev: true /please-upgrade-node/3.2.0: @@ -17773,21 +17777,22 @@ packages: points-on-curve: 0.2.0 dev: false - /portfinder/1.0.32: - resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} - engines: {node: '>= 0.12.0'} + /portfinder/1.0.37_supports-color@6.1.0: + resolution: {integrity: sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==} + engines: {node: '>= 10.12'} dependencies: - async: 2.6.4 - debug: 3.2.7 - mkdirp: 0.5.6 + async: 3.2.6 + debug: 4.4.0_supports-color@6.1.0 + transitivePeerDependencies: + - supports-color dev: true /posix-character-classes/0.1.1: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} - /possible-typed-array-names/1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + /possible-typed-array-names/1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} /postcss-html-transform/3.3.17: @@ -18136,7 +18141,7 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: colorette: 1.4.0 - nanoid: 3.3.8 + nanoid: 3.3.11 source-map-js: 0.6.2 dev: true @@ -18144,15 +18149,15 @@ packages: resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - /postcss/8.5.1: - resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + /postcss/8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 dev: true @@ -18346,7 +18351,7 @@ packages: /public-encrypt/4.0.3: resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 browserify-rsa: 4.1.1 create-hash: 1.2.0 parse-asn1: 5.1.7 @@ -18546,8 +18551,8 @@ packages: react: 18.3.1 scheduler: 0.23.2 - /react-focus-lock/2.13.5_x25zuu6u7xhdvbznsywf7wxevq: - resolution: {integrity: sha512-HjHuZFFk2+j6ZT3LDQpyqffue541HrxUG/OFchCEwis9nstgNg0rREVRAxHBcB1lHJ5Fsxtx1qya/5xFwxDb4g==} + /react-focus-lock/2.13.6_3nlyxfmlf5egaoiyklpqyxqsd4: + resolution: {integrity: sha512-ehylFFWyYtBKXjAO9+3v8d0i+cnc1trGS0vlTGhzFW1vbFXVUTmR8s2tt/ZQG8x5hElg6rhENlLG1H3EZK0Llg==} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -18556,13 +18561,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.17.0 - '@types/react': 18.3.18 + '@types/react': 18.3.21 focus-lock: 1.3.6 prop-types: 15.8.1 react: 18.3.1 react-clientside-effect: 1.2.7_react@18.3.1 - use-callback-ref: 1.3.3_x25zuu6u7xhdvbznsywf7wxevq - use-sidecar: 1.1.3_x25zuu6u7xhdvbznsywf7wxevq + use-callback-ref: 1.3.3_3nlyxfmlf5egaoiyklpqyxqsd4 + use-sidecar: 1.1.3_3nlyxfmlf5egaoiyklpqyxqsd4 dev: false /react-is/16.13.1: @@ -18825,7 +18830,7 @@ packages: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -18852,15 +18857,6 @@ packages: /regenerator-runtime/0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - /regenerator-runtime/0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: true - - /regenerator-transform/0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - dependencies: - '@babel/runtime': 7.17.0 - /regex-cache/0.4.4: resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} engines: {node: '>=0.10.0'} @@ -18875,8 +18871,8 @@ packages: extend-shallow: 3.0.2 safe-regex: 1.1.0 - /regex-parser/2.3.0: - resolution: {integrity: sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==} + /regex-parser/2.3.1: + resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==} dev: true /regexp.prototype.flags/1.5.4: @@ -19349,8 +19345,8 @@ packages: engines: {node: '>= 4'} dev: true - /reusify/1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + /reusify/1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} /rework-visit/1.0.0: @@ -19468,7 +19464,7 @@ packages: rollup: ^2 || ^3 dependencies: filesize: 9.0.11 - module-details-from-path: 1.0.3 + module-details-from-path: 1.0.4 rollup: 3.20.5 dev: true @@ -19478,7 +19474,7 @@ packages: peerDependencies: rollup: ^2.0.0 dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 jest-worker: 26.6.2 rollup: 3.20.5 serialize-javascript: 4.0.0 @@ -19579,8 +19575,8 @@ packages: tslib: 1.14.1 dev: true - /rxjs/7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + /rxjs/7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} dependencies: tslib: 2.3.1 dev: true @@ -19590,8 +19586,8 @@ packages: engines: {node: '>=0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -19612,7 +19608,7 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-regex: 1.2.1 @@ -19825,8 +19821,8 @@ packages: lru-cache: 6.0.0 dev: true - /semver/7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + /semver/7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -19912,7 +19908,7 @@ packages: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -20026,25 +20022,25 @@ packages: engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 /side-channel-map/1.0.1: resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 /side-channel-weakmap/1.0.2: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-map: 1.0.1 /side-channel/1.1.0: @@ -20052,7 +20048,7 @@ packages: engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -20076,8 +20072,8 @@ packages: simple-concat: 1.0.1 dev: true - /simple-statistics/7.8.7: - resolution: {integrity: sha512-ed5FwTNYvkMTfbCai1U+r3symP+lIPKWCqKdudpN4NFNMn9RtDlFtSyAQhCp4oPH0YBjWu/qnW+5q5ZkPB3uHQ==} + /simple-statistics/7.8.8: + resolution: {integrity: sha512-CUtP0+uZbcbsFpqEyvNDYjJCl+612fNgjT8GaVuvMG7tBuJg8gXGpsP5M7X658zy0IcepWOZ6nPBu1Qb9ezA1w==} dev: false /simple-swizzle/0.2.2: @@ -20478,8 +20474,8 @@ packages: engines: {node: '>= 0.8'} dev: true - /std-env/3.8.0: - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + /std-env/3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} dev: true /stealthy-require/1.1.1: @@ -20604,12 +20600,12 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -20622,7 +20618,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.23.9 @@ -20634,7 +20630,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -20786,7 +20782,7 @@ packages: /strip-literal/1.3.0: resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} dependencies: - acorn: 8.14.0 + acorn: 8.14.1 dev: true /strip-outer/1.0.1: @@ -21232,7 +21228,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.14.0 + acorn: 8.14.1 commander: 2.20.3 source-map-support: 0.5.21 @@ -21635,7 +21631,7 @@ packages: typescript: 4.9.5 dev: true - /ts-node/10.9.0_jk2urypwexmnq64epyki3pm4ga: + /ts-node/10.9.0_y4ydw5z7fjlzrnucxl3mepieeu: resolution: {integrity: sha512-bunW18GUyaCSYRev4DPf4SQpom3pWH29wKl0sDk5zE7ze19RImEVhCW7K4v3hHKkUyfWotU08ToE2RS+Y49aug==} hasBin: true peerDependencies: @@ -21654,8 +21650,8 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.10.9 - acorn: 8.14.0 + '@types/node': 22.15.14 + acorn: 8.14.1 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -21812,7 +21808,7 @@ packages: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 @@ -21821,7 +21817,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -21832,7 +21828,7 @@ packages: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -21843,10 +21839,10 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 /typedarray-to-buffer/3.1.5: @@ -21893,8 +21889,8 @@ packages: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} dev: false - /ufo/1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + /ufo/1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} dev: true /uglify-js/3.19.3: @@ -21916,7 +21912,7 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -21953,8 +21949,8 @@ packages: undertaker-registry: 1.0.1 dev: false - /undici-types/6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + /undici-types/6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} /unescape-js/1.1.4: resolution: {integrity: sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==} @@ -22175,13 +22171,13 @@ packages: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} - /update-browserslist-db/1.1.2_browserslist@4.24.4: - resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + /update-browserslist-db/1.1.3_browserslist@4.24.5: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.24.4 + browserslist: 4.24.5 escalade: 3.2.0 picocolors: 1.1.1 @@ -22265,7 +22261,7 @@ packages: qs: 6.14.0 dev: true - /use-callback-ref/1.3.3_x25zuu6u7xhdvbznsywf7wxevq: + /use-callback-ref/1.3.3_3nlyxfmlf5egaoiyklpqyxqsd4: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: @@ -22275,12 +22271,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.18 + '@types/react': 18.3.21 react: 18.3.1 tslib: 2.3.1 dev: false - /use-sidecar/1.1.3_x25zuu6u7xhdvbznsywf7wxevq: + /use-sidecar/1.1.3_3nlyxfmlf5egaoiyklpqyxqsd4: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} peerDependencies: @@ -22290,7 +22286,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.18 + '@types/react': 18.3.21 detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.3.1 @@ -22315,13 +22311,13 @@ packages: engines: {node: '>= 0.8'} dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 - for-each: 0.3.3 - get-intrinsic: 1.2.7 + for-each: 0.3.5 + get-intrinsic: 1.3.0 has-proto: 1.2.0 has-symbols: 1.1.0 object.getownpropertydescriptors: 2.1.8 @@ -22496,7 +22492,7 @@ packages: remove-trailing-separator: 1.1.0 replace-ext: 1.0.1 - /vite-node/0.30.1_fkk6bhjhh7iibig4gssacbnxsa: + /vite-node/0.30.1_ggmxgnkhbkwchgrz3ja2msua5e: resolution: {integrity: sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg==} engines: {node: '>=v14.18.0'} hasBin: true @@ -22506,7 +22502,7 @@ packages: mlly: 1.7.4 pathe: 1.1.2 picocolors: 1.1.1 - vite: 3.2.6_fkk6bhjhh7iibig4gssacbnxsa + vite: 3.2.6_ggmxgnkhbkwchgrz3ja2msua5e transitivePeerDependencies: - '@types/node' - less @@ -22550,7 +22546,7 @@ packages: fsevents: 2.3.3 dev: true - /vite/3.2.6_@types+node@22.10.9: + /vite/3.2.6_@types+node@22.15.14: resolution: {integrity: sha512-nTXTxYVvaQNLoW5BQ8PNNQ3lPia57gzsQU/Khv+JvzKPku8kNZL6NMUR/qwXhMG6E+g1idqEPanomJ+VZgixEg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -22575,7 +22571,7 @@ packages: terser: optional: true dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 esbuild: 0.15.18 postcss: 8.4.21 resolve: 1.22.10 @@ -22584,7 +22580,7 @@ packages: fsevents: 2.3.3 dev: true - /vite/3.2.6_fkk6bhjhh7iibig4gssacbnxsa: + /vite/3.2.6_ggmxgnkhbkwchgrz3ja2msua5e: resolution: {integrity: sha512-nTXTxYVvaQNLoW5BQ8PNNQ3lPia57gzsQU/Khv+JvzKPku8kNZL6NMUR/qwXhMG6E+g1idqEPanomJ+VZgixEg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -22609,7 +22605,7 @@ packages: terser: optional: true dependencies: - '@types/node': 22.10.9 + '@types/node': 22.15.14 esbuild: 0.15.18 less: 4.1.3 postcss: 8.4.21 @@ -22652,14 +22648,14 @@ packages: optional: true dependencies: '@types/chai': 4.3.20 - '@types/chai-subset': 1.3.5 - '@types/node': 22.10.9 + '@types/chai-subset': 1.3.6_@types+chai@4.3.20 + '@types/node': 22.15.14 '@vitest/expect': 0.30.1 '@vitest/runner': 0.30.1 '@vitest/snapshot': 0.30.1 '@vitest/spy': 0.30.1 '@vitest/utils': 0.30.1 - acorn: 8.14.0 + acorn: 8.14.1 acorn-walk: 8.3.4 cac: 6.7.14 chai: 4.5.0 @@ -22670,12 +22666,12 @@ packages: pathe: 1.1.2 picocolors: 1.1.1 source-map: 0.6.1 - std-env: 3.8.0 + std-env: 3.9.0 strip-literal: 1.3.0 tinybench: 2.9.0 tinypool: 0.4.0 - vite: 3.2.6_fkk6bhjhh7iibig4gssacbnxsa - vite-node: 0.30.1_fkk6bhjhh7iibig4gssacbnxsa + vite: 3.2.6_ggmxgnkhbkwchgrz3ja2msua5e + vite-node: 0.30.1_ggmxgnkhbkwchgrz3ja2msua5e why-is-node-running: 2.3.0 transitivePeerDependencies: - less @@ -22696,7 +22692,7 @@ packages: deprecated: The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm. hasBin: true dependencies: - acorn: 8.14.0 + acorn: 8.14.1 acorn-walk: 8.3.4 dev: true @@ -22842,7 +22838,7 @@ packages: ansi-html: 0.0.7 bonjour: 3.5.0 chokidar: 2.1.8 - compression: 1.7.5 + compression: 1.8.0 connect-history-api-fallback: 1.6.0 debug: 4.3.4_supports-color@6.1.0 del: 4.1.1 @@ -22857,7 +22853,7 @@ packages: loglevel: 1.9.2 opn: 5.5.0 p-retry: 3.0.1 - portfinder: 1.0.32 + portfinder: 1.0.37_supports-color@6.1.0 schema-utils: 1.0.0 selfsigned: 1.10.14 semver: 6.3.1 @@ -22946,7 +22942,7 @@ packages: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} engines: {node: '>=0.8.0'} dependencies: - http-parser-js: 0.5.9 + http-parser-js: 0.5.10 safe-buffer: 5.2.1 websocket-extensions: 0.1.4 dev: true @@ -23020,7 +23016,7 @@ packages: engines: {node: '>= 0.4'} dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.1 + is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 @@ -23029,7 +23025,7 @@ packages: resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.1.1 @@ -23037,11 +23033,11 @@ packages: is-finalizationregistry: 1.1.1 is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.1.0 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 /which-collection/1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} @@ -23068,14 +23064,15 @@ packages: path-exists: 3.0.0 dev: true - /which-typed-array/1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + /which-typed-array/1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 - for-each: 0.3.3 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -23438,8 +23435,8 @@ packages: engines: {node: '>=10'} dev: true - /yocto-queue/1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + /yocto-queue/1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} dev: true diff --git a/docs/assets/examples/en/pictogram-chart/pictogram-route.md b/docs/assets/examples/en/pictogram-chart/pictogram-route.md index 7c9c0e89d8..de2dca7e27 100644 --- a/docs/assets/examples/en/pictogram-chart/pictogram-route.md +++ b/docs/assets/examples/en/pictogram-chart/pictogram-route.md @@ -152,10 +152,8 @@ VChart.registerSVG('route', routeSVG); const vchart = new VChart(spec, { dom: CONTAINER_ID }); vchart.renderSync(); - -const people = vchart.getChart()?.getMarkByUserName('people')[0]?.getProduct()?.getGroupGraphicItem(); - -const route = vchart.getChart()?.getMarkByUserName('route')[0]?.getProduct()?.getGroupGraphicItem(); +const people = vchart.getChart()?.getMarkByUserName('people')[0]?.getGraphics()[0]; +const route = vchart.getChart()?.getMarkByUserName('route')[0]?.getGraphics()[0]; const cp = new VRender.CustomPath2D(); cp.fromLine(route); people diff --git a/docs/assets/examples/en/storytelling/bar-oneByOne-rect.md b/docs/assets/examples/en/storytelling/bar-oneByOne-rect.md index 24343d84da..c9c8920155 100644 --- a/docs/assets/examples/en/storytelling/bar-oneByOne-rect.md +++ b/docs/assets/examples/en/storytelling/bar-oneByOne-rect.md @@ -47,8 +47,8 @@ const spec = { animationAppear: { duration: 200, // 每个柱子的动画时长为 100ms delay: (datum, element, ctx, ...args) => { - const { elementIndex } = ctx.VGRAMMAR_ANIMATION_PARAMETERS; - return elementIndex * (200 + 50); // 柱子延迟为 100ms(之前柱子的动画时长)+ 50ms(动画间隔时间) + const { graphicIndex } = graphic.context; + return graphicIndex * (200 + 50); // 柱子延迟为 100ms(之前柱子的动画时长)+ 50ms(动画间隔时间) } }, legends: [{ visible: true, position: 'middle', orient: 'bottom' }], diff --git a/docs/assets/examples/en/vscreen/area-growth.md b/docs/assets/examples/en/vscreen/area-growth.md index b5dfb51f1e..85e47f2433 100644 --- a/docs/assets/examples/en/vscreen/area-growth.md +++ b/docs/assets/examples/en/vscreen/area-growth.md @@ -102,7 +102,7 @@ const spec = { attribute: { stroke: strokeColor, strokeOpacity: 0.8, - lineWidth: args[1].graphicItem.attribute?.lineWidth ?? 1 + lineWidth: args[1].attribute?.lineWidth ?? 1 } }; } @@ -125,19 +125,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); } } ] diff --git a/docs/assets/examples/en/vscreen/area-load.md b/docs/assets/examples/en/vscreen/area-load.md index 3a96ac7d3c..8af962f273 100644 --- a/docs/assets/examples/en/vscreen/area-load.md +++ b/docs/assets/examples/en/vscreen/area-load.md @@ -90,7 +90,7 @@ const spec = { attribute: { stroke: strokeColor, strokeOpacity: 0.8, - lineWidth: args[1].graphicItem.attribute?.lineWidth ?? 1 + lineWidth: args[1].attribute?.lineWidth ?? 1 } }; } @@ -113,19 +113,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); } } ] diff --git a/docs/assets/examples/en/vscreen/bar-highlight.md b/docs/assets/examples/en/vscreen/bar-highlight.md index 855065d654..a606c7eda0 100644 --- a/docs/assets/examples/en/vscreen/bar-highlight.md +++ b/docs/assets/examples/en/vscreen/bar-highlight.md @@ -119,13 +119,15 @@ const spec = { fill: { from: fillColor, to: (...p) => { - return p[1].graphicItem.attribute.fill; + console.log('aaa'); + return p[1].attribute.fill; } }, stroke: { from: strokeColor, to: (...p) => { - return p[1].graphicItem.attribute.fill; + console.log('aaa'); + return p[1].attribute.fill; } } }, diff --git a/docs/assets/examples/en/vscreen/column-parallel-highlight.md b/docs/assets/examples/en/vscreen/column-parallel-highlight.md index 04c7ba4222..0d6172392e 100644 --- a/docs/assets/examples/en/vscreen/column-parallel-highlight.md +++ b/docs/assets/examples/en/vscreen/column-parallel-highlight.md @@ -119,13 +119,13 @@ const spec = { fill: { from: fillColor, to: (...p) => { - return p[1].graphicItem.attribute.fill; + return p[1].attribute.fill; } }, stroke: { from: strokeColor, to: (...p) => { - return p[1].graphicItem.attribute.fill; + return p[1].attribute.fill; } } }, diff --git a/docs/assets/examples/en/vscreen/line-growth.md b/docs/assets/examples/en/vscreen/line-growth.md index c2850e502a..5821c1400b 100644 --- a/docs/assets/examples/en/vscreen/line-growth.md +++ b/docs/assets/examples/en/vscreen/line-growth.md @@ -102,7 +102,7 @@ const spec = { attribute: { stroke: strokeColor, strokeOpacity: 0.8, - lineWidth: args[1].graphicItem.attribute?.lineWidth ?? 1 + lineWidth: args[1].attribute?.lineWidth ?? 1 } }; } @@ -125,19 +125,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); } } ] diff --git a/docs/assets/examples/en/vscreen/line-load.md b/docs/assets/examples/en/vscreen/line-load.md index 7d47702470..a27203c522 100644 --- a/docs/assets/examples/en/vscreen/line-load.md +++ b/docs/assets/examples/en/vscreen/line-load.md @@ -90,7 +90,7 @@ const spec = { attribute: { stroke: strokeColor, strokeOpacity: 0.8, - lineWidth: args[1].graphicItem.attribute?.lineWidth ?? 1 + lineWidth: args[1].attribute?.lineWidth ?? 1 } }; } @@ -113,19 +113,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); } } ] diff --git a/docs/assets/examples/en/vscreen/pie-relocate.md b/docs/assets/examples/en/vscreen/pie-relocate.md index f2c5a3e0ff..ec80952f99 100644 --- a/docs/assets/examples/en/vscreen/pie-relocate.md +++ b/docs/assets/examples/en/vscreen/pie-relocate.md @@ -62,20 +62,20 @@ const spec = { channel: { x: { from: (...p) => { - return p[1].graphicItem.attribute.x; + return p[1].attribute.x; }, to: (...p) => { - const angle = (p[1].graphicItem.attribute.startAngle + p[1].graphicItem.attribute.endAngle) / 2; - return p[1].graphicItem.attribute.x + relocate_offset * Math.cos(angle); + const angle = (p[1].attribute.startAngle + p[1].attribute.endAngle) / 2; + return p[1].attribute.x + relocate_offset * Math.cos(angle); } }, y: { from: (...p) => { - return p[1].graphicItem.attribute.y; + return p[1].attribute.y; }, to: (...p) => { - const angle = (p[1].graphicItem.attribute.startAngle + p[1].graphicItem.attribute.endAngle) / 2; - return p[1].graphicItem.attribute.y + relocate_offset * Math.sin(angle); + const angle = (p[1].attribute.startAngle + p[1].attribute.endAngle) / 2; + return p[1].attribute.y + relocate_offset * Math.sin(angle); } } }, @@ -93,20 +93,20 @@ const spec = { channel: { x: { from: (...p) => { - const angle = (p[1].graphicItem.attribute.startAngle + p[1].graphicItem.attribute.endAngle) / 2; - return p[1].graphicItem.attribute.x + relocate_offset * Math.cos(angle); + const angle = (p[1].attribute.startAngle + p[1].attribute.endAngle) / 2; + return p[1].attribute.x + relocate_offset * Math.cos(angle); }, to: (...p) => { - return p[1].graphicItem.attribute.x; + return p[1].attribute.x; } }, y: { from: (...p) => { - const angle = (p[1].graphicItem.attribute.startAngle + p[1].graphicItem.attribute.endAngle) / 2; - return p[1].graphicItem.attribute.y + relocate_offset * Math.sin(angle); + const angle = (p[1].attribute.startAngle + p[1].attribute.endAngle) / 2; + return p[1].attribute.y + relocate_offset * Math.sin(angle); }, to: (...p) => { - return p[1].graphicItem.attribute.y; + return p[1].attribute.y; } } }, diff --git a/docs/assets/examples/en/vscreen/pie-scale.md b/docs/assets/examples/en/vscreen/pie-scale.md index 83a561a8c8..496fc2e228 100644 --- a/docs/assets/examples/en/vscreen/pie-scale.md +++ b/docs/assets/examples/en/vscreen/pie-scale.md @@ -59,10 +59,10 @@ const spec = { channel: { outerRadius: { from: (...p) => { - return p[1].graphicItem.attribute.outerRadius; + return p[1].attribute.outerRadius; }, to: (...p) => { - return p[1].graphicItem.attribute.outerRadius + 10; + return p[1].attribute.outerRadius + 10; } } }, @@ -80,10 +80,10 @@ const spec = { channel: { outerRadius: { from: (...p) => { - return p[1].graphicItem.attribute.outerRadius + 10; + return p[1].attribute.outerRadius + 10; }, to: (...p) => { - return p[1].graphicItem.attribute.outerRadius; + return p[1].attribute.outerRadius; } } }, diff --git a/docs/assets/examples/en/vscreen/radar-ridial.md b/docs/assets/examples/en/vscreen/radar-ridial.md index efbe2b8cc7..1e6d5570a1 100644 --- a/docs/assets/examples/en/vscreen/radar-ridial.md +++ b/docs/assets/examples/en/vscreen/radar-ridial.md @@ -71,19 +71,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); }, controlOptions: { immediatelyApply: false diff --git a/docs/assets/examples/en/vscreen/scatter-ripple.md b/docs/assets/examples/en/vscreen/scatter-ripple.md index f561bb4337..edb3184d2f 100644 --- a/docs/assets/examples/en/vscreen/scatter-ripple.md +++ b/docs/assets/examples/en/vscreen/scatter-ripple.md @@ -71,7 +71,7 @@ const spec = { direction: 'y', orient: 'negative', point: (...args) => { - const y = args[1].graphicItem.attribute.y; + const y = args[1].attribute.y; const { height } = args[2]; return { y: height - 100 }; } @@ -89,12 +89,12 @@ const spec = { channel: { fillOpacity: { from: (...args) => { - return (args[1].graphicItem.attribute.fillOpacity ?? 1) * 0.5; + return (args[1].attribute.fillOpacity ?? 1) * 0.5; } }, size: { from: (...args) => { - return args[1].graphicItem.attribute.size; + return args[1].attribute.size; } } }, @@ -112,7 +112,7 @@ const spec = { channel: { fill: { from: (...args) => { - return args[1].graphicItem.attribute.fill; + return args[1].attribute.fill; } } }, @@ -135,7 +135,7 @@ const spec = { direction: 'y', orient: 'negative', point: (...args) => { - const y = args[1].graphicItem.attribute.y; + const y = args[1].attribute.y; const { height } = args[2]; return { y: height - 100 }; } @@ -153,12 +153,12 @@ const spec = { channel: { fillOpacity: { from: (...args) => { - return (args[1].graphicItem.attribute.fillOpacity ?? 1) * 0.5; + return (args[1].attribute.fillOpacity ?? 1) * 0.5; } }, size: { from: (...args) => { - return args[1].graphicItem.attribute.size; + return args[1].attribute.size; } } }, @@ -176,7 +176,7 @@ const spec = { channel: { fill: { from: (...args) => { - return args[1].graphicItem.attribute.fill; + return args[1].attribute.fill; } } }, @@ -200,19 +200,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); }, controlOptions: { immediatelyApply: false diff --git a/docs/assets/examples/zh/pictogram-chart/pictogram-route.md b/docs/assets/examples/zh/pictogram-chart/pictogram-route.md index 9191d2b3ca..4d10e51800 100644 --- a/docs/assets/examples/zh/pictogram-chart/pictogram-route.md +++ b/docs/assets/examples/zh/pictogram-chart/pictogram-route.md @@ -153,17 +153,15 @@ VChart.registerSVG('route', routeSVG); const vchart = new VChart(spec, { dom: CONTAINER_ID }); vchart.renderSync(); - -const people = vchart.getChart()?.getMarkByUserName('people')[0]?.getProduct()?.getGroupGraphicItem(); - -const route = vchart.getChart()?.getMarkByUserName('route')[0]?.getProduct()?.getGroupGraphicItem(); +const people = vchart.getChart()?.getMarkByUserName('people')[0]?.getGraphics()[0]; +const route = vchart.getChart()?.getMarkByUserName('route')[0]?.getGraphics()[0]; const cp = new VRender.CustomPath2D(); cp.fromLine(route); people .animate() .wait(2000) .play( - new VRender.MotionPath(null, null, 10000, 'linear', { + new VRenderAnimate.MotionPath(null, null, 10000, 'linear', { path: cp, distance: 1, changeAngle: true, diff --git a/docs/assets/examples/zh/storytelling/bar-oneByOne-rect.md b/docs/assets/examples/zh/storytelling/bar-oneByOne-rect.md index e9f3b6ffd2..598d695fc6 100644 --- a/docs/assets/examples/zh/storytelling/bar-oneByOne-rect.md +++ b/docs/assets/examples/zh/storytelling/bar-oneByOne-rect.md @@ -46,9 +46,9 @@ const spec = { seriesField: 'country', animationAppear: { duration: 200, // 每个柱子的动画时长为 100ms - delay: (datum, element, ctx, ...args) => { - const { elementIndex } = ctx.VGRAMMAR_ANIMATION_PARAMETERS; - return elementIndex * (200 + 50); // 柱子延迟为 100ms(之前柱子的动画时长)+ 50ms(动画间隔时间) + delay: (datum, graphic) => { + const { graphicIndex } = graphic.context; + return graphicIndex * (200 + 50); // 柱子延迟为 100ms(之前柱子的动画时长)+ 50ms(动画间隔时间) } }, legends: [{ visible: true, position: 'middle', orient: 'bottom' }], diff --git a/docs/assets/examples/zh/vscreen/area-growth.md b/docs/assets/examples/zh/vscreen/area-growth.md index 31af86e0e3..0815585f9f 100644 --- a/docs/assets/examples/zh/vscreen/area-growth.md +++ b/docs/assets/examples/zh/vscreen/area-growth.md @@ -102,7 +102,7 @@ const spec = { attribute: { stroke: strokeColor, strokeOpacity: 0.8, - lineWidth: args[1].graphicItem.attribute?.lineWidth ?? 1 + lineWidth: args[1].attribute?.lineWidth ?? 1 } }; } @@ -125,19 +125,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); } } ] diff --git a/docs/assets/examples/zh/vscreen/area-load.md b/docs/assets/examples/zh/vscreen/area-load.md index 18eccf3933..27144d49bc 100644 --- a/docs/assets/examples/zh/vscreen/area-load.md +++ b/docs/assets/examples/zh/vscreen/area-load.md @@ -90,7 +90,7 @@ const spec = { attribute: { stroke: strokeColor, strokeOpacity: 0.8, - lineWidth: args[1].graphicItem.attribute?.lineWidth ?? 1 + lineWidth: args[1].attribute?.lineWidth ?? 1 } }; } @@ -113,19 +113,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); } } ] diff --git a/docs/assets/examples/zh/vscreen/bar-highlight.md b/docs/assets/examples/zh/vscreen/bar-highlight.md index 6c6f4a982d..91ee7d1a94 100644 --- a/docs/assets/examples/zh/vscreen/bar-highlight.md +++ b/docs/assets/examples/zh/vscreen/bar-highlight.md @@ -119,13 +119,15 @@ const spec = { fill: { from: fillColor, to: (...p) => { - return p[1].graphicItem.attribute.fill; + console.log('aaa'); + return p[1].attribute.fill; } }, stroke: { from: strokeColor, to: (...p) => { - return p[1].graphicItem.attribute.fill; + console.log('aaa'); + return p[1].attribute.fill; } } }, diff --git a/docs/assets/examples/zh/vscreen/column-parallel-highlight.md b/docs/assets/examples/zh/vscreen/column-parallel-highlight.md index 30f851f662..776657d374 100644 --- a/docs/assets/examples/zh/vscreen/column-parallel-highlight.md +++ b/docs/assets/examples/zh/vscreen/column-parallel-highlight.md @@ -119,13 +119,13 @@ const spec = { fill: { from: fillColor, to: (...p) => { - return p[1].graphicItem.attribute.fill; + return p[1].getFinalAttribute().fill; } }, stroke: { from: strokeColor, to: (...p) => { - return p[1].graphicItem.attribute.fill; + return p[1].getFinalAttribute().fill; } } }, diff --git a/docs/assets/examples/zh/vscreen/double-axis-load.md b/docs/assets/examples/zh/vscreen/double-axis-load.md index eabcb64a69..f7603e2006 100644 --- a/docs/assets/examples/zh/vscreen/double-axis-load.md +++ b/docs/assets/examples/zh/vscreen/double-axis-load.md @@ -92,6 +92,7 @@ const spec = { to: 0.5 } }, + priority: Infinity, delay: 4000, duration: 800, delayAfter: 2400 @@ -108,11 +109,12 @@ const spec = { controlOptions: { immediatelyApply: false }, + priority: Infinity, type: 'fadeIn', duration: 800, delayAfter: 1600, loop: true, - delay: 800 + delay: 4800 }, { channel: { @@ -125,7 +127,13 @@ const spec = { to: 1 } }, - delay: 1600, + controlOptions: { + immediatelyApply: false + }, + priority: Infinity, + oneByOne: true, + loop: true, + delay: 5600, duration: 800, delayAfter: 800 }, @@ -141,11 +149,12 @@ const spec = { controlOptions: { immediatelyApply: false }, + priority: Infinity, type: 'fadeIn', duration: 800, delayAfter: 0, loop: true, - delay: 2400 + delay: 6400 } ] }, diff --git a/docs/assets/examples/zh/vscreen/line-growth.md b/docs/assets/examples/zh/vscreen/line-growth.md index 17171f87a9..5bb22a6ec0 100644 --- a/docs/assets/examples/zh/vscreen/line-growth.md +++ b/docs/assets/examples/zh/vscreen/line-growth.md @@ -102,7 +102,7 @@ const spec = { attribute: { stroke: strokeColor, strokeOpacity: 0.8, - lineWidth: args[1].graphicItem.attribute?.lineWidth ?? 1 + lineWidth: args[1].attribute?.lineWidth ?? 1 } }; } @@ -125,19 +125,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); } } ] diff --git a/docs/assets/examples/zh/vscreen/line-load.md b/docs/assets/examples/zh/vscreen/line-load.md index ca68061d5f..b4ec66cf11 100644 --- a/docs/assets/examples/zh/vscreen/line-load.md +++ b/docs/assets/examples/zh/vscreen/line-load.md @@ -90,7 +90,7 @@ const spec = { attribute: { stroke: strokeColor, strokeOpacity: 0.8, - lineWidth: args[1].graphicItem.attribute?.lineWidth ?? 1 + lineWidth: args[1].attribute?.lineWidth ?? 1 } }; } @@ -113,19 +113,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); } } ] diff --git a/docs/assets/examples/zh/vscreen/pie-relocate.md b/docs/assets/examples/zh/vscreen/pie-relocate.md index aa47bef1bf..d1d2fbdb8d 100644 --- a/docs/assets/examples/zh/vscreen/pie-relocate.md +++ b/docs/assets/examples/zh/vscreen/pie-relocate.md @@ -62,20 +62,20 @@ const spec = { channel: { x: { from: (...p) => { - return p[1].graphicItem.attribute.x; + return p[1].attribute.x; }, to: (...p) => { - const angle = (p[1].graphicItem.attribute.startAngle + p[1].graphicItem.attribute.endAngle) / 2; - return p[1].graphicItem.attribute.x + relocate_offset * Math.cos(angle); + const angle = (p[1].attribute.startAngle + p[1].attribute.endAngle) / 2; + return p[1].attribute.x + relocate_offset * Math.cos(angle); } }, y: { from: (...p) => { - return p[1].graphicItem.attribute.y; + return p[1].attribute.y; }, to: (...p) => { - const angle = (p[1].graphicItem.attribute.startAngle + p[1].graphicItem.attribute.endAngle) / 2; - return p[1].graphicItem.attribute.y + relocate_offset * Math.sin(angle); + const angle = (p[1].attribute.startAngle + p[1].attribute.endAngle) / 2; + return p[1].attribute.y + relocate_offset * Math.sin(angle); } } }, @@ -93,20 +93,20 @@ const spec = { channel: { x: { from: (...p) => { - const angle = (p[1].graphicItem.attribute.startAngle + p[1].graphicItem.attribute.endAngle) / 2; - return p[1].graphicItem.attribute.x + relocate_offset * Math.cos(angle); + const angle = (p[1].attribute.startAngle + p[1].attribute.endAngle) / 2; + return p[1].attribute.x + relocate_offset * Math.cos(angle); }, to: (...p) => { - return p[1].graphicItem.attribute.x; + return p[1].attribute.x; } }, y: { from: (...p) => { - const angle = (p[1].graphicItem.attribute.startAngle + p[1].graphicItem.attribute.endAngle) / 2; - return p[1].graphicItem.attribute.y + relocate_offset * Math.sin(angle); + const angle = (p[1].attribute.startAngle + p[1].attribute.endAngle) / 2; + return p[1].attribute.y + relocate_offset * Math.sin(angle); }, to: (...p) => { - return p[1].graphicItem.attribute.y; + return p[1].attribute.y; } } }, diff --git a/docs/assets/examples/zh/vscreen/pie-scale.md b/docs/assets/examples/zh/vscreen/pie-scale.md index cd468af3d6..7952f11f36 100644 --- a/docs/assets/examples/zh/vscreen/pie-scale.md +++ b/docs/assets/examples/zh/vscreen/pie-scale.md @@ -59,10 +59,10 @@ const spec = { channel: { outerRadius: { from: (...p) => { - return p[1].graphicItem.attribute.outerRadius; + return p[1].attribute.outerRadius; }, to: (...p) => { - return p[1].graphicItem.attribute.outerRadius + 10; + return p[1].attribute.outerRadius + 10; } } }, @@ -80,10 +80,10 @@ const spec = { channel: { outerRadius: { from: (...p) => { - return p[1].graphicItem.attribute.outerRadius + 10; + return p[1].attribute.outerRadius + 10; }, to: (...p) => { - return p[1].graphicItem.attribute.outerRadius; + return p[1].attribute.outerRadius; } } }, diff --git a/docs/assets/examples/zh/vscreen/radar-ridial.md b/docs/assets/examples/zh/vscreen/radar-ridial.md index 5ff9afe55e..3c96a4631c 100644 --- a/docs/assets/examples/zh/vscreen/radar-ridial.md +++ b/docs/assets/examples/zh/vscreen/radar-ridial.md @@ -71,19 +71,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); }, controlOptions: { immediatelyApply: false diff --git a/docs/assets/examples/zh/vscreen/scatter-ripple.md b/docs/assets/examples/zh/vscreen/scatter-ripple.md index 3ecc063f72..08bbe03b99 100644 --- a/docs/assets/examples/zh/vscreen/scatter-ripple.md +++ b/docs/assets/examples/zh/vscreen/scatter-ripple.md @@ -71,7 +71,7 @@ const spec = { direction: 'y', orient: 'negative', point: (...args) => { - const y = args[1].graphicItem.attribute.y; + const y = args[1].attribute.y; const { height } = args[2]; return { y: height - 100 }; } @@ -89,12 +89,12 @@ const spec = { channel: { fillOpacity: { from: (...args) => { - return (args[1].graphicItem.attribute.fillOpacity ?? 1) * 0.5; + return (args[1].attribute.fillOpacity ?? 1) * 0.5; } }, size: { from: (...args) => { - return args[1].graphicItem.attribute.size; + return args[1].attribute.size; } } }, @@ -112,7 +112,7 @@ const spec = { channel: { fill: { from: (...args) => { - return args[1].graphicItem.attribute.fill; + return args[1].attribute.fill; } } }, @@ -135,7 +135,7 @@ const spec = { direction: 'y', orient: 'negative', point: (...args) => { - const y = args[1].graphicItem.attribute.y; + const y = args[1].attribute.y; const { height } = args[2]; return { y: height - 100 }; } @@ -153,12 +153,12 @@ const spec = { channel: { fillOpacity: { from: (...args) => { - return (args[1].graphicItem.attribute.fillOpacity ?? 1) * 0.5; + return (args[1].attribute.fillOpacity ?? 1) * 0.5; } }, size: { from: (...args) => { - return args[1].graphicItem.attribute.size; + return args[1].attribute.size; } } }, @@ -176,7 +176,7 @@ const spec = { channel: { fill: { from: (...args) => { - return args[1].graphicItem.attribute.fill; + return args[1].attribute.fill; } } }, @@ -200,19 +200,21 @@ const spec = { return { distance: 16, strokeOpacity: 0.00000001, // canvas bug, 待优化 - stroke: args[1].graphicItem.attribute.fill + stroke: args[1].attribute.fill }; } } }, - custom: (ratio, from, to, out) => { - out.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; - out.outerBorder = { + custom: (ratio, from, to, step, graphic) => { + graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity; + graphic.attribute.outerBorder = { distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance, strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity, stroke: to.outerBorder.stroke }; + graphic.addUpdatePositionTag(); + graphic.addUpdateShapeAndBoundsTag(); }, controlOptions: { immediatelyApply: false diff --git a/docs/package.json b/docs/package.json index e42b7230f0..536b7f6763 100644 --- a/docs/package.json +++ b/docs/package.json @@ -19,8 +19,8 @@ "@visactor/vchart-theme": "~1.6.6", "@visactor/vmind": "1.2.4-alpha.5", "@visactor/vutils": "~1.0.2", - "@visactor/vrender": "0.22.10", - "@visactor/vrender-kits": "0.22.10", + "@visactor/vrender": "1.0.0-alpha.7", + "@visactor/vrender-kits": "1.0.0-alpha.7", "@visactor/vtable": "1.12.0", "@visactor/vtable-editors": "1.12.0", "@visactor/vtable-gantt": "1.12.0", diff --git a/packages/openinula-vchart/package.json b/packages/openinula-vchart/package.json index 6135f2c617..a0c5158088 100644 --- a/packages/openinula-vchart/package.json +++ b/packages/openinula-vchart/package.json @@ -30,8 +30,8 @@ "dependencies": { "@visactor/vchart": "workspace:1.13.9", "@visactor/vutils": "~1.0.2", - "@visactor/vrender-core": "0.22.10", - "@visactor/vrender-kits": "0.22.10", + "@visactor/vrender-core": "1.0.0-alpha.7", + "@visactor/vrender-kits": "1.0.0-alpha.7", "react-is": "^18.2.0" }, "devDependencies": { diff --git a/packages/react-vchart/package.json b/packages/react-vchart/package.json index d818af4504..649cd0cced 100644 --- a/packages/react-vchart/package.json +++ b/packages/react-vchart/package.json @@ -30,8 +30,8 @@ "dependencies": { "@visactor/vchart": "workspace:1.13.9", "@visactor/vutils": "~1.0.2", - "@visactor/vrender-core": "0.22.10", - "@visactor/vrender-kits": "0.22.10", + "@visactor/vrender-core": "1.0.0-alpha.7", + "@visactor/vrender-kits": "1.0.0-alpha.7", "react-is": "^18.2.0" }, "devDependencies": { diff --git a/packages/vchart-extension/package.json b/packages/vchart-extension/package.json index 8b5a44c6a2..0fa543bc2c 100644 --- a/packages/vchart-extension/package.json +++ b/packages/vchart-extension/package.json @@ -21,9 +21,9 @@ "start": "ts-node __tests__/runtime/browser/scripts/initVite.ts && vite serve __tests__/runtime/browser" }, "dependencies": { - "@visactor/vrender-core": "0.22.10", - "@visactor/vrender-kits": "0.22.10", - "@visactor/vrender-components": "0.22.10", + "@visactor/vrender-core": "1.0.0-alpha.7", + "@visactor/vrender-kits": "1.0.0-alpha.7", + "@visactor/vrender-components": "1.0.0-alpha.7", "@visactor/vutils": "~1.0.2", "@visactor/vdataset": "~1.0.2", "@visactor/vchart": "workspace:1.13.9" diff --git a/packages/vchart/__tests__/runtime/browser/test-page/animation-area.ts b/packages/vchart/__tests__/runtime/browser/test-page/animation-area.ts new file mode 100644 index 0000000000..5d2615e4ea --- /dev/null +++ b/packages/vchart/__tests__/runtime/browser/test-page/animation-area.ts @@ -0,0 +1,225 @@ +import { isMobile } from 'react-device-detect'; +import type { IAreaChartSpec } from '../../../../src/index'; +// eslint-disable-next-line no-duplicate-imports +import { + default as VChart, + registerMediaQuery, + registerAnimate, + registerCustomAnimate, + registerStateTransition, + registerSequentialAnimate +} from '../../../../src/index'; +registerAnimate(); +registerCustomAnimate(); +registerStateTransition(); +registerSequentialAnimate(); + +let dataArray = [ + { type: 'Nail polish', country: 'Africa', value: 4229 }, + { type: 'Nail polish', country: 'EU', value: 4376 }, + { type: 'Nail polish', country: 'China', value: 3054 }, + { type: 'Nail polish', country: 'USA', value: 12814 }, + { type: 'Eyebrow pencil', country: 'Africa', value: 3932 }, + { type: 'Eyebrow pencil', country: 'EU', value: 3987 }, + { type: 'Eyebrow pencil', country: 'China', value: 5067 }, + { type: 'Eyebrow pencil', country: 'USA', value: 13012 }, + { type: 'Rouge', country: 'Africa', value: 5221 }, + { type: 'Rouge', country: 'EU', value: 3574 }, + { type: 'Rouge', country: 'China', value: 7004 }, + { type: 'Rouge', country: 'USA', value: 11624 }, + { type: 'Lipstick', country: 'Africa', value: 9256 }, + { type: 'Lipstick', country: 'EU', value: 4376 }, + { type: 'Lipstick', country: 'China', value: 9054 }, + { type: 'Lipstick', country: 'USA', value: 8814 }, + { type: 'Eyeshadows', country: 'Africa', value: 3308 }, + { type: 'Eyeshadows', country: 'EU', value: 4572 }, + { type: 'Eyeshadows', country: 'China', value: 12043 }, + { type: 'Eyeshadows', country: 'USA', value: 12998 }, + { type: 'Eyeliner', country: 'Africa', value: 5432 }, + { type: 'Eyeliner', country: 'EU', value: 3417 }, + { type: 'Eyeliner', country: 'China', value: 15067 }, + { type: 'Eyeliner', country: 'USA', value: 12321 }, + { type: 'Foundation', country: 'Africa', value: 13701 }, + { type: 'Foundation', country: 'EU', value: 5231 }, + { type: 'Foundation', country: 'China', value: 10119 }, + { type: 'Foundation', country: 'USA', value: 10342 }, + { type: 'Lip gloss', country: 'Africa', value: 4008 }, + { type: 'Lip gloss', country: 'EU', value: 4572 }, + { type: 'Lip gloss', country: 'China', value: 12043 }, + { type: 'Lip gloss', country: 'USA', value: 22998 }, + { type: 'Mascara', country: 'Africa', value: 18712 }, + { type: 'Mascara', country: 'EU', value: 6134 }, + { type: 'Mascara', country: 'China', value: 10419 }, + { type: 'Mascara', country: 'USA', value: 11261 } +]; + +const direction: string = 'vertical'; + +let spec = { + type: 'area', + data: { + id: 'data0', + values: dataArray + }, + title: { + visible: true, + text: 'Stacked area chart of cosmetic products sales' + }, + direction, + useSequentialAnimation: true, + // stack: true, + xField: direction === 'horizontal' ? 'value' : 'type', + yField: direction === 'horizontal' ? 'type' : 'value', + seriesField: 'country', + legends: [{ visible: true, position: 'middle', orient: 'bottom' }], + crosshair: { + followTooltip: true, + xField: { visible: true, label: { visible: true } }, + yField: { visible: true, label: { visible: true } } + }, + animationAppear: { + duration: 1000 + }, + animationUpdate: { + duration: 1000 + }, + animationEnter: { + duration: 1000 + }, + animationExit: { + duration: 1000, + type: 'fadeOut' + } +}; + +const run = () => { + registerMediaQuery(); + // VChart.ThemeManager.setCurrentTheme('dark'); + const cs = new VChart(spec, { + dom: document.getElementById('chart') as HTMLElement, + mode: isMobile ? 'mobile-browser' : 'desktop-browser', + //theme: 'dark', + onError: err => { + console.error(err); + } + }); + console.time('renderTime'); + + cs.renderAsync().then(() => { + console.timeEnd('renderTime'); + }); + + const button = document.createElement('button'); + button.innerHTML = 'update'; + button.addEventListener('click', () => { + dataArray = dataArray.map(d => ({ ...d, value: 100000 * Math.random() })); + cs.updateData('data0', dataArray); + }); + document.body.appendChild(button); + + const button2 = document.createElement('button'); + button2.innerHTML = 'add&remove'; + button2.addEventListener('click', () => { + const name = Math.random().toString(); + dataArray = dataArray.map(d => ({ + ...d, + value: 100000 * Math.random(), + country: ['EU', 'China', 'USA'].includes(d.country) ? d.country : name + })); + cs.updateData('data0', dataArray); + }); + document.body.appendChild(button2); + + function addData() { + const name = Math.random().toString(); + const newData = dataArray + .filter(d => d.country !== 'EU') + .map(d => ({ + ...d, + value: d.country === 'China' ? 100000 * Math.random() : d.value + })); + const newData2 = dataArray.map(d => ({ + ...d, + value: 100000 * Math.random(), + country: d.country + 'a' + })); + + dataArray = [...newData, ...newData2]; + } + + function removeData() { + dataArray = dataArray.filter(d => ['EU', 'China', 'USA'].includes(d.country)); + } + + const button3 = document.createElement('button'); + button3.innerHTML = 'stack<->group'; + button3.addEventListener('click', () => { + const nextSpec: any = { ...spec }; + const fieldKey = direction === 'horizontal' ? 'yField' : 'xField'; + if (typeof nextSpec[fieldKey] === 'string') { + (nextSpec as any)[fieldKey] = ['type', 'country']; + } else { + (nextSpec as any)[fieldKey] = 'type'; + } + spec = nextSpec; + cs.updateSpec(spec as any); + }); + document.body.appendChild(button3); + + const button4 = document.createElement('button'); + button4.innerHTML = 'stack<->group add'; + button4.addEventListener('click', () => { + const nextSpec: any = { ...spec }; + const fieldKey = direction === 'horizontal' ? 'yField' : 'xField'; + if (typeof nextSpec[fieldKey] === 'string') { + (nextSpec as any)[fieldKey] = ['type', 'country']; + } else { + (nextSpec as any)[fieldKey] = 'type'; + } + addData(); + nextSpec.data = { + id: 'data0', + values: dataArray + }; + spec = nextSpec; + cs.updateSpec(spec as any); + }); + document.body.appendChild(button4); + + const button5 = document.createElement('button'); + button5.innerHTML = 'stack<->group remove'; + button5.addEventListener('click', () => { + const nextSpec: any = { ...spec }; + const fieldKey = direction === 'horizontal' ? 'yField' : 'xField'; + if (typeof nextSpec[fieldKey] === 'string') { + (nextSpec as any)[fieldKey] = ['type', 'country']; + } else { + (nextSpec as any)[fieldKey] = 'type'; + } + removeData(); + nextSpec.data = { + id: 'data0', + values: dataArray + }; + spec = nextSpec; + cs.updateSpec(spec as any); + }); + document.body.appendChild(button5); + const button6 = document.createElement('button'); + button6.innerHTML = 'multiDataChange'; + button6.addEventListener('click', () => { + const nextSpec: any = { ...spec }; + addData(); + nextSpec.data = { + id: 'data0', + values: dataArray + }; + spec = nextSpec; + cs.updateSpec(spec as any); + }); + document.body.appendChild(button6); + + window['vchart'] = cs; + console.log(cs); +}; +run(); diff --git a/packages/vchart/__tests__/runtime/browser/test-page/animation-bar.ts b/packages/vchart/__tests__/runtime/browser/test-page/animation-bar.ts new file mode 100644 index 0000000000..2cb5f82d36 --- /dev/null +++ b/packages/vchart/__tests__/runtime/browser/test-page/animation-bar.ts @@ -0,0 +1,292 @@ +import { isMobile } from 'react-device-detect'; +import type { IAreaChartSpec } from '../../../../src/index'; +// eslint-disable-next-line no-duplicate-imports +import { + default as VChart, + registerMediaQuery, + registerAnimate, + registerCustomAnimate, + registerStateTransition, + registerSequentialAnimate +} from '../../../../src/index'; +registerAnimate(); +registerCustomAnimate(); +registerStateTransition(); +registerSequentialAnimate(); + +let dataArray = [ + { type: 'Nail polish', country: 'Africa', value: 4229 }, + { type: 'Nail polish', country: 'EU', value: 4376 }, + { type: 'Nail polish', country: 'China', value: 3054 }, + { type: 'Nail polish', country: 'USA', value: 12814 }, + { type: 'Eyebrow pencil', country: 'Africa', value: 3932 }, + { type: 'Eyebrow pencil', country: 'EU', value: 3987 }, + { type: 'Eyebrow pencil', country: 'China', value: 5067 }, + { type: 'Eyebrow pencil', country: 'USA', value: 13012 }, + { type: 'Rouge', country: 'Africa', value: 5221 }, + { type: 'Rouge', country: 'EU', value: 3574 }, + { type: 'Rouge', country: 'China', value: 7004 }, + { type: 'Rouge', country: 'USA', value: 11624 }, + { type: 'Lipstick', country: 'Africa', value: 9256 }, + { type: 'Lipstick', country: 'EU', value: 4376 }, + { type: 'Lipstick', country: 'China', value: 9054 }, + { type: 'Lipstick', country: 'USA', value: 8814 }, + { type: 'Eyeshadows', country: 'Africa', value: 3308 }, + { type: 'Eyeshadows', country: 'EU', value: 4572 }, + { type: 'Eyeshadows', country: 'China', value: 12043 }, + { type: 'Eyeshadows', country: 'USA', value: 12998 }, + { type: 'Eyeliner', country: 'Africa', value: 5432 }, + { type: 'Eyeliner', country: 'EU', value: 3417 }, + { type: 'Eyeliner', country: 'China', value: 15067 }, + { type: 'Eyeliner', country: 'USA', value: 12321 }, + { type: 'Foundation', country: 'Africa', value: 13701 }, + { type: 'Foundation', country: 'EU', value: 5231 }, + { type: 'Foundation', country: 'China', value: 10119 }, + { type: 'Foundation', country: 'USA', value: 10342 }, + { type: 'Lip gloss', country: 'Africa', value: 4008 }, + { type: 'Lip gloss', country: 'EU', value: 4572 }, + { type: 'Lip gloss', country: 'China', value: 12043 }, + { type: 'Lip gloss', country: 'USA', value: 22998 }, + { type: 'Mascara', country: 'Africa', value: 18712 }, + { type: 'Mascara', country: 'EU', value: 6134 }, + { type: 'Mascara', country: 'China', value: 10419 }, + { type: 'Mascara', country: 'USA', value: 11261 } +]; + +const direction: string = 'vertical'; + +let spec = { + type: 'bar', + data: { + id: 'data0', + values: dataArray + }, + title: { + visible: true, + text: 'Stacked area chart of cosmetic products sales' + }, + direction, + useSequentialAnimation: true, + // stack: true, + xField: direction === 'horizontal' ? 'value' : 'type', + yField: direction === 'horizontal' ? 'type' : 'value', + seriesField: 'country', + legends: [{ visible: true, position: 'middle', orient: 'bottom' }], + crosshair: { + followTooltip: true, + xField: { visible: true, label: { visible: true } }, + yField: { visible: true, label: { visible: true } } + }, + animationAppear: { + duration: 300 + }, + animationUpdate: { + duration: 300 + }, + animationEnter: { + duration: 300 + }, + animationExit: { + duration: 300 + }, + animationNormal: { + point: [ + { + loop: true, + startTime: 100, + oneByOne: 100, + priority: 1, + timeSlices: [ + { + delay: 1000, + effects: { + channel: { + fillOpacity: { to: 0.5 } + }, + easing: 'linear' + }, + duration: 500 + }, + { + effects: { + channel: { + fillOpacity: { to: 1 } + }, + easing: 'linear' + }, + duration: 500 + } + ] + } + ] + }, + point: { + state: { + hover: { + fill: 'red' + } + }, + style: { + size: 80 + } + }, + axes: [ + { + orient: 'left', + animation: true, + animationAppear: { + duration: 3000 + }, + animationEnter: { + duration: 3000 + }, + animationUpdate: { + duration: 3000 + }, + animationExit: { + duration: 3000 + } + }, + { + orient: 'bottom', + animation: true, + animationAppear: { + duration: 3000 + }, + animationEnter: { + duration: 3000 + }, + animationUpdate: { + duration: 3000 + }, + animationExit: { + duration: 3000 + } + } + ] +}; + +const run = () => { + registerMediaQuery(); + // VChart.ThemeManager.setCurrentTheme('dark'); + const cs = new VChart(spec, { + dom: document.getElementById('chart') as HTMLElement, + mode: isMobile ? 'mobile-browser' : 'desktop-browser', + //theme: 'dark', + onError: err => { + console.error(err); + } + }); + console.time('renderTime'); + + cs.renderAsync().then(() => { + console.timeEnd('renderTime'); + }); + + const button = document.createElement('button'); + button.innerHTML = 'update'; + button.addEventListener('click', () => { + dataArray = dataArray.map(d => ({ ...d, value: 100000 * Math.random() })); + cs.updateData('data0', dataArray); + }); + document.body.appendChild(button); + + const button2 = document.createElement('button'); + button2.innerHTML = 'add&remove'; + button2.addEventListener('click', () => { + const name = Math.random().toString(); + dataArray = dataArray.map(d => ({ + ...d, + value: 100000 * Math.random(), + country: ['EU', 'China', 'USA'].includes(d.country) ? d.country : name + })); + cs.updateData('data0', dataArray); + }); + document.body.appendChild(button2); + + function addData() { + const name = Math.random().toString(); + const newData = dataArray + .filter(d => d.country === 'EU') + .map(d => ({ + ...d, + value: 100000 * Math.random(), + country: name + })); + + dataArray = [...dataArray, ...newData]; + } + + function removeData() { + dataArray = dataArray.filter(d => ['EU', 'China', 'USA'].includes(d.country)); + } + + const button3 = document.createElement('button'); + button3.innerHTML = 'stack<->group'; + button3.addEventListener('click', () => { + const nextSpec: any = { ...spec }; + const fieldKey = direction === 'horizontal' ? 'yField' : 'xField'; + if (typeof nextSpec[fieldKey] === 'string') { + (nextSpec as any)[fieldKey] = ['type', 'country']; + } else { + (nextSpec as any)[fieldKey] = 'type'; + } + spec = nextSpec; + cs.updateSpec(spec as any); + }); + document.body.appendChild(button3); + + const button4 = document.createElement('button'); + button4.innerHTML = 'stack<->group add'; + button4.addEventListener('click', () => { + const nextSpec: any = { ...spec }; + const fieldKey = direction === 'horizontal' ? 'yField' : 'xField'; + if (typeof nextSpec[fieldKey] === 'string') { + (nextSpec as any)[fieldKey] = ['type', 'country']; + } else { + (nextSpec as any)[fieldKey] = 'type'; + } + addData(); + nextSpec.data = { + id: 'data0', + values: dataArray + }; + spec = nextSpec; + cs.updateSpec(spec as any); + }); + document.body.appendChild(button4); + + const button5 = document.createElement('button'); + button5.innerHTML = 'stack<->group remove'; + button5.addEventListener('click', () => { + const nextSpec: any = { ...spec }; + const fieldKey = direction === 'horizontal' ? 'yField' : 'xField'; + if (typeof nextSpec[fieldKey] === 'string') { + (nextSpec as any)[fieldKey] = ['type', 'country']; + } else { + (nextSpec as any)[fieldKey] = 'type'; + } + removeData(); + nextSpec.data = { + id: 'data0', + values: dataArray + }; + spec = nextSpec; + cs.updateSpec(spec as any); + }); + document.body.appendChild(button5); + // const button6 = document.createElement('button'); + // button6.innerHTML = 'direction'; + // button6.addEventListener('click', () => { + // const nextSpec: any = { ...spec }; + // nextSpec.direction = nextSpec.direction === 'horizontal' ? 'vertical' : 'horizontal'; + // [nextSpec.xField, nextSpec.yField] = [nextSpec.yField, nextSpec.xField]; + // spec = nextSpec; + // cs.updateSpec(spec as any); + // }); + // document.body.appendChild(button6); + + window['vchart'] = cs; + console.log(cs); +}; +run(); diff --git a/packages/vchart/__tests__/runtime/browser/test-page/animation-dynamic-bar.ts b/packages/vchart/__tests__/runtime/browser/test-page/animation-dynamic-bar.ts new file mode 100644 index 0000000000..fad092c412 --- /dev/null +++ b/packages/vchart/__tests__/runtime/browser/test-page/animation-dynamic-bar.ts @@ -0,0 +1,296 @@ +import { isMobile } from 'react-device-detect'; +import type { IAreaChartSpec } from '../../../../src/index'; +// eslint-disable-next-line no-duplicate-imports +import { + default as VChart, + registerMediaQuery, + registerAnimate, + registerCustomAnimate, + registerStateTransition, + registerSequentialAnimate +} from '../../../../src/index'; +registerAnimate(); +registerCustomAnimate(); +registerStateTransition(); +registerSequentialAnimate(); + +const goldenMedals = { + 2000: [ + { country: 'USA', value: 37 }, + { country: 'Russia', value: 32 }, + { country: 'China', value: 28 }, + { country: 'Australia', value: 16 }, + { country: 'Germany', value: 13 }, + { country: 'France', value: 13 }, + { country: 'Italy', value: 13 }, + { country: 'Netherlands', value: 12 }, + { country: 'Cuba', value: 11 }, + { country: 'U.K.', value: 11 } + ], + 2004: [ + { country: 'USA', value: 46 }, + { country: 'China', value: 32 }, + { country: 'Russia', value: 28 }, + { country: 'Australia', value: 17 }, + { country: 'Japan', value: 16 }, + { country: 'Germany', value: 13 }, + { country: 'France', value: 11 }, + { country: 'Italy', value: 10 }, + { country: 'South Korea', value: 9 }, + { country: 'U.K.', value: 9 } + ], + 2008: [ + { country: 'China', value: 58 }, + { country: 'USA', value: 36 }, + { country: 'Russia', value: 24 }, + { country: 'U.K.', value: 19 }, + { country: 'Germany', value: 16 }, + { country: 'Australia', value: 14 }, + { country: 'South Korea', value: 13 }, + { country: 'Japan', value: 9 }, + { country: 'Italy', value: 8 }, + { country: 'France', value: 7 } + ], + 2012: [ + { country: 'USA', value: 66 }, + { country: 'China', value: 39 }, + { country: 'U.K.', value: 29 }, + { country: 'Russia', value: 19 }, + { country: 'South Korea', value: 13 }, + { country: 'Germany', value: 11 }, + { country: 'France', value: 11 }, + { country: 'Australia', value: 8 }, + { country: 'Italy', value: 8 }, + { country: 'Hungary', value: 8 } + ], + 2016: [ + { country: 'USA', value: 106 }, + { country: 'U.K.', value: 27 }, + { country: 'China', value: 26 }, + { country: 'Russia', value: 19 }, + { country: 'Germany', value: 17 }, + { country: 'Japan', value: 12 }, + { country: 'France', value: 10 }, + { country: 'South Korea', value: 9 }, + { country: 'Italy', value: 8 }, + { country: 'Australia', value: 8 } + ], + 2020: [ + { country: 'USA', value: 39 }, + { country: 'China', value: 38 }, + { country: 'Japan', value: 27 }, + { country: 'U.K.', value: 22 }, + { country: 'Russian Olympic Committee', value: 20 }, + { country: 'Australia', value: 17 }, + { country: 'Netherlands', value: 10 }, + { country: 'France', value: 10 }, + { country: 'Germany', value: 10 }, + { country: 'Italy', value: 10 } + ] +}; + +const colors = { + China: '#d62728', + USA: '#1664FF', + Russia: '#B2CFFF', + 'U.K.': '#1AC6FF', + Australia: '#94EFFF', + Japan: '#FF8A00', + Cuba: '#FFCE7A', + Germany: '#3CC780', + France: '#B9EDCD', + Italy: '#7442D4', + 'South Korea': '#DDC5FA', + 'Russian Olympic Committee': '#B2CFFF', + Netherlands: '#FFC400', + Hungary: '#FAE878' +}; + +const dataSpecs = Object.keys(goldenMedals).map(year => { + return { + data: [ + { + id: 'id', + values: goldenMedals[year] + .sort((a, b) => b.value - a.value) + .map(v => { + return { ...v, fill: colors[v.country] }; + }) + }, + { + id: 'year', + values: [{ year }] + } + ] + }; +}); +const duration = 1000; +const exchangeDuration = 600; + +const spec = { + type: 'bar', + padding: { + top: 12, + right: 100, + bottom: 12 + }, + data: dataSpecs[0].data, + direction: 'horizontal', + yField: 'country', + xField: 'value', + seriesField: 'country', + bar: { + style: { + fill: datum => datum.fill + } + }, + axes: [ + { + animation: true, + orient: 'bottom', + type: 'linear', + visible: true, + grid: { + visible: true + } + }, + { + animation: true, + id: 'axis-left', + orient: 'left', + width: 130, + tick: { visible: false }, + label: { visible: true }, + type: 'band' + } + ], + title: { + visible: true, + text: 'Top 10 Olympic Gold Medals by Country Since 2000' + }, + animationUpdate: { + bar: [ + { + type: 'update', + options: { excludeChannels: ['y'] }, + easing: 'linear', + duration + }, + { + channel: ['y'], + easing: 'circInOut', + duration: exchangeDuration + } + ], + axis: { + duration: exchangeDuration, + easing: 'circInOut' + } + }, + animationEnter: { + bar: [ + { + type: 'moveIn', + duration: exchangeDuration, + easing: 'circInOut', + options: { + direction: 'y', + orient: 'negative' + } + } + ] + }, + animationExit: { + bar: [ + { + type: 'fadeOut', + duration: exchangeDuration + } + ] + }, + customMark: [ + { + type: 'text', + dataId: 'year', + style: { + textBaseline: 'bottom', + fontSize: 200, + textAlign: 'right', + fontFamily: 'PingFang SC', + fontWeight: 600, + text: datum => datum.year, + x: (datum, ctx) => { + return ctx.vchart.getChart().getCanvasRect()?.width - 50; + }, + y: (datum, ctx) => { + return ctx.vchart.getChart().getCanvasRect()?.height - 50; + }, + fill: 'grey', + fillOpacity: 0.5 + } + } + ], + player: { + type: 'continuous', + orient: 'bottom', + auto: true, + loop: true, + dx: 80, + position: 'middle', + interval: duration, + specs: dataSpecs, + slider: { + railStyle: { + height: 6 + } + }, + controller: { + backward: { + style: { + size: 12 + } + }, + forward: { + style: { + size: 12 + } + }, + start: { + order: 1, + position: 'end' + } + } + } +}; + +const run = () => { + registerMediaQuery(); + // VChart.ThemeManager.setCurrentTheme('dark'); + const cs = new VChart(spec, { + dom: document.getElementById('chart') as HTMLElement, + mode: isMobile ? 'mobile-browser' : 'desktop-browser', + //theme: 'dark', + onError: err => { + console.error(err); + } + }); + console.time('renderTime'); + + cs.renderAsync().then(() => { + console.timeEnd('renderTime'); + }); + // const button6 = document.createElement('button'); + // button6.innerHTML = 'direction'; + // button6.addEventListener('click', () => { + // const nextSpec: any = { ...spec }; + // nextSpec.direction = nextSpec.direction === 'horizontal' ? 'vertical' : 'horizontal'; + // [nextSpec.xField, nextSpec.yField] = [nextSpec.yField, nextSpec.xField]; + // spec = nextSpec; + // cs.updateSpec(spec as any); + // }); + // document.body.appendChild(button6); + + window['vchart'] = cs; + console.log(cs); +}; +run(); diff --git a/packages/vchart/__tests__/runtime/browser/test-page/animation-line.ts b/packages/vchart/__tests__/runtime/browser/test-page/animation-line.ts new file mode 100644 index 0000000000..1b061d789e --- /dev/null +++ b/packages/vchart/__tests__/runtime/browser/test-page/animation-line.ts @@ -0,0 +1,137 @@ +import { isMobile } from 'react-device-detect'; +import type { IAreaChartSpec } from '../../../../src/index'; +// eslint-disable-next-line no-duplicate-imports +import { + default as VChart, + registerMediaQuery, + registerAnimate, + registerCustomAnimate, + registerStateTransition, + registerSequentialAnimate +} from '../../../../src/index'; +registerAnimate(); +registerCustomAnimate(); +registerStateTransition(); +registerSequentialAnimate(); + +const spec = { + type: 'line', + data: { + values: [ + { type: 'Nail polish', country: 'Africa', value: 4229 }, + { type: 'Nail polish', country: 'EU', value: 4376 }, + { type: 'Nail polish', country: 'China', value: 3054 }, + { type: 'Nail polish', country: 'USA', value: 12814 }, + { type: 'Eyebrow pencil', country: 'Africa', value: 3932 }, + { type: 'Eyebrow pencil', country: 'EU', value: 3987 }, + { type: 'Eyebrow pencil', country: 'China', value: 5067 }, + { type: 'Eyebrow pencil', country: 'USA', value: 13012 }, + { type: 'Rouge', country: 'Africa', value: 5221 }, + { type: 'Rouge', country: 'EU', value: 3574 }, + { type: 'Rouge', country: 'China', value: 7004 }, + { type: 'Rouge', country: 'USA', value: 11624 }, + { type: 'Lipstick', country: 'Africa', value: 9256 }, + { type: 'Lipstick', country: 'EU', value: 4376 }, + { type: 'Lipstick', country: 'China', value: 9054 }, + { type: 'Lipstick', country: 'USA', value: 8814 }, + { type: 'Eyeshadows', country: 'Africa', value: 3308 }, + { type: 'Eyeshadows', country: 'EU', value: 4572 }, + { type: 'Eyeshadows', country: 'China', value: 12043 }, + { type: 'Eyeshadows', country: 'USA', value: 12998 }, + { type: 'Eyeliner', country: 'Africa', value: 5432 }, + { type: 'Eyeliner', country: 'EU', value: 3417 }, + { type: 'Eyeliner', country: 'China', value: 15067 }, + { type: 'Eyeliner', country: 'USA', value: 12321 }, + { type: 'Foundation', country: 'Africa', value: 13701 }, + { type: 'Foundation', country: 'EU', value: 5231 }, + { type: 'Foundation', country: 'China', value: 10119 }, + { type: 'Foundation', country: 'USA', value: 10342 }, + { type: 'Lip gloss', country: 'Africa', value: 4008 }, + { type: 'Lip gloss', country: 'EU', value: 4572 }, + { type: 'Lip gloss', country: 'China', value: 12043 }, + { type: 'Lip gloss', country: 'USA', value: 22998 }, + { type: 'Mascara', country: 'Africa', value: 18712 }, + { type: 'Mascara', country: 'EU', value: 6134 }, + { type: 'Mascara', country: 'China', value: 10419 }, + { type: 'Mascara', country: 'USA', value: 11261 } + ].filter(item => item.country === 'USA' || item.country === 'EU') + }, + title: { + visible: true, + text: 'Stacked line chart' + }, + stack: true, + xField: 'type', + yField: 'value', + seriesField: 'country', + line: { + style: { + curveType: 'monotone' + } + }, + point: { + style: { + size: 0, + fill: 'white', + stroke: null, + lineWidth: 2 + }, + state: { + myCustomState: { + size: 10 + } + } + }, + legends: [ + { + visible: true, + position: 'middle', + orient: 'bottom', + item: { shape: { style: { symbolType: 'roundLine' } } } + } + ] +}; + +const run = () => { + registerMediaQuery(); + + // VChart.ThemeManager.setCurrentTheme('dark'); + const cs = new VChart(spec, { + dom: document.getElementById('chart') as HTMLElement, + mode: isMobile ? 'mobile-browser' : 'desktop-browser', + //theme: 'dark', + onError: err => { + console.error(err); + } + }); + console.time('renderTime'); + + cs.renderAsync().then(() => { + console.timeEnd('renderTime'); + }); + + cs.on('dimensionClick', {}, params => { + console.log(params); + cs.updateState({ + myCustomState: { + filter: datum => { + return datum.type === params.dimensionInfo[0]?.value; + } + } + }); + }); + // const button6 = document.createElement('button'); + // button6.innerHTML = 'direction'; + // button6.addEventListener('click', () => { + // const nextSpec: any = { ...spec }; + // nextSpec.direction = nextSpec.direction === 'horizontal' ? 'vertical' : 'horizontal'; + // [nextSpec.xField, nextSpec.yField] = [nextSpec.yField, nextSpec.xField]; + // spec = nextSpec; + // cs.updateSpec(spec as any); + // }); + // document.body.appendChild(button6); + + window['vchart'] = cs; + console.log(cs); +}; +run(); diff --git a/packages/vchart/__tests__/runtime/browser/test-page/animation-performance.ts b/packages/vchart/__tests__/runtime/browser/test-page/animation-performance.ts new file mode 100644 index 0000000000..04e135a5f4 --- /dev/null +++ b/packages/vchart/__tests__/runtime/browser/test-page/animation-performance.ts @@ -0,0 +1,99 @@ +import { isMobile } from 'react-device-detect'; +import type { IAreaChartSpec } from '../../../../src/index'; +// eslint-disable-next-line no-duplicate-imports +import { + default as VChart, + registerMediaQuery, + registerAnimate, + registerCustomAnimate, + registerStateTransition, + registerSequentialAnimate +} from '../../../../src/index'; +registerAnimate(); +registerCustomAnimate(); +registerStateTransition(); +registerSequentialAnimate(); + +const valueList = [ + new Array(10000).fill(0).map((item, index) => ({ x: index, y: Math.random() * 100 })), + new Array(10000).fill(0).map((item, index) => ({ x: index, y: Math.random() * 100 })), + new Array(10000).fill(0).map((item, index) => ({ x: index, y: Math.random() * 100 })), + new Array(10000).fill(0).map((item, index) => ({ x: index, y: Math.random() * 100 })), + new Array(10000).fill(0).map((item, index) => ({ x: index, y: Math.random() * 100 })), + new Array(10000).fill(0).map((item, index) => ({ x: index, y: Math.random() * 100 })), + new Array(10000).fill(0).map((item, index) => ({ x: index, y: Math.random() * 100 })) +]; + +const spec = { + type: 'common', + series: [ + { + type: 'scatter', + xField: 'x', + yField: 'y', + animationThreshold: 10000000000 + } + ], + animation: false, + axes: [ + { + title: { + visible: true, + text: 'Horse Power' + }, + orient: 'left', + range: { min: 0 }, + type: 'linear' + }, + { + title: { + visible: true, + text: 'Miles Per Gallon' + }, + orient: 'bottom', + label: { visible: true }, + type: 'linear' + } + ], + data: [ + { + id: 'data', + values: new Array(10000).fill(0).map((item, index) => ({ x: index, y: Math.random() * 100 })) + } + ] +}; + +const run = () => { + const button = document.createElement('button'); + button.innerHTML = 'create'; + let cs; + button.addEventListener('click', () => { + registerMediaQuery(); + // VChart.ThemeManager.setCurrentTheme('dark'); + cs = new VChart(spec, { + dom: document.getElementById('chart') as HTMLElement, + mode: isMobile ? 'mobile-browser' : 'desktop-browser', + //theme: 'dark', + onError: err => { + console.error(err); + } + }); + console.time('renderTime'); + + cs.renderAsync().then(() => { + console.timeEnd('renderTime'); + }); + + window['vchart'] = cs; + }); + + document.body.appendChild(button); + + const button2 = document.createElement('button'); + button2.innerHTML = 'update'; + button2.addEventListener('click', () => { + cs.updateData('data', valueList[Math.floor(Math.random() * valueList.length)]); + }); + document.body.appendChild(button2); +}; +run(); diff --git a/packages/vchart/__tests__/runtime/browser/test-page/animation-pie.ts b/packages/vchart/__tests__/runtime/browser/test-page/animation-pie.ts new file mode 100644 index 0000000000..32dbe8335f --- /dev/null +++ b/packages/vchart/__tests__/runtime/browser/test-page/animation-pie.ts @@ -0,0 +1,124 @@ +import { isMobile } from 'react-device-detect'; +import type { IAreaChartSpec } from '../../../../src/index'; +// eslint-disable-next-line no-duplicate-imports +import { + default as VChart, + registerMediaQuery, + registerAnimate, + registerCustomAnimate, + registerStateTransition, + registerSequentialAnimate +} from '../../../../src/index'; +registerAnimate(); +registerCustomAnimate(); +registerStateTransition(); +registerSequentialAnimate(); + +let dataArray = [ + { type: 'oxygen', value: '46.60' }, + { type: 'silicon', value: '27.72' }, + { type: 'aluminum', value: '8.13' }, + { type: 'iron', value: '5' } +]; + +const spec = { + type: 'pie', + data: [ + { + id: 'data0', + values: [ + { type: 'oxygen', value: '46.60' }, + { type: 'silicon', value: '27.72' }, + { type: 'aluminum', value: '8.13' } + // { type: 'iron', value: '5' } + ] + } + ], + pie: { + state: { + hover: { + fill: 'red' + } + } + }, + animationAppear: { + duration: 1000 + }, + animationUpdate: { + duration: 300 + }, + animationEnter: { + duration: 1000, + type: 'growAngleIn' + }, + animationExit: { + duration: 1000, + type: 'growAngleOut' + }, + outerRadius: 0.8, + valueField: 'value', + categoryField: 'type', + legends: { + visible: true + }, + label: { + visible: true + } +}; + +const run = () => { + registerMediaQuery(); + // VChart.ThemeManager.setCurrentTheme('dark'); + const cs = new VChart(spec, { + dom: document.getElementById('chart') as HTMLElement, + mode: isMobile ? 'mobile-browser' : 'desktop-browser', + //theme: 'dark', + onError: err => { + console.error(err); + } + }); + console.time('renderTime'); + + cs.renderAsync().then(() => { + console.timeEnd('renderTime'); + }); + + const button = document.createElement('button'); + button.innerHTML = 'update'; + button.addEventListener('click', () => { + dataArray = dataArray.map(d => ({ ...d, value: 100 * Math.random() })); + cs.updateData('data0', dataArray); + }); + document.body.appendChild(button); + + const button2 = document.createElement('button'); + button2.innerHTML = 'add&remove'; + button2.addEventListener('click', () => { + const name = Math.random().toString(); + dataArray = [ + { type: 'oxygen', value: '16.60' }, // update + { type: 'silicon', value: '27.72' }, + // { type: 'aluminum', value: '8.13' }, // remove + { type: 'test', value: '8.13' } // add + // { type: 'iron', value: '5' } + ]; + cs.updateDataSync('data0', dataArray); + }); + document.body.appendChild(button2); + + // document.body.appendChild(button5); + // const button6 = document.createElement('button'); + // button6.innerHTML = 'direction'; + // button6.addEventListener('click', () => { + // const nextSpec: any = { ...spec }; + // nextSpec.direction = nextSpec.direction === 'horizontal' ? 'vertical' : 'horizontal'; + // [nextSpec.xField, nextSpec.yField] = [nextSpec.yField, nextSpec.xField]; + // spec = nextSpec; + // cs.updateSpec(spec as any); + // }); + // document.body.appendChild(button6); + + window['vchart'] = cs; + console.log(cs); +}; +run(); diff --git a/packages/vchart/__tests__/runtime/browser/test-page/animation-scatter.ts b/packages/vchart/__tests__/runtime/browser/test-page/animation-scatter.ts new file mode 100644 index 0000000000..fd1f03588d --- /dev/null +++ b/packages/vchart/__tests__/runtime/browser/test-page/animation-scatter.ts @@ -0,0 +1,203 @@ +import { isMobile } from 'react-device-detect'; +import type { IAreaChartSpec } from '../../../../src/index'; +// eslint-disable-next-line no-duplicate-imports +import { + default as VChart, + registerMediaQuery, + registerAnimate, + registerCustomAnimate, + registerStateTransition, + registerSequentialAnimate +} from '../../../../src/index'; +registerAnimate(); +registerCustomAnimate(); +registerStateTransition(); +registerSequentialAnimate(); + +let dataArray = [ + { type: 'Nail polish', country: 'Africa', value: 4229 }, + { type: 'Nail polish', country: 'EU', value: 4376 }, + { type: 'Nail polish', country: 'China', value: 3054 }, + { type: 'Nail polish', country: 'USA', value: 12814 }, + { type: 'Eyebrow pencil', country: 'Africa', value: 3932 }, + { type: 'Eyebrow pencil', country: 'EU', value: 3987 }, + { type: 'Eyebrow pencil', country: 'China', value: 5067 }, + { type: 'Eyebrow pencil', country: 'USA', value: 13012 }, + { type: 'Rouge', country: 'Africa', value: 5221 }, + { type: 'Rouge', country: 'EU', value: 3574 }, + { type: 'Rouge', country: 'China', value: 7004 }, + { type: 'Rouge', country: 'USA', value: 11624 }, + { type: 'Lipstick', country: 'Africa', value: 9256 }, + { type: 'Lipstick', country: 'EU', value: 4376 }, + { type: 'Lipstick', country: 'China', value: 9054 }, + { type: 'Lipstick', country: 'USA', value: 8814 }, + { type: 'Eyeshadows', country: 'Africa', value: 3308 }, + { type: 'Eyeshadows', country: 'EU', value: 4572 }, + { type: 'Eyeshadows', country: 'China', value: 12043 }, + { type: 'Eyeshadows', country: 'USA', value: 12998 }, + { type: 'Eyeliner', country: 'Africa', value: 5432 }, + { type: 'Eyeliner', country: 'EU', value: 3417 }, + { type: 'Eyeliner', country: 'China', value: 15067 }, + { type: 'Eyeliner', country: 'USA', value: 12321 }, + { type: 'Foundation', country: 'Africa', value: 13701 }, + { type: 'Foundation', country: 'EU', value: 5231 }, + { type: 'Foundation', country: 'China', value: 10119 }, + { type: 'Foundation', country: 'USA', value: 10342 }, + { type: 'Lip gloss', country: 'Africa', value: 4008 }, + { type: 'Lip gloss', country: 'EU', value: 4572 }, + { type: 'Lip gloss', country: 'China', value: 12043 }, + { type: 'Lip gloss', country: 'USA', value: 22998 }, + { type: 'Mascara', country: 'Africa', value: 18712 }, + { type: 'Mascara', country: 'EU', value: 6134 }, + { type: 'Mascara', country: 'China', value: 10419 }, + { type: 'Mascara', country: 'USA', value: 11261 } +]; + +const spec = { + type: 'common', + seriesField: 'color', + data: [ + { + id: 'id0', + values: [ + { x: 'Monday', type: 'breakfast', y: 15 }, + { x: 'Monday', type: 'lunch', y: 25 }, + { x: 'Tuesday', type: 'breakfast', y: 12 }, + { x: 'Tuesday', type: 'lunch', y: 30 }, + { x: 'Wednesday', type: 'breakfast', y: 15 }, + { x: 'Wednesday', type: 'lunch', y: 24 }, + { x: 'Thursday', type: 'breakfast', y: 10 }, + { x: 'Thursday', type: 'lunch', y: 25 }, + { x: 'Friday', type: 'breakfast', y: 13 }, + { x: 'Friday', type: 'lunch', y: 20 }, + { x: 'Saturday', type: 'breakfast', y: 10 }, + { x: 'Saturday', type: 'lunch', y: 22 }, + { x: 'Sunday', type: 'breakfast', y: 12 }, + { x: 'Sunday', type: 'lunch', y: 19 } + ] + }, + { + id: 'id1', + values: [ + { x: 'Monday', type: 'drinks', y: 22 }, + { x: 'Tuesday', type: 'drinks', y: 43 }, + { x: 'Wednesday', type: 'drinks', y: 33 }, + { x: 'Thursday', type: 'drinks', y: 22 }, + { x: 'Friday', type: 'drinks', y: 10 }, + { x: 'Saturday', type: 'drinks', y: 30 }, + { x: 'Sunday', type: 'drinks', y: 46 } + ] + } + ], + series: [ + { + type: 'bar', + dataIndex: 0, + seriesField: 'type', + xField: ['x', 'type'], + yField: 'y' + }, + { + type: 'line', + dataIndex: 1, + seriesField: 'type', + xField: 'x', + yField: 'y', + stack: false, + point: { + style: { + shape: 'star', + angle: 180, + size: 20 + } + }, + animationAppear: { + // 点图元动画配置 + point: { + type: 'rotateIn', + duration: 1000 + }, + // 线图元动画配置 + line: { + duration: 1000, + easing: 'cubicOut' + } + } + } + ], + axes: [{ orient: 'left' }, { orient: 'bottom', label: { visible: true }, type: 'band' }], + legends: { + visible: true, + orient: 'bottom' + } +}; + +const run = () => { + registerMediaQuery(); + // VChart.ThemeManager.setCurrentTheme('dark'); + const cs = new VChart(spec, { + dom: document.getElementById('chart') as HTMLElement, + mode: isMobile ? 'mobile-browser' : 'desktop-browser', + //theme: 'dark', + onError: err => { + console.error(err); + } + }); + console.time('renderTime'); + + cs.renderAsync().then(() => { + console.timeEnd('renderTime'); + }); + + const button = document.createElement('button'); + button.innerHTML = 'update'; + button.addEventListener('click', () => { + dataArray = dataArray.map(d => ({ ...d, value: 100000 * Math.random() })); + cs.updateData('data0', dataArray); + }); + document.body.appendChild(button); + + const button2 = document.createElement('button'); + button2.innerHTML = 'add&remove'; + button2.addEventListener('click', () => { + const name = Math.random().toString(); + dataArray = dataArray.map(d => ({ + ...d, + value: 100000 * Math.random(), + country: ['EU', 'China', 'USA'].includes(d.country) ? d.country : name + })); + cs.updateData('data0', dataArray); + }); + document.body.appendChild(button2); + + function addData() { + const name = Math.random().toString(); + const newData = dataArray + .filter(d => d.country === 'EU') + .map(d => ({ + ...d, + value: 100000 * Math.random(), + country: name + })); + + dataArray = [...dataArray, ...newData]; + } + + function removeData() { + dataArray = dataArray.filter(d => ['EU', 'China', 'USA'].includes(d.country)); + } + // const button6 = document.createElement('button'); + // button6.innerHTML = 'direction'; + // button6.addEventListener('click', () => { + // const nextSpec: any = { ...spec }; + // nextSpec.direction = nextSpec.direction === 'horizontal' ? 'vertical' : 'horizontal'; + // [nextSpec.xField, nextSpec.yField] = [nextSpec.yField, nextSpec.xField]; + // spec = nextSpec; + // cs.updateSpec(spec as any); + // }); + // document.body.appendChild(button6); + + window['vchart'] = cs; + console.log(cs); +}; +run(); diff --git a/packages/vchart/__tests__/runtime/browser/test-page/area.ts b/packages/vchart/__tests__/runtime/browser/test-page/area.ts index d4570bc481..624631d6c6 100644 --- a/packages/vchart/__tests__/runtime/browser/test-page/area.ts +++ b/packages/vchart/__tests__/runtime/browser/test-page/area.ts @@ -1,57 +1,73 @@ import { isMobile } from 'react-device-detect'; import type { IAreaChartSpec } from '../../../../src/index'; // eslint-disable-next-line no-duplicate-imports -import { default as VChart, registerMediaQuery } from '../../../../src/index'; +import { + default as VChart, + registerMediaQuery, + registerAnimate, + registerCustomAnimate, + registerStateTransition +} from '../../../../src/index'; +registerAnimate(); +registerCustomAnimate(); +registerStateTransition(); -const spec: IAreaChartSpec = { - type: 'area', +let dataArray = [ + { type: 'Nail polish', country: 'Africa', value: 4229 }, + { type: 'Nail polish', country: 'EU', value: 4376 }, + { type: 'Nail polish', country: 'China', value: 3054 }, + { type: 'Nail polish', country: 'USA', value: 12814 }, + { type: 'Eyebrow pencil', country: 'Africa', value: 3932 }, + { type: 'Eyebrow pencil', country: 'EU', value: 3987 }, + { type: 'Eyebrow pencil', country: 'China', value: 5067 }, + { type: 'Eyebrow pencil', country: 'USA', value: 13012 }, + { type: 'Rouge', country: 'Africa', value: 5221 }, + { type: 'Rouge', country: 'EU', value: 3574 }, + { type: 'Rouge', country: 'China', value: 7004 }, + { type: 'Rouge', country: 'USA', value: 11624 }, + { type: 'Lipstick', country: 'Africa', value: 9256 }, + { type: 'Lipstick', country: 'EU', value: 4376 }, + { type: 'Lipstick', country: 'China', value: 9054 }, + { type: 'Lipstick', country: 'USA', value: 8814 }, + { type: 'Eyeshadows', country: 'Africa', value: 3308 }, + { type: 'Eyeshadows', country: 'EU', value: 4572 }, + { type: 'Eyeshadows', country: 'China', value: 12043 }, + { type: 'Eyeshadows', country: 'USA', value: 12998 }, + { type: 'Eyeliner', country: 'Africa', value: 5432 }, + { type: 'Eyeliner', country: 'EU', value: 3417 }, + { type: 'Eyeliner', country: 'China', value: 15067 }, + { type: 'Eyeliner', country: 'USA', value: 12321 }, + { type: 'Foundation', country: 'Africa', value: 13701 }, + { type: 'Foundation', country: 'EU', value: 5231 }, + { type: 'Foundation', country: 'China', value: 10119 }, + { type: 'Foundation', country: 'USA', value: 10342 }, + { type: 'Lip gloss', country: 'Africa', value: 4008 }, + { type: 'Lip gloss', country: 'EU', value: 4572 }, + { type: 'Lip gloss', country: 'China', value: 12043 }, + { type: 'Lip gloss', country: 'USA', value: 22998 }, + { type: 'Mascara', country: 'Africa', value: 18712 }, + { type: 'Mascara', country: 'EU', value: 6134 }, + { type: 'Mascara', country: 'China', value: 10419 }, + { type: 'Mascara', country: 'USA', value: 11261 } +]; + +const direction: string = 'vertical'; + +let spec = { + type: 'bar', data: { - values: [ - { type: 'Nail polish', country: 'Africa', value: 4229 }, - { type: 'Nail polish', country: 'EU', value: 4376 }, - { type: 'Nail polish', country: 'China', value: 3054 }, - { type: 'Nail polish', country: 'USA', value: 12814 }, - { type: 'Eyebrow pencil', country: 'Africa', value: 3932 }, - { type: 'Eyebrow pencil', country: 'EU', value: 3987 }, - { type: 'Eyebrow pencil', country: 'China', value: 5067 }, - { type: 'Eyebrow pencil', country: 'USA', value: 13012 }, - { type: 'Rouge', country: 'Africa', value: 5221 }, - { type: 'Rouge', country: 'EU', value: 3574 }, - { type: 'Rouge', country: 'China', value: 7004 }, - { type: 'Rouge', country: 'USA', value: 11624 }, - { type: 'Lipstick', country: 'Africa', value: 9256 }, - { type: 'Lipstick', country: 'EU', value: 4376 }, - { type: 'Lipstick', country: 'China', value: 9054 }, - { type: 'Lipstick', country: 'USA', value: 8814 }, - { type: 'Eyeshadows', country: 'Africa', value: 3308 }, - { type: 'Eyeshadows', country: 'EU', value: 4572 }, - { type: 'Eyeshadows', country: 'China', value: 12043 }, - { type: 'Eyeshadows', country: 'USA', value: 12998 }, - { type: 'Eyeliner', country: 'Africa', value: 5432 }, - { type: 'Eyeliner', country: 'EU', value: 3417 }, - { type: 'Eyeliner', country: 'China', value: 15067 }, - { type: 'Eyeliner', country: 'USA', value: 12321 }, - { type: 'Foundation', country: 'Africa', value: 13701 }, - { type: 'Foundation', country: 'EU', value: 5231 }, - { type: 'Foundation', country: 'China', value: 10119 }, - { type: 'Foundation', country: 'USA', value: 10342 }, - { type: 'Lip gloss', country: 'Africa', value: 4008 }, - { type: 'Lip gloss', country: 'EU', value: 4572 }, - { type: 'Lip gloss', country: 'China', value: 12043 }, - { type: 'Lip gloss', country: 'USA', value: 22998 }, - { type: 'Mascara', country: 'Africa', value: 18712 }, - { type: 'Mascara', country: 'EU', value: 6134 }, - { type: 'Mascara', country: 'China', value: 10419 }, - { type: 'Mascara', country: 'USA', value: 11261 } - ] + id: 'data0', + values: dataArray }, title: { visible: true, text: 'Stacked area chart of cosmetic products sales' }, + direction, + useSequentialAnimation: true, // stack: true, - xField: 'type', - yField: 'value', + xField: direction === 'horizontal' ? 'value' : 'type', + yField: direction === 'horizontal' ? 'type' : 'value', seriesField: 'country', legends: [{ visible: true, position: 'middle', orient: 'bottom' }], crosshair: { @@ -59,49 +75,58 @@ const spec: IAreaChartSpec = { xField: { visible: true, label: { visible: true } }, yField: { visible: true, label: { visible: true } } }, - axes: [ - { - orient: 'bottom', - type: 'band' - }, - { orient: 'left', type: 'linear' }, - { orient: 'right', type: 'linear' } - ], - media: [ - { - query: { - maxWidth: 600 - }, - action: { - filterType: 'legends', - filter: { - visible: true, - orient: 'bottom' - }, - spec: { - visible: false, - test: true - } - } - } - ], - theme: { - series: { - area_stack: { - area: { - style: { - fill: 'red' + animationAppear: { + duration: 300 + }, + animationUpdate: { + duration: 300 + }, + animationEnter: { + duration: 300 + }, + animationExit: { + duration: 300, + type: 'fadeOut' + }, + animationNormal: { + point: [ + { + loop: true, + startTime: 100, + oneByOne: 100, + priority: 1, + timeSlices: [ + { + delay: 1000, + effects: { + channel: { + fillOpacity: { to: 0.5 } + }, + easing: 'linear' + }, + duration: 500 + }, + { + effects: { + channel: { + fillOpacity: { to: 1 } + }, + easing: 'linear' + }, + duration: 500 } - }, - seriesMark: 'line' + ] } - } + ] }, - tooltip: { - trigger: 'click', - hideTimer: 3000, - group: { - triggerMark: ['point'] + point: { + state: { + hover: { + fill: 'red' + } + }, + style: { + size: 80 } } }; @@ -123,6 +148,109 @@ const run = () => { console.timeEnd('renderTime'); }); + const button = document.createElement('button'); + button.innerHTML = 'click'; + button.addEventListener('click', () => { + dataArray = dataArray.map(d => ({ ...d, value: 100000 * Math.random() })); + cs.updateData('data0', dataArray); + }); + document.body.appendChild(button); + + const button2 = document.createElement('button'); + button2.innerHTML = 'add&remove'; + button2.addEventListener('click', () => { + const name = Math.random().toString(); + dataArray = dataArray.map(d => ({ + ...d, + value: 100000 * Math.random(), + country: ['EU', 'China', 'USA'].includes(d.country) ? d.country : name + })); + cs.updateData('data0', dataArray); + }); + document.body.appendChild(button2); + + function addData() { + const name = Math.random().toString(); + const newData = dataArray + .filter(d => d.country === 'EU') + .map(d => ({ + ...d, + value: 100000 * Math.random(), + country: name + })); + + dataArray = [...dataArray, ...newData]; + } + + function removeData() { + dataArray = dataArray.filter(d => ['EU', 'China', 'USA'].includes(d.country)); + } + + const button3 = document.createElement('button'); + button3.innerHTML = 'stack<->group'; + button3.addEventListener('click', () => { + const nextSpec: any = { ...spec }; + const fieldKey = direction === 'horizontal' ? 'yField' : 'xField'; + if (typeof nextSpec[fieldKey] === 'string') { + (nextSpec as any)[fieldKey] = ['type', 'country']; + } else { + (nextSpec as any)[fieldKey] = 'type'; + } + spec = nextSpec; + cs.updateSpec(spec as any); + }); + document.body.appendChild(button3); + + const button4 = document.createElement('button'); + button4.innerHTML = 'stack<->group add'; + button4.addEventListener('click', () => { + const nextSpec: any = { ...spec }; + const fieldKey = direction === 'horizontal' ? 'yField' : 'xField'; + if (typeof nextSpec[fieldKey] === 'string') { + (nextSpec as any)[fieldKey] = ['type', 'country']; + } else { + (nextSpec as any)[fieldKey] = 'type'; + } + addData(); + nextSpec.data = { + id: 'data0', + values: dataArray + }; + spec = nextSpec; + cs.updateSpec(spec as any); + }); + document.body.appendChild(button4); + + const button5 = document.createElement('button'); + button5.innerHTML = 'stack<->group remove'; + button5.addEventListener('click', () => { + const nextSpec: any = { ...spec }; + const fieldKey = direction === 'horizontal' ? 'yField' : 'xField'; + if (typeof nextSpec[fieldKey] === 'string') { + (nextSpec as any)[fieldKey] = ['type', 'country']; + } else { + (nextSpec as any)[fieldKey] = 'type'; + } + removeData(); + nextSpec.data = { + id: 'data0', + values: dataArray + }; + spec = nextSpec; + cs.updateSpec(spec as any); + }); + // document.body.appendChild(button5); + // const button6 = document.createElement('button'); + // button6.innerHTML = 'direction'; + // button6.addEventListener('click', () => { + // const nextSpec: any = { ...spec }; + // nextSpec.direction = nextSpec.direction === 'horizontal' ? 'vertical' : 'horizontal'; + // [nextSpec.xField, nextSpec.yField] = [nextSpec.yField, nextSpec.xField]; + // spec = nextSpec; + // cs.updateSpec(spec as any); + // }); + // document.body.appendChild(button6); + window['vchart'] = cs; console.log(cs); }; diff --git a/packages/vchart/__tests__/runtime/browser/test-page/morph-animate.ts b/packages/vchart/__tests__/runtime/browser/test-page/morph-animate.ts new file mode 100644 index 0000000000..bc2762734e --- /dev/null +++ b/packages/vchart/__tests__/runtime/browser/test-page/morph-animate.ts @@ -0,0 +1,149 @@ +import { isMobile } from 'react-device-detect'; +import type { IAreaChartSpec } from '../../../../src/index'; +// eslint-disable-next-line no-duplicate-imports +import { + default as VChart, + registerMediaQuery, + registerAnimate, + registerCustomAnimate, + registerStateTransition, + registerSequentialAnimate +} from '../../../../src/index'; +registerAnimate(); +registerCustomAnimate(); +registerStateTransition(); +registerSequentialAnimate(); + +// registerMorph(); + +const pieSpec = { + type: 'pie', + data: [ + { + values: [ + { type: '1', value: Math.random() }, + { type: '2', value: Math.random() }, + { type: '3', value: Math.random() } + ] + } + ], + outerRadius: 0.8, + innerRadius: 0.6, + valueField: 'value', + categoryField: 'type', + cornerRadius: 100, + tooltip: false +}; + +const bar = Object.assign({}, pieSpec, { + type: 'bar', + xField: 'type', + yField: 'value', + seriesField: 'type', + bar: { + style: { + fillOpacity: 0.8, + cornerRadius: 100 + } + } +}); +const scatter = Object.assign({}, pieSpec, { + type: 'scatter', + xField: 'type', + yField: 'value', + // seriesField: 'type', + scatter: { + style: { + fillOpacity: 0.8, + cornerRadius: 100, + size: 60 + } + }, + morph: { + enable: true, + morphKey: 'aaa', + morphElementKey: null + } +}); +const line = Object.assign({}, pieSpec, { + type: 'line', + xField: 'type', + yField: 'value', + seriesField: 'type', + scatter: { + style: { + fillOpacity: 0.8, + cornerRadius: 100, + size: 60 + } + } +}); +const area = Object.assign({}, pieSpec, { + type: 'area', + xField: 'type', + yField: 'value', + morph: { + enable: true, + morphKey: 'aaa', + morphElementKey: null + }, + scatter: { + style: { + fillOpacity: 0.8, + cornerRadius: 100, + size: 60 + } + } +}); +const funnel = Object.assign({}, pieSpec, { + type: 'funnel', + categoryField: 'type', + valueField: 'value' +}); +const progress = Object.assign({}, pieSpec, { + type: 'circularProgress', + valueField: 'value', + categoryField: 'type', + seriesField: 'type', + radius: 0.8, + innerRadius: 0.5, + roundCap: true, + cornerRadius: 20, + progress: { + style: { + innerPadding: 5, + outerPadding: 5 + } + } +}); + +const run = () => { + registerMediaQuery(); + + const specs: any[] = [pieSpec, bar, scatter, funnel, progress]; + + // VChart.ThemeManager.setCurrentTheme('dark'); + const cs = new VChart(specs[0], { + dom: document.getElementById('chart') as HTMLElement, + mode: isMobile ? 'mobile-browser' : 'desktop-browser', + //theme: 'dark', + onError: err => { + console.error(err); + } + }); + console.time('renderTime'); + + cs.renderAsync().then(() => { + console.timeEnd('renderTime'); + }); + + let count = 1; + setInterval(() => { + cs.updateSpec(specs[count % specs.length]); + count++; + }, 2000); + + window['vchart'] = cs; + console.log(cs); +}; +run(); diff --git a/packages/vchart/__tests__/runtime/browser/test-page/vscreen-performance.ts b/packages/vchart/__tests__/runtime/browser/test-page/vscreen-performance.ts new file mode 100644 index 0000000000..d906b009c9 --- /dev/null +++ b/packages/vchart/__tests__/runtime/browser/test-page/vscreen-performance.ts @@ -0,0 +1,201 @@ +import { isMobile } from 'react-device-detect'; +import { + default as VChart, + registerMediaQuery, + registerAnimate, + registerCustomAnimate, + registerStateTransition +} from '../../../../src/index'; + +// Register necessary animation modules +registerAnimate(); +registerCustomAnimate(); +registerStateTransition(); + +// Function to generate random data for different chart types +function makeRandomData(dataLen: number) { + const data: Array<{ type: string; value: number }> = []; + for (let i = 0; i < dataLen; i++) { + data.push({ + type: `type${i}`, + value: Math.random() * 100 + }); + } + return data; +} + +// Function to get a chart type based on index +function getChartTypeByIndex(index: number) { + const types = ['bar', 'line', 'scatter', 'pie']; + return types[index % types.length]; +} + +// Function to create chart specifications +function createChartSpec(chartType: string, dataLen: number = 5) { + const spec: any = { + type: chartType, + // animation: false, + background: 'transparent', + padding: 0, + data: [ + { + id: 'data', + values: makeRandomData(dataLen) + } + ], + animationAppear: { + duration: 10000 + } + }; + + const axes = [ + { orient: 'bottom', label: { visible: false }, grid: { visible: false } }, + { orient: 'left', label: { visible: false }, grid: { visible: false } } + ]; + // Add specific properties based on chart type + if (chartType === 'bar') { + spec.xField = 'type'; + spec.yField = 'value'; + spec.axes = axes; + } else if (chartType === 'line') { + spec.xField = 'type'; + spec.yField = 'value'; + spec.axes = axes; + } else if (chartType === 'scatter') { + spec.xField = 'type'; + spec.yField = 'value'; + spec.axes = axes; + } else if (chartType === 'pie') { + spec.valueField = 'value'; + spec.categoryField = 'type'; + } + + return spec; +} + +// Function to run the performance test +const run = () => { + const container = document.getElementById('chartContainer') as HTMLElement; + container.style.display = 'flex'; + container.style.flexWrap = 'wrap'; + container.style.width = '100%'; + container.style.height = '100%'; + document.body.appendChild(container); + + // Create a status display + const statusDisplay = document.createElement('div'); + statusDisplay.style.position = 'fixed'; + statusDisplay.style.top = '50px'; + statusDisplay.style.left = '10px'; + statusDisplay.style.zIndex = '1000'; + statusDisplay.style.backgroundColor = 'rgba(255, 255, 255, 0.8)'; + statusDisplay.style.padding = '5px'; + statusDisplay.style.borderRadius = '5px'; + statusDisplay.innerHTML = 'Ready'; + document.body.appendChild(statusDisplay); + + // Create buttons + const buttonContainer = document.createElement('div'); + buttonContainer.style.position = 'fixed'; + buttonContainer.style.top = '10px'; + buttonContainer.style.left = '300px'; + buttonContainer.style.zIndex = '1000'; + document.body.appendChild(buttonContainer); + + const button = document.createElement('button'); + button.innerHTML = 'Create 300 Charts'; + buttonContainer.appendChild(button); + + const clearButton = document.createElement('button'); + clearButton.innerHTML = 'Clear Charts'; + clearButton.style.marginLeft = '10px'; + buttonContainer.appendChild(clearButton); + + // Store charts for later access + let charts: VChart[] = []; + + // Clear charts and free memory + clearButton.addEventListener('click', () => { + statusDisplay.innerHTML = 'Clearing charts...'; + charts.forEach(chart => { + try { + chart.release(); + } catch (e) { + console.error('Error releasing chart:', e); + } + }); + charts = []; + container.innerHTML = ''; + statusDisplay.innerHTML = 'Charts cleared'; + }); + + // Add event listener to the create button + button.addEventListener('click', () => { + statusDisplay.innerHTML = 'Creating charts...'; + console.time('charts-creation-time'); + + // Clear previous charts if any + charts.forEach(chart => { + try { + chart.release(); + } catch (e) { + console.error('Error releasing chart:', e); + } + }); + charts = []; + container.innerHTML = ''; + + // Create 300 chart containers + for (let i = 0; i < 300; i++) { + const chartContainer = document.createElement('div'); + chartContainer.id = `chart-${i}`; + chartContainer.style.width = '46px'; + chartContainer.style.height = '46px'; + chartContainer.style.margin = '2px'; + container.appendChild(chartContainer); + + // Create chart + const chartType = getChartTypeByIndex(i); + const spec = createChartSpec(chartType); + + registerMediaQuery(); + const chart = new VChart(spec, { + dom: chartContainer, + mode: isMobile ? 'mobile-browser' : 'desktop-browser', + onError: err => { + console.error(`Error in chart ${i}:`, err); + statusDisplay.innerHTML = `Error in chart ${i}: ${err.message || 'Unknown error'}`; + } + }); + + // Store chart reference + charts.push(chart); + } + + // Render all charts + Promise.all( + charts.map(chart => { + // Set performance optimization mode + const stage = chart.getStage(); + if (stage && stage.params && stage.params.optimize) { + stage.params.optimize.tickRenderMode = 'performance'; + } + return chart.renderAsync(); + }) + ) + .then(() => { + console.timeEnd('charts-creation-time'); + console.log('All charts rendered successfully'); + statusDisplay.innerHTML = 'All charts rendered successfully'; + }) + .catch(err => { + console.error('Error rendering charts:', err); + statusDisplay.innerHTML = `Error rendering charts: ${err.message || 'Unknown error'}`; + }); + + // Store charts in window for potential debugging + window['vcharts'] = charts; + }); +}; + +run(); diff --git a/packages/vchart/__tests__/util/factory/chart.ts b/packages/vchart/__tests__/util/factory/chart.ts index 8ab5c5376e..8f7c50e4c9 100644 --- a/packages/vchart/__tests__/util/factory/chart.ts +++ b/packages/vchart/__tests__/util/factory/chart.ts @@ -31,12 +31,16 @@ import { TestRegion } from './region'; import { TestSeries } from './series'; import { DataSet } from '@visactor/vdataset'; import { getTestCompiler } from './compiler'; -import type { IView, IGroupMark } from '@visactor/vgrammar-core'; +// import type { IView, IGroupMark } from '@visactor/vgrammar-core'; import type { IBoundsLike } from '@visactor/vutils'; import type { ITheme } from '../../../src/theme'; import type { LayoutCallBack } from '../../../src/layout/interface'; // eslint-disable-next-line no-duplicate-imports import type { IRegionQuerier } from '../../../src/typings'; + +type IView = any; +type IGroupMark = any; + export class TestChart implements IChart { protected _spec: any; diff --git a/packages/vchart/__tests__/util/factory/region.ts b/packages/vchart/__tests__/util/factory/region.ts index 786db22f55..5ef203576a 100644 --- a/packages/vchart/__tests__/util/factory/region.ts +++ b/packages/vchart/__tests__/util/factory/region.ts @@ -29,18 +29,24 @@ import type { IAnimate } from '../../../src/animation/interface'; import type { ITooltipHelper } from '../../../src/model/tooltip-helper'; import type { StateValue, StateValueType } from '../../../src/compile/mark'; import type { ModelStateManager } from '../../../src/model/model-state-manager'; -import type { - IElement, - IGroupMark as IVGRrammarGroupMark, - IMark as IVGRrammarMark, - IView -} from '@visactor/vgrammar-core'; +// import type { +// IElement, +// IGroupMark as IVGRrammarGroupMark, +// IMark as IVGRrammarMark, +// IView +// } from '@visactor/vgrammar-core'; import type { Compiler } from '../../../src/compile/compiler'; import type { ICompilableData } from '../../../src/compile/data'; import type { IBoundsLike } from '@visactor/vutils'; import type { IGroupMark } from '../../../src/mark/group'; import type { IChart } from '../../../src/chart/interface'; +type IView = any; +type IGroupMark = any; +type IElement = any; +type IVGRrammarGroupMark = any; +type IVGRrammarMark = any; + export class TestRegion implements IRegion { state: ModelStateManager; interaction: IInteraction = { diff --git a/packages/vchart/package.json b/packages/vchart/package.json index 8dbe2a26be..2f2ba113d8 100644 --- a/packages/vchart/package.json +++ b/packages/vchart/package.json @@ -122,9 +122,10 @@ "@visactor/vdataset": "~1.0.2", "@visactor/vscale": "~1.0.2", "@visactor/vlayouts": "~1.0.2", - "@visactor/vrender-core": "0.22.10", - "@visactor/vrender-kits": "0.22.10", - "@visactor/vrender-components": "0.22.10", + "@visactor/vrender-core": "1.0.0-alpha.7", + "@visactor/vrender-kits": "1.0.0-alpha.7", + "@visactor/vrender-components": "1.0.0-alpha.7", + "@visactor/vrender-animate": "1.0.0-alpha.7", "@visactor/vutils-extension": "workspace:1.13.9" }, "publishConfig": { diff --git a/packages/vchart/src/animation/animation-planner.ts b/packages/vchart/src/animation/animation-planner.ts new file mode 100644 index 0000000000..f611d8d1d9 --- /dev/null +++ b/packages/vchart/src/animation/animation-planner.ts @@ -0,0 +1,133 @@ +/** + * 动画规划器,执行一批graphic.applyAnimationState, + * planner和planner之间是串行的 + */ +import type { IMarkGraphic } from '../mark/interface'; +import type { IAnimationConfig } from './interface'; +import type { IGroup } from '@visactor/vrender-core'; + +export class AnimationPlanner { + state: string; + graphics: IMarkGraphic[]; + private config: IAnimationConfig[]; + private beforeExecute?: (graphics: IMarkGraphic[]) => void; + private afterExecute?: (graphics: IMarkGraphic[]) => void; + + /** + * @param state 要应用的动画状态 + * @param graphics 要动画的图形数组 + * @param config 动画配置 + * @param beforeExecute 可选的在执行前调用的函数,用于设置diffAttrs + * @param afterExecute 可选的在执行后调用的函数,用于恢复diffAttrs + */ + constructor( + state: string, + graphics: IMarkGraphic[], + config: IAnimationConfig[], + beforeExecute?: (graphics: IMarkGraphic[]) => void, + afterExecute?: (graphics: IMarkGraphic[]) => void + ) { + this.state = state; + this.graphics = graphics; + this.config = config || []; + this.beforeExecute = beforeExecute; + this.afterExecute = afterExecute; + } + + /** + * 执行动画planner + * @param product 包含图形的组元素 + * @param onComplete 所有动画完成时的回调 + */ + execute(product?: IGroup, onComplete?: () => void): void { + if (!this.graphics.length || !this.config.length) { + onComplete?.(); + return; + } + + // 执行前处理回调,例如设置正确的diffAttrs + if (this.beforeExecute) { + this.beforeExecute(this.graphics); + } + + // 计数完成的动画 + let completedCount = 0; + const totalCount = this.graphics.length; + + // 每个图形的动画完成回调 + const onAnimationComplete = () => { + completedCount++; + if (completedCount >= totalCount) { + // 所有动画完成后执行后处理回调 + if (this.afterExecute) { + this.afterExecute(this.graphics); + } + + onComplete?.(); + } + }; + + this.graphics.forEach(g => { + if (!g) { + completedCount++; + return; + } + + if (this.state === 'exit') { + g.isExiting = true; + } + const animationConfig = + this.config.length > 1 + ? this.config.map(c => ({ + name: this.state, + animation: { ...c, customParameters: g.context } as any + })) + : { + name: this.state, + animation: { ...this.config[0], customParameters: g.context } as any + }; + + g.applyAnimationState([this.state], [animationConfig], onAnimationComplete); + }); + } + + /** + * 一次执行所有图形的动画(在组元素上) + * @param product 包含所有图形的组元素 + * @param onComplete 动画完成时的回调 + */ + executeOnGroup(product: IGroup, onComplete?: () => void): void { + if (!this.graphics.length || !this.config.length || !product) { + onComplete?.(); + return; + } + + // 执行前处理回调 + if (this.beforeExecute) { + this.beforeExecute(this.graphics); + } + + const mainConfig = this.config[0]; + const configArray = [ + { + name: this.state, + animation: { ...mainConfig } as any + } + ]; + + // 使用任何类型断言设置自定义参数函数 + configArray.forEach(config => { + config.animation.customParameters = (data: any, g: IMarkGraphic) => g.context; + }); + + // 对整个组应用动画 + product.applyAnimationState([this.state], configArray, () => { + // 动画完成后执行后处理回调 + if (this.afterExecute) { + this.afterExecute(this.graphics); + } + + onComplete?.(); + }); + } +} diff --git a/packages/vchart/src/animation/config.ts b/packages/vchart/src/animation/config.ts index 03925682b3..1476c69874 100644 --- a/packages/vchart/src/animation/config.ts +++ b/packages/vchart/src/animation/config.ts @@ -1,40 +1,42 @@ /* eslint-disable no-duplicate-imports */ import type { IGraphic } from '@visactor/vrender-core'; -import { TagPointsUpdate, ClipDirectionAnimate } from '@visactor/vrender-core'; +import { + TagPointsUpdate, + ClipDirectionAnimate, + AnimateExecutor, + ScaleIn, + ScaleOut, + FadeIn, + FadeOut, + MoveIn, + MoveOut, + RotateIn, + RotateOut, + Update, + GrowHeightIn, + GrowHeightOut, + GrowWidthIn, + GrowWidthOut, + GrowCenterIn, + GrowCenterOut, + GrowRadiusIn, + GrowRadiusOut, + GrowAngleIn, + GrowAngleOut, + GrowPointsIn, + GrowPointsOut, + GrowPointsXIn, + GrowPointsXOut, + GrowPointsYIn, + GrowPointsYOut, + ClipIn, + ClipOut, + FromTo +} from '@visactor/vrender-animate'; import type { ILineAnimationParams, LineAppearPreset } from '../series/line/interface'; import { linePresetAnimation } from '../series/line/animation'; import type { MarkAnimationSpec, ICartesianGroupAnimationParams } from './interface'; import { Factory } from '../core/factory'; -// import { -// View, -// registerScaleInAnimation, -// registerScaleOutAnimation, -// registerFadeInAnimation, -// registerFadeOutAnimation, -// registerClipInAnimation, -// registerClipOutAnimation, -// registerGrowAngleInAnimation, -// registerGrowAngleOutAnimation, -// registerGrowCenterInAnimation, -// registerGrowCenterOutAnimation, -// registerGrowHeightInAnimation, -// registerGrowHeightOutAnimation, -// registerGrowPointsInAnimation, -// registerGrowPointsOutAnimation, -// registerGrowPointsXInAnimation, -// registerGrowPointsXOutAnimation, -// registerGrowPointsYInAnimation, -// registerGrowPointsYOutAnimation, -// registerGrowRadiusInAnimation, -// registerGrowRadiusOutAnimation, -// registerGrowWidthInAnimation, -// registerGrowWidthOutAnimation, -// registerMoveInAnimation, -// registerMoveOutAnimation, -// registerRotateInAnimation, -// registerRotateOutAnimation, -// registerUpdateAnimation -// } from '@visactor/vgrammar-core'; import { Direction } from '../typings/space'; export const DEFAULT_ANIMATION_CONFIG = { @@ -152,53 +154,46 @@ export const registerAreaAnimation = () => { Factory.registerAnimation('area', lineOrAreaAnimation); }; -export const registerVGrammarCommonAnimation = () => { - // View.useRegisters([ - // registerScaleInAnimation, - // registerScaleOutAnimation, - // registerFadeInAnimation, - // registerFadeOutAnimation, - // registerMoveInAnimation, - // registerMoveOutAnimation, - // registerRotateInAnimation, - // registerRotateOutAnimation, - // registerUpdateAnimation - // ]); +export const registerBuiltInAnimation = () => { + AnimateExecutor.registerBuiltInAnimate('scaleIn', ScaleIn); + AnimateExecutor.registerBuiltInAnimate('scaleOut', ScaleOut); + AnimateExecutor.registerBuiltInAnimate('fadeIn', FadeIn); + AnimateExecutor.registerBuiltInAnimate('fadeOut', FadeOut); + AnimateExecutor.registerBuiltInAnimate('moveIn', MoveIn); + AnimateExecutor.registerBuiltInAnimate('moveOut', MoveOut); + AnimateExecutor.registerBuiltInAnimate('rotateIn', RotateIn); + AnimateExecutor.registerBuiltInAnimate('rotateOut', RotateOut); + AnimateExecutor.registerBuiltInAnimate('update', Update); + AnimateExecutor.registerBuiltInAnimate('fromTo', FromTo); }; -export const registerVGrammarRectAnimation = () => { - // View.useRegisters([ - // registerGrowHeightInAnimation, - // registerGrowHeightOutAnimation, - // registerGrowWidthInAnimation, - // registerGrowWidthOutAnimation, - // registerGrowCenterInAnimation, - // registerGrowCenterOutAnimation - // ]); +export const registerRectAnimation = () => { + AnimateExecutor.registerBuiltInAnimate('growHeightIn', GrowHeightIn); + AnimateExecutor.registerBuiltInAnimate('growHeightOut', GrowHeightOut); + AnimateExecutor.registerBuiltInAnimate('growWidthIn', GrowWidthIn); + AnimateExecutor.registerBuiltInAnimate('growWidthOut', GrowWidthOut); + AnimateExecutor.registerBuiltInAnimate('growCenterIn', GrowCenterIn); + AnimateExecutor.registerBuiltInAnimate('growCenterOut', GrowCenterOut); }; -export const registerVGrammarArcAnimation = () => { - // View.useRegisters([ - // registerGrowRadiusInAnimation, - // registerGrowRadiusOutAnimation, - // registerGrowAngleInAnimation, - // registerGrowAngleOutAnimation - // ]); +export const registerArcAnimation = () => { + AnimateExecutor.registerBuiltInAnimate('growRadiusIn', GrowRadiusIn); + AnimateExecutor.registerBuiltInAnimate('growRadiusOut', GrowRadiusOut); + AnimateExecutor.registerBuiltInAnimate('growAngleIn', GrowAngleIn); + AnimateExecutor.registerBuiltInAnimate('growAngleOut', GrowAngleOut); }; -export const registerVGrammarLineOrAreaAnimation = () => { - // View.useRegisters([ - // registerGrowPointsInAnimation, - // registerGrowPointsOutAnimation, - // registerGrowPointsXInAnimation, - // registerGrowPointsXOutAnimation, - // registerGrowPointsYInAnimation, - // registerGrowPointsYOutAnimation, - // registerClipInAnimation, - // registerClipOutAnimation - // ]); +export const registerLineOrAreaAnimation = () => { + AnimateExecutor.registerBuiltInAnimate('growPointsIn', GrowPointsIn); + AnimateExecutor.registerBuiltInAnimate('growPointsOut', GrowPointsOut); + AnimateExecutor.registerBuiltInAnimate('growPointsXIn', GrowPointsXIn); + AnimateExecutor.registerBuiltInAnimate('growPointsXOut', GrowPointsXOut); + AnimateExecutor.registerBuiltInAnimate('growPointsYIn', GrowPointsYIn); + AnimateExecutor.registerBuiltInAnimate('growPointsYOut', GrowPointsYOut); + AnimateExecutor.registerBuiltInAnimate('clipIn', ClipIn); + AnimateExecutor.registerBuiltInAnimate('clipOut', ClipOut); }; -export const registerVGrammarPolygonAnimation = () => { - // View.useRegisters([registerGrowPointsInAnimation, registerGrowPointsOutAnimation]); +export const registerPolygonAnimation = () => { + AnimateExecutor.registerBuiltInAnimate('growPointsOut', GrowPointsOut); }; diff --git a/packages/vchart/src/animation/grammar-dector.ts b/packages/vchart/src/animation/grammar-dector.ts new file mode 100644 index 0000000000..66c9b26e00 --- /dev/null +++ b/packages/vchart/src/animation/grammar-dector.ts @@ -0,0 +1,253 @@ +/** + * 检测语法变化,注册策略针对不同的语法变化,创建不同的planner去依次执行 + * 可以注册的策略有: + * 1. 如果有数据删除,分为两个planner,先走exit动画,再走其他的动画 + * 2. 如果有数据添加,分为两个planner,先走其他的动画,最后走Enter动画 + * 3. 如果是一般的更新,那么正常走update,也就是一个planner就行 + * 4. 如果有数据维度变化 + * - 1. 堆积变分组,先执行band方向的插值,在进行value方向的插值 + * - 2. 分组变堆积,先执行value方向的插值,再执行band方向的插值 + */ +import { AnimationPlanner } from './animation-planner'; +import type { IMarkGraphic } from '../mark/interface'; +import { DiffState } from '../mark/interface/enum'; +import type { IAnimationConfig, IAnimationSplitStrategy } from './interface'; +import type { BaseMark } from '../mark'; +import { VerticalBarSplitStrategy } from './strategy/vertical-bar-split'; +import { HorizontalBarSplitStrategy } from './strategy/horizontal-bar-split'; + +export interface IDetectionResult { + hasExit: boolean; + hasUpdate: boolean; + hasEnter: boolean; + hasAppear: boolean; + exitGraphics: IMarkGraphic[]; + updateGraphics: IMarkGraphic[]; + enterGraphics: IMarkGraphic[]; + appearGraphics: IMarkGraphic[]; +} + +export class GrammarDetector { + private mark: BaseMark; + private splitStrategies: IAnimationSplitStrategy[] = []; + + constructor(mark: BaseMark) { + this.mark = mark; + if (mark.type === 'rect') { + // 注册默认策略 + this.registerStrategy(new VerticalBarSplitStrategy()); + this.registerStrategy(new HorizontalBarSplitStrategy()); + } + } + + /** + * 注册动画拆分策略 + * @param strategy 动画拆分策略 + */ + registerStrategy(strategy: IAnimationSplitStrategy): void { + this.splitStrategies.push(strategy); + } + + /** + * 检测图形的变化类型 + * @param graphics 要分析的图形列表 + * @returns 一个检测结果,指示需要哪些类型的动画 + */ + detect(graphics: IMarkGraphic[], graphicMap: Map): IDetectionResult { + const exitGraphics: IMarkGraphic[] = []; + const updateGraphics: IMarkGraphic[] = []; + const enterGraphics: IMarkGraphic[] = []; + const appearGraphics: IMarkGraphic[] = []; + + const fieldX = (this.mark.model as any).fieldX; + const fieldY = (this.mark.model as any).fieldY; + + graphics.forEach(g => { + // 保存field信息以便进行堆积/分组变化的检测 + const context = g.context; + + // 保存原始fieldX/fieldY以供比较 + if (context.fieldX) { + context.originalFieldX = context.fieldX; + } + if (context.fieldY) { + context.originalFieldY = context.fieldY; + } + + // 更新为当前field + context.fieldX = fieldX; + context.fieldY = fieldY; + + const state = g.context.animationState; + switch (state) { + case 'update': + updateGraphics.push(g); + break; + case 'enter': + enterGraphics.push(g); + break; + case 'appear': + appearGraphics.push(g); + break; + default: + // 对于未知状态,根据diffState确定 + if (g.context.diffState === DiffState.exit) { + exitGraphics.push(g); + } else if (g.context.diffState === DiffState.enter) { + enterGraphics.push(g); + } else { + updateGraphics.push(g); + } + } + }); + + if (graphicMap.size > graphics.length) { + graphicMap.forEach((g, key) => { + if (g.context.diffState === DiffState.exit && !g.isExiting) { + exitGraphics.push(g); + } + }); + } + + return { + hasExit: exitGraphics.length > 0, + hasUpdate: updateGraphics.length > 0, + hasEnter: enterGraphics.length > 0, + hasAppear: appearGraphics.length > 0, + exitGraphics, + updateGraphics, + enterGraphics, + appearGraphics + }; + } + + /** + * 根据检测到的变化创建动画Planner + * @param result 检测结果 + * @param animationConfig 动画配置 + * @returns 一个动画Planner数组,按顺序执行 + */ + createPlanners(result: IDetectionResult, animationConfig: Record): AnimationPlanner[] { + const planners: AnimationPlanner[] = []; + + // 按顺序创建Planner + if (result.hasExit && animationConfig.exit) { + planners.push(new AnimationPlanner('exit', result.exitGraphics, animationConfig.exit)); + } + + // 对更新动画进行分析和拆分 + if (result.hasUpdate && animationConfig.update) { + // 检查是否可以应用拆分策略 + type GraphicWithSteps = { + graphic: IMarkGraphic; + steps: Array<{ attrs: Record; order: number }>; + }; + + const updateGraphicsByStep: Map = new Map(); + const regularUpdateGraphics: IMarkGraphic[] = []; + + // 根据策略拆分每个图形的更新 + result.updateGraphics.forEach(graphic => { + let applied = false; + + for (const strategy of this.splitStrategies) { + if (strategy.shouldApply(this.mark, graphic)) { + // 应用策略拆分更新 + const splitUpdates = strategy.split(this.mark, graphic); + + // 保存图形和它的更新步骤关系 + const graphicWithSteps: GraphicWithSteps = { + graphic, + steps: splitUpdates + }; + + // 为每个步骤创建分组 + splitUpdates.forEach(update => { + const { order } = update; + + // 按顺序分组 + if (!updateGraphicsByStep.has(order)) { + updateGraphicsByStep.set(order, []); + } + updateGraphicsByStep.get(order).push(graphicWithSteps); + }); + + applied = true; + break; + } + } + + // 如果没有应用任何策略,把图形放入常规更新组 + if (!applied) { + regularUpdateGraphics.push(graphic); + } + }); + + // 添加常规更新Planner(如果有常规更新) + if (regularUpdateGraphics.length > 0) { + planners.push(new AnimationPlanner('update', regularUpdateGraphics, animationConfig.update)); + } + + // 按顺序添加拆分后的更新Planner + const steps = Array.from(updateGraphicsByStep.keys()).sort((a, b) => a - b); + steps.forEach(step => { + const graphicsWithSteps = updateGraphicsByStep.get(step); + if (graphicsWithSteps && graphicsWithSteps.length > 0) { + // 为这个步骤创建一个特殊的planner,它会在执行前设置对应的diffAttrs + const graphicsForStep = graphicsWithSteps.map(({ graphic, steps }) => { + // 找到当前步骤对应的attrs + const stepConfig = steps.find(s => s.order === step); + return { + graphic, + attrs: stepConfig?.attrs || {} + }; + }); + + planners.push( + new AnimationPlanner( + 'update', + graphicsForStep.map(item => item.graphic), + animationConfig.update, + // 传入一个预处理函数,在执行动画前设置正确的diffAttrs + (graphics: IMarkGraphic[]) => { + graphics.forEach((g: IMarkGraphic, index: number) => { + const attrs = graphicsForStep[index].attrs; + // 暂存原始diffAttrs + const context = g.context as any; + if (!context._originalDiffAttrs) { + context._originalDiffAttrs = g.context.diffAttrs; + } + // 设置当前步骤的diffAttrs + g.context.diffAttrs = attrs; + }); + }, + // 传入一个后处理函数,在执行动画后恢复原始diffAttrs + (graphics: IMarkGraphic[]) => { + // 只有最后一个步骤才需要恢复,因为中间步骤会被下一个步骤覆盖 + if (step === steps[steps.length - 1]) { + graphics.forEach((g: IMarkGraphic) => { + const context = g.context as any; + if (context._originalDiffAttrs) { + g.context.diffAttrs = context._originalDiffAttrs; + delete context._originalDiffAttrs; + } + }); + } + } + ) + ); + } + }); + } + + if (result.hasEnter && animationConfig.enter) { + planners.push(new AnimationPlanner('enter', result.enterGraphics, animationConfig.enter)); + } + + if (result.hasAppear && animationConfig.appear) { + planners.push(new AnimationPlanner('appear', result.appearGraphics, animationConfig.appear)); + } + + return planners; + } +} diff --git a/packages/vchart/src/animation/index.ts b/packages/vchart/src/animation/index.ts new file mode 100644 index 0000000000..a65be66233 --- /dev/null +++ b/packages/vchart/src/animation/index.ts @@ -0,0 +1,3 @@ +export { registerAnimate as registerVRenderAnimate, registerCustomAnimate } from '@visactor/vrender-animate'; +export { registerStateTransition } from './state-transition'; +export { registerSequentialAnimate } from './sequential-animate'; diff --git a/packages/vchart/src/animation/interface.ts b/packages/vchart/src/animation/interface.ts index 6cba5a77c0..45d8a32ad2 100644 --- a/packages/vchart/src/animation/interface.ts +++ b/packages/vchart/src/animation/interface.ts @@ -1,6 +1,7 @@ -import type { ACustomAnimate, EasingType, IGraphic } from '@visactor/vrender-core'; -import type { ICompilable } from '../compile/interface'; -import type { IMark } from '../mark/interface/common'; +import type { ACustomAnimate } from '@visactor/vrender-animate'; +import type { IGraphic, EasingType } from '@visactor/vrender-core'; +import type { IMark, IMarkGraphic } from '../mark/interface/common'; +import type { BaseMark } from '../mark'; export enum AnimationStateEnum { appear = 'appear', @@ -167,3 +168,36 @@ export interface MarkAnimationSpec { } export type MarkAnimationType = keyof MarkAnimationSpec; + +/** + * 动画拆分策略接口 + * 用于定义如何拆分一个动画更新为多个步骤 + */ +export interface IAnimationSplitStrategy { + /** + * 策略名称 + */ + name: string; + + /** + * 检查是否应该应用此策略 + * @param mark 图表标记 + * @param graphic 图形元素 + * @returns 是否应用此策略 + */ + shouldApply: (mark: BaseMark, graphic: IMarkGraphic) => boolean; + + /** + * 拆分动画更新 + * @param mark 图表标记 + * @param graphic 图形元素 + * @returns 拆分后的动画更新数组(每个元素包含一组属性和执行顺序) + */ + split: ( + mark: BaseMark, + graphic: IMarkGraphic + ) => Array<{ + attrs: Record; + order: number; + }>; +} diff --git a/packages/vchart/src/animation/sequential-animate.ts b/packages/vchart/src/animation/sequential-animate.ts new file mode 100644 index 0000000000..f836d06acd --- /dev/null +++ b/packages/vchart/src/animation/sequential-animate.ts @@ -0,0 +1,105 @@ +import { mixin } from '@visactor/vutils'; +import type { IMarkGraphic } from '../core'; +import type { AnimationPlanner } from './animation-planner'; +import { GrammarDetector } from './grammar-dector'; +import type { IAnimationConfig, IAnimationSplitStrategy } from './interface'; +import { BaseMark } from '../mark'; + +class SequentialAnimate { + protected _grammarDetector: GrammarDetector; + /** + * 注册自定义动画拆分策略 + * @param strategy 动画拆分策略 + */ + registerAnimationSplitStrategy(strategy: IAnimationSplitStrategy): void { + if (!this._grammarDetector) { + this._grammarDetector = new GrammarDetector(this as any); + } + this._grammarDetector.registerStrategy(strategy); + } + + getGrammarDetector() { + this.initGrammarDetector(); + return this._grammarDetector; + } + + initGrammarDetector() { + if (!this._grammarDetector) { + this._grammarDetector = new GrammarDetector(this as any); + } + } + + // 处理动画序列 + protected _runSequentialAnimations(graphics: IMarkGraphic[]) { + this.initGrammarDetector(); + const animationConfig = (this as any).getAnimationConfig(); + + // 使用 GrammarDetector 检测变化类型 + const detectionResult = this._grammarDetector.detect(graphics, (this as any)._graphicMap); + + // 根据检测结果创建动画planners + const planners = this._grammarDetector.createPlanners( + detectionResult, + animationConfig as unknown as Record + ); + + // 按顺序执行planner + this._executePlanners(planners, 0); + } + + /** + * 按顺序执行planner + * @param planners + * @param index + */ + private _executePlanners(planners: AnimationPlanner[], index: number) { + if (index >= planners.length) { + return; + } + + const planner = planners[index]; + planner.execute((this as any)._product, () => { + // 执行下一个planner + this._executePlanners(planners, index + 1); + + // 如果这个planner是exit,那么结束之后就删除它 + if (planner.state === 'exit') { + planner.graphics.forEach(g => { + if (g.isExiting) { + (this as any)._graphicMap.delete(g.context.uniqueKey); + if (g.parent) { + g.parent.removeChild(g); + } + if (g.release) { + g.release(); + } + } + }); + } + + // 如果这是最后一个planner并且它是一个'enter'动画,则运行normal动画 + // if (index === planners.length - 1 && planner.state === 'enter') { + // // 在enter完成后执行normal动画 + // const normalConfig = (this.getAnimationConfig() as any).normal?.[0]; + // if (normalConfig && this._product) { + // // 停止normal动画并重置为初始属性 + // (this._product as IGroup).stopAnimationState('normal', 'end'); + + // (this._product as IGroup).applyAnimationState( + // ['normal'], + // [ + // { + // name: 'normal', + // animation: normalConfig + // } + // ] + // ); + // } + // } + }); + } +} + +export function registerSequentialAnimate() { + mixin(BaseMark, SequentialAnimate); +} diff --git a/packages/vchart/src/animation/state-transition.ts b/packages/vchart/src/animation/state-transition.ts new file mode 100644 index 0000000000..2233565fe9 --- /dev/null +++ b/packages/vchart/src/animation/state-transition.ts @@ -0,0 +1,36 @@ +import { AnimationTransitionRegistry } from '@visactor/vrender-animate'; + +export function registerStateTransition() { + const animationTransitionRegistry = AnimationTransitionRegistry.getInstance(); + // update动画,可以被任何动画覆盖,但不会停止(disappear、exit除外) + animationTransitionRegistry.registerTransition('update', '*', () => ({ + allowTransition: true, + stopOriginalTransition: false + })); + // update动画碰到disappear动画,会停止,也会被覆盖 + animationTransitionRegistry.registerTransition('update', 'disappear', () => ({ + allowTransition: true, + stopOriginalTransition: true + })); + // update动画碰到exit动画,会停止,也会被覆盖 + animationTransitionRegistry.registerTransition('update', 'exit', () => ({ + allowTransition: true, + stopOriginalTransition: true + })); + + // state动画,可以被任何动画覆盖,但不会停止(disappear、exit除外) + animationTransitionRegistry.registerTransition('state', '*', () => ({ + allowTransition: true, + stopOriginalTransition: false + })); + // state动画碰到disappear动画,会停止,也会被覆盖 + animationTransitionRegistry.registerTransition('state', 'disappear', () => ({ + allowTransition: true, + stopOriginalTransition: true + })); + // state动画碰到exit动画,会停止,也会被覆盖 + animationTransitionRegistry.registerTransition('state', 'exit', () => ({ + allowTransition: true, + stopOriginalTransition: true + })); +} diff --git a/packages/vchart/src/animation/strategy/common.ts b/packages/vchart/src/animation/strategy/common.ts new file mode 100644 index 0000000000..e114af1e72 --- /dev/null +++ b/packages/vchart/src/animation/strategy/common.ts @@ -0,0 +1,37 @@ +import type { IMarkGraphic } from '../../mark/interface'; +import type { BaseMark } from '../../mark'; +import type { IAnimationSplitStrategy } from '../interface'; + +/** + * 自定义拆分策略 + * 允许用户自定义条件和拆分逻辑 + */ +export class CustomSplitStrategy implements IAnimationSplitStrategy { + name: string; + private checkFn: (mark: BaseMark, graphic: IMarkGraphic) => boolean; + private splitFn: (mark: BaseMark, graphic: IMarkGraphic) => Array<{ attrs: Record; order: number }>; + + /** + * 创建自定义拆分策略 + * @param name 策略名称 + * @param checkFn 用于检查是否应用此策略的函数 + * @param splitFn 用于拆分动画的函数 + */ + constructor( + name: string, + checkFn: (mark: BaseMark, graphic: IMarkGraphic) => boolean, + splitFn: (mark: BaseMark, graphic: IMarkGraphic) => Array<{ attrs: Record; order: number }> + ) { + this.name = name; + this.checkFn = checkFn; + this.splitFn = splitFn; + } + + shouldApply(mark: BaseMark, graphic: IMarkGraphic): boolean { + return this.checkFn(mark, graphic); + } + + split(mark: BaseMark, graphic: IMarkGraphic): Array<{ attrs: Record; order: number }> { + return this.splitFn(mark, graphic); + } +} diff --git a/packages/vchart/src/animation/strategy/horizontal-bar-split.ts b/packages/vchart/src/animation/strategy/horizontal-bar-split.ts new file mode 100644 index 0000000000..e05769a248 --- /dev/null +++ b/packages/vchart/src/animation/strategy/horizontal-bar-split.ts @@ -0,0 +1,59 @@ +import type { IMarkGraphic } from '../../mark/interface'; +import type { BaseMark } from '../../mark'; +import type { IAnimationSplitStrategy } from '../interface'; + +/** + * 水平柱状图拆分策略 + * 针对水平柱状图,先更新y和height,再更新x和width + */ +export class HorizontalBarSplitStrategy implements IAnimationSplitStrategy { + name = 'horizontalBarSplit'; + + shouldApply(mark: BaseMark, graphic: IMarkGraphic): boolean { + // 检查是否是柱状图且方向是水平的 + const isRectMark = mark.type === 'rect'; + const isHorizontal = (mark.model as any)?.direction === 'horizontal'; + + // 检查是否同时存在维度和值的变化 + const diffAttrs = graphic.context?.diffAttrs || {}; + const hasDimensionChanges = 'y' in diffAttrs || 'height' in diffAttrs || 'y1' in diffAttrs; + const hasValueChanges = 'x' in diffAttrs || 'width' in diffAttrs || 'x1' in diffAttrs; + + return isRectMark && isHorizontal && hasDimensionChanges && hasValueChanges; + } + + split(mark: BaseMark, graphic: IMarkGraphic): Array<{ attrs: Record; order: number }> { + const diffAttrs = graphic.context?.diffAttrs || {}; + const dimensionAttrs: Record = {}; + const valueAttrs: Record = {}; + + // 分配属性到对应的组 + Object.entries(diffAttrs).forEach(([key, value]) => { + if (key === 'y' || key === 'height' || key === 'y1') { + dimensionAttrs[key] = value; + } else if (key === 'x' || key === 'width' || key === 'x1') { + valueAttrs[key] = value; + } else { + // 其他属性(如颜色、透明度等)与维度一起更新 + dimensionAttrs[key] = value; + } + }); + + // 检查是从堆积变为分组还是从分组变为堆积 + // 如果fieldY长度增加,说明是从堆积变为分组,先执行y/height + // 如果fieldY长度减少,说明是从分组变为堆积,先执行x/width + const context = graphic.context as any; + const fieldY = context.fieldY; + const originalFieldY = context.originalFieldY; + + // 检查fieldY是否是数组(表示多维度) + const isGrouped = Array.isArray(fieldY) && fieldY.length > 1; + const wasStacked = originalFieldY ? !(Array.isArray(originalFieldY) && originalFieldY.length > 1) : !isGrouped; + const group2stack = !wasStacked && !isGrouped; + + return [ + { attrs: dimensionAttrs, order: group2stack ? 2 : 1 }, // 先更新维度(y和height) + { attrs: valueAttrs, order: group2stack ? 1 : 2 } // 再更新值(x和width) + ]; + } +} diff --git a/packages/vchart/src/animation/strategy/vertical-bar-split.ts b/packages/vchart/src/animation/strategy/vertical-bar-split.ts new file mode 100644 index 0000000000..6fec463f89 --- /dev/null +++ b/packages/vchart/src/animation/strategy/vertical-bar-split.ts @@ -0,0 +1,60 @@ +import type { IMarkGraphic } from '../../mark/interface'; +import type { BaseMark } from '../../mark'; +import type { IAnimationSplitStrategy } from '../interface'; + +/** + * 垂直柱状图拆分策略 + * 针对垂直柱状图,先更新x和width,再更新y和height + */ +export class VerticalBarSplitStrategy implements IAnimationSplitStrategy { + name = 'verticalBarSplit'; + + shouldApply(mark: BaseMark, graphic: IMarkGraphic): boolean { + // 检查是否是柱状图且方向是垂直的 + const isRectMark = mark.type === 'rect'; + const isVertical = (mark.model as any)?.direction === 'vertical'; + + // 检查是否同时存在维度和值的变化 + const diffAttrs = graphic.context?.diffAttrs || {}; + const hasDimensionChanges = 'x' in diffAttrs || 'width' in diffAttrs || 'x1' in diffAttrs; + const hasValueChanges = 'y' in diffAttrs || 'height' in diffAttrs || 'y1' in diffAttrs; + + return isRectMark && isVertical && hasDimensionChanges && hasValueChanges; + } + + split(mark: BaseMark, graphic: IMarkGraphic): Array<{ attrs: Record; order: number }> { + const diffAttrs = graphic.context?.diffAttrs || {}; + const dimensionAttrs: Record = {}; + const valueAttrs: Record = {}; + + // 分配属性到对应的组 + Object.entries(diffAttrs).forEach(([key, value]) => { + if (key === 'x' || key === 'width' || key === 'x1') { + dimensionAttrs[key] = value; + } else if (key === 'y' || key === 'height' || key === 'y1') { + valueAttrs[key] = value; + } else { + // 其他属性(如颜色、透明度等)与维度一起更新 + dimensionAttrs[key] = value; + } + }); + + // 检查是从堆积变为分组还是从分组变为堆积 + // 如果fieldX长度增加,说明是从堆积变为分组,先执行x/width + // 如果fieldX长度减少,说明是从分组变为堆积,先执行y/height + const context = graphic.context as any; + const fieldX = context.fieldX; + const originalFieldX = context.originalFieldX; + + // 检查fieldX是否是数组(表示多维度) + const isGrouped = Array.isArray(fieldX) && fieldX.length > 1; + const wasStacked = originalFieldX ? !(Array.isArray(originalFieldX) && originalFieldX.length > 1) : !isGrouped; + + const stack2group = wasStacked && isGrouped; + // 默认情况:先执行x/width,再执行y/height + return [ + { attrs: dimensionAttrs, order: stack2group ? 1 : 2 }, // 先更新维度(x和width) + { attrs: valueAttrs, order: stack2group ? 2 : 1 } // 再更新值(y和height) + ]; + } +} diff --git a/packages/vchart/src/animation/utils.ts b/packages/vchart/src/animation/utils.ts index c1d8a4af4b..2241a347a7 100644 --- a/packages/vchart/src/animation/utils.ts +++ b/packages/vchart/src/animation/utils.ts @@ -18,6 +18,7 @@ import type { ISeries } from '../series'; import type { ISeriesSpec } from '../typings'; import type { IModelMarkAttributeContext } from '../compile/mark'; import type { IGraphic } from '@visactor/vrender-core'; +import type { IMarkGraphic } from '../core'; export const AnimationStates = [...Object.keys(DEFAULT_ANIMATION_CONFIG), 'normal']; @@ -186,7 +187,7 @@ function produceOneByOne( if (oneByOneTime === false) { return userDelayAfter; } - const indexCount = dataCount ? dataCount() : g.mark.graphics.length; + const indexCount = dataCount ? dataCount() : g.parent.count - 1; oneByOneTime = oneByOneTime === true ? 0 : oneByOneTime; return userDelayAfter + (indexCount - index) * (durationTime + oneByOneTime); }; @@ -194,8 +195,8 @@ function produceOneByOne( return stateConfig; } -function defaultDataIndex(datum: any, params: any) { - return datum?.[DEFAULT_DATA_INDEX] ?? params?.VGRAMMAR_ANIMATION_PARAMETERS?.elementIndex; +function defaultDataIndex(datum: any, graphic: IMarkGraphic) { + return datum?.[DEFAULT_DATA_INDEX] ?? graphic.context.graphicIndex; } export function shouldMarkDoMorph(spec: ISeriesSpec & IAnimationSpec, markName: string) { diff --git a/packages/vchart/src/chart/area/area-transformer.ts b/packages/vchart/src/chart/area/area-transformer.ts index 68e045f9ed..3fb73b66e8 100644 --- a/packages/vchart/src/chart/area/area-transformer.ts +++ b/packages/vchart/src/chart/area/area-transformer.ts @@ -17,7 +17,8 @@ export class AreaChartSpecTransformer< 'pointDis', 'pointDisMul', 'markOverlap', - 'areaLabel' + 'areaLabel', + 'useSequentialAnimation' ]); } diff --git a/packages/vchart/src/chart/bar/bar-transformer.ts b/packages/vchart/src/chart/bar/bar-transformer.ts index 4cdb65a9f9..63d3a363ac 100644 --- a/packages/vchart/src/chart/bar/bar-transformer.ts +++ b/packages/vchart/src/chart/bar/bar-transformer.ts @@ -16,7 +16,8 @@ export class BarChartSpecTransformer ex 'sampling', 'samplingFactor', 'barBackground', - 'stackCornerRadius' + 'stackCornerRadius', + 'useSequentialAnimation' ]) as IBarSeriesSpec; } diff --git a/packages/vchart/src/chart/base/base-chart.ts b/packages/vchart/src/chart/base/base-chart.ts index bc60e4f5bc..daaf09bdf1 100644 --- a/packages/vchart/src/chart/base/base-chart.ts +++ b/packages/vchart/src/chart/base/base-chart.ts @@ -196,6 +196,10 @@ export class BaseChart extends CompilableBase implements I protected _interaction: IInteraction; + protected _setModelOption(): void { + // implement in subclass + } + constructor(spec: T, option: IChartOption) { super(option); this._paddingSpec = normalizeLayoutPaddingSpec(spec.padding ?? option.getTheme().padding); diff --git a/packages/vchart/src/chart/pie/base/pie-transformer.ts b/packages/vchart/src/chart/pie/base/pie-transformer.ts index bcb33788a9..1d17c89202 100644 --- a/packages/vchart/src/chart/pie/base/pie-transformer.ts +++ b/packages/vchart/src/chart/pie/base/pie-transformer.ts @@ -19,6 +19,7 @@ export class BasePieChartSpecTransformer extends PolarC 'emptyPlaceholder', 'showAllZero', 'supportNegative', + 'useSequentialAnimation', 'layoutRadius' ]); // 兼容旧版写法 diff --git a/packages/vchart/src/compile/compiler.ts b/packages/vchart/src/compile/compiler.ts index 759560a3f1..e556f3f4e6 100644 --- a/packages/vchart/src/compile/compiler.ts +++ b/packages/vchart/src/compile/compiler.ts @@ -133,6 +133,7 @@ export class Compiler implements ICompiler { afterRender: this._option.afterRender, disableDirtyBounds: true, autoRender: true, + ticker: this._option.ticker, pluginList: this._option.pluginList, enableHtmlAttribute: this._option.enableHtmlAttribute, optimize: this._option.optimize, @@ -350,13 +351,19 @@ export class Compiler implements ICompiler { const { update, exit } = diffMarks(this._cachedMarks, newMarks, { morph, morphAll, reuse }); update.forEach(({ prev, next }) => { - const enableMarkMorphConfig = - prev.every(mark => mark.getMarkConfig().morph) && next.every(mark => mark.getMarkConfig().morph); + // const enableMarkMorphConfig = + // prev.every(mark => mark.getMarkConfig().morph) && next.every(mark => mark.getMarkConfig().morph); - if ((enableExitAnimation && morph) || morphAll) { - // todo morphing - } else if (reuse && prev.length === 1 && next.length === 1 && prev[0].type === next[0].type) { + // 优先复用 + if (reuse && prev.length === 1 && next.length === 1 && prev[0].type === next[0].type) { next[0].reuse(prev[0]); + } else { + // 执行morphing + const prevMark = prev.filter(item => item.getMarkConfig().morph)[0]; + prevMark && + next.forEach(item => { + item.getMarkConfig().morph && item.prepareMorph(prevMark); + }); } }); @@ -692,7 +699,9 @@ export class Compiler implements ICompiler { const raf = vglobal.getRequestAnimationFrame(); this._progressiveRafId = raf(this.handleProgressiveFrame); } else if (this._progressiveMarks && this._progressiveMarks.every(mark => mark.canAnimateAfterProgressive())) { - // todo this.animate.animate(); + this._progressiveMarks.forEach(mark => { + mark.runAnimation(); + }); } else if (this._progressiveMarks) { this._progressiveMarks = null; } diff --git a/packages/vchart/src/compile/interface/compiler.ts b/packages/vchart/src/compile/interface/compiler.ts index 3b8091aa3b..fe06dc7e3f 100644 --- a/packages/vchart/src/compile/interface/compiler.ts +++ b/packages/vchart/src/compile/interface/compiler.ts @@ -1,4 +1,4 @@ -import type { IColor, IStageParams, IStage, ILayer, IOption3D } from '@visactor/vrender-core'; +import type { IColor, IStageParams, IStage, ILayer, IOption3D, ITicker } from '@visactor/vrender-core'; import type { IPerformanceHook, RenderMode } from '../../typings/spec/common'; import type { IBoundsLike } from '@visactor/vutils'; import type { StringOrNumber } from '../../typings'; @@ -155,6 +155,10 @@ export interface IRenderOption { * vrender 的插件列表 */ pluginList?: string[]; + /** + * vrender 的 ticker + */ + ticker?: ITicker; /** * @since 1.8.0 */ diff --git a/packages/vchart/src/compile/mark/interface.ts b/packages/vchart/src/compile/mark/interface.ts index d4cf4bcc10..cf98d0901c 100644 --- a/packages/vchart/src/compile/mark/interface.ts +++ b/packages/vchart/src/compile/mark/interface.ts @@ -1,6 +1,6 @@ -import type { IMark, IMarkStateStyle, MarkType } from '../../mark/interface'; +import type { IMark, IMarkGraphic, IMarkStateStyle, MarkType } from '../../mark/interface'; import type { IModel } from '../../model/interface'; -import type { GrammarItemCompileOption, GrammarItemInitOption, IGrammarItem } from '../interface'; +import type { GrammarItemCompileOption, GrammarItemInitOption, IGrammarItem, StateValueMap } from '../interface'; import type { DataView } from '@visactor/vdataset'; import type { Maybe, Datum, StringOrNumber } from '../../typings'; import type { IRegion } from '../../region/interface'; @@ -51,6 +51,11 @@ export interface IMarkConfig { overflow?: 'scroll' | 'hidden' | 'scroll-x' | 'scroll-y'; skipTheme?: boolean; + + /** + * 是否开启序列动画能力,默认关闭 + */ + useSequentialAnimation?: boolean; } export interface IMarkStateManager { @@ -59,8 +64,11 @@ export interface IMarkStateManager { addStateInfo: (stateInfo: IStateInfo) => void; changeStateInfo: (stateInfo: Partial) => void; clearStateInfo: (stateValues: StateValue[]) => void; - checkOneState: (renderNode: IGraphic, datum: Datum[], state: IStateInfo) => 'in' | 'out' | 'skip'; - checkState: (renderNode: IGraphic, datum: Datum[]) => StateValue[]; + checkOneState: (renderNode: IMarkGraphic, datum: Datum[], state: IStateInfo) => 'in' | 'out' | 'skip'; + checkState: (renderNode: IMarkGraphic, datum: Datum[]) => StateValue[]; + getStateMap: () => StateValueMap; + updateState: (newState: Partial, noRender?: boolean) => void; + release: () => void; } export interface IMarkData extends ICompilableData { diff --git a/packages/vchart/src/compile/mark/mark-state-manager.ts b/packages/vchart/src/compile/mark/mark-state-manager.ts index 38891fca65..c7d1d065bf 100644 --- a/packages/vchart/src/compile/mark/mark-state-manager.ts +++ b/packages/vchart/src/compile/mark/mark-state-manager.ts @@ -253,4 +253,8 @@ export class MarkStateManager extends StateManager implements IMarkStateManager const datum_v = this._isMultiMark() ? datum[0]?.[key] : datum[key]; return datum_v < domain[0] || datum_v > domain[domain.length - 1]; } + + release(): void { + // todo + } } diff --git a/packages/vchart/src/compile/morph.ts b/packages/vchart/src/compile/morph.ts new file mode 100644 index 0000000000..a3a984672d --- /dev/null +++ b/packages/vchart/src/compile/morph.ts @@ -0,0 +1,216 @@ +import { morphPath, multiToOneMorph, oneToMultiMorph } from '@visactor/vrender-animate'; +import { isNil, isNumber, isValid, isValidNumber } from '@visactor/vutils'; +import type { IMark, IMarkGraphic } from '../mark/interface'; +import type { IMorphConfig } from '../animation/spec'; +import type { Datum } from '../typings'; + +/** Morph data for animation */ +interface MorphData { + prev: Datum[]; + next: Datum[]; +} + +/** Elements to morph */ +interface MorphElements { + prev: IMarkGraphic[]; + next: IMarkGraphic[]; +} + +/** Type to allow either a static value or a function that returns a value */ +type MorphFunctionValueType = T | ((params: any, morphData: MorphData, morphElements: MorphElements) => T); + +/** + * Apply a function value or return the static value + */ +const invokeFunctionType = ( + value: MorphFunctionValueType, + params: any, + morphData: MorphData, + morphElements: MorphElements +): T => { + if (typeof value === 'function') { + return (value as Function)(params, morphData, morphElements) as T; + } + return value; +}; + +/** + * Execute the morphing animation between previous and next elements + */ +const doMorph = ( + prev: IMarkGraphic[], + next: IMarkGraphic[], + config: IMorphConfig, + onEnd: () => void, + parameters: any +) => { + const morphData: MorphData = { + prev: prev.map(element => element.context?.data?.[0]), + next: next.map(element => element.context?.data?.[0]) + }; + + const morphElements: MorphElements = { + prev: prev.slice(), + next: next.slice() + }; + + const animation = config.animation ?? {}; + const easing = animation.easing; + const delay = invokeFunctionType(animation.delay as any, parameters, morphData, morphElements); + const duration = invokeFunctionType(animation.duration as any, parameters, morphData, morphElements); + const oneByOne = invokeFunctionType(animation.oneByOne as any, parameters, morphData, morphElements); + const splitPath = invokeFunctionType(animation.splitPath as any, parameters, morphData, morphElements); + + const individualDelay = + isValidNumber(oneByOne) && (oneByOne as number) > 0 + ? (index: number) => { + if (isNumber(oneByOne)) { + return index * (oneByOne as number); + } else if (oneByOne === true) { + return index * duration; + } + return 0; + } + : undefined; + + // if no previous item or just one, still execute morph animation + if ((prev.length === 1 || prev.length === 0) && next.length === 1) { + morphPath(prev[0], next[0], { delay, duration, easing, onEnd }); + } else if (prev.length === 1 && next.length > 1) { + oneToMultiMorph(prev[0], next, { delay, duration, easing, onEnd, individualDelay, splitPath }); + } else if (prev.length > 1 && next.length === 1) { + multiToOneMorph(prev, next[0], { delay, duration, easing, onEnd, individualDelay, splitPath }); + } +}; + +/** + * Divide elements into specified number of groups + */ +const divideElements = (elements: IMarkGraphic[], count: number) => { + const divideLength = Math.floor(elements.length / count); + return new Array(count).fill(0).map((_, index) => { + return elements.slice(divideLength * index, index === count - 1 ? elements.length : divideLength * (index + 1)); + }); +}; + +/** + * Add morphKey to each mark's graphics based on mark's morphConfig + */ +const appendMorphKeyToGraphics = (mark: IMark) => { + const config = mark.getMarkConfig(); + + if (isValid(config.morphElementKey)) { + const graphics = mark.getGraphics(); + graphics.forEach(graphic => { + const data = graphic.context?.data?.[0]; + if (data) { + (graphic.context as any).morphKey = data[config.morphElementKey]; + } + }); + } +}; + +/** + * Execute morphing animation between two sets of marks + */ +export const morph = (prevMarks: IMark[], nextMarks: IMark[], morphConfig: IMorphConfig = {}) => { + // Get all graphics from previous and next marks + const prevGraphics: IMarkGraphic[] = []; + const nextGraphics: IMarkGraphic[] = []; + + // Get graphics and append morph keys + prevMarks.forEach(mark => { + appendMorphKeyToGraphics(mark); + prevGraphics.push(...mark.getGraphics()); + }); + + nextMarks.forEach(mark => { + appendMorphKeyToGraphics(mark); + nextGraphics.push(...mark.getGraphics()); + }); + + // Group graphics by morphKey if available + const getKey = (graphic: IMarkGraphic) => (graphic.context as any)?.morphKey ?? graphic.context?.key; + + // Group graphics by their keys + const prevByKey = new Map(); + const nextByKey = new Map(); + + prevGraphics.forEach(graphic => { + const key = getKey(graphic); + if (key) { + if (!prevByKey.has(key)) { + prevByKey.set(key, []); + } + prevByKey.get(key).push(graphic); + } + }); + + nextGraphics.forEach(graphic => { + const key = getKey(graphic); + if (key) { + if (!nextByKey.has(key)) { + nextByKey.set(key, []); + } + nextByKey.get(key).push(graphic); + } + }); + + // TODO 这里逻辑有问题,无法实现一对多和多对一的morphing效果。所以如果无法执行一对一动画的话,直接不走morphing了 + if (!(prevByKey.size === nextByKey.size && Array.from(prevByKey.keys()).every(k => nextByKey.has(k)))) { + return false; + } + + // Find matching keys for update animation + const updateKeys = [...new Set([...prevByKey.keys()].filter(key => nextByKey.has(key)))]; + + // Find enter keys (in next but not in prev) + const enterKeys = [...nextByKey.keys()].filter(key => !prevByKey.has(key)); + + // Track morph operations to know when all are complete + let morphCount = 0; + const onMorphEnd = () => { + morphCount -= 1; + if (morphCount === 0) { + // Enable animations for next marks after all morphs complete + nextMarks.forEach(mark => { + // If mark has any animation states that were disabled, re-enable them + // This is placeholder logic - actual implementation depends on animation system + }); + } + }; + + // Handle enter animations + enterKeys.forEach(key => { + const nextElements = nextByKey.get(key); + doMorph([], nextElements, morphConfig, onMorphEnd, {}); + morphCount += 1; + }); + + // Handle update animations + updateKeys.forEach(key => { + const prevElements = prevByKey.get(key); + const nextElements = nextByKey.get(key); + + // Handle different count scenarios + const divideCount = Math.min(prevElements.length, nextElements.length); + if (divideCount > 0) { + const prevDivide = divideElements(prevElements, divideCount); + const nextDivide = divideElements(nextElements, divideCount); + + for (let i = 0; i < divideCount; i++) { + doMorph(prevDivide[i], nextDivide[i], morphConfig, onMorphEnd, {}); + morphCount += 1; + } + } + }); + + // Handle exit animations if needed (not in original sample but might be needed) + // This would be similar to enter but with empty next elements + + // If no morphs were started, call onMorphEnd to ensure animations are re-enabled + if (morphCount === 0) { + onMorphEnd(); + } + return true; +}; diff --git a/packages/vchart/src/component/axis/base-axis.ts b/packages/vchart/src/component/axis/base-axis.ts index 8c1ab60d99..691cc51488 100644 --- a/packages/vchart/src/component/axis/base-axis.ts +++ b/packages/vchart/src/component/axis/base-axis.ts @@ -11,7 +11,9 @@ import type { Datum, StringOrNumber, IGroup as ISeriesGroup, - CoordinateType + CoordinateType, + IRect, + ILayoutRect } from '../../typings'; import { BaseComponent } from '../base/base-component'; import { CompilableData } from '../../compile/data'; @@ -48,7 +50,7 @@ import { Factory } from '../../core/factory'; // eslint-disable-next-line no-duplicate-imports import { AXIS_ELEMENT_NAME, GroupTransition } from '@visactor/vrender-components'; // eslint-disable-next-line no-duplicate-imports -import { GroupFadeOut, GroupFadeIn } from '@visactor/vrender-core'; +import { GroupFadeOut, GroupFadeIn } from '@visactor/vrender-animate'; import { scaleParser } from '../../data/parser/scale'; import { registerDataSetInstanceParser } from '../../data/register'; import { getFormatFunction } from '../util'; @@ -463,7 +465,6 @@ export abstract class AxisComponent { registerComponentMark(); Factory.registerAnimation('axis', () => ({ appear: { - custom: GroupFadeIn + type: 'fadeIn' + }, + enter: { + type: 'fadeIn' }, update: { - custom: GroupTransition + type: 'update' }, exit: { - custom: GroupFadeOut + type: 'fadeOut' + // custom: GroupFadeOut } })); }; diff --git a/packages/vchart/src/component/axis/cartesian/axis.ts b/packages/vchart/src/component/axis/cartesian/axis.ts index 11e87aaaff..19c760b5d0 100644 --- a/packages/vchart/src/component/axis/cartesian/axis.ts +++ b/packages/vchart/src/component/axis/cartesian/axis.ts @@ -749,7 +749,8 @@ export abstract class CartesianAxis { const startPoint = this.getLayoutStartPoint(); const { grid: updateGridAttrs, ...updateAxisAttrs } = this._getUpdateAttribute(false); - //const axisComponent = this._axisMark.getComponent(); // 获取语法元素 const axisAttrs = mergeSpec({ x: startPoint.x, y: startPoint.y }, this._axisStyle, updateAxisAttrs); //axisComponent.setAttributes(axisAttrs); - this._axisMark.setSimpleStyle(axisAttrs); if (this._gridMark) { diff --git a/packages/vchart/src/component/axis/polar/axis.ts b/packages/vchart/src/component/axis/polar/axis.ts index a465107296..86376c972a 100644 --- a/packages/vchart/src/component/axis/polar/axis.ts +++ b/packages/vchart/src/component/axis/polar/axis.ts @@ -461,7 +461,8 @@ export abstract class PolarAxis { - const diffState = graphic.context.diffState; + const diffState = graphic.context?.diffState; if (initial) { return diffState === 'exit' ? undefined : AnimationStateEnum.appear; } return diffState; }; - this._compiler.getRootMarks().forEach(mark => { mark.updateAnimationState(updateGraphicAnimationState); }); diff --git a/packages/vchart/src/index-harmony-simple.ts b/packages/vchart/src/index-harmony-simple.ts index a55ce36e11..2e216cf893 100644 --- a/packages/vchart/src/index-harmony-simple.ts +++ b/packages/vchart/src/index-harmony-simple.ts @@ -55,7 +55,7 @@ import { registerCustomMark } from './component/custom-mark'; import { registerGridLayout } from './layout/grid-layout/grid-layout'; import { registerPoptip } from './component/poptip'; import { registerCanvasTooltipHandler } from './plugin/components/tooltip-handler'; -import { DefaultTicker } from '@visactor/vrender-core'; +import { DefaultTicker } from '@visactor/vrender-animate'; import { registerAnimate } from './plugin/other'; import { registerElementSelect } from './interaction/triggers/element-select'; import { registerElementHighlight } from './interaction/triggers/element-highlight'; diff --git a/packages/vchart/src/index-harmony.ts b/packages/vchart/src/index-harmony.ts index 6e64c5f289..f6393ecc5d 100644 --- a/packages/vchart/src/index-harmony.ts +++ b/packages/vchart/src/index-harmony.ts @@ -55,7 +55,7 @@ import { registerCustomMark } from './component/custom-mark'; import { registerGridLayout } from './layout/grid-layout/grid-layout'; import { registerPoptip } from './component/poptip'; import { registerCanvasTooltipHandler } from './plugin/components/tooltip-handler'; -import { DefaultTicker } from '@visactor/vrender-core'; +import { DefaultTicker } from '@visactor/vrender-animate'; import { registerAnimate } from './plugin/other'; import { registerElementHighlight } from './interaction/triggers/element-highlight'; import { registerElementSelect } from './interaction/triggers/element-select'; diff --git a/packages/vchart/src/index.ts b/packages/vchart/src/index.ts index c4e0725353..8316ea24ad 100644 --- a/packages/vchart/src/index.ts +++ b/packages/vchart/src/index.ts @@ -29,3 +29,4 @@ export * from './util/mark'; // base component model for extension export * from './component/base'; export * from './compile/data/compilable-data'; +export * from './animation'; diff --git a/packages/vchart/src/interaction/interaction.ts b/packages/vchart/src/interaction/interaction.ts index 20f613df6e..b70d7dace8 100644 --- a/packages/vchart/src/interaction/interaction.ts +++ b/packages/vchart/src/interaction/interaction.ts @@ -87,7 +87,9 @@ export class Interaction implements IInteraction { reverseState && markIdByState[reverseState] && markIdByState[reverseState].includes(g.context.markId); if (hasReverse) { - g.addState(reverseState, true); + const m = g.parent?.mark; + const hasAnimation = (m as any).hasAnimationByState && (m as any).hasAnimationByState('state'); + g.addState(reverseState, true, hasAnimation); } }); @@ -96,7 +98,9 @@ export class Interaction implements IInteraction { reverseState && markIdByState[reverseState] && markIdByState[reverseState].includes(g.context.markId); if (hasReverse) { - g.removeState(reverseState); + const m = g.parent?.mark; + const hasAnimation = (m as any).hasAnimationByState && (m as any).hasAnimationByState('state'); + g.removeState(reverseState, hasAnimation); } }); } @@ -113,15 +117,18 @@ export class Interaction implements IInteraction { const hasState = state && markIdByState[state] && markIdByState[state].includes(g.context.markId); if (hasState) { - g.removeState(state); + const m = g.parent?.mark; + const hasAnimation = (m as any).hasAnimationByState && (m as any).hasAnimationByState('state'); + g.removeState(state, hasAnimation); } }); newStatedGraphics.forEach(g => { const hasState = state && markIdByState[state] && markIdByState[state].includes(g.context.markId); - if (hasState) { - g.addState(state, true); + const m = g.parent?.mark; + const hasAnimation = (m as any).hasAnimationByState && (m as any).hasAnimationByState('state'); + g.addState(state, true, hasAnimation); } }); } @@ -143,16 +150,16 @@ export class Interaction implements IInteraction { return; } + const hasAnimation = (m as any).hasAnimationByState && (m as any).hasAnimationByState('state'); m.getGraphics()?.forEach(g => { const isStated = statedGraphics && statedGraphics.includes(g); - if (isStated) { if (hasState) { - g.addState(state, true); + g.addState(state, true, hasAnimation); } } else { if (hasReverse) { - g.addState(reverseState, true); + g.addState(reverseState, true, hasAnimation); } } }); @@ -170,12 +177,14 @@ export class Interaction implements IInteraction { return; } + const hasAnimation = (mark as any).hasAnimationByState && (mark as any).hasAnimationByState('state'); + mark.getGraphics()?.forEach(g => { const isStated = statedGraphics && statedGraphics.includes(g); if (isStated) { if (hasState) { - g.addState(state, true); + g.addState(state, true, hasAnimation); } } }); @@ -198,18 +207,18 @@ export class Interaction implements IInteraction { marks.forEach(mark => { if (mark) { const graphics = mark.getGraphics(); - + const hasAnimation = (mark as any).hasAnimationByState && (mark as any).hasAnimationByState('state'); if (graphics && graphics.length) { if (reverseState && markIdByState[reverseState] && markIdByState[reverseState].includes(mark.id)) { graphics.forEach(g => { - g.removeState(reverseState); + g.removeState(reverseState, hasAnimation); }); } if (state && markIdByState[state] && markIdByState[state].includes(mark.id)) { graphics.forEach(g => { if (statedGraphics.includes(g)) { - g.removeState(state); + g.removeState(state, hasAnimation); } }); } diff --git a/packages/vchart/src/mark/arc-3d.ts b/packages/vchart/src/mark/arc-3d.ts index 77617f8ca5..9645ae14f4 100644 --- a/packages/vchart/src/mark/arc-3d.ts +++ b/packages/vchart/src/mark/arc-3d.ts @@ -3,7 +3,7 @@ import type { IArc3dMarkSpec } from '../typings'; import { BaseArcMark } from './arc'; import type { IArc3dMark } from './interface'; import { MarkTypeEnum } from './interface/type'; -import { registerVGrammarArcAnimation } from '../animation/config'; +import { registerArcAnimation } from '../animation/config'; import { registerArc3d, registerShadowRoot } from '@visactor/vrender-kits'; import { createArc3d } from '@visactor/vrender-core'; @@ -14,7 +14,7 @@ export class Arc3dMark extends BaseArcMark implements IArc3dMark } export const registerArc3dMark = () => { - registerVGrammarArcAnimation(); + registerArcAnimation(); registerShadowRoot(); registerArc3d(); Factory.registerGraphicComponent(MarkTypeEnum.arc3d, createArc3d); diff --git a/packages/vchart/src/mark/arc.ts b/packages/vchart/src/mark/arc.ts index 5b161b086d..13e809ef74 100644 --- a/packages/vchart/src/mark/arc.ts +++ b/packages/vchart/src/mark/arc.ts @@ -7,7 +7,7 @@ import { BaseMark } from './base/base-mark'; import type { IArcMark, IMarkOption, IMarkRaw, IMarkStyle } from './interface'; // eslint-disable-next-line no-duplicate-imports import { MarkTypeEnum } from './interface/type'; -import { registerVGrammarArcAnimation } from '../animation/config'; +import { registerArcAnimation } from '../animation/config'; import { polarToCartesian } from '@visactor/vutils'; import { createArc } from '@visactor/vrender-core'; import { registerArcDataLabel } from '@visactor/vrender-components'; @@ -75,7 +75,7 @@ export const registerArcMark = () => { registerShadowRoot(); registerArc(); registerArcDataLabel(); - registerVGrammarArcAnimation(); + registerArcAnimation(); Factory.registerGraphicComponent(MarkTypeEnum.arc, createArc); Factory.registerMark(ArcMark.type, ArcMark); }; diff --git a/packages/vchart/src/mark/area.ts b/packages/vchart/src/mark/area.ts index db5d290c17..2ab0822be5 100644 --- a/packages/vchart/src/mark/area.ts +++ b/packages/vchart/src/mark/area.ts @@ -4,7 +4,7 @@ import { BaseLineMark, LINE_SEGMENT_ATTRIBUTES } from './base/base-line'; import type { IAreaMark, IMarkStyle } from './interface'; // eslint-disable-next-line no-duplicate-imports import { MarkTypeEnum } from './interface/type'; -import { registerVGrammarLineOrAreaAnimation } from '../animation/config'; +import { registerLineOrAreaAnimation } from '../animation/config'; import { registerArea, registerShadowRoot } from '@visactor/vrender-kits'; import { registerLineDataLabel, registerSymbolDataLabel } from '@visactor/vrender-components'; import { createArea } from '@visactor/vrender-core'; @@ -51,6 +51,6 @@ export const registerAreaMark = () => { registerArea(); registerLineDataLabel(); registerSymbolDataLabel(); - registerVGrammarLineOrAreaAnimation(); + registerLineOrAreaAnimation(); Factory.registerGraphicComponent(MarkTypeEnum.area, createArea); }; diff --git a/packages/vchart/src/mark/base/base-mark.ts b/packages/vchart/src/mark/base/base-mark.ts index fa917e72e5..2a7411090e 100644 --- a/packages/vchart/src/mark/base/base-mark.ts +++ b/packages/vchart/src/mark/base/base-mark.ts @@ -1,4 +1,4 @@ -import { DiffState } from './../interface/enum'; +import { DiffState } from '../interface/enum'; import { type IStateInfo, type IModelMarkAttributeContext, STATE_VALUE_ENUM } from '../../compile/mark/interface'; import type { BaseSeries } from '../../series/base/base-series'; import type { @@ -44,12 +44,18 @@ import { isValidScaleType } from '@visactor/vscale'; import { computeActualDataScheme, getDataScheme } from '../../theme/color-scheme/util'; import type { ISeries } from '../../series/interface'; import { MarkStateManager } from '../../compile/mark'; -import type { ICompilableMark, IMarkCompileOption, IMarkConfig, StateValueType } from '../../compile/mark'; -import { array, degreeToRadian, isArray, isBoolean, isFunction, isNil, isObject, isValid } from '@visactor/vutils'; +import type { + ICompilableMark, + IMarkCompileOption, + IMarkConfig, + IMarkStateManager, + StateValueType +} from '../../compile/mark/interface'; +import { array, degreeToRadian, has, isArray, isBoolean, isFunction, isNil, isObject, isValid } from '@visactor/vutils'; import { curveTypeTransform, groupData, runEncoder } from '../utils/common'; import type { ICompilableInitOption } from '../../compile/interface'; import { LayoutState } from '../../compile/interface'; -import type { IGroupGraphicAttribute, IGraphicAttribute, IGroup } from '@visactor/vrender-core'; +import type { IGroupGraphicAttribute, IGraphicAttribute, IGroup, IGraphic } from '@visactor/vrender-core'; import { createGroup, CustomPath2D } from '@visactor/vrender-core'; import { isStateAttrChangeable } from '../../compile/mark/util'; import { Factory } from '../../core/factory'; @@ -62,6 +68,7 @@ import type { IAnimationConfig } from '../../animation/interface'; import { AnimationStateEnum, type MarkAnimationSpec } from '../../animation/interface'; import { CompilableData } from '../../compile/data/compilable-data'; import { log } from '../../util'; +import { morph as runMorph } from '../../compile/morph'; export type ExChannelCall = ( key: string | number | symbol, @@ -166,7 +173,7 @@ export class BaseMark extends GrammarItem implements IMar stateStyle: IMarkStateStyle = {}; /** 状态管理器 */ - state: MarkStateManager; + state: IMarkStateManager; protected _unCompileChannel: { [key in string]: boolean } = {}; @@ -182,7 +189,27 @@ export class BaseMark extends GrammarItem implements IMar return this._animationConfig; } setAnimationConfig(config: Partial) { - this._animationConfig = config; + // 封装options,批量添加一些默认参数 + const animationConfig = { ...config }; + Object.keys(animationConfig).forEach(key => { + const value = (animationConfig as any)[key]; + if (isArray(value)) { + value.forEach(item => { + const options = item!.options ?? {}; + item.options = (...args: any[]) => { + const _options = typeof options === 'function' ? options(...args) : options; + return { + ..._options, + layoutRect: (this.model as any).getLayoutRect?.() + }; + }; + }); + } + // if (isNil(animationConfig[key])) { + // animationConfig[key] = {}; + // } + }); + this._animationConfig = animationConfig; } /** 布局标记 */ @@ -204,6 +231,9 @@ export class BaseMark extends GrammarItem implements IMar return this._product; } + // 保存上一次的mark,用于morph的时候获取上次的图元 + protected declare _lastMark?: IMark; + /** 初始化 mark data */ protected initMarkData(option: ICompilableInitOption) { this._data = new CompilableData(option); @@ -266,6 +296,8 @@ export class BaseMark extends GrammarItem implements IMar ); // todo 为了和之前的版本兼容,这里暂时设置成name this._product.name = id; + // 为了从graphic上能索引到mark + this._product.mark = this; // todo (group ?? this.getCompiler()?.getRootGroup()).appendChild(this._product); @@ -452,6 +484,7 @@ export class BaseMark extends GrammarItem implements IMar this.state.release(); super.release(); + this._lastMark = null; } protected _simpleStyle: T; @@ -484,7 +517,7 @@ export class BaseMark extends GrammarItem implements IMar this.name = name; this.model = option.model; this.key = option.key; - this.state = new MarkStateManager(option, this as unknown as IMark); + this.state = new MarkStateManager(option, this as unknown as IMark) as unknown as IMarkStateManager; // 这里的上下文多数情况下与 mark 是什么是没有关系的,与mark的使用者,也就是series,component有的逻辑有关。 this._attributeContext = option.attributeContext; option.map?.set(this.id, this as unknown as IMark); @@ -1004,6 +1037,14 @@ export class BaseMark extends GrammarItem implements IMar }; } + prepareMorph(mark: IMark) { + // 可以同类型进行morphing + // if (this.type === mark.type) { + // return; + // } + this._lastMark = mark; + } + reuse(mark: IMark) { if (this.type !== mark.type) { return; @@ -1060,7 +1101,7 @@ export class BaseMark extends GrammarItem implements IMar return this._graphics; } - protected _createGraphic(attrs: any = {}): IMarkGraphic { + protected _createGraphic(attrs: any = {}): IGraphic { return Factory.createGraphicComponent(this.type, attrs); } @@ -1079,6 +1120,131 @@ export class BaseMark extends GrammarItem implements IMar this._dataByGroup = groupData(data, this._groupKeyGetter); } + protected createAnimationStateList(type: string, animationConfig: Partial) { + let config = (animationConfig as any)[type]; + if (config && Array.isArray(config)) { + config = config.length === 1 ? config[0] : config; + } + // TODO 因为数据的覆盖特点,无动画的时候新的更新一定会覆盖前一次的旧值,所以默认都是后面的动画覆盖前面的动画 + // TODO 但是如果用户定义了一个动画数组,他的预期是动画不会覆盖,通过priority为INfinity来控制不覆盖 + if (Array.isArray(config)) { + config = config.map((item: any, index: number) => ({ + ...item, + priority: item.priority ?? Infinity + })); + } + return config; + } + + /** + * 尝试执行morphing动画 + * @param graphics + * @returns + */ + protected tryRunMorphing(graphics: IMarkGraphic[]) { + if (this._lastMark) { + // 得设置入场图元的属性 + graphics.forEach(g => { + if (g.context.animationState === 'appear' || g.context.animationState === 'enter') { + g.setAttributes((g.getAttributes as any)(true)); + } + }); + const res = runMorph([this._lastMark], [this as any], {}); + this._lastMark = null; + return res; + } + return false; + } + + protected _runStateAnimation(graphics: IMarkGraphic[]) { + if (!this._animationConfig || graphics.length === 0) { + return; + } + if (this.tryRunMorphing(graphics)) { + return; + } + const animationConfig = this.getAnimationConfig(); + const useSequentialAnimation = this._markConfig.useSequentialAnimation ?? false; + if (useSequentialAnimation && (this as any)._runSequentialAnimations) { + (this as any)._runSequentialAnimations(graphics); + return; + } + // 过滤出appear动画出来,appear动画是整体动画,可以放在全局,同时appear动画和normal动画是串行关系 + const isAppear = graphics.every(g => g.context.animationState === 'appear'); + // const appearConfig = (animationConfig as any).appear?.[0]; // TODO: animation: appear 数组 + const appearConfig = this.createAnimationStateList('appear', animationConfig); + if (isAppear && this._product) { + // TODO 一般appear都在最开始执行,所以这里不需要停掉normal动画 + // (this._product as IGroup).stopAnimationState('normal'); + const stateArray = appearConfig ? ['appear'] : []; + const configArray = appearConfig + ? [ + { + name: 'appear', + animation: appearConfig + } + ] + : []; + + if ((animationConfig as any).normal) { + stateArray.push('normal'); + const normal = this.createAnimationStateList('normal', animationConfig); + const normalConfig = { + name: 'normal', + animation: normal + }; + + configArray.push(normalConfig); + } + this._product.applyAnimationState(stateArray, configArray); + } + + // 判断是否需要走normal动画,enter动画执行完成后,需要跟一个normal动画 + let shouldRunNormal = false; + // 处理除了appear以外的动画 + graphics.forEach(g => { + const state = g.context.animationState; + if (state === 'appear') { + return; + } + const config = (animationConfig as any)[state] as any; + if (config && config.length > 0) { + const configList = config.map((item: any, index: number) => ({ + name: `${state}_${index}`, + animation: item + })); + + configList.forEach((item: any) => { + item.animation.customParameters = g.context; + }); + + // configList.forEach((item: any) => { + // item.animation.customParameters = g.context; + // }); + const stateArray = [state]; + + if (state === 'enter' && animationConfig.normal) { + shouldRunNormal = true; + } + g.applyAnimationState(stateArray, [configList.length === 1 ? configList[0] : configList]); + // configList.forEach((item: any) => { + // item.animation.customParameters = null; + // }); + } + }); + + if (shouldRunNormal && this._product && (animationConfig as any).normal?.length) { + // 停止normal动画,并回复最初的属性 + (this._product as IGroup).stopAnimationState('normal', 'start'); + const normal = this.createAnimationStateList('normal', animationConfig); + const normalConfig = { + name: 'normal', + animation: normal + }; + (this._product as IGroup).applyAnimationState(['normal'], [normalConfig]); + } + } + protected _runJoin(data: Datum[]) { const newGroupedData = this._getDataByKey(data); const prevGroupedData = this._dataByKey; @@ -1104,8 +1270,15 @@ export class BaseMark extends GrammarItem implements IMar g = {} as IMarkGraphic; // } diffState = DiffState.enter; + g.isExiting = false; + // 复用exit的图元,需要设置属性为最初的属性 if (g.context?.diffState === DiffState.exit) { + // 表示正在被复用,后续需要重设属性的 + g.context.reusing = true; + // 停止所有动画, + // TODO:属性可能回不去了(如果enter和exit不是一个动画),所以在encode阶段要获取finalAttribute,设置上去 + (g as any).animates && (g as any).animates.forEach((a: any) => a.stop()); // force element to stop exit animation if it is reentered // todo animaiton // const animators = this.animate?.getElementAnimators(element, DiffState.exit); @@ -1128,11 +1301,25 @@ export class BaseMark extends GrammarItem implements IMar g.context = { ...this._getCommonContext(), diffState, + // 从旧context中继承 + reusing: g.context?.reusing, + // 从旧context中继承 + originalFieldX: g.context?.originalFieldX, + // 从旧context中继承 + originalFieldY: g.context?.originalFieldY, + // 从旧context中继承 + fieldX: g.context?.fieldX, + // 从旧context中继承 + fieldY: g.context?.fieldY, animationState: diffState, - data: newData, + // TODO 如果newData为空,则使用旧的data,避免exit图元找不到data + data: newData ?? g.context?.data, uniqueKey: key, key: newData ? this._keyGetter(newData[0]) : g.context?.key, - groupKey: newData ? this._groupKeyGetter(newData[0]) : g.context?.groupKey + groupKey: newData ? this._groupKeyGetter(newData[0]) : g.context?.groupKey, + // TODO 用于判定这个图元是第几个,在OneByOne动画中控制顺序 + indexKey: '__VCHART_DEFAULT_DATA_INDEX', + stateAnimateConfig: this.getAnimationConfig()?.state }; enterGraphics.delete(g); } @@ -1179,7 +1366,11 @@ export class BaseMark extends GrammarItem implements IMar (g as IMarkGraphic).release(); }); - + const graphicCount = newGraphics.length; + newGraphics.forEach((g, index) => { + g.context.graphicCount = graphicCount; + g.context.graphicIndex = index; + }); this._dataByKey = newGroupedData; this._graphics = newGraphics; } @@ -1284,6 +1475,7 @@ export class BaseMark extends GrammarItem implements IMar protected _runEncoder(graphics: IMarkGraphic[], noGroupEncode?: boolean) { const attrsByGroup = noGroupEncode ? null : this._runGroupEncoder(this._encoderOfState?.group); + const hasAnimation = this.hasAnimation(); graphics.forEach((g, index) => { const attrs = this._runEncoderOfGraphic(this._encoderOfState?.update, g); @@ -1293,10 +1485,20 @@ export class BaseMark extends GrammarItem implements IMar } const finalAttrs = this._transformGraphicAttributes(g, attrs, attrsByGroup?.[g.context.groupKey]); + const hasStateAnimation = this.hasAnimationByState(g.context.animationState); + // 新创建的graphic if (!(g as any).setAttributes) { const mockGraphic = g; - g = this._createGraphic(finalAttrs); + // TODO:如果要走入场、Enter动画,就不用设置值了,保存到diffAttrs中由入场动画自己去设置,因为入场动画可能会延迟执行,所以首帧不能直接设置属性 + // TODO 太麻烦了,会影响后续bounds等计算逻辑,还是首帧设置吧。。。 + g = this._createGraphic(hasStateAnimation ? {} : finalAttrs) as IMarkGraphic; + // g = this._createGraphic(finalAttrs) as IMarkGraphic; + // 如果有动画,设置一下最终attribute + if (hasAnimation) { + g.setFinalAttribute(finalAttrs); + } g.context = mockGraphic.context; + g.context.diffAttrs = finalAttrs; const gIndex = this._graphics === graphics ? index : index + this._graphics.length - graphics.length; if (gIndex >= 0) { @@ -1314,10 +1516,33 @@ export class BaseMark extends GrammarItem implements IMar this._graphicMap.set(g.context.uniqueKey, g); } } else { - if (this.hasAnimationByState(g.context.animationState)) { - // todo 执行动画 @zxy - } else { - g.setAttributes(finalAttrs); + // diff一下,获取差异的属性 + const prevAttrs: Record = g.getAttributes(true); + const diffAttrs: Record = {}; + Object.keys(finalAttrs).forEach(key => { + if (prevAttrs[key] !== finalAttrs[key]) { + diffAttrs[key] = finalAttrs[key]; + } + }); + g.context.diffAttrs = diffAttrs; + if (g.context.reusing) { + // 表示正在被复用,需要重设属性的 + // TODO 理论上复用后只会走一次enter,所以这里lastAttrs不需要后续清除,这里需要硬拷贝(通过initAttributes重设属性也行) + g.context.lastAttrs = g.attribute; + g.initAttributes({}); + // 为了避免exit一些和enter不一样的属性,所以这里要重置属性 + // const finalAttrs = g.getFinalAttribute(); + // finalAttrs && g.initAttributes({ ...finalAttrs }); + // g.initAttributes(finalAttrs); + g.context.reusing = false; + } else if (!hasStateAnimation) { + // 不是正在被复用的属性,也不需要走动画,那就设置属性 + hasAnimation ? g.setAttributesAndPreventAnimate(diffAttrs) : g.setAttributes(diffAttrs); + } + + // 如果有动画,需要设置值 + if (hasAnimation) { + g.setFinalAttribute(finalAttrs); } } @@ -1461,6 +1686,7 @@ export class BaseMark extends GrammarItem implements IMar }), this._graphics ); + this._runStateAnimation(this._graphics); } this._updateAttrsOfGroup(); @@ -1493,14 +1719,38 @@ export class BaseMark extends GrammarItem implements IMar } protected _cleanExitGraphics() { + const doRemove = (g: IMarkGraphic, key: string) => { + this._graphicMap.delete(key); + if (g.parent) { + g.parent.removeChild(g); + } + if (g.release) { + g.release(); + } + }; this._graphicMap.forEach((g, key) => { - if (g.context.diffState === DiffState.exit) { - this._graphicMap.delete(key); - if (g.parent) { - g.parent.removeChild(g); - } - if (g.release) { - g.release(); + // 避免重复执行退场动画 + if (g.context.diffState === DiffState.exit && !g.isExiting) { + if (this.hasAnimationByState('exit')) { + g.isExiting = true; + // 执行exit动画 + const animationConfig = this.getAnimationConfig(); + if ((animationConfig as any).exit && (animationConfig as any).exit.length) { + const exitConfigList = (animationConfig as any).exit.map((item: any, index: number) => ({ + name: `exit_${index}`, + animation: { + ...item, + customParameters: g.context + } + })); + g.applyAnimationState(['exit'], [exitConfigList.length === 1 ? exitConfigList[0] : exitConfigList], () => { + // 有可能又被复用了,所以这里需要判断,如果还是在exiting阶段的话才删除 + // TODO 这里如果频繁执行的话,可能会误判 + doRemove(g, key); + }); + } + } else { + doRemove(g, key); } } }); @@ -1684,16 +1934,29 @@ export class BaseMark extends GrammarItem implements IMar } updateAnimationState(callback: (graphic: IMarkGraphic) => AnimationStateValues) { - if (this._graphics) { - this._graphics.forEach(g => (g.context.animationState = callback(g))); + if (this._graphics && this._graphics.length) { + this._graphics.forEach(g => { + g.context.animationState = callback(g); + }); } } - hasAnimationByState(state: string) { + hasAnimationByState(state: keyof MarkAnimationSpec) { if (!state || !this._animationConfig || !this._animationConfig[state]) { return false; } const stateAnimationConfig = this._animationConfig[state]; return (stateAnimationConfig as IAnimationConfig[]).length > 0 || isObject(stateAnimationConfig); } + + hasAnimation() { + if (!this._animationConfig) { + return false; + } + return Object.keys(this._animationConfig).length > 0; + } + + runAnimation() { + this._runStateAnimation(this._graphics); + } } diff --git a/packages/vchart/src/mark/cell.ts b/packages/vchart/src/mark/cell.ts index 7350ccf5de..35587103f4 100644 --- a/packages/vchart/src/mark/cell.ts +++ b/packages/vchart/src/mark/cell.ts @@ -1,6 +1,6 @@ import { Factory } from './../core/factory'; import type { ICellMarkSpec } from '../typings'; -import type { ICellMark, IMarkStyle } from './interface'; +import type { ICellMark, IMarkGraphic, IMarkStyle } from './interface'; // eslint-disable-next-line no-duplicate-imports import { MarkTypeEnum } from './interface/type'; import { registerShadowRoot, registerSymbol } from '@visactor/vrender-kits'; @@ -28,7 +28,7 @@ export class CellMark extends BaseMark implements ICellMark { return createSymbol(attrs); } - protected _transformGraphicAttributes(g: IGraphic, attrs: any, groupAttrs?: any) { + protected _transformGraphicAttributes(g: IMarkGraphic, attrs: any, groupAttrs?: any) { const symbolAttrs = super._transformGraphicAttributes(g, attrs, groupAttrs); const symbolType = symbolAttrs.shape ?? symbolAttrs.symbolType ?? (g.attribute as ISymbolGraphicAttribute)?.symbolType; diff --git a/packages/vchart/src/mark/component.ts b/packages/vchart/src/mark/component.ts index 9968dbe8b0..7518350c75 100644 --- a/packages/vchart/src/mark/component.ts +++ b/packages/vchart/src/mark/component.ts @@ -56,6 +56,33 @@ export class ComponentMark extends BaseMark implements IComponentMa attrs = this._attributesTransform(attrs); } + if (this._animationConfig) { + attrs = { + ...attrs, + animation: true, + animationAppear: this._animationConfig.appear + ? Array.isArray(this._animationConfig.appear) + ? this._animationConfig.appear[0] + : this._animationConfig.appear + : undefined, + animationEnter: this._animationConfig.enter + ? Array.isArray(this._animationConfig.enter) + ? this._animationConfig.enter[0] + : this._animationConfig.enter + : undefined, + animationUpdate: this._animationConfig.update + ? Array.isArray(this._animationConfig.update) + ? this._animationConfig.update[0] + : this._animationConfig.update + : undefined, + animationExit: this._animationConfig.exit + ? Array.isArray(this._animationConfig.exit) + ? this._animationConfig.exit[0] + : this._animationConfig.exit + : undefined + } as any; + } + if (!this._component) { this._component = Factory.createGraphicComponent(this._componentType, attrs, { mode: this._mode, diff --git a/packages/vchart/src/mark/group.ts b/packages/vchart/src/mark/group.ts index b2255e91f3..e5d9d630ea 100644 --- a/packages/vchart/src/mark/group.ts +++ b/packages/vchart/src/mark/group.ts @@ -12,6 +12,7 @@ import type { IGroup, IGroupGraphicAttribute } from '@visactor/vrender-core'; import { registerGroup, registerShadowRoot } from '@visactor/vrender-kits'; import { isNil } from '@visactor/vutils'; import { traverseGroupMark } from '../compile/util'; +import { LayoutState } from '../compile/interface'; export class GroupMark extends BaseMark implements IGroupMark { static readonly type = MarkTypeEnum.group; @@ -110,8 +111,12 @@ export class GroupMark extends BaseMark implements IGroupMark { const style = this._simpleStyle ?? this.getAttributesOfState({}); - this._product.context = this._getCommonContext(); + this._product.context = { ...this._product.context, ...this._getCommonContext() }; this._product.setAttributes(this._getAttrsFromConfig(style)); + + if (this.getCompiler().getLayoutState() !== LayoutState.before) { + this._runStateAnimation(this.getGraphics()); + } } render(): void { @@ -127,6 +132,11 @@ export class GroupMark extends BaseMark implements IGroupMark { } updateAnimationState(callback: (g: IMarkGraphic) => AnimationStateValues) { + this.getGraphics().forEach(g => { + if (g) { + g.context = { ...g.context, animationState: callback(g) }; + } + }); this.getMarks().forEach(mark => { mark.updateAnimationState(callback); }); diff --git a/packages/vchart/src/mark/interface/common.ts b/packages/vchart/src/mark/interface/common.ts index b36c1ed0f4..0dda3b8f2c 100644 --- a/packages/vchart/src/mark/interface/common.ts +++ b/packages/vchart/src/mark/interface/common.ts @@ -13,7 +13,7 @@ import type { import type { Datum, StringOrNumber } from '../../typings'; import type { IGraphic } from '@visactor/vrender-core'; import type { IGroupMark } from './mark'; -import type { MarkAnimationType } from '../../animation/interface'; +import type { IAnimationConfig } from '../../animation/interface'; export interface VisualScaleType { scale: IBaseScale; @@ -83,6 +83,38 @@ export interface IGraphicContext { * 数据对比状态 */ diffState?: DiffStateValues; + /** + * 是否正在被复用的图元 + */ + reusing?: boolean; + /** + * 复用图元时,保存的上一次的旧属性(用于平滑的过渡动画) + */ + lastAttrs?: Record; + /** + * 用于判定这个图元是第几个,在OneByOne动画中控制顺序 + */ + indexKey?: string; + /** + * 差异的属性 + */ + diffAttrs?: Record; + /** + * 用于保存mark对应series的fieldX + */ + fieldX?: string[]; + /** + * 用于保存mark对应series的fieldX + */ + originalFieldX?: string[]; + /** + * 用于保存mark对应series的fieldY + */ + fieldY?: string[]; + /** + * 用于保存mark对应series的fieldY + */ + originalFieldY?: string[]; /** * 动画状态管理: 'appear' / 'enter' / 'update' / 'exit' / 'disappear' */ @@ -109,6 +141,18 @@ export interface IGraphicContext { * 状态 */ states?: string[]; + /** + * 图元总数量 + */ + graphicCount?: number; + /** + * 图元索引顺序 + */ + graphicIndex?: number; + /** + * 状态动画配置 + */ + stateAnimateConfig?: IAnimationConfig | IAnimationConfig[]; } export interface IMarkGraphic extends IGraphic { @@ -121,6 +165,11 @@ export interface IMarkGraphic extends IGraphic { * 上下文数据 */ context?: IGraphicContext; + + /** + * 是否正在退场 + */ + isExiting?: boolean; } /********** mark ***************/ @@ -158,6 +207,7 @@ export interface IMarkRaw extends ICompilableMark { getGraphics: () => IMarkGraphic[]; reuse: (mark: IMark) => void; + prepareMorph: (mark: IMark) => void; /** 是否启动了增量渲染模式 */ isProgressive: () => boolean; @@ -173,6 +223,8 @@ export interface IMarkRaw extends ICompilableMark { canAnimateAfterProgressive: () => boolean; /** 更新图元动画状态 */ updateAnimationState: (callback: (graphic: IMarkGraphic) => AnimationStateValues) => void; + /** 执行动画 */ + runAnimation: () => void; } export type IMark = IMarkRaw; diff --git a/packages/vchart/src/mark/line.ts b/packages/vchart/src/mark/line.ts index eb0f4d9241..23bd0c2a1d 100644 --- a/packages/vchart/src/mark/line.ts +++ b/packages/vchart/src/mark/line.ts @@ -5,7 +5,7 @@ import { BaseLineMark } from './base/base-line'; import type { ILineMark, IMarkStyle } from './interface'; // eslint-disable-next-line no-duplicate-imports import { MarkTypeEnum } from './interface/type'; -import { registerVGrammarLineOrAreaAnimation } from '../animation/config'; +import { registerLineOrAreaAnimation } from '../animation/config'; import type { IGraphic, ILineGraphicAttribute } from '@visactor/vrender-core'; import { createLine } from '@visactor/vrender-core'; import { registerLine, registerShadowRoot } from '@visactor/vrender-kits'; @@ -42,7 +42,7 @@ export const registerLineMark = () => { registerLine(); registerLineDataLabel(); registerSymbolDataLabel(); - registerVGrammarLineOrAreaAnimation(); + registerLineOrAreaAnimation(); Factory.registerGraphicComponent(MarkTypeEnum.line, createLine); }; diff --git a/packages/vchart/src/mark/polygon/polygon.ts b/packages/vchart/src/mark/polygon/polygon.ts index a2ba80f7d8..03b9fd2d59 100644 --- a/packages/vchart/src/mark/polygon/polygon.ts +++ b/packages/vchart/src/mark/polygon/polygon.ts @@ -4,7 +4,7 @@ import type { IPolygonMarkSpec } from '../../typings/visual'; import { BasePolygonMark } from './base-polygon'; import type { IMarkStyle, IPolygonMark } from '../interface'; import { MarkTypeEnum } from '../interface/type'; -import { registerVGrammarPolygonAnimation } from '../../animation/config'; +import { registerPolygonAnimation } from '../../animation/config'; import { registerPolygon, registerShadowRoot } from '@visactor/vrender-kits'; import { createPolygon } from '@visactor/vrender-core'; @@ -25,7 +25,7 @@ export const registerPolygonMark = () => { Factory.registerMark(PolygonMark.type, PolygonMark); registerShadowRoot(); registerPolygon(); - registerVGrammarPolygonAnimation(); + registerPolygonAnimation(); Factory.registerGraphicComponent(MarkTypeEnum.polygon, createPolygon); }; diff --git a/packages/vchart/src/mark/polygon/pyramid-3d.ts b/packages/vchart/src/mark/polygon/pyramid-3d.ts index 35d4b28818..e25409858f 100644 --- a/packages/vchart/src/mark/polygon/pyramid-3d.ts +++ b/packages/vchart/src/mark/polygon/pyramid-3d.ts @@ -3,7 +3,7 @@ import { Factory } from './../../core/factory'; import type { IPyramid3dMarkSpec } from '../../typings/visual'; import { MarkTypeEnum } from '../interface/type'; import { BasePolygonMark } from './base-polygon'; -import { registerVGrammarPolygonAnimation } from '../../animation/config'; +import { registerPolygonAnimation } from '../../animation/config'; import type { IPyramid3dMark } from '../interface/mark'; import { registerPyramid3d, registerShadowRoot } from '@visactor/vrender-kits'; import { createPyramid3d } from '@visactor/vrender-core'; @@ -17,7 +17,7 @@ export const registerPyramid3dMark = () => { Factory.registerMark(Pyramid3dMark.type, Pyramid3dMark); registerShadowRoot(); registerPyramid3d(); - registerVGrammarPolygonAnimation(); + registerPolygonAnimation(); Factory.registerGraphicComponent(MarkTypeEnum.pyramid3d, createPyramid3d); }; diff --git a/packages/vchart/src/mark/rect-3d.ts b/packages/vchart/src/mark/rect-3d.ts index 257d808ec6..7576e8dd2c 100644 --- a/packages/vchart/src/mark/rect-3d.ts +++ b/packages/vchart/src/mark/rect-3d.ts @@ -4,9 +4,8 @@ import { BaseMark } from './base/base-mark'; import type { IMarkStyle, IRect3dMark } from './interface'; // eslint-disable-next-line no-duplicate-imports import { MarkTypeEnum } from './interface/type'; -import { registerVGrammarRectAnimation } from '../animation/config'; +import { registerRectAnimation } from '../animation/config'; import { registerRect3d, registerShadowRoot } from '@visactor/vrender-kits'; -import type { IGraphic, IRect3dGraphicAttribute } from '@visactor/vrender-core'; import { createRect3d } from '@visactor/vrender-core'; export class Rect3dMark extends BaseMark implements IRect3dMark { @@ -28,7 +27,7 @@ export const registerRect3dMark = () => { Factory.registerMark(Rect3dMark.type, Rect3dMark); registerShadowRoot(); registerRect3d(); - registerVGrammarRectAnimation(); + registerRectAnimation(); Factory.registerGraphicComponent(MarkTypeEnum.rect3d, createRect3d); }; diff --git a/packages/vchart/src/mark/rect.ts b/packages/vchart/src/mark/rect.ts index 383c15fed5..3ccd259a7e 100644 --- a/packages/vchart/src/mark/rect.ts +++ b/packages/vchart/src/mark/rect.ts @@ -4,7 +4,7 @@ import { BaseMark } from './base/base-mark'; import type { IMarkStyle, IRectMark } from './interface'; // eslint-disable-next-line no-duplicate-imports import { MarkTypeEnum } from './interface/type'; -import { registerVGrammarRectAnimation } from '../animation/config'; +import { registerRectAnimation } from '../animation/config'; import { registerRect, registerShadowRoot } from '@visactor/vrender-kits'; import { registerRectDataLabel } from '@visactor/vrender-components'; import { createRect } from '@visactor/vrender-core'; @@ -29,7 +29,7 @@ export const registerRectMark = () => { registerRect(); registerRectDataLabel(); Factory.registerMark(RectMark.type, RectMark); - registerVGrammarRectAnimation(); + registerRectAnimation(); Factory.registerGraphicComponent(MarkTypeEnum.rect, createRect); }; diff --git a/packages/vchart/src/mark/ripple.ts b/packages/vchart/src/mark/ripple.ts index 72aa265868..c59a93e613 100644 --- a/packages/vchart/src/mark/ripple.ts +++ b/packages/vchart/src/mark/ripple.ts @@ -44,7 +44,7 @@ export class RippleMark extends GlyphMark implements IRippleMar } }; - protected _positionChannels: string[] = ['ripple']; + protected _positionChannels: string[] = ['ripple', 'size']; protected _positionEncoder = (glyphAttrs: any, datum: Datum, g: IGlyph) => { const { ripple = (g.attribute as any).ripple, size = (g.attribute as any).size } = glyphAttrs; diff --git a/packages/vchart/src/mark/text.ts b/packages/vchart/src/mark/text.ts index 9c3e9c8202..91f5bb62ef 100644 --- a/packages/vchart/src/mark/text.ts +++ b/packages/vchart/src/mark/text.ts @@ -1,7 +1,7 @@ import { Factory } from './../core/factory'; import type { IComposedTextMarkSpec } from '../typings/visual'; import { BaseMark } from './base/base-mark'; -import type { IMarkOption, IMarkStyle } from './interface'; +import type { IMarkGraphic, IMarkOption, IMarkStyle } from './interface'; // eslint-disable-next-line no-duplicate-imports import { MarkTypeEnum } from './interface'; import type { ITextMark, ITextSpec } from './interface/mark'; @@ -42,7 +42,7 @@ export class TextMark extends BaseMark implements ITextMa } } - protected _transformGraphicAttributes(g: IGraphic, attrs: any, groupAttrs?: any) { + protected _transformGraphicAttributes(g: IMarkGraphic, attrs: any, groupAttrs?: any) { const textAttrs = super._transformGraphicAttributes(g, attrs, groupAttrs); const { text } = textAttrs; diff --git a/packages/vchart/src/plugin/other.ts b/packages/vchart/src/plugin/other.ts index 03064b6e84..d14944f9a5 100644 --- a/packages/vchart/src/plugin/other.ts +++ b/packages/vchart/src/plugin/other.ts @@ -6,10 +6,10 @@ import { registerViewTransform3dPlugin } from '@visactor/vrender-core'; -// import { registerViewMorphAPI, registerAnimate as registerAnimateAPI } from '@visactor/vgrammar-core'; -import { registerVGrammarCommonAnimation } from '../animation/config'; +import { registerAnimate as registerVRenderAnimate } from '@visactor/vrender-animate'; import { DragNDrop, Gesture } from '@visactor/vrender-kits'; import { Factory } from '../core/factory'; +import { registerBuiltInAnimation } from '../animation/config'; export const register3DPlugin = () => { registerDirectionalLight(); @@ -18,8 +18,8 @@ export const register3DPlugin = () => { }; export const registerAnimate = () => { - // registerAnimateAPI(); - registerVGrammarCommonAnimation(); + registerVRenderAnimate(); + registerBuiltInAnimation(); }; export const registerDragPlugin = () => { diff --git a/packages/vchart/src/series/base/base-series.ts b/packages/vchart/src/series/base/base-series.ts index 941ad0dedf..5c1899f56e 100644 --- a/packages/vchart/src/series/base/base-series.ts +++ b/packages/vchart/src/series/base/base-series.ts @@ -1315,6 +1315,7 @@ export abstract class BaseSeries extends BaseModel imp large: (spec as IMarkProgressiveConfig).large, largeThreshold: (spec as IMarkProgressiveConfig).largeThreshold, morph: config.morph ?? false, + useSequentialAnimation: spec.useSequentialAnimation, support3d: is3DMark(markInfo.type as MarkTypeEnum) || (config.support3d ?? (spec.support3d || !!(spec as any).zField)), morphKey: spec.morph?.morphKey || `${this.getSpecIndex()}_${this.getMarks().length}`, diff --git a/packages/vchart/src/series/box-plot/animation.ts b/packages/vchart/src/series/box-plot/animation.ts new file mode 100644 index 0000000000..4f81c7a0bb --- /dev/null +++ b/packages/vchart/src/series/box-plot/animation.ts @@ -0,0 +1,283 @@ +import type { EasingType, ILineAttribute, IRectAttribute } from '@visactor/vrender-core'; +import type { IGlyph } from '@visactor/vrender-core'; +import type { IAnimationParameters } from '../../animation/interface'; +import { isValidNumber } from '@visactor/vutils'; +import { ACustomAnimate, AnimateExecutor } from '@visactor/vrender-animate'; +export interface IBoxplotScaleAnimationOptions { + center?: number; +} + +type TypeAnimation = ( + graphic: IGlyph, + options: IBoxplotScaleAnimationOptions, + animationParameters: IAnimationParameters +) => { from?: { [channel: string]: any }; to?: { [channel: string]: any } }; + +const scaleIn = ( + computeCenter: ( + graphic: IGlyph, + direction: 'vertical' | 'horizontal', + options: IBoxplotScaleAnimationOptions + ) => number +): TypeAnimation => { + return (graphic: IGlyph, options: IBoxplotScaleAnimationOptions, animationParameters: IAnimationParameters) => { + const finalAttribute = graphic.getFinalAttribute(); + const direction = finalAttribute.direction ?? 'vertical'; + const center = computeCenter(graphic, direction, options); + if (!isValidNumber(center)) { + return {}; + } + const { x, y, min, max, q1, q3, median } = finalAttribute; + const animateAttributes: any = { from: { x, y }, to: { x, y } }; + if (isValidNumber(min)) { + animateAttributes.from.min = center; + animateAttributes.to.min = min; + } + if (isValidNumber(max)) { + animateAttributes.from.max = center; + animateAttributes.to.max = max; + } + if (isValidNumber(q1)) { + animateAttributes.from.q1 = center; + animateAttributes.to.q1 = q1; + } + if (isValidNumber(q3)) { + animateAttributes.from.q3 = center; + animateAttributes.to.q3 = q3; + } + if (isValidNumber(median)) { + animateAttributes.from.median = center; + animateAttributes.to.median = median; + } + return animateAttributes; + }; +}; + +const scaleOut = ( + computeCenter: (mark: IGlyph, direction: 'vertical' | 'horizontal', options: IBoxplotScaleAnimationOptions) => number +): TypeAnimation => { + return (graphic: IGlyph, options: IBoxplotScaleAnimationOptions, animationParameters: IAnimationParameters) => { + const finalAttribute = graphic.getFinalAttribute(); + const direction = finalAttribute.direction ?? 'vertical'; + const center = computeCenter(graphic, direction, options); + if (!isValidNumber(center)) { + return {}; + } + const { x, y, min, max, q1, q3, median } = finalAttribute; + + const animateAttributes: any = { from: { x, y }, to: { x, y } }; + if (isValidNumber(min)) { + animateAttributes.to.min = center; + animateAttributes.from.min = min; + } + if (isValidNumber(max)) { + animateAttributes.to.max = center; + animateAttributes.from.max = max; + } + if (isValidNumber(q1)) { + animateAttributes.to.q1 = center; + animateAttributes.from.q1 = q1; + } + if (isValidNumber(q3)) { + animateAttributes.to.q3 = center; + animateAttributes.from.q3 = q3; + } + if (isValidNumber(median)) { + animateAttributes.to.median = center; + animateAttributes.from.median = median; + } + return animateAttributes; + }; +}; +const getGlyphChildByName = (mark: IGlyph, name: string) => { + return mark.getSubGraphic().find(child => child.name === name); +}; + +const computeBoxplotCenter = ( + glyphMark: IGlyph, + direction: 'vertical' | 'horizontal', + options: IBoxplotScaleAnimationOptions +) => { + if (options && isValidNumber(options.center)) { + return options.center; + } + let median: number; + let max: number; + let min: number; + let q1: number; + let q3: number; + if (isHorizontal(direction)) { + median = (getGlyphChildByName(glyphMark, 'median')?.attribute as ILineAttribute).points?.[0]?.x; + max = (getGlyphChildByName(glyphMark, 'max')?.attribute as ILineAttribute)?.points?.[0]?.x; + min = (getGlyphChildByName(glyphMark, 'min')?.attribute as ILineAttribute)?.points?.[0]?.x; + + const boxWidth = (getGlyphChildByName(glyphMark, 'box').attribute as IRectAttribute).width; + const boxX = getGlyphChildByName(glyphMark, 'box').attribute.x; + q1 = boxX; + q3 = boxX + boxWidth; + } else { + median = (getGlyphChildByName(glyphMark, 'median')?.attribute as ILineAttribute).points?.[0]?.y; + max = (getGlyphChildByName(glyphMark, 'max')?.attribute as ILineAttribute)?.points?.[0]?.y; + min = (getGlyphChildByName(glyphMark, 'min')?.attribute as ILineAttribute)?.points?.[0]?.y; + + const boxHeight = (getGlyphChildByName(glyphMark, 'box').attribute as IRectAttribute).height; + const boxY = getGlyphChildByName(glyphMark, 'box').attribute.y; + q1 = boxY; + q3 = boxY + boxHeight; + } + + if (isValidNumber(median)) { + return median; + } + if (isValidNumber(q1) && isValidNumber(q3)) { + return (q1 + q3) / 2; + } + if (isValidNumber(max) && isValidNumber(min)) { + return (max + min) / 2; + } + if (isValidNumber(min)) { + return min; + } + if (isValidNumber(max)) { + return max; + } + return NaN; +}; + +const computeBarBoxplotCenter = ( + glyphMark: IGlyph, + direction: 'vertical' | 'horizontal', + options: IBoxplotScaleAnimationOptions +) => { + if (isValidNumber(options?.center)) { + return options.center; + } + let median: number; + let max: number; + let min: number; + let q1: number; + let q3: number; + if (direction === 'horizontal') { + median = (getGlyphChildByName(glyphMark, 'median')?.attribute as ILineAttribute).points?.[0]?.x; + const minMaxBoxWidth = (getGlyphChildByName(glyphMark, 'minMaxBox')?.attribute as IRectAttribute).width; + const minMaxBoxBoxX = getGlyphChildByName(glyphMark, 'minMaxBox')?.attribute.x; + min = minMaxBoxBoxX; + max = minMaxBoxBoxX + minMaxBoxWidth; + + const q1q3BoxWidth = (getGlyphChildByName(glyphMark, 'q1q3Box')?.attribute as IRectAttribute).width; + const q1q3BoxX = getGlyphChildByName(glyphMark, 'q1q3Box')?.attribute.x; + q1 = q1q3BoxX; + q3 = q1q3BoxX + q1q3BoxWidth; + } else { + median = (getGlyphChildByName(glyphMark, 'median')?.attribute as ILineAttribute).points?.[0]?.y; + + const minMaxBoxHeight = (getGlyphChildByName(glyphMark, 'minMaxBox')?.attribute as IRectAttribute).height; + const minMaxBoxBoxY = getGlyphChildByName(glyphMark, 'minMaxBox')?.attribute.y; + min = minMaxBoxBoxY; + max = minMaxBoxBoxY + minMaxBoxHeight; + + const q1q3BoxHeight = (getGlyphChildByName(glyphMark, 'q1q3Box')?.attribute as IRectAttribute).height; + const q1q3BoxY = getGlyphChildByName(glyphMark, 'q1q3Box')?.attribute.y; + q1 = q1q3BoxY; + q3 = q1q3BoxY + q1q3BoxHeight; + } + + if (isValidNumber(median)) { + return median; + } + if (isValidNumber(q1) && isValidNumber(q3)) { + return (q1 + q3) / 2; + } + if (isValidNumber(max) && isValidNumber(min)) { + return (max + min) / 2; + } + if (isValidNumber(min)) { + return min; + } + if (isValidNumber(max)) { + return max; + } + return NaN; +}; + +export class BoxplotScaleIn extends ACustomAnimate> { + constructor(from: null, to: null, duration: number, easing: EasingType, params?: IBoxplotScaleAnimationOptions) { + super(from, to, duration, easing, params); + } + + onBind(): void { + super.onBind(); + const finalAttribute = this.target.getFinalAttribute(); + if (finalAttribute) { + this.target.setAttributes(finalAttribute); + } + const { from, to } = this.computeAttribute(); + this.propKeys = Object.keys(to).filter(key => to[key] != null); + this.animate.reSyncProps(); + this.from = from; + this.to = to; + this.target.setAttributes(this.from); + } + + computeAttribute() { + return scaleIn(computeBoxplotCenter)(this.target as IGlyph, this.params, this.params.options); + } + + onUpdate(end: boolean, ratio: number, out: Record): void { + const attribute: Record = this.target.attribute; + this.propKeys.forEach(key => { + attribute[key] = this.from[key] + (this.to[key] - this.from[key]) * ratio; + }); + this.target.setAttributes(attribute); + } +} + +export class BoxplotScaleOut extends ACustomAnimate> { + constructor(from: null, to: null, duration: number, easing: EasingType, params?: IBoxplotScaleAnimationOptions) { + super(from, to, duration, easing, params); + } + + onBind(): void { + // 用于入场的时候设置属性(因为有动画的时候VChart不会再设置属性了) + if (this.params?.diffAttrs) { + this.target.setAttributes(this.params.diffAttrs); + } + const { from, to } = this.computeAttribute(); + this.propKeys = Object.keys(to).filter(key => to[key] != null); + this.animate.reSyncProps(); + this.from = from; + this.to = to; + this.target.setAttributes(this.from); + } + + computeAttribute() { + return scaleOut(computeBoxplotCenter)(this.target as IGlyph, this.params, this.params.options); + } + + onUpdate(end: boolean, ratio: number, out: Record): void { + const attribute: Record = this.target.attribute; + this.propKeys.forEach(key => { + attribute[key] = this.from[key] + (this.to[key] - this.from[key]) * ratio; + }); + this.target.setAttributes(attribute); + } +} + +export class BarBoxplotScaleIn extends BoxplotScaleIn { + computeAttribute() { + return scaleIn(computeBarBoxplotCenter)(this.target as IGlyph, this.params, this.params.options); + } +} + +export class BarBoxplotScaleOut extends BoxplotScaleOut { + computeAttribute() { + return scaleOut(computeBarBoxplotCenter)(this.target as IGlyph, this.params, this.params.options); + } +} + +export const registeBoxPlotScaleAnimation = () => { + AnimateExecutor.registerBuiltInAnimate('boxplotScaleIn', BoxplotScaleIn); + AnimateExecutor.registerBuiltInAnimate('boxplotScaleOut', BoxplotScaleOut); + AnimateExecutor.registerBuiltInAnimate('barBoxplotScaleIn', BarBoxplotScaleIn); + AnimateExecutor.registerBuiltInAnimate('barBoxplotScaleOut', BarBoxplotScaleOut); +}; diff --git a/packages/vchart/src/series/box-plot/box-plot.ts b/packages/vchart/src/series/box-plot/box-plot.ts index 2501ea67f9..24c2310fd7 100644 --- a/packages/vchart/src/series/box-plot/box-plot.ts +++ b/packages/vchart/src/series/box-plot/box-plot.ts @@ -31,6 +31,7 @@ import { getGroupAnimationParams } from '../util/utils'; import { registerCartesianLinearAxis, registerCartesianBandAxis } from '../../component/axis/cartesian'; import type { ICompilableData } from '../../compile/data'; import { CompilableData } from '../../compile/data'; +import { registeBoxPlotScaleAnimation } from './animation'; const DEFAULT_STROKE_WIDTH = 2; const DEFAULT_SHAFT_FILL_OPACITY = 0.5; @@ -127,12 +128,14 @@ export class BoxPlotSeries ex groupKey: this._seriesField, isSeriesMark: true }) as IBoxPlotMark; - this._outlierMark = this._createMark(BoxPlotSeries.mark.outlier, { - key: DEFAULT_DATA_INDEX, - groupKey: this._seriesField, - dataView: this._outlierDataView.getDataView(), - dataProductId: this._outlierDataView.getProductId() - }) as ISymbolMark; + if (this._outliersField) { + this._outlierMark = this._createMark(BoxPlotSeries.mark.outlier, { + key: DEFAULT_DATA_INDEX, + groupKey: this._seriesField, + dataView: this._outlierDataView.getDataView(), + dataProductId: this._outlierDataView.getProductId() + }) as ISymbolMark; + } } initMarkStyle(): void { @@ -407,5 +410,6 @@ export const registerBoxplotSeries = () => { registerScaleInOutAnimation(); registerCartesianBandAxis(); registerCartesianLinearAxis(); + registeBoxPlotScaleAnimation(); Factory.registerSeries(BoxPlotSeries.type, BoxPlotSeries); }; diff --git a/packages/vchart/src/series/box-plot/tooltip-helper.ts b/packages/vchart/src/series/box-plot/tooltip-helper.ts index 15eedad7da..79e4cecc12 100644 --- a/packages/vchart/src/series/box-plot/tooltip-helper.ts +++ b/packages/vchart/src/series/box-plot/tooltip-helper.ts @@ -134,7 +134,7 @@ export class BoxPlotSeriesTooltipHelper extends BaseSeriesTooltipHelper implemen getOutlierFillColor = (datum: Datum) => { const outliersStyle = (this.series as BoxPlotSeries).getOutliersStyle(); - return outliersStyle?.fill ?? (this.series.getMarkInName('outlier').getAttribute('fill' as any, datum) as any); + return outliersStyle?.fill ?? (this.series.getMarkInName('outlier')?.getAttribute('fill' as any, datum) as any); }; isOutlierMark = (datum: Datum) => { return isValid(datum[BOX_PLOT_OUTLIER_VALUE_FIELD]); diff --git a/packages/vchart/src/series/funnel/funnel.ts b/packages/vchart/src/series/funnel/funnel.ts index f1bcc02ea2..ad31c2e20d 100644 --- a/packages/vchart/src/series/funnel/funnel.ts +++ b/packages/vchart/src/series/funnel/funnel.ts @@ -405,19 +405,9 @@ export class FunnelSeries { direction: () => (this._isHorizontal() ? 'x' : 'y'), width: () => { - const rootMark = this.getRootMark().getProduct(); - if (rootMark) { - const { x1, x2 } = rootMark.AABBBounds; - return Math.max(x1, x2); // rootMark.x === 0, so need to find largest bound x instead of bounds width - } return this.getLayoutRect().width; }, height: () => { - const rootMark = this.getRootMark().getProduct(); - if (rootMark) { - const { y1, y2 } = rootMark.AABBBounds; - return Math.max(y1, y2); - } return this.getLayoutRect().height; }, orient: () => (this._isReverse() ? 'negative' : 'positive') diff --git a/packages/vchart/src/series/liquid/animation.ts b/packages/vchart/src/series/liquid/animation.ts index f3f95a53b2..d80aad7a85 100644 --- a/packages/vchart/src/series/liquid/animation.ts +++ b/packages/vchart/src/series/liquid/animation.ts @@ -21,16 +21,7 @@ const Appear_Grow = (params: ILiquidAnimationParams): IAnimationTypeConfig => { }; }; -const Appear_WaveGrow = (params: ILiquidAnimationParams): IAnimationTypeConfig => { - return { - duration: 2000, - channel: { - wave: { from: 0, to: 1 }, - height: params.height, - dy: params.dy - } - }; -}; +const Appear_WaveGrow = Appear_Grow; const Appear_Group_Grow = (params: ILiquidAnimationParams): IAnimationTypeConfig => { return { diff --git a/packages/vchart/src/series/pie/animation/animation.ts b/packages/vchart/src/series/pie/animation/animation.ts index 26e8fdf21f..f99bcda6d4 100644 --- a/packages/vchart/src/series/pie/animation/animation.ts +++ b/packages/vchart/src/series/pie/animation/animation.ts @@ -3,7 +3,7 @@ import { AnimationStateEnum } from '../../../animation/interface'; import type { Datum } from '../../../typings'; import { Factory } from '../../../core/factory'; import type { IPieAnimationParams, PieAppearPreset } from '../interface'; -import type { IGraphic } from '@visactor/vrender-core'; +import type { IMarkGraphic } from '../../../core'; /** * grow生长option @@ -14,7 +14,7 @@ import type { IGraphic } from '@visactor/vrender-core'; * @returns */ export function pieGrowOption(pieParams: IPieAnimationParams, isOverall: boolean, state: AnimationStateEnum) { - return (datum: Datum, element: IGraphic, params: AnimationStateEnum) => { + return (datum: Datum, graphic: IMarkGraphic, params: AnimationStateEnum) => { if (isOverall) { if (pieParams.growField === 'radius') { return { @@ -22,7 +22,7 @@ export function pieGrowOption(pieParams: IPieAnimationParams, isOverall: boolean }; } return { - overall: pieParams.growFrom(datum, element, state) + overall: pieParams.growFrom(datum, graphic, state) }; } return { diff --git a/packages/vchart/src/series/pie/pie.ts b/packages/vchart/src/series/pie/pie.ts index c7ab1bebcc..9229fb8e35 100644 --- a/packages/vchart/src/series/pie/pie.ts +++ b/packages/vchart/src/series/pie/pie.ts @@ -470,9 +470,9 @@ export class BasePieSeries extends PolarSeries .reverse() .find(e => e.context.data[0]?.[DEFAULT_DATA_INDEX] < dataIndex); if (outState.includes(state)) { - return prevMarkElement?.getNextGraphicAttributes()?.endAngle; + return prevMarkElement?.getFinalAttribute()?.endAngle; } - return prevMarkElement?.getGraphicAttribute('endAngle', true); + return (prevMarkElement?.attribute as any)?.endAngle; } }; const appearPreset = (this._spec.animationAppear as IStateAnimateSpec)?.preset; diff --git a/packages/vchart/src/series/polar/animation.ts b/packages/vchart/src/series/polar/animation.ts index 35148413aa..53063683eb 100644 --- a/packages/vchart/src/series/polar/animation.ts +++ b/packages/vchart/src/series/polar/animation.ts @@ -1,7 +1,7 @@ /* eslint-disable no-duplicate-imports */ -import type { EasingType } from '@visactor/vrender-core'; +import type { EasingType, ILineAttribute } from '@visactor/vrender-core'; import type { IPointLike } from '@visactor/vutils'; -import { ACustomAnimate, TagPointsUpdate } from '@visactor/vrender-core'; +import { ACustomAnimate, TagPointsUpdate } from '@visactor/vrender-animate'; import { Point, isValidNumber, polarToCartesian, cartesianToPolar } from '@visactor/vutils'; import { isClose, isValidPoint, normalizeAngle } from '../../util'; import type { IPoint } from '../../typings'; @@ -53,6 +53,7 @@ export class PolarPointUpdate extends ACustomAnimate<{ x: number; y: number }> { if (isClose(this._fromAngle, this._toAngle) && isClose(this._fromRadius, this._toRadius)) { this.valid = false; } + this.props = this.getEndProps() as any; } onUpdate(end: boolean, ratio: number, out: Record): void { @@ -61,23 +62,17 @@ export class PolarPointUpdate extends ACustomAnimate<{ x: number; y: number }> { out.y = this.to.y; return; } - if (end) { - const { x, y } = this.getEndProps(); - out.x = x; - out.y = y; - out.center = this._center; - } else { - const { x, y } = polarToCartesian( - { - x: this._prevCenter.x + (this._center.x - this._prevCenter.x) * ratio, - y: this._prevCenter.y + (this._center.y - this._prevCenter.y) * ratio - }, - this._fromRadius + (this._toRadius - this._fromRadius) * ratio, - this._fromAngle + (this._toAngle - this._fromAngle) * ratio - ); - out.x = x; - out.y = y; - } + const { x, y } = polarToCartesian( + { + x: this._prevCenter.x + (this._center.x - this._prevCenter.x) * ratio, + y: this._prevCenter.y + (this._center.y - this._prevCenter.y) * ratio + }, + this._fromRadius + (this._toRadius - this._fromRadius) * ratio, + this._fromAngle + (this._toAngle - this._fromAngle) * ratio + ); + this.target.setAttributes({ x, y }); + this.target.addUpdatePositionTag(); + this.target.addUpdateShapeAndBoundsTag(); } } @@ -90,19 +85,14 @@ export class PolarTagPointsUpdate extends TagPointsUpdate { private _center: IPointLike; private _prevCenter: IPointLike; - constructor( - from: any, - to: any, - duration: number, - easing: EasingType, - params?: { - newPointAnimateType?: 'grow' | 'appear'; - } - ) { - super(from, to, duration, easing, params); - this._center = to.center; - this._prevCenter = from.center; + onBind(): void { + super.onBind(); + const { center } = this.target.attribute as any; + const { center: centerTo } = this.target.getFinalAttribute() as any; + this._center = center; + this._prevCenter = centerTo; } + onUpdate(end: boolean, ratio: number, out: Record): void { // if not create new points, multi points animation might not work well. this.points = this.points.map((point, index) => { @@ -117,7 +107,9 @@ export class PolarTagPointsUpdate extends TagPointsUpdate { newPoint.context = point.context; return newPoint; }); - out.points = this.points; + (this.target.attribute as ILineAttribute).points = this.points; + this.target.addUpdatePositionTag(); + this.target.addUpdateShapeAndBoundsTag(); } private _interpolationSinglePoint(pointA: IPoint, pointB: IPoint, ratio: number): IPoint { diff --git a/packages/vchart/src/series/radar/animation.ts b/packages/vchart/src/series/radar/animation.ts index cfad161236..65ee0d1195 100644 --- a/packages/vchart/src/series/radar/animation.ts +++ b/packages/vchart/src/series/radar/animation.ts @@ -1,5 +1,5 @@ import type { IGraphic } from '@visactor/vrender-core'; -import { ClipAngleAnimate } from '@visactor/vrender-core'; +import { ClipAngleAnimate, AnimateExecutor } from '@visactor/vrender-animate'; import { Factory } from '../../core/factory'; import { PolarPointUpdate, PolarTagPointsUpdate } from '../polar/animation'; import { DEFAULT_ANIMATION_CONFIG } from '../../animation/config'; @@ -76,9 +76,9 @@ export const radarGroupClipAnimation = ( ): IAnimationTypeConfig => { return { custom: ClipAngleAnimate, - customParameters: (datum: any, element: IGraphic) => { + customParameters: (datum: any, graphic: IGraphic) => { return { - group: element.getGraphicItem(), + group: graphic, startAngle: params.startAngle ?? Math.PI / 2, orient: 'clockwise', center: params.center(), @@ -97,15 +97,16 @@ export const registerRadarAnimation = () => { exit: radarPresetAnimation(params, preset, 'out'), disappear: preset === 'clipIn' ? undefined : radarPresetAnimation(params, preset, 'out'), update: [ - { - options: { excludeChannels: ['points', 'defined', 'center'] } - }, { channel: ['points', 'center'], custom: PolarTagPointsUpdate, customParameters: params, duration: DEFAULT_ANIMATION_CONFIG.update.duration, easing: DEFAULT_ANIMATION_CONFIG.update.easing + }, + { + type: 'update', + options: { excludeChannels: ['points', 'defined', 'center'] } } ] } as MarkAnimationSpec; diff --git a/packages/vchart/src/series/rose/animation.ts b/packages/vchart/src/series/rose/animation.ts index 5c59d0dbfe..918c462b79 100644 --- a/packages/vchart/src/series/rose/animation.ts +++ b/packages/vchart/src/series/rose/animation.ts @@ -1,21 +1,22 @@ -import type { Datum } from '../../typings'; import { Factory } from '../../core/factory'; import type { IRoseAnimationParams, RoseAppearPreset } from './interface'; import type { IAnimationTypeConfig } from '../../animation/interface'; +const growInType = (growField: string) => { + return growField === 'angle' ? 'growAngleIn' : 'growRadiusIn'; +}; + +const growOutType = (growField: string) => { + return growField === 'angle' ? 'growAngleOut' : 'growRadiusOut'; +}; + export const Appear_Grow = (params: IRoseAnimationParams): IAnimationTypeConfig => { - const from = params.growField === 'angle' ? 0 : params.innerRadius; - //TODO: 待 vgrammar 内置后替换 - return params.growField === 'angle' - ? { - type: params.growField === 'angle' ? 'growAngleIn' : 'growRadiusIn' - } - : { - channel: { - innerRadius: { from, to: (datum: Datum, element: any) => element.getFinalGraphicAttributes()?.innerRadius }, - outerRadius: { from, to: (datum: Datum, element: any) => element.getFinalGraphicAttributes()?.outerRadius } - } - }; + return { + type: growInType(params.growField), + options: { + overall: true + } + }; }; export const Appear_FadeIn: IAnimationTypeConfig = { @@ -24,21 +25,17 @@ export const Appear_FadeIn: IAnimationTypeConfig = { export const roseEnter = (params: IRoseAnimationParams): IAnimationTypeConfig => { return { - type: params.growField === 'angle' ? 'growAngleIn' : 'growRadiusIn' + type: growInType(params.growField) }; }; export const roseExit = (params: IRoseAnimationParams): IAnimationTypeConfig => { return { - type: params.growField === 'angle' ? 'growAngleOut' : 'growRadiusOut' + type: growOutType(params.growField) }; }; -export const roseDisappear = (params: IRoseAnimationParams): IAnimationTypeConfig => { - return { - type: params.growField === 'angle' ? 'growAngleOut' : 'growRadiusOut' - }; -}; +export const roseDisappear = roseExit; export function rosePresetAnimation( params: IRoseAnimationParams, diff --git a/packages/vchart/src/series/sankey/animation.ts b/packages/vchart/src/series/sankey/animation.ts index a11465ed2d..621fb9e2a9 100644 --- a/packages/vchart/src/series/sankey/animation.ts +++ b/packages/vchart/src/series/sankey/animation.ts @@ -3,7 +3,10 @@ import { Direction } from '../../typings/space'; import { Factory } from '../../core/factory'; import { FadeInOutAnimation } from '../../animation/config'; import type { ISankeyAnimationParams, SankeyAppearPreset } from './interface'; -import type { IAnimationTypeConfig } from '../../animation/interface'; +import type { IAnimationTypeConfig, IAnimationParameters } from '../../animation/interface'; +import { ACustomAnimate, AnimateExecutor } from '@visactor/vrender-animate'; +import type { IGraphic } from '@visactor/vrender-core'; +import type { ILinkPathMarkSpec } from '../../typings'; export const sankeyGrowIn = (params: ISankeyAnimationParams, isOverall: boolean = true): IAnimationTypeConfig => { return { @@ -60,6 +63,160 @@ export const sankeyLinkPresetAnimation = (preset: SankeyAppearPreset): IAnimatio } }; +type TypeAnimation = ( + graphic: T, + options: any, + animationParameters: IAnimationParameters +) => { from?: { [channel: string]: any }; to?: { [channel: string]: any } }; + +const linkPathGrowIn: TypeAnimation = ( + graphic: IGraphic, + options: any, + animationParameters: IAnimationParameters +) => { + const linkValues: ILinkPathMarkSpec = { + x0: graphic.getFinalAttribute().x0, + x1: graphic.getFinalAttribute().x1, + y0: graphic.getFinalAttribute().y0, + y1: graphic.getFinalAttribute().y1, + thickness: graphic.getFinalAttribute().thickness + }; + // // FIXME: undefined channel animation will cause vRender warning + // Object.keys(linkValues).forEach(key => { + // if (isNil(linkValues[key])) { + // delete linkValues[key]; + // } + // }); + return { + from: Object.assign({}, linkValues, { x1: linkValues.x0, y1: linkValues.y0 }), + to: linkValues + }; +}; + +const linkPathGrowOut: TypeAnimation = ( + element: IGraphic, + options: any, + animationParameters: IAnimationParameters +) => { + const linkValues: ILinkPathMarkSpec = { + x0: element.getFinalAttribute().x0, + x1: element.getFinalAttribute().x1, + y0: element.getFinalAttribute().y0, + y1: element.getFinalAttribute().y1, + thickness: element.getFinalAttribute().thickness + }; + // // FIXME: undefined channel animation will cause vRender warning + // Object.keys(linkValues).forEach(key => { + // if (isNil(linkValues[key])) { + // delete linkValues[key]; + // } + // }); + return { + from: linkValues, + to: Object.assign({}, linkValues, { x1: linkValues.x0, y1: linkValues.y0 }) + }; +}; + +const linkPathUpdate: TypeAnimation = ( + graphic: IGraphic, + options: any, + animationParameters: IAnimationParameters +) => { + let from; + let to; + { + const { x0, x1, y0, y1 } = graphic.getFinalAttribute(); + from = { x0, x1, y0, y1 }; + } + { + const { x0, x1, y0, y1 } = graphic.attribute as any; + to = { x0, x1, y0, y1 }; + } + + return { + from, + to + }; +}; + +export class LinkPathGrowIn extends ACustomAnimate> { + onBind(): void { + super.onBind(); + if (this.params?.diffAttrs) { + this.target.setAttributes(this.params.diffAttrs); + } + const { from, to } = linkPathGrowIn(this.target, this.params.options, this.params); + const fromAttrs = this.target.context?.lastAttrs ?? from; + const finalAttribute = this.target.getFinalAttribute(); + if (finalAttribute) { + Object.assign(this.target.attribute, finalAttribute); + } + this.props = to; + this.propKeys = Object.keys(to).filter(key => to[key] != null); + this.animate.reSyncProps(); + this.from = fromAttrs; + this.to = to; + this.target.setAttributes(fromAttrs); + } + + onUpdate(end: boolean, ratio: number, out: Record): void { + const attribute: Record = this.target.attribute; + this.propKeys.forEach(key => { + attribute[key] = this.from[key] + (this.to[key] - this.from[key]) * ratio; + }); + this.target.setAttributes(attribute); + } +} + +export class LinkPathGrowOut extends ACustomAnimate> { + onBind(): void { + super.onBind(); + if (this.params?.diffAttrs) { + this.target.setAttributes(this.params.diffAttrs); + } + const { from, to } = linkPathGrowOut(this.target, this.params.options, this.params); + const fromAttrs = this.target.context?.lastAttrs ?? from; + this.props = to; + this.propKeys = Object.keys(to).filter(key => to[key] != null); + this.animate.reSyncProps(); + this.from = fromAttrs; + this.to = to; + this.target.setAttributes(fromAttrs); + } + + onUpdate(end: boolean, ratio: number, out: Record): void { + const attribute: Record = this.target.attribute; + this.propKeys.forEach(key => { + attribute[key] = this.from[key] + (this.to[key] - this.from[key]) * ratio; + }); + this.target.setAttributes(attribute); + } +} + +export class LinkPathUpdate extends ACustomAnimate> { + onBind(): void { + if (this.params?.diffAttrs) { + this.target.setAttributes(this.params.diffAttrs); + } + const { from, to } = linkPathUpdate(this.target, this.params.options, this.params); + const fromAttrs = this.target.context?.lastAttrs ?? from; + this.props = to; + this.propKeys = Object.keys(to).filter(key => to[key] != null); + this.animate.reSyncProps(); + this.from = fromAttrs; + this.to = to; + this.target.setAttributes(fromAttrs); + } + + onUpdate(end: boolean, ratio: number, out: Record): void { + const attribute: Record = this.target.attribute; + this.propKeys.forEach(key => { + attribute[key] = this.from[key] + (this.to[key] - this.from[key]) * ratio; + }); + this.target.setAttributes(attribute); + } +} + export const registerSankeyAnimation = () => { Factory.registerAnimation('sankeyNode', (params: ISankeyAnimationParams, preset: SankeyAppearPreset) => ({ appear: sankeyNodePresetAnimation(params, preset), @@ -71,4 +228,6 @@ export const registerSankeyAnimation = () => { exit: { type: 'linkPathGrowOut' }, disappear: { type: 'linkPathGrowOut' } })); + AnimateExecutor.registerBuiltInAnimate('linkPathGrowOut', LinkPathGrowOut); + AnimateExecutor.registerBuiltInAnimate('linkPathGrowIn', LinkPathGrowIn); }; diff --git a/packages/vchart/src/series/sunburst/animation/enter.ts b/packages/vchart/src/series/sunburst/animation/enter.ts index 07c6c83b50..574f79732c 100644 --- a/packages/vchart/src/series/sunburst/animation/enter.ts +++ b/packages/vchart/src/series/sunburst/animation/enter.ts @@ -3,16 +3,16 @@ import type { Datum } from '../../../typings'; import { computeRatio, getInnerMostElements } from './utils'; import { isEmpty, maxInArray, minInArray } from '@visactor/vutils'; import type { IAnimationTypeConfig } from '../../../animation/interface'; -import type { IMark, IMarkGraphic } from '../../../mark/interface'; +import type { IMarkGraphic } from '../../../mark/interface'; -const computeInnerAngleRange = (elements: IMarkGraphic[], startAngle: number, endAngle: number): [number, number] => { +const computeInnerAngleRange = (graphics: IMarkGraphic[], startAngle: number, endAngle: number): [number, number] => { // 处理enter时从无到有的case, 例如图例. - if (isEmpty(elements)) { + if (isEmpty(graphics)) { return [startAngle, endAngle]; } - const minStartAngle = minInArray(elements.map(m => m.getGraphicAttribute('startAngle', false) * 1)); - const maxEndAngle = maxInArray(elements.map(m => m.getGraphicAttribute('endAngle', false) * 1)); + const minStartAngle = minInArray(graphics.map(m => m.getFinalAttribute().startAngle * 1)); + const maxEndAngle = maxInArray(graphics.map(m => m.getFinalAttribute().endAngle * 1)); return [minStartAngle, maxEndAngle]; }; @@ -20,38 +20,38 @@ export const sunburstEnter = (params: ISunburstAnimationParams): IAnimationTypeC return { channel: { startAngle: { - from: (d: Datum, element: IMarkGraphic, mark: IMark) => { + from: (d: Datum, graphic: IMarkGraphic) => { const { startAngle, endAngle } = params.animationInfo(); // 得到最内层的elements. - const innerElements = getInnerMostElements(mark.getGraphics()); + const innerElements = getInnerMostElements(graphic.parent.children); // 计算间距 const angleRange = computeInnerAngleRange(innerElements, startAngle, endAngle); // 计算比例 - const ratio = computeRatio(d.startAngle, angleRange); + const ratio = computeRatio(graphic.getFinalAttribute().startAngle, angleRange); return ratio * (endAngle - startAngle) + startAngle; }, - to: (d: Datum) => d.startAngle + to: (d: Datum, graphic: IMarkGraphic) => graphic.getFinalAttribute().startAngle }, endAngle: { - from: (d: Datum, element: IMarkGraphic, mark: IMark) => { + from: (d: Datum, graphic: IMarkGraphic) => { const { startAngle, endAngle } = params.animationInfo(); // 得到最内层的elements. - const innerElements = getInnerMostElements(mark.getGraphics()); + const innerElements = getInnerMostElements(graphic.parent.children); // 计算间距 const angleRange = computeInnerAngleRange(innerElements, startAngle, endAngle); // 计算比例 - const ratio = computeRatio(d.endAngle, angleRange); + const ratio = computeRatio(graphic.getFinalAttribute().endAngle, angleRange); return ratio * (endAngle - startAngle) + startAngle; }, - to: (d: Datum) => d.endAngle + to: (d: Datum, graphic: IMarkGraphic) => graphic.getFinalAttribute().endAngle }, outerRadius: { - from: (d: Datum) => d.innerRadius, - to: (d: Datum) => d.outerRadius + from: (d: Datum, graphic: IMarkGraphic) => graphic.getFinalAttribute().innerRadius, + to: (d: Datum, graphic: IMarkGraphic) => graphic.getFinalAttribute().outerRadius }, innerRadius: { - from: (d: Datum) => d.innerRadius, - to: (d: Datum) => d.innerRadius + from: (d: Datum, graphic: IMarkGraphic) => graphic.getFinalAttribute().innerRadius, + to: (d: Datum, graphic: IMarkGraphic) => graphic.getFinalAttribute().innerRadius } } }; diff --git a/packages/vchart/src/series/sunburst/animation/exit.ts b/packages/vchart/src/series/sunburst/animation/exit.ts index f30c722c0d..234102cc34 100644 --- a/packages/vchart/src/series/sunburst/animation/exit.ts +++ b/packages/vchart/src/series/sunburst/animation/exit.ts @@ -3,11 +3,11 @@ import type { Datum } from '../../../typings'; import { computeRatio, getInnerMostElements } from './utils'; import { maxInArray, minInArray } from '@visactor/vutils'; import type { IAnimationTypeConfig } from '../../../animation/interface'; -import type { IMark, IMarkGraphic } from '../../../mark/interface/common'; +import type { IMarkGraphic } from '../../../mark/interface/common'; -const computeInnerAngleRange = (elements: IMarkGraphic[]): [number, number] => { - const minStartAngle = minInArray(elements.map(m => m.getGraphicAttribute('startAngle', false) * 1)); - const maxEndAngle = maxInArray(elements.map(m => m.getGraphicAttribute('endAngle', false) * 1)); +const computeInnerAngleRange = (mark: IMarkGraphic[]): [number, number] => { + const minStartAngle = minInArray(mark.map(m => m.getFinalAttribute().startAngle * 1)); + const maxEndAngle = maxInArray(mark.map(m => m.getFinalAttribute().endAngle * 1)); return [minStartAngle, maxEndAngle]; }; @@ -15,37 +15,37 @@ export const sunburstExit = (params: ISunburstAnimationParams): IAnimationTypeCo return { channel: { startAngle: { - from: (_d: Datum, element: IMarkGraphic) => element.getGraphicAttribute('startAngle', false), - to: (_d: Datum, element: IMarkGraphic, mark: IMark) => { + from: (_d: Datum, graphic: IMarkGraphic) => graphic.getFinalAttribute().startAngle, + to: (_d: Datum, graphic: IMarkGraphic) => { const { startAngle, endAngle } = params.animationInfo(); // 得到最内层的elements. - const innerElements = getInnerMostElements(mark.getGraphics()); + const innerElements = getInnerMostElements(graphic.parent.children); // 计算range const range = computeInnerAngleRange(innerElements); // 计算比例 - const ratio = computeRatio(element.getGraphicAttribute('startAngle', false), range); + const ratio = computeRatio(graphic.getFinalAttribute().startAngle, range); return ratio * (endAngle - startAngle) + startAngle; } }, endAngle: { - from: (_d: Datum, element: IMarkGraphic) => element.getGraphicAttribute('endAngle', false), - to: (_d: Datum, element: IMarkGraphic, mark: IMark) => { + from: (_d: Datum, graphic: IMarkGraphic) => graphic.getFinalAttribute().endAngle, + to: (_d: Datum, graphic: IMarkGraphic) => { const { startAngle, endAngle } = params.animationInfo(); // 得到最内层的elements. - const innerElements = getInnerMostElements(mark.getGraphics()); + const innerElements = getInnerMostElements(graphic.parent.children); // 计算range const range = computeInnerAngleRange(innerElements); // 计算比例 - const ratio = computeRatio(element.getGraphicAttribute('endAngle', false), range); + const ratio = computeRatio(graphic.getFinalAttribute().endAngle, range); return ratio * (endAngle - startAngle) + startAngle; } }, outerRadius: { - from: (_d: Datum, element: IMarkGraphic) => element.getGraphicAttribute('outerRadius', false), + from: (_d: Datum, graphic: IMarkGraphic) => graphic.getFinalAttribute().outerRadius, to: () => params.animationInfo().innerRadius }, innerRadius: { - from: (_d: Datum, element: IMarkGraphic) => element.getGraphicAttribute('innerRadius', false), + from: (_d: Datum, graphic: IMarkGraphic) => graphic.getFinalAttribute().innerRadius, to: () => params.animationInfo().innerRadius } } diff --git a/packages/vchart/src/series/venn/animation.ts b/packages/vchart/src/series/venn/animation.ts index 99e7c5db17..74068d56c5 100644 --- a/packages/vchart/src/series/venn/animation.ts +++ b/packages/vchart/src/series/venn/animation.ts @@ -1,6 +1,7 @@ -import { Factory } from '../../core/factory'; import type { VennAppearPreset } from './interface'; import type { IAnimationTypeConfig } from '../../animation/interface'; +// import { ACustomAnimate } from '@visactor/vrender-animate'; +import { Factory } from '../../core/factory'; export const vennCirclePresetAnimation = (preset: VennAppearPreset): IAnimationTypeConfig => { switch (preset) { @@ -59,7 +60,7 @@ export const registerVennAnimation = () => { Factory.registerAnimation('vennOverlap', (params: unknown, preset: VennAppearPreset) => { return { appear: vennOverlapPresetAnimation(preset), - // update: { custom: VennOverlapAnimation }, + // update: { custom: VennOverlapAnimation }, // TODO: vgrammar 封装的动画,要更新依赖 enter: { type: 'fadeIn' }, exit: { type: 'fadeOut' }, disappear: { type: 'fadeOut' } diff --git a/packages/vchart/src/series/word-cloud/animation.ts b/packages/vchart/src/series/word-cloud/animation.ts index d10e3637f1..8ac4d65031 100644 --- a/packages/vchart/src/series/word-cloud/animation.ts +++ b/packages/vchart/src/series/word-cloud/animation.ts @@ -1,4 +1,4 @@ -import { RotateBySphereAnimate } from '@visactor/vrender-core'; +import { RotateBySphereAnimate } from '@visactor/vrender-animate'; import { DEFAULT_ANIMATION_CONFIG } from '../../animation/config'; import { Factory } from '../../core/factory'; import type { IWordcloud3dAnimationParams, IWordcloudAnimationParams, WordcloudAppearPreset } from './interface'; @@ -23,18 +23,14 @@ function computeWordDelay(duration: number, totalTime: number, wordCount: number export const WordCloudScaleInAnimation = (params: IWordcloudAnimationParams): IAnimationTypeConfig => { return { - channel: { - fontSize: { - from: 0 - } - }, + type: 'scaleIn', duration: 200, - delay: (datum, element, vgrammarParams) => { + delay: (datum, graphic) => { const animationConfig = params.animationConfig(); const duration = animationConfig?.duration || 200; const totalTime = animationConfig?.totalTime || DEFAULT_ANIMATION_CONFIG.appear.duration; - const count = vgrammarParams.VGRAMMAR_ANIMATION_PARAMETERS.elementCount; - const index = vgrammarParams.VGRAMMAR_ANIMATION_PARAMETERS.elementIndex; + const count = graphic.context.graphicCount; + const index = graphic.context.graphicIndex; return index * computeWordDelay(duration as number, totalTime as number, count); } }; diff --git a/packages/vchart/src/vchart-all.ts b/packages/vchart/src/vchart-all.ts index 81a5715e42..4d1706d654 100644 --- a/packages/vchart/src/vchart-all.ts +++ b/packages/vchart/src/vchart-all.ts @@ -69,12 +69,7 @@ import { registerElementHighlightByKey } from './interaction'; import { registerAllMarks } from './mark'; -import { - register3DPlugin, - registerAnimate, - registerHtmlAttributePlugin, - registerReactAttributePlugin -} from './plugin/other'; +import { registerAnimate, registerHtmlAttributePlugin, registerReactAttributePlugin } from './plugin/other'; VChart.useRegisters([ // charts @@ -177,7 +172,6 @@ VChart.useRegisters([ registerElementHighlightByGroup, registerElementHighlightByKey, - // animate, registerAnimate, registerReactAttributePlugin, registerHtmlAttributePlugin diff --git a/packages/vchart/src/vchart-simple.ts b/packages/vchart/src/vchart-simple.ts index a369f131eb..cfecfce958 100644 --- a/packages/vchart/src/vchart-simple.ts +++ b/packages/vchart/src/vchart-simple.ts @@ -38,7 +38,6 @@ VChart.useRegisters([ // plugin registerDomTooltipHandler, registerCanvasTooltipHandler, - registerAnimate, registerReactAttributePlugin, registerHtmlAttributePlugin diff --git a/packages/vstory/package.json b/packages/vstory/package.json index 7954201e24..be5dc4a09d 100644 --- a/packages/vstory/package.json +++ b/packages/vstory/package.json @@ -21,9 +21,9 @@ }, "dependencies": { "@visactor/vchart": "workspace:1.11.0", - "@visactor/vrender-core": "0.22.10", - "@visactor/vrender-kits": "0.22.10", - "@visactor/vrender-components": "0.22.10", + "@visactor/vrender-core": "1.0.0-alpha.7", + "@visactor/vrender-kits": "1.0.0-alpha.7", + "@visactor/vrender-components": "1.0.0-alpha.7", "@visactor/vutils": "~1.0.2" }, "devDependencies": { diff --git a/tools/story-player/package.json b/tools/story-player/package.json index 3f0406f748..4c79480a80 100644 --- a/tools/story-player/package.json +++ b/tools/story-player/package.json @@ -56,10 +56,10 @@ "vite": "3.2.6" }, "dependencies": { - "@visactor/vrender-core": "0.22.10", - "@visactor/vrender-kits": "0.22.10", + "@visactor/vrender-core": "1.0.0-alpha.7", + "@visactor/vrender-kits": "1.0.0-alpha.7", "@visactor/vchart": "workspace:1.13.9", - "@visactor/vrender": "0.22.10", + "@visactor/vrender": "1.0.0-alpha.7", "@visactor/vutils": "~1.0.2" } } \ No newline at end of file