diff --git a/.nvmrc b/.nvmrc index 7ea6a59d3..53d1c14db 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20.11.0 +v22 diff --git a/package-lock.json b/package-lock.json index 58a7f0079..db90e2aaa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,16 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.16.1", + "version": "1.17.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.16.1", + "version": "1.17.0", "hasInstallScript": true, "license": "ISC", "dependencies": { + "@codemirror/autocomplete": "6.18.6", "@codemirror/lang-json": "6.0.1", "@codemirror/lang-yaml": "6.1.2", "@codemirror/language": "6.10.8", @@ -44,7 +45,7 @@ }, "devDependencies": { "@esbuild-plugins/node-globals-polyfill": "0.2.3", - "@laynezh/vite-plugin-lib-assets": "^0.5.26", + "@laynezh/vite-plugin-lib-assets": "1.1.0", "@sentry/browser": "^7.119.1", "@testing-library/jest-dom": "^5.16.2", "@testing-library/react": "^12.1.4", @@ -57,7 +58,7 @@ "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "8.3.0", "@typescript-eslint/parser": "8.3.0", - "@vitejs/plugin-react": "4.3.1", + "@vitejs/plugin-react": "4.5.2", "eslint": "^8.57.1", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.1.0", @@ -79,9 +80,8 @@ "sharp": "^0.33.5", "svgo": "^3.3.2", "typescript": "5.5.4", - "vite": "5.4.19", - "vite-plugin-dts": "4.0.3", - "vite-plugin-image-optimizer": "^1.1.8", + "vite": "6.3.5", + "vite-plugin-dts": "4.5.4", "vite-plugin-lib-inject-css": "2.1.1", "vite-plugin-svgr": "^2.4.0", "vite-tsconfig-paths": "5.0.1" @@ -270,42 +270,46 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", - "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", - "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.8", - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.8", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -330,11 +334,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -344,13 +350,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", - "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -364,32 +371,34 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", - "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", - "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -399,149 +408,64 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", - "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", - "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", - "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", - "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", - "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.8" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -551,12 +475,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz", - "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -566,12 +491,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz", - "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -592,28 +518,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", - "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -622,22 +550,23 @@ } }, "node_modules/@babel/types": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", - "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@codemirror/autocomplete": { - "version": "6.18.4", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.4.tgz", - "integrity": "sha512-sFAphGQIqyQZfP2ZBsSHV7xQvo9Py0rV0dW7W3IMRdS+zDuNb2l3no78CvUaWKGfzFjI4FTrLdUSj86IGb2hRA==", + "version": "6.18.6", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", + "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==", + "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -919,409 +848,426 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -2084,9 +2030,9 @@ } }, "node_modules/@laynezh/vite-plugin-lib-assets": { - "version": "0.5.26", - "resolved": "https://registry.npmjs.org/@laynezh/vite-plugin-lib-assets/-/vite-plugin-lib-assets-0.5.26.tgz", - "integrity": "sha512-WObL2hZZyAYHQXOzGs7TyWKJUrIOF9IABEaiwtwIY08/repd14dLfig11LV4EKSIEkfQpITSQoWsjuyhrkldpw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@laynezh/vite-plugin-lib-assets/-/vite-plugin-lib-assets-1.1.0.tgz", + "integrity": "sha512-Rynyr1A/DxJEmjNZu4NrpDQUfxUmJhanqojwOO20HQWtN5Oc0jJ3ZtwnlpntruK6VYV8aC25Mjzs67dmTIBHyA==", "dev": true, "license": "MIT", "dependencies": { @@ -2096,7 +2042,7 @@ "semver": "^7.6.0" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@lezer/common": { @@ -2146,45 +2092,48 @@ "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==" }, "node_modules/@microsoft/api-extractor": { - "version": "7.47.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.47.4.tgz", - "integrity": "sha512-HKm+P4VNzWwvq1Ey+Jfhhj/3MjsD+ka2hbt8L5AcRM95lu1MFOYnz3XlU7Gr79Q/ZhOb7W/imAKeYrOI0bFydg==", + "version": "7.52.8", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.52.8.tgz", + "integrity": "sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg==", "dev": true, + "license": "MIT", "dependencies": { - "@microsoft/api-extractor-model": "7.29.4", - "@microsoft/tsdoc": "~0.15.0", - "@microsoft/tsdoc-config": "~0.17.0", - "@rushstack/node-core-library": "5.5.1", + "@microsoft/api-extractor-model": "7.30.6", + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.13.1", "@rushstack/rig-package": "0.5.3", - "@rushstack/terminal": "0.13.3", - "@rushstack/ts-command-line": "4.22.3", + "@rushstack/terminal": "0.15.3", + "@rushstack/ts-command-line": "5.0.1", "lodash": "~4.17.15", "minimatch": "~3.0.3", "resolve": "~1.22.1", "semver": "~7.5.4", "source-map": "~0.6.1", - "typescript": "5.4.2" + "typescript": "5.8.2" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.29.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.29.4.tgz", - "integrity": "sha512-LHOMxmT8/tU1IiiiHOdHFF83Qsi+V8d0kLfscG4EvQE9cafiR8blOYr8SfkQKWB1wgEilQgXJX3MIA4vetDLZw==", + "version": "7.30.6", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.6.tgz", + "integrity": "sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg==", "dev": true, + "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "~0.15.0", - "@microsoft/tsdoc-config": "~0.17.0", - "@rushstack/node-core-library": "5.5.1" + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.13.1" } }, "node_modules/@microsoft/api-extractor/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2195,6 +2144,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2207,6 +2157,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2219,6 +2170,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2234,15 +2186,17 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2255,21 +2209,24 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@microsoft/tsdoc": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", - "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==", - "dev": true + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "dev": true, + "license": "MIT" }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz", - "integrity": "sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", + "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", "dev": true, + "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "0.15.0", + "@microsoft/tsdoc": "0.15.1", "ajv": "~8.12.0", "jju": "~1.4.0", "resolve": "~1.22.2" @@ -2280,6 +2237,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -2773,15 +2731,23 @@ "@rjsf/utils": "^5.20.x" } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11.tgz", + "integrity": "sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/pluginutils": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", - "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" @@ -2795,209 +2761,294 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.43.0.tgz", + "integrity": "sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.43.0.tgz", + "integrity": "sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.43.0.tgz", + "integrity": "sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.43.0.tgz", + "integrity": "sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.43.0.tgz", + "integrity": "sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.43.0.tgz", + "integrity": "sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.43.0.tgz", + "integrity": "sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.43.0.tgz", + "integrity": "sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.43.0.tgz", + "integrity": "sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.43.0.tgz", + "integrity": "sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.43.0.tgz", + "integrity": "sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.43.0.tgz", + "integrity": "sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.43.0.tgz", + "integrity": "sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.43.0.tgz", + "integrity": "sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.43.0.tgz", + "integrity": "sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.43.0.tgz", + "integrity": "sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.43.0.tgz", + "integrity": "sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.43.0.tgz", + "integrity": "sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.43.0.tgz", + "integrity": "sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.43.0.tgz", + "integrity": "sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3010,15 +3061,16 @@ "dev": true }, "node_modules/@rushstack/node-core-library": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.5.1.tgz", - "integrity": "sha512-ZutW56qIzH8xIOlfyaLQJFx+8IBqdbVCZdnj+XT1MorQ1JqqxHse8vbCpEM+2MjsrqcbxcgDIbfggB1ZSQ2A3g==", + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.13.1.tgz", + "integrity": "sha512-5yXhzPFGEkVc9Fu92wsNJ9jlvdwz4RNb2bMso+/+TH0nMm1jDDDsOIf4l8GAkPxGuwPw5DH24RliWVfSPhlW/Q==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "~8.13.0", "ajv-draft-04": "~1.0.0", "ajv-formats": "~3.0.1", - "fs-extra": "~7.0.1", + "fs-extra": "~11.3.0", "import-lazy": "~4.0.0", "jju": "~1.4.0", "resolve": "~1.22.1", @@ -3038,6 +3090,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -3054,6 +3107,7 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -3071,6 +3125,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3083,6 +3138,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3097,25 +3153,28 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@rushstack/rig-package": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz", "integrity": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==", "dev": true, + "license": "MIT", "dependencies": { "resolve": "~1.22.1", "strip-json-comments": "~3.1.1" } }, "node_modules/@rushstack/terminal": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.13.3.tgz", - "integrity": "sha512-fc3zjXOw8E0pXS5t9vTiIPx9gHA0fIdTXsu9mT4WbH+P3mYvnrX0iAQ5a6NvyK1+CqYWBTw/wVNx7SDJkI+WYQ==", + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.3.tgz", + "integrity": "sha512-DGJ0B2Vm69468kZCJkPj3AH5nN+nR9SPmC0rFHtzsS4lBQ7/dgOwtwVxYP7W9JPDMuRBkJ4KHmWKr036eJsj9g==", "dev": true, + "license": "MIT", "dependencies": { - "@rushstack/node-core-library": "5.5.1", + "@rushstack/node-core-library": "5.13.1", "supports-color": "~8.1.1" }, "peerDependencies": { @@ -3132,6 +3191,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3143,12 +3203,13 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.22.3.tgz", - "integrity": "sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.0.1.tgz", + "integrity": "sha512-bsbUucn41UXrQK7wgM8CNM/jagBytEyJqXw/umtI8d68vFm1Jwxh1OtLrlW7uGZgjCWiiPH6ooUNa1aVsuVr3Q==", "dev": true, + "license": "MIT", "dependencies": { - "@rushstack/terminal": "0.13.3", + "@rushstack/terminal": "0.15.3", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" @@ -3159,6 +3220,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -3729,7 +3791,8 @@ "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/aria-query": { "version": "5.0.4", @@ -3843,10 +3906,11 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/hast": { "version": "3.0.4", @@ -4355,71 +4419,78 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", - "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.2.tgz", + "integrity": "sha512-QNVT3/Lxx99nMQWJWF7K4N6apUEuT0KlZA3mx/mVaoGj3smm/8rc8ezz15J1pcbcjDK0V15rpHetVfya08r76Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@babel/core": "^7.27.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.11", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" + "react-refresh": "^0.17.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "node_modules/@volar/language-core": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.6.tgz", - "integrity": "sha512-FxUfxaB8sCqvY46YjyAAV6c3mMIq/NWQMVvJ+uS4yxr1KzOvyg61gAuOnNvgCvO4TZ7HcLExBEsWcDu4+K4E8A==", + "version": "2.4.14", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.14.tgz", + "integrity": "sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==", "dev": true, + "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.6" + "@volar/source-map": "2.4.14" } }, "node_modules/@volar/source-map": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.6.tgz", - "integrity": "sha512-Nsh7UW2ruK+uURIPzjJgF0YRGP5CX9nQHypA2OMqdM2FKy7rh+uv3XgPnWPw30JADbKvZ5HuBzG4gSbVDYVtiw==", - "dev": true + "version": "2.4.14", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.14.tgz", + "integrity": "sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==", + "dev": true, + "license": "MIT" }, "node_modules/@volar/typescript": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.6.tgz", - "integrity": "sha512-NMIrA7y5OOqddL9VtngPWYmdQU03htNKFtAYidbYfWA0TOhyGVd9tfcP4TsLWQ+RBWDZCbBqsr8xzU0ZOxYTCQ==", + "version": "2.4.14", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.14.tgz", + "integrity": "sha512-p8Z6f/bZM3/HyCdRNFZOEEzts51uV8WHeN8Tnfnm2EBv6FDB2TQLzfVx7aJvnl8ofKAOnS64B2O8bImBFaauRw==", "dev": true, + "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.6", + "@volar/language-core": "2.4.14", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz", - "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", + "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.12", + "@babel/parser": "^7.27.2", + "@vue/shared": "3.5.16", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz", - "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", + "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.12", - "@vue/shared": "3.5.12" + "@vue/compiler-core": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/compiler-vue2": { @@ -4427,22 +4498,24 @@ "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", "dev": true, + "license": "MIT", "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "node_modules/@vue/language-core": { - "version": "2.0.29", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.29.tgz", - "integrity": "sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", + "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", "dev": true, + "license": "MIT", "dependencies": { - "@volar/language-core": "~2.4.0-alpha.18", - "@vue/compiler-dom": "^3.4.0", + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.4.0", - "computeds": "^0.0.1", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.4.9", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" @@ -4457,10 +4530,11 @@ } }, "node_modules/@vue/shared": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz", - "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==", - "dev": true + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz", + "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==", + "dev": true, + "license": "MIT" }, "node_modules/@xyflow/react": { "version": "12.4.2", @@ -4499,10 +4573,11 @@ "peer": true }, "node_modules/acorn": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", - "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4582,6 +4657,7 @@ "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^8.5.0" }, @@ -4608,6 +4684,13 @@ } } }, + "node_modules/alien-signals": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", + "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", + "dev": true, + "license": "MIT" + }, "node_modules/ansi_up": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ansi_up/-/ansi_up-5.2.1.tgz", @@ -4616,16 +4699,6 @@ "node": "*" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -4957,9 +5030,9 @@ "integrity": "sha512-Tfn5JSE7hrUlFcOoaLzVvkbgIemIorMIyoMr3TgvszWW7jFt2C9PdeMLtysYD9RU0MmU17b69+XJG1eRY2OBRg==" }, "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "dev": true, "funding": [ { @@ -4975,11 +5048,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -5054,9 +5128,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001669", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", - "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "version": "1.0.30001723", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz", + "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==", "dev": true, "funding": [ { @@ -5071,7 +5145,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/canvas-confetti": { "version": "1.9.3", @@ -5355,22 +5430,17 @@ "validate.io-integer-array": "^1.0.0" } }, - "node_modules/computeds": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", - "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" }, "node_modules/confusing-browser-globals": { "version": "1.0.11", @@ -5690,12 +5760,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -5979,10 +6051,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.41", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", - "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", - "dev": true + "version": "1.5.169", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.169.tgz", + "integrity": "sha512-q7SQx6mkLy0GTJK9K9OiWeaBMV4XQtBSdf6MJUzDB/H/5tFXfIiX38Lci1Kl6SsgiEhz1SQI1ejEOU5asWEhwQ==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -6208,12 +6281,12 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, - "peer": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -6221,30 +6294,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/escalade": { @@ -6252,6 +6326,7 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6970,6 +7045,13 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/exsolve": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", + "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-copy": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", @@ -7175,17 +7257,18 @@ } }, "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=14.14" } }, "node_modules/fs.realpath": { @@ -7525,6 +7608,7 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } @@ -7635,6 +7719,7 @@ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8365,7 +8450,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -8508,10 +8594,13 @@ } }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -8828,13 +8917,15 @@ } }, "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", + "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", "dev": true, + "license": "MIT", "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" + "mlly": "^1.7.4", + "pkg-types": "^2.0.1", + "quansync": "^0.2.8" }, "engines": { "node": ">=14" @@ -8990,6 +9081,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -9004,10 +9096,11 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -9260,17 +9353,44 @@ } }, "node_modules/mlly": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.2.tgz", - "integrity": "sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.12.1", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -9303,18 +9423,20 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -9360,10 +9482,11 @@ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -9765,18 +9888,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/patch-package/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/patch-package/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -9811,20 +9922,12 @@ "node": ">=6" } }, - "node_modules/patch-package/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", @@ -9901,12 +10004,6 @@ "node": ">=8" } }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -9941,16 +10038,24 @@ } }, "node_modules/pkg-types": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz", - "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz", + "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", "dev": true, + "license": "MIT", "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.2", - "pathe": "^1.1.2" + "confbox": "^0.2.1", + "exsolve": "^1.0.1", + "pathe": "^2.0.3" } }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/popmotion": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz", @@ -9972,9 +10077,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -9990,9 +10095,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -10133,6 +10239,23 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/quansync": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10344,10 +10467,11 @@ } }, "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10767,12 +10891,13 @@ } }, "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.43.0.tgz", + "integrity": "sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -10782,22 +10907,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@rollup/rollup-android-arm-eabi": "4.43.0", + "@rollup/rollup-android-arm64": "4.43.0", + "@rollup/rollup-darwin-arm64": "4.43.0", + "@rollup/rollup-darwin-x64": "4.43.0", + "@rollup/rollup-freebsd-arm64": "4.43.0", + "@rollup/rollup-freebsd-x64": "4.43.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.43.0", + "@rollup/rollup-linux-arm-musleabihf": "4.43.0", + "@rollup/rollup-linux-arm64-gnu": "4.43.0", + "@rollup/rollup-linux-arm64-musl": "4.43.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.43.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.43.0", + "@rollup/rollup-linux-riscv64-gnu": "4.43.0", + "@rollup/rollup-linux-riscv64-musl": "4.43.0", + "@rollup/rollup-linux-s390x-gnu": "4.43.0", + "@rollup/rollup-linux-x64-gnu": "4.43.0", + "@rollup/rollup-linux-x64-musl": "4.43.0", + "@rollup/rollup-win32-arm64-msvc": "4.43.0", + "@rollup/rollup-win32-ia32-msvc": "4.43.0", + "@rollup/rollup-win32-x64-msvc": "4.43.0", "fsevents": "~2.3.2" } }, @@ -11141,7 +11270,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/stack-utils": { "version": "2.0.6", @@ -11569,6 +11699,51 @@ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", "peer": true }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tippy.js": { "version": "6.3.7", "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", @@ -11590,14 +11765,6 @@ "node": ">=0.6.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11791,10 +11958,11 @@ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" }, "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" }, "node_modules/unbox-primitive": { "version": "1.0.2", @@ -11880,18 +12048,18 @@ } }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -11907,9 +12075,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -12025,20 +12194,24 @@ } }, "node_modules/vite": { - "version": "5.4.19", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, + "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -12047,19 +12220,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -12080,28 +12259,31 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, "node_modules/vite-plugin-dts": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.0.3.tgz", - "integrity": "sha512-+xnTsaONwU2kV6zhRjtbRJSGN41uFR/whqmcb4k4fftLFDJElxthp0PP5Fq8gMeM9ytWMt1yk5gGgekLREWYQQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", + "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", "dev": true, + "license": "MIT", "dependencies": { - "@microsoft/api-extractor": "7.47.4", - "@rollup/pluginutils": "^5.1.0", - "@volar/typescript": "^2.3.4", - "@vue/language-core": "2.0.29", + "@microsoft/api-extractor": "^7.50.1", + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.11", + "@vue/language-core": "2.2.0", "compare-versions": "^6.1.1", - "debug": "^4.3.6", + "debug": "^4.4.0", "kolorist": "^1.8.0", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.11", - "vue-tsc": "2.0.29" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17" }, "peerDependencies": { "typescript": "*", @@ -12113,23 +12295,6 @@ } } }, - "node_modules/vite-plugin-image-optimizer": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/vite-plugin-image-optimizer/-/vite-plugin-image-optimizer-1.1.8.tgz", - "integrity": "sha512-40bYRDHQLUOrIwJIJQqyKJHrfgVshqzDLtMy8SEgf+fB7PnppslSTTkY7PJFrBGqgbCdOdN9KkqsvccXmnEa5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.3", - "pathe": "^1.1.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "vite": ">=3" - } - }, "node_modules/vite-plugin-lib-inject-css": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/vite-plugin-lib-inject-css/-/vite-plugin-lib-inject-css-2.1.1.tgz", @@ -12176,434 +12341,40 @@ } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], + "node_modules/vite/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "dev": true, - "optional": true, - "os": [ - "aix" - ], + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "dev": true - }, - "node_modules/vue-tsc": { - "version": "2.0.29", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.29.tgz", - "integrity": "sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "dev": true, - "dependencies": { - "@volar/typescript": "~2.4.0-alpha.18", - "@vue/language-core": "2.0.29", - "semver": "^7.5.4" - }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" - }, - "peerDependencies": { - "typescript": ">=5.0.0" - } + "license": "MIT" }, "node_modules/w3c-keyname": { "version": "2.2.8", @@ -12822,7 +12593,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { "version": "2.6.0", diff --git a/package.json b/package.json index cc083b38c..1473fed9a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.16.1", + "version": "1.17.0", "description": "Supporting common component library", "type": "module", "main": "dist/index.js", @@ -37,7 +37,7 @@ }, "devDependencies": { "@esbuild-plugins/node-globals-polyfill": "0.2.3", - "@laynezh/vite-plugin-lib-assets": "^0.5.26", + "@laynezh/vite-plugin-lib-assets": "1.1.0", "@sentry/browser": "^7.119.1", "@testing-library/jest-dom": "^5.16.2", "@testing-library/react": "^12.1.4", @@ -50,7 +50,7 @@ "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "8.3.0", "@typescript-eslint/parser": "8.3.0", - "@vitejs/plugin-react": "4.3.1", + "@vitejs/plugin-react": "4.5.2", "eslint": "^8.57.1", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.1.0", @@ -72,9 +72,8 @@ "sharp": "^0.33.5", "svgo": "^3.3.2", "typescript": "5.5.4", - "vite": "5.4.19", - "vite-plugin-dts": "4.0.3", - "vite-plugin-image-optimizer": "^1.1.8", + "vite": "6.3.5", + "vite-plugin-dts": "4.5.4", "vite-plugin-lib-inject-css": "2.1.1", "vite-plugin-svgr": "^2.4.0", "vite-tsconfig-paths": "5.0.1" @@ -96,6 +95,7 @@ "yaml": "^2.4.1" }, "dependencies": { + "@codemirror/autocomplete": "6.18.6", "@codemirror/lang-json": "6.0.1", "@codemirror/lang-yaml": "6.1.2", "@codemirror/language": "6.10.8", @@ -135,7 +135,7 @@ "react-dom": "^17.0.2" }, "vite-plugin-svgr": { - "vite": "5.4.19" + "vite": "6.3.5" }, "react-virtualized-sticky-tree": { "react": "^17.0.2", diff --git a/src/Assets/IconV2/ic-bug.svg b/src/Assets/IconV2/ic-bug.svg new file mode 100644 index 000000000..6b7544817 --- /dev/null +++ b/src/Assets/IconV2/ic-bug.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Assets/IconV2/ic-check-all.svg b/src/Assets/IconV2/ic-check-all.svg new file mode 100644 index 000000000..aa0ae781a --- /dev/null +++ b/src/Assets/IconV2/ic-check-all.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/Assets/IconV2/ic-check-square.svg b/src/Assets/IconV2/ic-check-square.svg new file mode 100644 index 000000000..f871ba7ba --- /dev/null +++ b/src/Assets/IconV2/ic-check-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/Assets/IconV2/ic-ci-webhook.svg b/src/Assets/IconV2/ic-ci-webhook.svg deleted file mode 100644 index 0a8d93714..000000000 --- a/src/Assets/IconV2/ic-ci-webhook.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Assets/IconV2/ic-clean-brush.svg b/src/Assets/IconV2/ic-clean-brush.svg new file mode 100644 index 000000000..198d53f81 --- /dev/null +++ b/src/Assets/IconV2/ic-clean-brush.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/Assets/IconV2/ic-container-registry.svg b/src/Assets/IconV2/ic-container-registry.svg new file mode 100644 index 000000000..95c9543a8 --- /dev/null +++ b/src/Assets/IconV2/ic-container-registry.svg @@ -0,0 +1,19 @@ + + + + + diff --git a/src/Assets/IconV2/ic-container.svg b/src/Assets/IconV2/ic-container.svg index 95c9543a8..1dc10d7df 100644 --- a/src/Assets/IconV2/ic-container.svg +++ b/src/Assets/IconV2/ic-container.svg @@ -1,19 +1,3 @@ - - - - + + diff --git a/src/Assets/IconV2/ic-deploy-color.svg b/src/Assets/IconV2/ic-deploy-color.svg new file mode 100644 index 000000000..524cf159e --- /dev/null +++ b/src/Assets/IconV2/ic-deploy-color.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/Assets/IconV2/ic-deploy-sync.svg b/src/Assets/IconV2/ic-deploy-sync.svg new file mode 100644 index 000000000..fcee3b190 --- /dev/null +++ b/src/Assets/IconV2/ic-deploy-sync.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/Assets/IconV2/ic-download.svg b/src/Assets/IconV2/ic-download.svg new file mode 100644 index 000000000..d3c67c66e --- /dev/null +++ b/src/Assets/IconV2/ic-download.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Assets/IconV2/ic-file-code.svg b/src/Assets/IconV2/ic-file-code.svg new file mode 100644 index 000000000..a6869d798 --- /dev/null +++ b/src/Assets/IconV2/ic-file-code.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/Assets/IconV2/ic-gavel.svg b/src/Assets/IconV2/ic-gavel.svg new file mode 100644 index 000000000..e2f32f692 --- /dev/null +++ b/src/Assets/IconV2/ic-gavel.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Assets/IconV2/ic-git-branch.svg b/src/Assets/IconV2/ic-git-branch.svg new file mode 100644 index 000000000..c4e481730 --- /dev/null +++ b/src/Assets/IconV2/ic-git-branch.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Assets/IconV2/ic-info-filled-color.svg b/src/Assets/IconV2/ic-info-filled-color.svg new file mode 100644 index 000000000..a4d6bf344 --- /dev/null +++ b/src/Assets/IconV2/ic-info-filled-color.svg @@ -0,0 +1,8 @@ + + + + diff --git a/src/Assets/IconV2/ic-linked-build-color.svg b/src/Assets/IconV2/ic-linked-build-color.svg new file mode 100644 index 000000000..e8285e694 --- /dev/null +++ b/src/Assets/IconV2/ic-linked-build-color.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/Assets/IconV2/ic-logs.svg b/src/Assets/IconV2/ic-logs.svg new file mode 100644 index 000000000..53cac8f34 --- /dev/null +++ b/src/Assets/IconV2/ic-logs.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/Assets/IconV2/ic-minus.svg b/src/Assets/IconV2/ic-minus.svg index c3e3d3831..3f0a5f895 100644 --- a/src/Assets/IconV2/ic-minus.svg +++ b/src/Assets/IconV2/ic-minus.svg @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/src/Assets/IconV2/ic-pause-circle.svg b/src/Assets/IconV2/ic-pause-circle.svg new file mode 100644 index 000000000..44995c308 --- /dev/null +++ b/src/Assets/IconV2/ic-pause-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Assets/IconV2/ic-speedometer.svg b/src/Assets/IconV2/ic-speedometer.svg new file mode 100644 index 000000000..b93c8c1f5 --- /dev/null +++ b/src/Assets/IconV2/ic-speedometer.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Assets/IconV2/ic-two-cubes.svg b/src/Assets/IconV2/ic-two-cubes.svg new file mode 100644 index 000000000..15ca41392 --- /dev/null +++ b/src/Assets/IconV2/ic-two-cubes.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Assets/IconV2/ic-webhook.svg b/src/Assets/IconV2/ic-webhook.svg new file mode 100644 index 000000000..59cc224da --- /dev/null +++ b/src/Assets/IconV2/ic-webhook.svg @@ -0,0 +1,21 @@ + + + + + + + diff --git a/src/Assets/Img/change-source.png b/src/Assets/Img/change-source.png deleted file mode 100644 index e1291f901..000000000 Binary files a/src/Assets/Img/change-source.png and /dev/null differ diff --git a/src/Assets/Img/select-image-source.png b/src/Assets/Img/select-image-source.png deleted file mode 100644 index 788713755..000000000 Binary files a/src/Assets/Img/select-image-source.png and /dev/null differ diff --git a/src/Assets/Img/workflow-options-modal-header.svg b/src/Assets/Img/workflow-options-modal-header.svg new file mode 100644 index 000000000..0968b045f --- /dev/null +++ b/src/Assets/Img/workflow-options-modal-header.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Common/Checkbox/Checkbox.tsx b/src/Common/Checkbox/Checkbox.tsx index d95747cf4..d7a65dfaf 100644 --- a/src/Common/Checkbox/Checkbox.tsx +++ b/src/Common/Checkbox/Checkbox.tsx @@ -14,6 +14,10 @@ * limitations under the License. */ +import { forwardRef } from 'react' + +import { stopPropagation } from '@Common/Helper' + import { CheckboxProps } from '../Types' import './Checkbox.scss' @@ -28,38 +32,32 @@ Valid States of Checkbox: 6. disabled: false, checked: true, value: CHECKED */ // TODO: Associate label with input element -export const Checkbox = ({ - rootClassName, - onClick, - name, - disabled, - value, - onChange, - tabIndex, - isChecked, - id, - dataTestId, - children, -}: CheckboxProps) => { - const rootClass = `${rootClassName || ''}` +export const Checkbox = forwardRef( + ( + { rootClassName, onClick, name, disabled, value, onChange, tabIndex, isChecked, id, dataTestId, children }, + forwardedRef, + ) => { + const rootClass = `${rootClassName || ''}` - return ( - // eslint-disable-next-line jsx-a11y/label-has-associated-control - - ) -} + return ( + // eslint-disable-next-line jsx-a11y/label-has-associated-control + + ) + }, +) diff --git a/src/Common/Constants.ts b/src/Common/Constants.ts index a5a013b75..c74a92f82 100644 --- a/src/Common/Constants.ts +++ b/src/Common/Constants.ts @@ -86,6 +86,7 @@ export const URLS = { // NOTE: using appId since we are re-using AppConfig component GLOBAL_CONFIG_TEMPLATES_DEVTRON_APP_DETAIL: `${GLOBAL_CONFIG_TEMPLATES_DEVTRON_APP}/detail/:appId`, LICENSE_AUTH: '/license-auth', + GLOBAL_CONFIG_EDIT_CLUSTER: '/global-config/cluster-env/edit/:clusterId', } as const export const ROUTES = { @@ -381,6 +382,7 @@ export const API_STATUS_CODES = { NOT_FOUND: 404, REQUEST_TIMEOUT: 408, CONFLICT: 409, + PRE_CONDITION_FAILED: 412, EXPECTATION_FAILED: 417, UNPROCESSABLE_ENTITY: 422, LOCKED: 423, diff --git a/src/Common/GenericDescription/GenericDescription.tsx b/src/Common/GenericDescription/GenericDescription.tsx index 422f170ad..ab853257f 100644 --- a/src/Common/GenericDescription/GenericDescription.tsx +++ b/src/Common/GenericDescription/GenericDescription.tsx @@ -16,32 +16,25 @@ import { useEffect, useRef, useState } from 'react' import ReactMde from 'react-mde' -import Tippy from '@tippyjs/react' -import { ReactComponent as BoldIcon } from '../../Assets/Icon/ic-bold.svg' -import { ReactComponent as CheckedListIcon } from '../../Assets/Icon/ic-checked-list.svg' -import { ReactComponent as CodeIcon } from '../../Assets/Icon/ic-code.svg' -import { ReactComponent as HeaderIcon } from '../../Assets/Icon/ic-header.svg' -import { ReactComponent as ImageIcon } from '../../Assets/Icon/ic-image.svg' -import { ReactComponent as ItalicIcon } from '../../Assets/Icon/ic-italic.svg' -import { ReactComponent as LinkIcon } from '../../Assets/Icon/ic-link.svg' -import { ReactComponent as OrderedListIcon } from '../../Assets/Icon/ic-ordered-list.svg' -import { ReactComponent as Edit } from '../../Assets/Icon/ic-pencil.svg' -import { ReactComponent as QuoteIcon } from '../../Assets/Icon/ic-quote.svg' -import { ReactComponent as StrikethroughIcon } from '../../Assets/Icon/ic-strikethrough.svg' -import { ReactComponent as UnorderedListIcon } from '../../Assets/Icon/ic-unordered-list.svg' -import { ButtonWithLoader, ToastManager, ToastVariantType } from '../../Shared' +import { ReactComponent as Edit } from '@Icons/ic-pencil.svg' +import { ReactComponent as UnorderedListIcon } from '@Icons/ic-unordered-list.svg' + import { - DEFAULT_MARKDOWN_EDITOR_PREVIEW_MESSAGE, - MARKDOWN_EDITOR_COMMAND_ICON_TIPPY_CONTENT, - MARKDOWN_EDITOR_COMMAND_TITLE, - MARKDOWN_EDITOR_COMMANDS, -} from '../Markdown/constant' + Button, + ButtonStyleType, + ButtonVariantType, + ComponentSizeType, + Icon, + ToastManager, + ToastVariantType, +} from '../../Shared' +import { DEFAULT_MARKDOWN_EDITOR_PREVIEW_MESSAGE, MARKDOWN_EDITOR_COMMANDS } from '../Markdown/constant' import Markdown from '../Markdown/MarkDown' import { deepEqual, showError } from '..' import { DESCRIPTION_EMPTY_ERROR_MSG, DESCRIPTION_UNSAVED_CHANGES_MSG } from './constant' import { GenericDescriptionProps, MDEditorSelectedTabType } from './types' -import { getParsedUpdatedOnDate } from './utils' +import { getEditorCustomIcon, getParsedUpdatedOnDate } from './utils' import 'react-mde/lib/styles/css/react-mde-all.css' import './genericDescription.scss' @@ -50,16 +43,17 @@ const GenericDescription = ({ text, updatedBy, updatedOn, - isDescriptionPreview, tabIndex, updateDescription, title, minEditorHeight = 300, + emptyStateConfig, }: GenericDescriptionProps) => { const [isLoading, setIsLoading] = useState(false) - const [isEditDescriptionView, setIsEditDescriptionView] = useState(isDescriptionPreview) + const [editorView, setEditorView] = useState< + MDEditorSelectedTabType.PREVIEW | MDEditorSelectedTabType.WRITE | 'previewSaved' | 'empty' + >(text ? 'previewSaved' : 'empty') const [modifiedDescriptionText, setModifiedDescriptionText] = useState(text) - const [selectedTab, setSelectedTab] = useState<'write' | 'preview'>(MDEditorSelectedTabType.WRITE) const isDescriptionModified = !deepEqual(text, modifiedDescriptionText) const mdeRef = useRef(null) @@ -70,27 +64,25 @@ const GenericDescription = ({ const _date = getParsedUpdatedOnDate(updatedOn) const validateDescriptionText = (description: string): boolean => { - let isValid = true - if (description.length === 0) { + const descriptionLength = description.length + if (!descriptionLength) { ToastManager.showToast({ variant: ToastVariantType.error, description: DESCRIPTION_EMPTY_ERROR_MSG, }) - isValid = false } - return isValid + return !!descriptionLength } - const toggleDescriptionView = () => { + const handleCancel = () => { let isConfirmed: boolean = true - if (isDescriptionModified && !isEditDescriptionView) { + if (isDescriptionModified) { // eslint-disable-next-line no-alert isConfirmed = window.confirm(DESCRIPTION_UNSAVED_CHANGES_MSG) } if (isConfirmed) { setModifiedDescriptionText(text) - setIsEditDescriptionView(!isEditDescriptionView) - setSelectedTab(MDEditorSelectedTabType.WRITE) + setEditorView(text ? 'previewSaved' : 'empty') } } @@ -103,171 +95,53 @@ const GenericDescription = ({ try { setIsLoading(true) await updateDescription(trimmedDescription) - setIsEditDescriptionView(true) // Explicitly updating the state, since the modified state gets corrupted setModifiedDescriptionText(trimmedDescription) + setEditorView('previewSaved') } catch (error) { showError(error) + setEditorView(MDEditorSelectedTabType.WRITE) + setModifiedDescriptionText(text) } finally { setIsLoading(false) } } - // TODO: add commandName - // eslint-disable-next-line consistent-return - const editorCustomIcon = (commandName: string): JSX.Element => { - // eslint-disable-next-line default-case - switch (commandName) { - case MARKDOWN_EDITOR_COMMAND_TITLE.HEADER: - return ( - -
- -
-
- ) - case MARKDOWN_EDITOR_COMMAND_TITLE.BOLD: - return ( - -
- -
-
- ) - case MARKDOWN_EDITOR_COMMAND_TITLE.ITALIC: - return ( - -
- -
-
- ) - case MARKDOWN_EDITOR_COMMAND_TITLE.STRIKETHROUGH: - return ( - -
- -
-
- ) - case MARKDOWN_EDITOR_COMMAND_TITLE.LINK: - return ( - -
- -
-
- ) - case MARKDOWN_EDITOR_COMMAND_TITLE.QUOTE: - return ( - -
- -
-
- ) - case MARKDOWN_EDITOR_COMMAND_TITLE.CODE: - return ( - -
- -
-
- ) - case MARKDOWN_EDITOR_COMMAND_TITLE.IMAGE: - return ( - -
- -
-
- ) - case MARKDOWN_EDITOR_COMMAND_TITLE.UNORDERED_LIST: - return ( - -
- -
-
- ) - case MARKDOWN_EDITOR_COMMAND_TITLE.ORDERED_LIST: - return ( - -
- -
-
- ) - case MARKDOWN_EDITOR_COMMAND_TITLE.CHECKED_LIST: - return ( - -
- -
-
- ) - } + const handleWriteDescription = () => { + setEditorView(MDEditorSelectedTabType.WRITE) + } + + const handleTabChange = (tab: MDEditorSelectedTabType) => { + setEditorView(tab) + } + + if (editorView === 'empty') { + const { img, subtitle } = emptyStateConfig || {} + return ( +
+
+
+ {title} + {subtitle &&
{subtitle}
} +
+
+ {img && release-note} +
+ ) } return (
- {isEditDescriptionView ? ( + {editorView === 'previewSaved' ? (
@@ -283,7 +157,7 @@ const GenericDescription = ({
Edit
@@ -309,24 +183,19 @@ const GenericDescription = ({ editorCustomIcon(commandName)} + getIcon={(commandName: string) => getEditorCustomIcon(commandName)} toolbarCommands={MARKDOWN_EDITOR_COMMANDS} value={modifiedDescriptionText} onChange={setModifiedDescriptionText} minEditorHeight={minEditorHeight} minPreviewHeight={150} - selectedTab={selectedTab} - onTabChange={setSelectedTab} + selectedTab={editorView} + onTabChange={handleTabChange} generateMarkdownPreview={(markdown: string) => Promise.resolve( , @@ -335,12 +204,12 @@ const GenericDescription = ({ childProps={{ writeButton: { className: `tab-list__tab pointer fs-13 ${ - selectedTab === MDEditorSelectedTabType.WRITE && 'cb-5 fw-6 active active-tab' + editorView === MDEditorSelectedTabType.WRITE && 'cb-5 fw-6 active active-tab' }`, }, previewButton: { className: `tab-list__tab pointer fs-13 ${ - selectedTab === MDEditorSelectedTabType.PREVIEW && 'cb-5 fw-6 active active-tab' + editorView === MDEditorSelectedTabType.PREVIEW && 'cb-5 fw-6 active active-tab' }`, }, textArea: { @@ -348,28 +217,26 @@ const GenericDescription = ({ }, }} /> - {selectedTab === MDEditorSelectedTabType.WRITE && ( + {editorView === MDEditorSelectedTabType.WRITE && (
-
- - +
)} diff --git a/src/Common/GenericDescription/types.ts b/src/Common/GenericDescription/types.ts index ead6ad9db..802b5c9f7 100644 --- a/src/Common/GenericDescription/types.ts +++ b/src/Common/GenericDescription/types.ts @@ -18,11 +18,14 @@ export interface GenericDescriptionProps { text?: string updatedBy?: string updatedOn?: string - isDescriptionPreview: boolean updateDescription: (string) => Promise title: string tabIndex?: number minEditorHeight?: number + emptyStateConfig?: { + img: string + subtitle: JSX.Element + } } export enum MDEditorSelectedTabType { diff --git a/src/Common/GenericDescription/utils.ts b/src/Common/GenericDescription/utils.ts deleted file mode 100644 index 0f0ccd4ee..000000000 --- a/src/Common/GenericDescription/utils.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2024. Devtron Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import moment from 'moment' - -import { DATE_TIME_FORMATS, ZERO_TIME_STRING } from '@Common/Constants' - -export const getParsedUpdatedOnDate = (updatedOn: string) => { - if (!updatedOn || updatedOn === ZERO_TIME_STRING) { - return '' - } - - const _moment = moment(updatedOn) - - return _moment.isValid() ? _moment.format(DATE_TIME_FORMATS.TWELVE_HOURS_FORMAT) : updatedOn -} diff --git a/src/Common/GenericDescription/utils.tsx b/src/Common/GenericDescription/utils.tsx new file mode 100644 index 000000000..b4e7f8c7e --- /dev/null +++ b/src/Common/GenericDescription/utils.tsx @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2024. Devtron Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Tippy from '@tippyjs/react' +import moment from 'moment' + +import { ReactComponent as BoldIcon } from '@Icons/ic-bold.svg' +import { ReactComponent as CheckedListIcon } from '@Icons/ic-checked-list.svg' +import { ReactComponent as CodeIcon } from '@Icons/ic-code.svg' +import { ReactComponent as HeaderIcon } from '@Icons/ic-header.svg' +import { ReactComponent as ImageIcon } from '@Icons/ic-image.svg' +import { ReactComponent as ItalicIcon } from '@Icons/ic-italic.svg' +import { ReactComponent as LinkIcon } from '@Icons/ic-link.svg' +import { ReactComponent as OrderedListIcon } from '@Icons/ic-ordered-list.svg' +import { ReactComponent as QuoteIcon } from '@Icons/ic-quote.svg' +import { ReactComponent as StrikethroughIcon } from '@Icons/ic-strikethrough.svg' +import { ReactComponent as UnorderedListIcon } from '@Icons/ic-unordered-list.svg' +import { DATE_TIME_FORMATS, ZERO_TIME_STRING } from '@Common/Constants' +import { logExceptionToSentry } from '@Common/Helper' +import { MARKDOWN_EDITOR_COMMAND_ICON_TIPPY_CONTENT, MARKDOWN_EDITOR_COMMAND_TITLE } from '@Common/Markdown/constant' + +export const getParsedUpdatedOnDate = (updatedOn: string) => { + if (!updatedOn || updatedOn === ZERO_TIME_STRING) { + return '' + } + + const _moment = moment(updatedOn) + + return _moment.isValid() ? _moment.format(DATE_TIME_FORMATS.TWELVE_HOURS_FORMAT) : updatedOn +} + +export const getEditorCustomIcon = (commandName: string): JSX.Element => { + switch (commandName) { + case MARKDOWN_EDITOR_COMMAND_TITLE.HEADER: + return ( + +
+ +
+
+ ) + case MARKDOWN_EDITOR_COMMAND_TITLE.BOLD: + return ( + +
+ +
+
+ ) + case MARKDOWN_EDITOR_COMMAND_TITLE.ITALIC: + return ( + +
+ +
+
+ ) + case MARKDOWN_EDITOR_COMMAND_TITLE.STRIKETHROUGH: + return ( + +
+ +
+
+ ) + case MARKDOWN_EDITOR_COMMAND_TITLE.LINK: + return ( + +
+ +
+
+ ) + case MARKDOWN_EDITOR_COMMAND_TITLE.QUOTE: + return ( + +
+ +
+
+ ) + case MARKDOWN_EDITOR_COMMAND_TITLE.CODE: + return ( + +
+ +
+
+ ) + case MARKDOWN_EDITOR_COMMAND_TITLE.IMAGE: + return ( + +
+ +
+
+ ) + case MARKDOWN_EDITOR_COMMAND_TITLE.UNORDERED_LIST: + return ( + +
+ +
+
+ ) + case MARKDOWN_EDITOR_COMMAND_TITLE.ORDERED_LIST: + return ( + +
+ +
+
+ ) + case MARKDOWN_EDITOR_COMMAND_TITLE.CHECKED_LIST: + return ( + +
+ +
+
+ ) + default: + logExceptionToSentry('Invalid command for MDE') + return null + } +} diff --git a/src/Common/Hooks/UseRegisterShortcut/UseRegisterShortcutProvider.tsx b/src/Common/Hooks/UseRegisterShortcut/UseRegisterShortcutProvider.tsx index ff53f1ce7..e93934753 100644 --- a/src/Common/Hooks/UseRegisterShortcut/UseRegisterShortcutProvider.tsx +++ b/src/Common/Hooks/UseRegisterShortcut/UseRegisterShortcutProvider.tsx @@ -14,9 +14,11 @@ * limitations under the License. */ -import { useCallback, useEffect, useMemo, useRef } from 'react' +import { KeyboardEvent, useCallback, useEffect, useMemo, useRef } from 'react' import { deepEquals } from '@rjsf/utils' +import { noop } from '@Common/Helper' + import { ShortcutType, UseRegisterShortcutContextType, UseRegisterShortcutProviderType } from './types' import { UseRegisterShortcutContext } from './UseRegisterShortcutContext' import { preprocessKeys, verifyCallbackStack } from './utils' @@ -25,6 +27,7 @@ const IGNORE_TAGS_FALLBACK = ['input', 'textarea', 'select'] const DEFAULT_TIMEOUT = 300 const UseRegisterShortcutProvider = ({ + shouldHookOntoWindow = true, ignoreTags, preventDefault = false, shortcutTimeout, @@ -116,11 +119,7 @@ const UseRegisterShortcutProvider = ({ } }, []) - const handleKeydownEvent = useCallback((event: KeyboardEvent) => { - if (preventDefault) { - event.preventDefault() - } - + const handleKeydownEvent = useCallback((event: KeyboardEvent) => { if ( // NOTE: in case of custom events generated by password managers autofill, the event.key is not set !event.key || @@ -132,6 +131,10 @@ const UseRegisterShortcutProvider = ({ return } + if (preventDefault) { + event.preventDefault() + } + keysDownRef.current.add(event.key.toUpperCase() as Uppercase) if (event.ctrlKey) { @@ -159,12 +162,19 @@ const UseRegisterShortcutProvider = ({ }, []) useEffect(() => { - window.addEventListener('keydown', handleKeydownEvent) + if (!shouldHookOntoWindow) { + return noop + } + + window.addEventListener('keydown', handleKeydownEvent as unknown as (event: globalThis.KeyboardEvent) => void) window.addEventListener('keyup', handleKeyupEvent) window.addEventListener('blur', handleBlur) return () => { - window.removeEventListener('keydown', handleKeydownEvent) + window.removeEventListener( + 'keydown', + handleKeydownEvent as unknown as (event: globalThis.KeyboardEvent) => void, + ) window.removeEventListener('keyup', handleKeyupEvent) window.removeEventListener('blur', handleBlur) @@ -172,7 +182,7 @@ const UseRegisterShortcutProvider = ({ clearTimeout(keyDownTimeoutRef.current) } } - }, [handleKeyupEvent, handleKeydownEvent, handleBlur]) + }, [handleKeyupEvent, handleKeydownEvent, handleBlur, shouldHookOntoWindow]) const providerValue: UseRegisterShortcutContextType = useMemo( () => ({ @@ -180,8 +190,20 @@ const UseRegisterShortcutProvider = ({ unregisterShortcut, setDisableShortcuts, triggerShortcut, + ...(!shouldHookOntoWindow + ? { targetProps: { onKeyDown: handleKeydownEvent, onKeyUp: handleKeyupEvent, onBlur: handleBlur } } + : {}), }), - [registerShortcut, unregisterShortcut, setDisableShortcuts, triggerShortcut], + [ + registerShortcut, + unregisterShortcut, + setDisableShortcuts, + triggerShortcut, + shouldHookOntoWindow, + handleKeydownEvent, + handleKeyupEvent, + handleBlur, + ], ) return {children} diff --git a/src/Common/Hooks/UseRegisterShortcut/types.ts b/src/Common/Hooks/UseRegisterShortcut/types.ts index 4888e4056..2508933d4 100644 --- a/src/Common/Hooks/UseRegisterShortcut/types.ts +++ b/src/Common/Hooks/UseRegisterShortcut/types.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import { FocusEvent, KeyboardEvent } from 'react' + import { IS_PLATFORM_MAC_OS } from '@Common/Constants' // NOTE: check this link for more info on keyboard keys: https://w3c.github.io/uievents-key/ @@ -28,6 +30,9 @@ export const KEYBOARD_KEYS_MAP = { K: 'K', X: 'X', A: 'A', + N: 'N', + S: 'S', + '/': '/', Escape: 'Esc', Enter: '↩', ArrowLeft: '←', @@ -77,9 +82,26 @@ export interface UseRegisterShortcutContextType { * Programmatically trigger a shortcut if already registered */ triggerShortcut: (keys: ShortcutType['keys']) => void + /** + * If shouldHookOntoWindow is false, these props need to be hooked onto + * the component that needs to listen to the shortcuts + */ + targetProps?: { + onKeyDown: (event: KeyboardEvent) => void + onKeyUp: (event: KeyboardEvent) => void + onBlur: (event: FocusEvent) => void + } } export interface UseRegisterShortcutProviderType { + /** + * If false, the shortcuts will not be registered to the window object + * instead onKeyDown, onKeyUp and onBlur will be exposed as context methods + * which need to be hooked onto the component that needs to listen to the shortcuts + * + * defaults to true + */ + shouldHookOntoWindow?: boolean children: React.ReactNode /** * Defines how long after holding the keys down do we trigger the callback in milliseconds diff --git a/src/Common/Hooks/useStateFilters/types.ts b/src/Common/Hooks/useStateFilters/types.ts index 3720c70c1..782df3344 100644 --- a/src/Common/Hooks/useStateFilters/types.ts +++ b/src/Common/Hooks/useStateFilters/types.ts @@ -16,7 +16,8 @@ import { UseUrlFiltersProps, UseUrlFiltersReturnType } from '../useUrlFilters' -export interface UseStateFiltersProps extends Pick, 'initialSortKey'> {} +export interface UseStateFiltersProps + extends Pick, 'initialSortKey' | 'defaultPageSize'> {} export interface UseStateFiltersReturnType extends Pick< @@ -31,7 +32,7 @@ export interface UseStateFiltersReturnType | 'pageSize' | 'searchKey' | 'handleSearch' - | 'isFilterApplied' + | 'areFiltersApplied' > {} export interface PaginationType extends Pick, 'pageSize'> { diff --git a/src/Common/Hooks/useStateFilters/useStateFilters.tsx b/src/Common/Hooks/useStateFilters/useStateFilters.tsx index 864e1b3af..485e3c7ac 100644 --- a/src/Common/Hooks/useStateFilters/useStateFilters.tsx +++ b/src/Common/Hooks/useStateFilters/useStateFilters.tsx @@ -35,6 +35,7 @@ import { PaginationType, UseStateFiltersProps, UseStateFiltersReturnType } from */ const useStateFilters = ({ initialSortKey, + defaultPageSize = DEFAULT_BASE_PAGE_SIZE, }: UseStateFiltersProps = {}): UseStateFiltersReturnType => { const [sortingConfig, setSortingConfig] = useState({ sortOrder: SortingOrder.ASC, @@ -45,7 +46,7 @@ const useStateFilters = ({ const { sortBy, sortOrder } = sortingConfig const [pagination, setPagination] = useState>({ - pageSize: DEFAULT_BASE_PAGE_SIZE, + pageSize: defaultPageSize, pageNumber: DEFAULT_PAGE_NUMBER, }) const offset = pagination.pageSize * (pagination.pageNumber - 1) @@ -117,7 +118,7 @@ const useStateFilters = ({ changePage, changePageSize, offset, - isFilterApplied: !!searchKey, + areFiltersApplied: !!searchKey, } } diff --git a/src/Common/Hooks/useUrlFilters/index.ts b/src/Common/Hooks/useUrlFilters/index.ts index 8e77c1d17..7b63d2d78 100644 --- a/src/Common/Hooks/useUrlFilters/index.ts +++ b/src/Common/Hooks/useUrlFilters/index.ts @@ -14,5 +14,6 @@ * limitations under the License. */ +export { URL_FILTER_KEYS } from './constants' export type { UseUrlFiltersProps, UseUrlFiltersReturnType } from './types' export { default as useUrlFilters } from './useUrlFilters' diff --git a/src/Common/Hooks/useUrlFilters/types.ts b/src/Common/Hooks/useUrlFilters/types.ts index 46beb8a00..57c6ea50c 100644 --- a/src/Common/Hooks/useUrlFilters/types.ts +++ b/src/Common/Hooks/useUrlFilters/types.ts @@ -35,6 +35,7 @@ export interface UseUrlFiltersProps { * @default 'replace' */ redirectionMethod?: 'replace' | 'push' + defaultPageSize?: number } export type UpdateSearchParamsOptionsType = Partial, 'redirectionMethod'>> @@ -86,5 +87,5 @@ export type UseUrlFiltersReturnType = K & { * Update the search params with the passed object */ updateSearchParams: (paramsToSerialize: Partial, options?: UpdateSearchParamsOptionsType) => void - isFilterApplied: boolean + areFiltersApplied: boolean } diff --git a/src/Common/Hooks/useUrlFilters/useUrlFilters.ts b/src/Common/Hooks/useUrlFilters/useUrlFilters.ts index 85e9acb75..b502e4833 100644 --- a/src/Common/Hooks/useUrlFilters/useUrlFilters.ts +++ b/src/Common/Hooks/useUrlFilters/useUrlFilters.ts @@ -49,6 +49,7 @@ const useUrlFilters = ({ parseSearchParams, localStorageKey, redirectionMethod = 'replace', + defaultPageSize = DEFAULT_BASE_PAGE_SIZE, }: UseUrlFiltersProps = {}): UseUrlFiltersReturnType => { const location = useLocation() const history = useHistory() @@ -108,7 +109,7 @@ const useUrlFilters = ({ const _parsedParams = getParsedSearchParams(searchParams) return { - pageSize: Number(_pageSize) || DEFAULT_BASE_PAGE_SIZE, + pageSize: Number(_pageSize) || defaultPageSize, pageNumber: Number(_pageNumber) || DEFAULT_PAGE_NUMBER, searchKey: _searchKey || '', sortBy: sortByKey, @@ -223,7 +224,7 @@ const useUrlFilters = ({ clearFilters, ...parsedParams, updateSearchParams, - isFilterApplied: !!searchKey || areAnyAdditionalFiltersApplied(parsedParams), + areFiltersApplied: !!searchKey || areAnyAdditionalFiltersApplied(parsedParams), } } diff --git a/src/Common/Modals/VisibleModal.tsx b/src/Common/Modals/VisibleModal.tsx index a57e72ab6..84dbad2ae 100644 --- a/src/Common/Modals/VisibleModal.tsx +++ b/src/Common/Modals/VisibleModal.tsx @@ -27,6 +27,7 @@ export class VisibleModal extends React.Component<{ onEscape?: (e) => void }> { modalRef = document.getElementById('visible-modal') + previousActiveElement: HTMLElement | null = null constructor(props) { super(props) @@ -50,6 +51,8 @@ export class VisibleModal extends React.Component<{ this.modalRef.classList.add(this.props.noBackground ? 'show' : 'show-with-bg') preventBodyScroll(true) + this.previousActiveElement = document.activeElement as HTMLElement + if (this.props.parentClassName) { this.modalRef.classList.add(this.props.parentClassName) } @@ -61,6 +64,8 @@ export class VisibleModal extends React.Component<{ this.modalRef.classList.remove('show-with-bg') preventBodyScroll(false) + this.previousActiveElement?.focus({ preventScroll: true }) + if (this.props.parentClassName) { this.modalRef.classList.remove(this.props.parentClassName) } diff --git a/src/Common/Modals/VisibleModal2.tsx b/src/Common/Modals/VisibleModal2.tsx index d0806666d..c8ee73232 100644 --- a/src/Common/Modals/VisibleModal2.tsx +++ b/src/Common/Modals/VisibleModal2.tsx @@ -21,6 +21,7 @@ import { stopPropagation } from '../Helper' export class VisibleModal2 extends React.Component<{ className?: string; close?: (e) => void }> { modalRef = document.getElementById('visible-modal-2') + previousActiveElement: HTMLElement | null = null constructor(props) { super(props) @@ -38,12 +39,14 @@ export class VisibleModal2 extends React.Component<{ className?: string; close?: document.addEventListener('keydown', this.escFunction) this.modalRef.classList.add('show-with-bg') preventBodyScroll(true) + this.previousActiveElement = document.activeElement as HTMLElement } componentWillUnmount() { document.removeEventListener('keydown', this.escFunction) this.modalRef.classList.remove('show-with-bg') preventBodyScroll(false) + this.previousActiveElement?.focus({ preventScroll: true }) } handleBodyClick = (e: SyntheticEvent) => { diff --git a/src/Common/Pagination/PageSizeSelector.tsx b/src/Common/Pagination/PageSizeSelector.tsx index 4b9108e54..bf7c0093f 100644 --- a/src/Common/Pagination/PageSizeSelector.tsx +++ b/src/Common/Pagination/PageSizeSelector.tsx @@ -82,7 +82,7 @@ const PageSizeSelector = ({ pageSizeOptions, pageSize, changePageSize }: PageSiz
)} -
) diff --git a/src/Common/SegmentedControl/segmentedControl.scss b/src/Common/SegmentedControl/segmentedControl.scss index a2cc2ea19..8d170b8ae 100644 --- a/src/Common/SegmentedControl/segmentedControl.scss +++ b/src/Common/SegmentedControl/segmentedControl.scss @@ -37,10 +37,11 @@ border: 0.5px solid var(--border-primary); box-shadow: 0px 1px 2px 0px var(--black-20); } + } - > *:not(.active-mask) { - z-index: 1; - } + > span { + position: relative; + z-index: 1; } &:hover:not(#{$parent-selector}--selected):not(.cursor-not-allowed) { diff --git a/src/Common/SortableTableHeaderCell/SortableTableHeaderCell.tsx b/src/Common/SortableTableHeaderCell/SortableTableHeaderCell.tsx index 4c120268f..ebfd7c2ef 100644 --- a/src/Common/SortableTableHeaderCell/SortableTableHeaderCell.tsx +++ b/src/Common/SortableTableHeaderCell/SortableTableHeaderCell.tsx @@ -95,7 +95,9 @@ const SortableTableHeaderCell = ({ return ( // Added w-100, h-100 when isResizable is true to ensure the cell takes full dimensions in wrapper flex layout (if any) -
+
diff --git a/src/Shared/Components/AppStatusModal/AppStatusModal.component.tsx b/src/Shared/Components/AppStatusModal/AppStatusModal.component.tsx index a2cd53503..daf66cdea 100644 --- a/src/Shared/Components/AppStatusModal/AppStatusModal.component.tsx +++ b/src/Shared/Components/AppStatusModal/AppStatusModal.component.tsx @@ -99,6 +99,7 @@ const AppStatusModal = ({ } : null, isHelmApp: appDetails.appType === AppType.DEVTRON_HELM_CHART, + deploymentAppType: appDetails.deploymentAppType, }), deploymentStatusAbortControllerRef, ) diff --git a/src/Shared/Components/AppStatusModal/service.ts b/src/Shared/Components/AppStatusModal/service.ts index e862199d3..93bf49caf 100644 --- a/src/Shared/Components/AppStatusModal/service.ts +++ b/src/Shared/Components/AppStatusModal/service.ts @@ -51,6 +51,7 @@ export const getDeploymentStatusWithTimeline = async ({ showTimeline, virtualEnvironmentConfig, isHelmApp, + deploymentAppType, }: GetDeploymentStatusWithTimelineParamsType): Promise => { const baseURL = isHelmApp ? ROUTES.HELM_DEPLOYMENT_STATUS_TIMELINE_INSTALLED_APP : ROUTES.DEPLOYMENT_STATUS @@ -68,5 +69,8 @@ export const getDeploymentStatusWithTimeline = async ({ return virtualEnvironmentConfig ? virtualEnvironmentConfig.processVirtualEnvironmentDeploymentData(deploymentStatusDetailsResponse.result) - : processDeploymentStatusDetailsData(deploymentStatusDetailsResponse.result) + : processDeploymentStatusDetailsData( + deploymentStatusDetailsResponse.result.deploymentAppType ?? deploymentAppType, + deploymentStatusDetailsResponse.result, + ) } diff --git a/src/Shared/Components/AppStatusModal/types.ts b/src/Shared/Components/AppStatusModal/types.ts index 6b86ada85..9671e06a7 100644 --- a/src/Shared/Components/AppStatusModal/types.ts +++ b/src/Shared/Components/AppStatusModal/types.ts @@ -1,6 +1,6 @@ import { FunctionComponent, PropsWithChildren, ReactNode } from 'react' -import { APIOptions } from '@Common/Types' +import { APIOptions, DeploymentAppTypes } from '@Common/Types' import { AppDetails, ConfigDriftModalProps, @@ -85,6 +85,7 @@ export type GetDeploymentStatusWithTimelineParamsType = Pick { diff --git a/src/Shared/Components/Backdrop/Backdrop.tsx b/src/Shared/Components/Backdrop/Backdrop.tsx index 7c0fb5e72..c130efd5e 100644 --- a/src/Shared/Components/Backdrop/Backdrop.tsx +++ b/src/Shared/Components/Backdrop/Backdrop.tsx @@ -14,19 +14,27 @@ * limitations under the License. */ -import { useEffect } from 'react' +import { useEffect, useLayoutEffect, useRef, useState } from 'react' import { createPortal } from 'react-dom' import { motion } from 'framer-motion' import { useRegisterShortcut } from '@Common/Hooks' import { DEVTRON_BASE_MAIN_ID } from '@Shared/constants' -import { preventBodyScroll, preventOutsideFocus } from '@Shared/Helpers' +import { getUniqueId, preventBodyScroll, preventOutsideFocus } from '@Shared/Helpers' import { BackdropProps } from './types' +import { createPortalContainerAndAppendToDOM } from './utils' -const Backdrop = ({ children, onEscape }: BackdropProps) => { +const Backdrop = ({ children, onEscape, onClick, hasClearBackground = false, onBackdropMount }: BackdropProps) => { + // STATES + const [portalContainer, setPortalContainer] = useState(null) + + // HOOKS const { registerShortcut, unregisterShortcut } = useRegisterShortcut() + // REFS + const portalContainerIdRef = useRef(`backdrop-${getUniqueId()}`) + // useEffect on onEscape since onEscape might change based on conditions useEffect(() => { registerShortcut({ keys: ['Escape'], callback: onEscape }) @@ -37,6 +45,8 @@ const Backdrop = ({ children, onEscape }: BackdropProps) => { }, [onEscape]) useEffect(() => { + const previousActiveElement = document.activeElement as HTMLElement + preventBodyScroll(true) // Setting main as inert to that focus is trapped inside the new portal preventOutsideFocus({ identifier: DEVTRON_BASE_MAIN_ID, preventFocus: true }) @@ -48,19 +58,68 @@ const Backdrop = ({ children, onEscape }: BackdropProps) => { preventOutsideFocus({ identifier: DEVTRON_BASE_MAIN_ID, preventFocus: false }) preventOutsideFocus({ identifier: 'visible-modal', preventFocus: false }) preventOutsideFocus({ identifier: 'visible-modal-2', preventFocus: false }) + + previousActiveElement?.focus({ preventScroll: true }) } }, []) + useEffect(() => { + onBackdropMount?.(!!portalContainer) + }, [portalContainer]) + + /** + * Manages a dedicated DOM node for rendering a portal backdrop. + * + * On mount: + * - Looks for an existing element with the specified `portalContainerId` + * - If not found, creates and appends a new wrapper element to the DOM + * - Sets the found or created element as the target for rendering the portal + * + * On unmount: + * - Removes the portal container element from the DOM *only* if this component created it + * + * Why this is needed: + * - Ensures each portal instance has an isolated container + * - Avoids duplicate DOM nodes or conflicts with other portals + * - Prevents memory leaks by cleaning up unused elements + * - Allows rendering outside the parent DOM hierarchy to avoid layout/z-index issues + */ + useLayoutEffect(() => { + let element = document.getElementById(portalContainerIdRef.current) + let systemCreated = false + + // If the portal container doesn't exist, create and append it to the DOM + if (!element) { + systemCreated = true + element = createPortalContainerAndAppendToDOM(portalContainerIdRef.current) + } + + // Set the container element as the portal's render target + setPortalContainer(element) + + return () => { + // Clean up only if we created the element + if (systemCreated && element?.parentNode) { + element.parentNode.removeChild(element) + } + } + }, []) + + if (portalContainer === null) { + return null + } + return createPortal( {children} , - document.getElementById('animated-dialog-backdrop'), + portalContainer, ) } diff --git a/src/Shared/Components/Backdrop/index.tsx b/src/Shared/Components/Backdrop/index.ts similarity index 96% rename from src/Shared/Components/Backdrop/index.tsx rename to src/Shared/Components/Backdrop/index.ts index 1eb94274c..7d972dae0 100644 --- a/src/Shared/Components/Backdrop/index.tsx +++ b/src/Shared/Components/Backdrop/index.ts @@ -15,3 +15,4 @@ */ export { default as Backdrop } from './Backdrop' +export * from './types' diff --git a/src/Shared/Components/Backdrop/types.ts b/src/Shared/Components/Backdrop/types.ts new file mode 100644 index 000000000..a2939c4c5 --- /dev/null +++ b/src/Shared/Components/Backdrop/types.ts @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2024. Devtron Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { MouseEvent, ReactNode } from 'react' + +export interface BackdropProps { + /** + * The content to be rendered within the backdrop component. + */ + children: ReactNode + /** + * Callback function that gets triggered when the Escape key is pressed. \ + * Should be wrapped in useCallback to prevent unnecessary re-renders. + * @example + * const handleEscape = useCallback(() => { + * // Handle escape key press + * }, []); + */ + onEscape: () => void + /** + * Callback function that gets triggered when the backdrop is clicked. + * Useful for dismissing modals or other overlay content. + * @param e - The mouse event object from the click interaction + */ + onClick?: (e: MouseEvent) => void + /** + * Determines if the backdrop should be transparent. + * When true, the backdrop will not have any background color or blur filter. + * @default false + */ + hasClearBackground?: boolean + /** + * Callback function that gets triggered when the backdrop component mounts or unmounts. + * This can be used to perform side effects or state updates when the backdrop's visibility changes. + * @param isMounted - A boolean indicating whether the backdrop is currently mounted (true) or not (false) + */ + onBackdropMount?: (isMounted: boolean) => void +} diff --git a/src/Shared/Components/Backdrop/types.tsx b/src/Shared/Components/Backdrop/types.tsx deleted file mode 100644 index 0a5d956f9..000000000 --- a/src/Shared/Components/Backdrop/types.tsx +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2024. Devtron Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ReactNode } from 'react' - -export interface BackdropProps { - children: ReactNode - /** - * @param onEscape: please wrap in a useCallback, with respective dependencies or [] - */ - onEscape: () => void -} diff --git a/src/Shared/Components/Backdrop/utils.ts b/src/Shared/Components/Backdrop/utils.ts new file mode 100644 index 000000000..033984d0c --- /dev/null +++ b/src/Shared/Components/Backdrop/utils.ts @@ -0,0 +1,14 @@ +import { DEVTRON_BASE_MAIN_ID } from '@Shared/constants' + +export const createPortalContainerAndAppendToDOM = (portalContainerId: string) => { + const devtronBaseMainElement = document.getElementById(DEVTRON_BASE_MAIN_ID) + if (!devtronBaseMainElement) { + return null + } + + const portalContainer = document.createElement('div') + portalContainer.setAttribute('id', portalContainerId) + devtronBaseMainElement.parentElement.appendChild(portalContainer) + + return portalContainer +} diff --git a/src/Shared/Components/Badge/Badge.tsx b/src/Shared/Components/Badge/Badge.tsx new file mode 100644 index 000000000..f3128c865 --- /dev/null +++ b/src/Shared/Components/Badge/Badge.tsx @@ -0,0 +1,38 @@ +import { ComponentSizeType } from '@Shared/constants' + +import { Icon } from '../Icon' +import { BadgeProps } from './types' +import { getClassNameAccToSize, getClassNameAccToVariant } from './utils' + +const Badge = ({ + label, + bgColor, + fontColor, + endIconProps, + startIconProps, + variant = 'default', + size = ComponentSizeType.xs, +}: BadgeProps) => { + const { styles, iconColor } = getClassNameAccToVariant(variant) + const iconSize = size === ComponentSizeType.xs ? 20 : 16 + + return ( +
+ {startIconProps && } + {label && {label}} + {endIconProps && } +
+ ) +} + +export default Badge diff --git a/src/Shared/Components/Badge/index.tsx b/src/Shared/Components/Badge/index.tsx new file mode 100644 index 000000000..91da7ac41 --- /dev/null +++ b/src/Shared/Components/Badge/index.tsx @@ -0,0 +1,2 @@ +export { default as Badge } from './Badge' +export type { BadgeProps } from './types' diff --git a/src/Shared/Components/Badge/types.ts b/src/Shared/Components/Badge/types.ts new file mode 100644 index 000000000..f799544a4 --- /dev/null +++ b/src/Shared/Components/Badge/types.ts @@ -0,0 +1,24 @@ +import { ComponentSizeType } from '@Shared/constants' +import { IconBaseColorType } from '@Shared/types' + +import { IconsProps } from '../Icon' + +export type BadgeVariants = 'default' | 'negative' | 'negative-grey' | 'positive' | 'warning' | 'neutral' | 'custom' + +export type BadgeProps = { + size?: Extract + startIconProps?: Omit + endIconProps?: Omit + label: string +} & ( + | { + variant?: Exclude + fontColor?: never + bgColor?: never + } + | { + variant: 'custom' + fontColor: IconBaseColorType + bgColor: IconBaseColorType + } +) diff --git a/src/Shared/Components/Badge/utils.ts b/src/Shared/Components/Badge/utils.ts new file mode 100644 index 000000000..9e0d04453 --- /dev/null +++ b/src/Shared/Components/Badge/utils.ts @@ -0,0 +1,36 @@ +import { ComponentSizeType } from '@Shared/constants' +import { IconBaseColorType } from '@Shared/types' + +import { BadgeProps } from './types' + +export const getClassNameAccToVariant = ( + variant: BadgeProps['variant'], +): { styles: string; iconColor: IconBaseColorType } => { + switch (variant) { + case 'custom': + return { styles: '', iconColor: 'B700' } + case 'negative': + return { styles: 'bcr-1 cr-7', iconColor: 'R700' } + case 'warning': + return { styles: 'bcy-50 cy-7', iconColor: 'Y700' } + case 'positive': + return { styles: 'bcg-1 cg-7', iconColor: 'G700' } + case 'neutral': + return { styles: 'bg__secondary cn-700', iconColor: 'N700' } + case 'default': + default: + return { styles: 'bcb-1 cb-7', iconColor: 'B700' } + } +} + +export const getClassNameAccToSize = (size: BadgeProps['size']) => { + switch (size) { + case ComponentSizeType.xxxs: + return 'fs-11 lh-16 px-4 py-1' + case ComponentSizeType.xxs: + return 'fs-12 lh-16 px-6 py-2' + case ComponentSizeType.xs: + default: + return 'fs-13 lh-20 px-6 py-2' + } +} diff --git a/src/Shared/Components/BulkSelection/BulkSelection.tsx b/src/Shared/Components/BulkSelection/BulkSelection.tsx index 866b89cb9..128ad5ece 100644 --- a/src/Shared/Components/BulkSelection/BulkSelection.tsx +++ b/src/Shared/Components/BulkSelection/BulkSelection.tsx @@ -14,84 +14,101 @@ * limitations under the License. */ -import { ReactComponent as ICCheckAll } from '../../../Assets/Icon/ic-check-all.svg' -import { ReactComponent as ICCheckSquare } from '../../../Assets/Icon/ic-check-square.svg' +import { forwardRef, MouseEvent } from 'react' + import { ReactComponent as ICChevronDown } from '../../../Assets/Icon/ic-chevron-down.svg' -import { ReactComponent as ICClose } from '../../../Assets/Icon/ic-close.svg' -import { Checkbox, CHECKBOX_VALUE, noop, PopupMenu } from '../../../Common' -import BulkSelectionDropdownItems from './BulkSelectionDropdownItems' +import { Checkbox, ConditionalWrap, noop } from '../../../Common' +import { ActionMenu, ActionMenuItemType, ActionMenuProps } from '../ActionMenu' import { useBulkSelection } from './BulkSelectionProvider' import { BULK_DROPDOWN_TEST_ID, BulkSelectionOptionsLabels } from './constants' -import { BulkSelectionDropdownItemsType, BulkSelectionEvents, BulkSelectionProps } from './types' +import { BulkSelectionEvents, BulkSelectionProps } from './types' -const BulkSelection = ({ showPagination, disabled = false, showChevronDownIcon = true }: BulkSelectionProps) => { - const { handleBulkSelection, isChecked, checkboxValue, getSelectedIdentifiersCount } = useBulkSelection() - const areOptionsSelected = getSelectedIdentifiersCount() > 0 - const BulkSelectionItems: BulkSelectionDropdownItemsType[] = [ - { - locator: BulkSelectionEvents.SELECT_ALL_ON_PAGE, - label: BulkSelectionOptionsLabels[BulkSelectionEvents.SELECT_ALL_ON_PAGE], - isSelected: isChecked && checkboxValue === CHECKBOX_VALUE.CHECKED, - icon: ICCheckSquare, - }, - ...(showPagination - ? [ - { - locator: BulkSelectionEvents.SELECT_ALL_ACROSS_PAGES, - label: BulkSelectionOptionsLabels[BulkSelectionEvents.SELECT_ALL_ACROSS_PAGES], - isSelected: isChecked && checkboxValue === CHECKBOX_VALUE.BULK_CHECKED, - icon: ICCheckAll, - }, - ] - : []), - ...(areOptionsSelected - ? [ - { - locator: BulkSelectionEvents.CLEAR_ALL_SELECTIONS, - label: BulkSelectionOptionsLabels[BulkSelectionEvents.CLEAR_ALL_SELECTIONS], - isSelected: false, - icon: ICClose, - iconClass: 'icon-use-fill-n6', - }, - ] - : []), - ] +const BulkSelection = forwardRef( + ( + { showPagination, disabled = false, showChevronDownIcon = true, selectAllIfNotPaginated = false }, + forwardedRef, + ) => { + const { handleBulkSelection, isChecked, checkboxValue, getSelectedIdentifiersCount } = useBulkSelection() + const areOptionsSelected = getSelectedIdentifiersCount() > 0 + const BulkSelectionItems: ActionMenuItemType[] = [ + { + id: BulkSelectionEvents.SELECT_ALL_ON_PAGE, + label: BulkSelectionOptionsLabels[BulkSelectionEvents.SELECT_ALL_ON_PAGE], + startIcon: { name: 'ic-check-square' }, + }, + ...(showPagination + ? [ + { + id: BulkSelectionEvents.SELECT_ALL_ACROSS_PAGES, + label: BulkSelectionOptionsLabels[BulkSelectionEvents.SELECT_ALL_ACROSS_PAGES], + startIcon: { name: 'ic-check-all' }, + } as ActionMenuItemType, + ] + : []), + ...(areOptionsSelected + ? [ + { + id: BulkSelectionEvents.CLEAR_ALL_SELECTIONS, + label: BulkSelectionOptionsLabels[BulkSelectionEvents.CLEAR_ALL_SELECTIONS], + startIcon: { name: 'ic-close-small' }, + type: 'negative', + } as ActionMenuItemType, + ] + : []), + ] - return ( - - - + const onActionMenuClick: ActionMenuProps['onClick'] = (item) => { + handleBulkSelection({ + action: item.id as BulkSelectionEvents, + }) + } + + const onSinglePageSelectAll = (e: MouseEvent) => { + e.stopPropagation() + + handleBulkSelection({ + action: areOptionsSelected + ? BulkSelectionEvents.CLEAR_ALL_SELECTIONS + : BulkSelectionEvents.SELECT_ALL_ON_PAGE, + }) + } - {showChevronDownIcon && } - + const shouldWrapActionMenu = !selectAllIfNotPaginated || showPagination - - {BulkSelectionItems.map((item) => ( - - key={item.locator} - locator={item.locator} - label={item.label} - isSelected={item.isSelected} - icon={item.icon} - handleBulkSelection={handleBulkSelection} - iconClass={item.iconClass} + const wrapWithActionMenu = (children: React.ReactElement) => ( + + {children} + + ) + + return ( + +
+ - ))} - - - ) -} + + {showChevronDownIcon && } +
+
+ ) + }, +) export default BulkSelection diff --git a/src/Shared/Components/BulkSelection/BulkSelectionDropdownItems.tsx b/src/Shared/Components/BulkSelection/BulkSelectionDropdownItems.tsx deleted file mode 100644 index a3b4fd9a3..000000000 --- a/src/Shared/Components/BulkSelection/BulkSelectionDropdownItems.tsx +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2024. Devtron Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { BulkSelectionDropdownItemsProps } from './types' - -const BulkSelectionDropdownItems = ({ - locator, - label, - isSelected, - handleBulkSelection, - icon: Icon, - iconClass, -}: BulkSelectionDropdownItemsProps) => { - const handleSelect = () => { - handleBulkSelection({ - action: locator, - }) - } - - return ( - - ) -} - -export default BulkSelectionDropdownItems diff --git a/src/Shared/Components/BulkSelection/types.tsx b/src/Shared/Components/BulkSelection/types.tsx index 7350a500a..7883e1a06 100644 --- a/src/Shared/Components/BulkSelection/types.tsx +++ b/src/Shared/Components/BulkSelection/types.tsx @@ -54,20 +54,12 @@ export interface BulkSelectionProps { */ showChevronDownIcon?: boolean disabled?: boolean + /** + * Will act as checkbox instead of opening up popup if list is not paginated + */ + selectAllIfNotPaginated?: boolean } -export interface BulkSelectionDropdownItemsType { - locator: BulkSelectionEvents - label: string - isSelected: boolean - icon: React.FunctionComponent> - iconClass?: string -} - -export interface BulkSelectionDropdownItemsProps - extends BulkSelectionDropdownItemsType, - Pick, 'handleBulkSelection'> {} - export enum SelectAllDialogStatus { OPEN = 'OPEN', CLOSED = 'CLOSED', diff --git a/src/Shared/Components/Button/constants.ts b/src/Shared/Components/Button/constants.ts index d858bd580..9507c735f 100644 --- a/src/Shared/Components/Button/constants.ts +++ b/src/Shared/Components/Button/constants.ts @@ -21,6 +21,7 @@ import { ButtonProps } from './types' export const BUTTON_SIZE_TO_CLASS_NAME_MAP: Record = { [ComponentSizeType.xxs_small_icon]: `${COMPONENT_SIZE_TYPE_TO_FONT_AND_BLOCK_PADDING_MAP[ComponentSizeType.xxs]} px-9 dc__gap-6 mw-48`, + [ComponentSizeType.xxxs]: `${COMPONENT_SIZE_TYPE_TO_FONT_AND_BLOCK_PADDING_MAP[ComponentSizeType.xxs]} px-9 dc__gap-6 mw-48`, [ComponentSizeType.xxs]: `${COMPONENT_SIZE_TYPE_TO_FONT_AND_BLOCK_PADDING_MAP[ComponentSizeType.xxs]} px-9 dc__gap-6 mw-48`, [ComponentSizeType.xs]: `${COMPONENT_SIZE_TYPE_TO_FONT_AND_BLOCK_PADDING_MAP[ComponentSizeType.xs]} px-9 dc__gap-6 mw-48`, [ComponentSizeType.small]: `${COMPONENT_SIZE_TYPE_TO_FONT_AND_BLOCK_PADDING_MAP[ComponentSizeType.small]} px-9 dc__gap-8 mw-48`, @@ -36,6 +37,7 @@ export const BUTTON_FONT_WEIGHT_TO_CLASS_NAME_MAP: Record = { [ComponentSizeType.xxs_small_icon]: 'p-4', + [ComponentSizeType.xxxs]: 'p-1', [ComponentSizeType.xxs]: 'p-1', [ComponentSizeType.xs]: 'p-3', [ComponentSizeType.small]: 'p-5', @@ -46,6 +48,7 @@ export const ICON_BUTTON_SIZE_TO_CLASS_NAME_MAP: Record = { [ComponentSizeType.xxs_small_icon]: 12, + [ComponentSizeType.xxxs]: 14, [ComponentSizeType.xxs]: 14, [ComponentSizeType.xs]: 14, [ComponentSizeType.small]: 16, @@ -56,6 +59,7 @@ export const BUTTON_SIZE_TO_ICON_SIZE_MAP: Record = { [ComponentSizeType.xxs_small_icon]: 12, + [ComponentSizeType.xxxs]: 16, [ComponentSizeType.xxs]: 16, [ComponentSizeType.xs]: 16, [ComponentSizeType.small]: 16, diff --git a/src/Shared/Components/Button/types.ts b/src/Shared/Components/Button/types.ts index 240bf10ff..a896ce213 100644 --- a/src/Shared/Components/Button/types.ts +++ b/src/Shared/Components/Button/types.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { AnchorHTMLAttributes, ButtonHTMLAttributes, ReactElement } from 'react' +import { AnchorHTMLAttributes, ButtonHTMLAttributes, ReactElement, Ref } from 'react' import { LinkProps } from 'react-router-dom' -import { TooltipProps } from '@Common/Tooltip/types' +import { TooltipProps } from '@Common/Tooltip' import { ComponentSizeType } from '@Shared/constants' // Using the same for BEM class elements @@ -48,6 +48,7 @@ export enum ButtonComponentType { export type ButtonProps = (ComponentType extends ButtonComponentType.link ? { + ref?: Ref component: ButtonComponentType.link /** * Props for the link component @@ -59,6 +60,7 @@ export type ButtonProps component: ButtonComponentType.anchor linkProps?: never buttonProps?: never @@ -74,6 +76,7 @@ export type ButtonProps['onClick'] } : { + ref?: Ref /** * Component to be rendered from the available options * @@ -146,7 +149,7 @@ export type ButtonProps(processedData) @@ -115,7 +115,10 @@ const DeploymentDetailSteps = ({ const processedDeploymentStatusDetailsData = isVirtualEnv.current && processVirtualEnvironmentDeploymentData ? processVirtualEnvironmentDeploymentData(deploymentStatusDetailRes) - : processDeploymentStatusDetailsData(deploymentStatusDetailRes) + : processDeploymentStatusDetailsData( + deploymentStatusDetailRes.deploymentAppType, + deploymentStatusDetailRes, + ) clearDeploymentStatusTimer() // If deployment status is in progress then fetch data in every 10 seconds @@ -171,6 +174,7 @@ const DeploymentDetailSteps = ({ isVirtualEnvironment={isVirtualEnv.current} appDetails={appDetails} rootClassName="p-20" + deploymentAppType={deploymentStatusDetailsBreakdownData.deploymentAppType} />
) diff --git a/src/Shared/Components/CICDHistory/DeploymentStatusBreakdown.tsx b/src/Shared/Components/CICDHistory/DeploymentStatusBreakdown.tsx index 5ba7e5b59..8790ae1ce 100644 --- a/src/Shared/Components/CICDHistory/DeploymentStatusBreakdown.tsx +++ b/src/Shared/Components/CICDHistory/DeploymentStatusBreakdown.tsx @@ -16,6 +16,7 @@ import { Fragment } from 'react' +import { DeploymentAppTypes } from '@Common/Types' import { TIMELINE_STATUS } from '@Shared/types' import { InfoBlock } from '../InfoBlock' @@ -29,6 +30,7 @@ const DeploymentStatusDetailBreakdown = ({ isVirtualEnvironment, appDetails, rootClassName = '', + deploymentAppType, }: DeploymentStatusDetailBreakdownType) => { const isHelmManifestPushed = deploymentStatusDetailsBreakdownData.deploymentStatusBreakdown[ @@ -58,8 +60,9 @@ const DeploymentStatusDetailBreakdown = ({ {( [ TIMELINE_STATUS.GIT_COMMIT, - TIMELINE_STATUS.ARGOCD_SYNC, - TIMELINE_STATUS.KUBECTL_APPLY, + ...(deploymentAppType === DeploymentAppTypes.ARGO + ? [TIMELINE_STATUS.ARGOCD_SYNC, TIMELINE_STATUS.KUBECTL_APPLY] + : []), ] as DeploymentStatusDetailRowType['type'][] ).map((timelineStatus) => ( diff --git a/src/Shared/Components/CICDHistory/TriggerOutput.tsx b/src/Shared/Components/CICDHistory/TriggerOutput.tsx index 128a24f9a..f3929c229 100644 --- a/src/Shared/Components/CICDHistory/TriggerOutput.tsx +++ b/src/Shared/Components/CICDHistory/TriggerOutput.tsx @@ -128,7 +128,8 @@ const HistoryLogs: React.FC = ({ deploymentAppType={deploymentAppType} userApprovalMetadata={userApprovalMetadata} isGitops={ - deploymentAppType === DeploymentAppTypes.GITOPS || + deploymentAppType === DeploymentAppTypes.ARGO || + deploymentAppType === DeploymentAppTypes.FLUX || deploymentAppType === DeploymentAppTypes.MANIFEST_DOWNLOAD || deploymentAppType === DeploymentAppTypes.MANIFEST_PUSH } diff --git a/src/Shared/Components/CICDHistory/types.tsx b/src/Shared/Components/CICDHistory/types.tsx index 82d789232..4c63f94e8 100644 --- a/src/Shared/Components/CICDHistory/types.tsx +++ b/src/Shared/Components/CICDHistory/types.tsx @@ -522,6 +522,7 @@ export interface DeploymentStatusDetailBreakdownType { */ appDetails: AppDetails | null rootClassName?: string + deploymentAppType: DeploymentAppTypes } export interface DeploymentStatusDetailRowType extends Pick { diff --git a/src/Shared/Components/CICDHistory/utils.tsx b/src/Shared/Components/CICDHistory/utils.tsx index c039d5e26..be3071c7f 100644 --- a/src/Shared/Components/CICDHistory/utils.tsx +++ b/src/Shared/Components/CICDHistory/utils.tsx @@ -19,10 +19,11 @@ import moment from 'moment' import { ReactComponent as ICCheck } from '@Icons/ic-check.svg' import { ReactComponent as Close } from '@Icons/ic-close.svg' import { ReactComponent as ICInProgress } from '@Icons/ic-in-progress.svg' -import { DATE_TIME_FORMATS } from '@Common/Constants' +import { DATE_TIME_FORMATS, URLS } from '@Common/Constants' import { DeploymentAppTypes } from '@Common/Types' import { ALL_RESOURCE_KIND_FILTER } from '@Shared/constants' import { isTimeStringAvailable } from '@Shared/Helpers' +import { K8S_EMPTY_GROUP } from '@Pages/ResourceBrowser' import { DeploymentStatusBreakdownItemType, Node, ResourceKindType, WorkflowStatusEnum } from '../../types' import { Icon } from '../Icon' @@ -233,7 +234,7 @@ export const getHistoryItemStatusIconFromWorkflowStages = ( } export const getWorkerPodBaseUrl = (clusterId: number = DEFAULT_CLUSTER_ID, podNamespace: string = DEFAULT_NAMESPACE) => - `/resource-browser/${clusterId}/${podNamespace}/pod/k8sEmptyGroup` + `${URLS.RESOURCE_BROWSER}/${clusterId}/${podNamespace}/pod/${K8S_EMPTY_GROUP}` export const getWorkflowNodeStatusTitle = (status: string) => { if (!status) { diff --git a/src/Shared/Components/CodeEditor/CodeEditor.tsx b/src/Shared/Components/CodeEditor/CodeEditor.tsx index b1cdcbcaa..c6f57f598 100644 --- a/src/Shared/Components/CodeEditor/CodeEditor.tsx +++ b/src/Shared/Components/CodeEditor/CodeEditor.tsx @@ -15,6 +15,7 @@ */ import { useEffect, useMemo, useRef, useState } from 'react' +import { autocompletion } from '@codemirror/autocomplete' import { foldGutter } from '@codemirror/language' import { lintGutter } from '@codemirror/lint' import { search } from '@codemirror/search' @@ -193,6 +194,7 @@ const CodeEditor = ({ drawSelection: true, highlightActiveLineGutter: true, tabSize, + autocompletion: false, } const handleOnChange: ReactCodeMirrorProps['onChange'] = (newValue) => { @@ -216,6 +218,7 @@ const CodeEditor = ({ // EXTENSIONS const getBaseExtensions = (): Extension[] => [ basicSetup(basicSetupOptions), + autocompletion({ closeOnBlur: false }), themeExtension, keymap.of([ ...vscodeKeymap.filter(({ key }) => key !== 'Mod-Alt-Enter' && key !== 'Mod-Enter' && key !== 'Mod-f'), diff --git a/src/Shared/Components/CodeEditor/codeEditor.scss b/src/Shared/Components/CodeEditor/codeEditor.scss index bd1894d7e..49907ae4a 100644 --- a/src/Shared/Components/CodeEditor/codeEditor.scss +++ b/src/Shared/Components/CodeEditor/codeEditor.scss @@ -181,7 +181,54 @@ } .cm-tooltip-autocomplete { - background-color: var(--bg-primary); + padding: 2px; + background-color: var(--bg-menu-primary); + border: 1px solid var(--border-primary-translucent); + + & > ul > li { + display: flex; + gap: 6px; + padding: 2px 4px; + color: var(--N900); + border-radius: 2px; + font-size: 13px; + line-height: 20px; + } + + & > ul li[aria-selected] { + color: var(--N900); + background-color: var(--bg-hover); + } + + .cm-completionDetail { + margin-left: 0; + } + + .cm-completionIcon.cm-completionIcon-property { + box-sizing: border-box; + height: 14px; + width: 14px; + padding-right: 0; + font-size: 100%; + vertical-align: middle; + opacity: 1; + + &::after { + content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='none' viewBox='0 0 24 24'%3E%3Cpath stroke='rgb(29, 39, 48)' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M12 22.015a.75.75 0 0 1-.368-.097l-8.25-4.64A.75.75 0 0 1 3 16.623V7.376a.75.75 0 0 1 .382-.654l8.25-4.64a.75.75 0 0 1 .736 0l8.25 4.64a.75.75 0 0 1 .382.654v9.248a.75.75 0 0 1-.382.654l-8.25 4.64a.75.75 0 0 1-.368.097Zm0 0L12.089 12m8.808-5.004L12.089 12m0 0L3.104 6.995' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E"); + } + } + } + + .cm-tooltip .cm-completionInfo { + padding: 3px 7px; + background-color: var(--bg-menu-primary); + color: var(--N700); + border: 1px solid var(--border-primary-translucent); + border-radius: 0; + font-size: 13px; + line-height: 1.5; + max-height: 240px; + overflow-y: auto; } .cm-diagnostic-error { @@ -277,6 +324,23 @@ } } +// THEME SPECIFIC STYLES +.component-specific-theme__dark { + .cm-editor { + .cm-tooltip-autocomplete .cm-completionIcon.cm-completionIcon-property::after { + content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='none' viewBox='0 0 24 24'%3E%3Cpath stroke='rgb(228, 229, 230)' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M12 22.015a.75.75 0 0 1-.368-.097l-8.25-4.64A.75.75 0 0 1 3 16.623V7.376a.75.75 0 0 1 .382-.654l8.25-4.64a.75.75 0 0 1 .736 0l8.25 4.64a.75.75 0 0 1 .382.654v9.248a.75.75 0 0 1-.382.654l-8.25 4.64a.75.75 0 0 1-.368.097Zm0 0L12.089 12m8.808-5.004L12.089 12m0 0L3.104 6.995' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E"); + } + + .cm-lint-marker-error { + content: url('data:image/svg+xml,'); + } + + .cm-lint-marker-warning { + content: url('data:image/svg+xml,'); + } + } +} + // MINIMAP STYLES .code-editor__mini-map { user-select: none; diff --git a/src/Shared/Components/DeploymentStatusBreakdown/constants.ts b/src/Shared/Components/DeploymentStatusBreakdown/constants.ts index 9ced31e1f..1439ba4e5 100644 --- a/src/Shared/Components/DeploymentStatusBreakdown/constants.ts +++ b/src/Shared/Components/DeploymentStatusBreakdown/constants.ts @@ -66,7 +66,7 @@ export const FAILED_DEPLOYMENT_STATUS: typeof PROGRESSING_DEPLOYMENT_STATUS = [ DEPLOYMENT_STATUS.UNABLE_TO_FETCH, ] -export const PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER: Readonly = [ +export const PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER_ARGO: Readonly = [ TIMELINE_STATUS.DEPLOYMENT_INITIATED, TIMELINE_STATUS.GIT_COMMIT, TIMELINE_STATUS.ARGOCD_SYNC, @@ -74,6 +74,12 @@ export const PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER: Readonly = [ + TIMELINE_STATUS.DEPLOYMENT_INITIATED, + TIMELINE_STATUS.GIT_COMMIT, + TIMELINE_STATUS.APP_HEALTH, +] + export const DEPLOYMENT_PHASES: Readonly = [ DeploymentPhaseType.PRE_SYNC, DeploymentPhaseType.SYNC, diff --git a/src/Shared/Components/DeploymentStatusBreakdown/utils.tsx b/src/Shared/Components/DeploymentStatusBreakdown/utils.tsx index 89a232fe0..7815dae4f 100644 --- a/src/Shared/Components/DeploymentStatusBreakdown/utils.tsx +++ b/src/Shared/Components/DeploymentStatusBreakdown/utils.tsx @@ -1,5 +1,6 @@ /* eslint-disable no-param-reassign */ import { findRight, handleUTCTime, logExceptionToSentry } from '@Common/Helper' +import { DeploymentAppTypes } from '@Common/Types' import { DEPLOYMENT_STATUS } from '@Shared/constants' import { DeploymentPhaseType, @@ -14,7 +15,8 @@ import { import { DEPLOYMENT_PHASES, FAILED_DEPLOYMENT_STATUS, - PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER, + PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER_ARGO, + PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER_FLUX, PROGRESSING_DEPLOYMENT_STATUS, SUCCESSFUL_DEPLOYMENT_STATUS, WFR_STATUS_DTO_TO_DEPLOYMENT_STATUS_MAP, @@ -22,6 +24,7 @@ import { import { ProcessUnableToFetchOrTimedOutStatusType } from './types' const getDefaultDeploymentStatusTimeline = ( + deploymentAppType: DeploymentAppTypes, data?: DeploymentStatusDetailsType, ): DeploymentStatusDetailsBreakdownDataType => { const commonProps: Pick< @@ -45,6 +48,7 @@ const getDefaultDeploymentStatusTimeline = ( return { deploymentStatus, + deploymentAppType, deploymentTriggerTime: data?.deploymentStartedOn || '', deploymentEndTime: data?.deploymentFinishedOn || '', triggeredBy: data?.triggeredBy || '', @@ -58,19 +62,26 @@ const getDefaultDeploymentStatusTimeline = ( ...commonProps, displayText: 'Push manifest to Git', }, - [TIMELINE_STATUS.ARGOCD_SYNC]: { - ...commonProps, - displayText: 'Synced with Argo CD', - }, - [TIMELINE_STATUS.KUBECTL_APPLY]: { - ...commonProps, - displayText: 'Apply manifest to Kubernetes', - resourceDetails: [], - subSteps: [], - }, + ...(deploymentAppType === DeploymentAppTypes.ARGO + ? { + [TIMELINE_STATUS.ARGOCD_SYNC]: { + ...commonProps, + displayText: 'Synced with Argo CD', + }, + [TIMELINE_STATUS.KUBECTL_APPLY]: { + ...commonProps, + displayText: 'Apply manifest to Kubernetes', + resourceDetails: [], + subSteps: [], + }, + } + : {}), [TIMELINE_STATUS.APP_HEALTH]: { ...commonProps, - displayText: 'Propagate manifest to Kubernetes resources', + displayText: + deploymentAppType === DeploymentAppTypes.FLUX + ? 'Synced with Flux CD' + : 'Propagate manifest to Kubernetes resources', }, }, errorBarConfig: deploymentErrorMessage @@ -219,13 +230,17 @@ const processKubeCTLApply = ( * This function processes the deployment status details data and returns a breakdown of the deployment status. * Cases it handles: * 1. If timelines are not present, say the case of helm deployment, we will parse the wfrStatus and put the status and basic deployment info [triggeredBy, deploymentStartedOn, deploymentFinishedOn] into the breakdown data and return it. - * 2. In case of gitops: + * 2. In case of argo_cd: * - There are five timelines in chronological order: * - Deployment Initiated * - Git commit * - ArgoCD Sync * - Kubectl Apply * - App Health + * In case of flux_cd + * - Deployment Initiated + * - Git commit + * - App Health * - Basic flow is we traverse the timelines in order, if find the last status for that specific timeline from response by traversing the timelines in reverse order. * - If element is found, we will parse the status and set the icon, display text, time, etc. for that timeline and set the next timeline to inprogress. * - If element is not found, we will parse on basis of factors like: @@ -233,12 +248,13 @@ const processKubeCTLApply = ( * - In similar fashion based on the deploymentStatus we will set the icon and display text for the timeline. */ export const processDeploymentStatusDetailsData = ( + deploymentAppType: DeploymentAppTypes, data?: DeploymentStatusDetailsType, ): DeploymentStatusDetailsBreakdownDataType => { if (data && !WFR_STATUS_DTO_TO_DEPLOYMENT_STATUS_MAP[data.wfrStatus]) { logExceptionToSentry(new Error(`New WFR status found: ${data?.wfrStatus}`)) } - const deploymentData = getDefaultDeploymentStatusTimeline(data) + const deploymentData = getDefaultDeploymentStatusTimeline(deploymentAppType, data) const { deploymentStatus } = deploymentData @@ -266,7 +282,13 @@ export const processDeploymentStatusDetailsData = ( timeline.status.includes(TIMELINE_STATUS.ARGOCD_SYNC), ) - PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER.forEach((timelineStatusType, index) => { + // Only keep 3 steps in case of flux + const timelineOrder = + deploymentAppType === DeploymentAppTypes.FLUX + ? PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER_FLUX + : PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER_ARGO + + timelineOrder.forEach((timelineStatusType, index) => { const element = findRight(data.timelines, getPredicate(timelineStatusType)) const timelineData = deploymentData.deploymentStatusBreakdown[timelineStatusType] @@ -289,7 +311,11 @@ export const processDeploymentStatusDetailsData = ( if (hasDeploymentFailed) { const hasCurrentTimelineFailed = timelineStatusType === TIMELINE_STATUS.APP_HEALTH && - deploymentData.deploymentStatusBreakdown.KUBECTL_APPLY.icon === 'success' + deploymentData.deploymentStatusBreakdown[ + deploymentAppType === DeploymentAppTypes.FLUX + ? TIMELINE_STATUS.GIT_COMMIT + : TIMELINE_STATUS.KUBECTL_APPLY + ].icon === 'success' timelineData.displaySubText = hasCurrentTimelineFailed ? 'Failed' : '' timelineData.icon = hasCurrentTimelineFailed ? 'failed' : 'unreachable' @@ -353,8 +379,8 @@ export const processDeploymentStatusDetailsData = ( } // Moving the next timeline to inprogress - if (timelineData.icon === 'success' && index !== PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER.length - 1) { - const nextTimelineStatus = PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER[index + 1] + if (timelineData.icon === 'success' && index !== timelineOrder.length - 1) { + const nextTimelineStatus = timelineOrder[index + 1] const nextTimeline = deploymentData.deploymentStatusBreakdown[nextTimelineStatus] if (deploymentData.errorBarConfig) { @@ -367,13 +393,13 @@ export const processDeploymentStatusDetailsData = ( }) // Traversing the timeline in reverse order so that if any status is there which is inprogress or success then we will mark all the previous steps as success - for (let i = PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER.length - 1; i >= 0; i -= 1) { - const timelineStatusType = PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER[i] + for (let i = timelineOrder.length - 1; i >= 0; i -= 1) { + const timelineStatusType = timelineOrder[i] const timelineData = deploymentData.deploymentStatusBreakdown[timelineStatusType] if (timelineData.icon === 'inprogress' || timelineData.icon === 'success') { for (let j = i - 1; j >= 0; j -= 1) { - const prevTimelineStatusType = PHYSICAL_ENV_DEPLOYMENT_TIMELINE_ORDER[j] + const prevTimelineStatusType = timelineOrder[j] const prevTimelineData = deploymentData.deploymentStatusBreakdown[prevTimelineStatusType] prevTimelineData.icon = 'success' prevTimelineData.displaySubText = '' diff --git a/src/Shared/Components/DynamicDataTable/types.ts b/src/Shared/Components/DynamicDataTable/types.ts index a7b8b3981..46c485479 100644 --- a/src/Shared/Components/DynamicDataTable/types.ts +++ b/src/Shared/Components/DynamicDataTable/types.ts @@ -18,7 +18,7 @@ import { DetailedHTMLProps, ReactElement, ReactNode } from 'react' import { ResizableTagTextAreaProps } from '@Common/CustomTagSelector' import { UseStateFiltersReturnType } from '@Common/Hooks' -import { TooltipProps } from '@Common/Tooltip/types' +import { TooltipProps } from '@Common/Tooltip' import { FileUploadProps } from '../FileUpload' import { SelectPickerOptionType, SelectPickerProps, SelectPickerTextAreaProps } from '../SelectPicker' diff --git a/src/Shared/Components/GenericModal/GenericModal.component.tsx b/src/Shared/Components/GenericModal/GenericModal.component.tsx new file mode 100644 index 000000000..f94980e33 --- /dev/null +++ b/src/Shared/Components/GenericModal/GenericModal.component.tsx @@ -0,0 +1,97 @@ +import { PropsWithChildren } from 'react' +import { AnimatePresence, motion } from 'framer-motion' + +import { noop, stopPropagation } from '@Common/Helper' +import { Backdrop, Button, ButtonStyleType, ButtonVariantType, Icon } from '@Shared/Components' +import { ComponentSizeType } from '@Shared/constants' + +import { MODAL_WIDTH_TO_CLASS_NAME_MAP } from './constants' +import { GenericModalProvider, useGenericModalContext } from './GenericModal.context' +import { GenericModalFooterProps, GenericModalHeaderProps, GenericModalProps } from './types' + +const GenericModalHeader = ({ title }: GenericModalHeaderProps) => { + const { name, onClose } = useGenericModalContext() + + return ( +
+

+ {title} +

+
+ ) +} + +const GenericModalFooter = ({ + leftSideElement, + buttonConfig, + children, +}: PropsWithChildren) => ( +
+ {children || ( + <> + {leftSideElement} + {!!buttonConfig && ( +
+ {buttonConfig?.secondaryButton && ( +
+ )} + + )} +
+) + +// eslint-disable-next-line react/jsx-no-useless-fragment +const GenericModalBody = ({ children }: PropsWithChildren<{}>) => <>{children} + +const GenericModal = ({ + name, + open, + width = 600, + onClose, + onEscape = noop, + closeOnBackdropClick = false, + children, +}: PropsWithChildren) => ( + + + {open && ( + + + {children} + + + )} + + +) + +GenericModal.Header = GenericModalHeader +GenericModal.Body = GenericModalBody +GenericModal.Footer = GenericModalFooter + +export default GenericModal diff --git a/src/Shared/Components/GenericModal/GenericModal.context.tsx b/src/Shared/Components/GenericModal/GenericModal.context.tsx new file mode 100644 index 000000000..1d2aca6b2 --- /dev/null +++ b/src/Shared/Components/GenericModal/GenericModal.context.tsx @@ -0,0 +1,26 @@ +import { createContext, PropsWithChildren, useContext, useMemo } from 'react' + +import { noop } from '@Common/Helper' + +import { GenericModalContextType } from './types' + +const GenericModalContext = createContext({ + name: 'dummy-generic-modal-name', + onClose: noop, +}) + +export const GenericModalProvider = ({ value, children }: PropsWithChildren<{ value: GenericModalContextType }>) => { + const contextValue = useMemo(() => value, [value]) + + return {children} +} + +export const useGenericModalContext = () => { + const context = useContext(GenericModalContext) + + if (!context) { + throw new Error(`Generic Modal components cannot be rendered outside the GenericModal`) + } + + return context +} diff --git a/src/Shared/Components/GenericModal/constants.ts b/src/Shared/Components/GenericModal/constants.ts new file mode 100644 index 000000000..f0bc00cd9 --- /dev/null +++ b/src/Shared/Components/GenericModal/constants.ts @@ -0,0 +1,7 @@ +import { GenericModalProps } from './types' + +export const MODAL_WIDTH_TO_CLASS_NAME_MAP: Record = { + 500: 'w-500', + 600: 'w-600', + 800: 'w-800', +} diff --git a/src/Shared/Components/GenericModal/index.ts b/src/Shared/Components/GenericModal/index.ts new file mode 100644 index 000000000..e9dc460ca --- /dev/null +++ b/src/Shared/Components/GenericModal/index.ts @@ -0,0 +1,2 @@ +export { default as GenericModal } from './GenericModal.component' +export * from './types' diff --git a/src/Shared/Components/GenericModal/types.ts b/src/Shared/Components/GenericModal/types.ts new file mode 100644 index 000000000..6e4d15402 --- /dev/null +++ b/src/Shared/Components/GenericModal/types.ts @@ -0,0 +1,40 @@ +import { BackdropProps } from '../Backdrop' +import { ButtonProps } from '../Button' + +export interface GenericModalProps extends Partial> { + /** Unique identifier for the modal */ + name: string + /** Controls whether the modal is visible or hidden */ + open: boolean + /** Callback function triggered when the modal is closed */ + onClose: () => void + /** + * Width of the modal (in pixels). + * @default 600 + */ + width?: 500 | 600 | 800 + /** + * Determines if the modal should close when the user clicks outside of it (on the backdrop). + * @default false + */ + closeOnBackdropClick?: boolean +} + +export interface GenericModalContextType extends Pick {} + +export interface GenericModalHeaderProps { + /** Title text displayed in the modal header */ + title: string +} + +export interface GenericModalFooterProps { + /** Configuration for the buttons displayed in the modal footer */ + buttonConfig?: { + /** Properties for the primary action button */ + primaryButton?: ButtonProps + /** Properties for the secondary action button */ + secondaryButton?: ButtonProps + } + /** Optional element to be displayed on the left side of the footer */ + leftSideElement?: React.ReactNode +} diff --git a/src/Shared/Components/GettingStartedCard/GettingStarted.tsx b/src/Shared/Components/GettingStartedCard/GettingStarted.tsx index 18604ca28..a0f554700 100644 --- a/src/Shared/Components/GettingStartedCard/GettingStarted.tsx +++ b/src/Shared/Components/GettingStartedCard/GettingStarted.tsx @@ -17,15 +17,13 @@ import { ComponentSizeType } from '@Shared/constants' import GettingToast from '../../../Assets/Img/lifebuoy.png' -import { LOGIN_COUNT, MAX_LOGIN_COUNT, POSTHOG_EVENT_ONBOARDING } from '../../../Common' +import { LOGIN_COUNT, MAX_LOGIN_COUNT, POSTHOG_EVENT_ONBOARDING, stopPropagation } from '../../../Common' import { Button, ButtonStyleType, ButtonVariantType } from '../Button' import { handlePostHogEventUpdate, setActionWithExpiry } from '../Header/utils' import updateLoginCount from './service' import { GettingStartedType } from './types' -import './gettingStarted.scss' - -const GettingStartedCard = ({ className, hideGettingStartedCard }: GettingStartedType) => { +const GettingStartedCard = ({ hideGettingStartedCard }: GettingStartedType) => { const onClickedOkay = async () => { setActionWithExpiry('clickedOkay', 1) hideGettingStartedCard() @@ -43,28 +41,25 @@ const GettingStartedCard = ({ className, hideGettingStartedCard }: GettingStarte } return ( -
-
-
- getting started icon -
Getting started
-
You can always access the Getting Started guide from here.
-
-
+
+ getting started icon +
Getting started
+
You can always access the Getting Started guide from here.
+
+
) diff --git a/src/Shared/Components/GettingStartedCard/gettingStarted.scss b/src/Shared/Components/GettingStartedCard/gettingStarted.scss deleted file mode 100644 index 51393ab98..000000000 --- a/src/Shared/Components/GettingStartedCard/gettingStarted.scss +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2024. Devtron Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -.getting-started-card { - position: fixed; - z-index: 6; - right: 20px; - top: 54px; -} - -.arrow-up { - width: 0; - height: 0; - border-left: 12px solid transparent; - border-right: 12px solid transparent; - border-bottom: 12px solid var(--bg-overlay-primary); - right: 64px; - position: fixed; - top: 42px; -} - -.getting_tippy__position { - position: fixed; -} diff --git a/src/Shared/Components/GettingStartedCard/types.ts b/src/Shared/Components/GettingStartedCard/types.ts index 7144c1ad5..6008f8a35 100644 --- a/src/Shared/Components/GettingStartedCard/types.ts +++ b/src/Shared/Components/GettingStartedCard/types.ts @@ -27,8 +27,5 @@ export interface LoginCountType extends ResponseType { } export interface GettingStartedType { - className: string - showHelpCard: boolean hideGettingStartedCard: (count?: string) => void - loginCount: number } diff --git a/src/Shared/Components/Header/HelpButton.tsx b/src/Shared/Components/Header/HelpButton.tsx index 24b5113bd..422eab6ee 100644 --- a/src/Shared/Components/Header/HelpButton.tsx +++ b/src/Shared/Components/Header/HelpButton.tsx @@ -1,14 +1,16 @@ -import { useRef, useState } from 'react' -import ReactGA from 'react-ga4' +import { useEffect, useRef, useState } from 'react' +import Tippy from '@tippyjs/react' import { SliderButton } from '@typeform/embed-react' -import { DOCUMENTATION_HOME_PAGE, URLS } from '@Common/Constants' +import { DOCUMENTATION_HOME_PAGE, MAX_LOGIN_COUNT, URLS } from '@Common/Constants' +import { handleAnalyticsEvent } from '@Shared/Analytics' import { ComponentSizeType } from '@Shared/constants' -import { SidePanelTab, useMainContext } from '@Shared/Providers' +import { AppThemeType, SidePanelTab, useMainContext, useTheme } from '@Shared/Providers' import { InstallationType } from '@Shared/types' import { ActionMenu } from '../ActionMenu' import { Button, ButtonComponentType, ButtonVariantType } from '../Button' +import GettingStartedCard from '../GettingStartedCard/GettingStarted' import { Icon } from '../Icon' import { HelpButtonActionMenuProps, HelpButtonProps, HelpMenuItems } from './types' import { getHelpActionMenuOptions } from './utils' @@ -36,33 +38,28 @@ const CheckForUpdates = ({
) -export const HelpButton = ({ serverInfo, fetchingServerInfo, onClick }: HelpButtonProps) => { +export const HelpButton = ({ serverInfo, fetchingServerInfo, onClick, hideGettingStartedCard }: HelpButtonProps) => { // STATES const [isActionMenuOpen, setIsActionMenuOpen] = useState(false) + const [expiryDate, setExpiryDate] = useState(0) // HOOKS - const { handleOpenLicenseInfoDialog, licenseData, setGettingStartedClicked, isEnterprise, setSidePanelConfig } = - useMainContext() + const { + handleOpenLicenseInfoDialog, + licenseData, + setGettingStartedClicked, + isEnterprise, + setSidePanelConfig, + loginCount, + showGettingStartedCard, + } = useMainContext() + const { appTheme } = useTheme() // REFS const typeFormSliderButtonRef = useRef(null) - // CONSTANTS - const FEEDBACK_FORM_ID = `UheGN3KJ#source=${window.location.hostname}` - // HANDLERS - const handleAnalytics: HelpButtonActionMenuProps['onClick'] = (item) => { - ReactGA.event({ - category: 'Help Nav', - action: `${item.label} Clicked`, - }) - } - const handleOpenAboutDevtron = () => { - ReactGA.event({ - category: 'help-nav__about-devtron', - action: 'ABOUT_DEVTRON_CLICKED', - }) handleOpenLicenseInfoDialog() } @@ -74,8 +71,7 @@ export const HelpButton = ({ serverInfo, fetchingServerInfo, onClick }: HelpButt setGettingStartedClicked(true) } - const handleViewDocumentationClick: HelpButtonActionMenuProps['onClick'] = (item, e) => { - handleAnalytics(item, e) + const handleViewDocumentationClick: HelpButtonActionMenuProps['onClick'] = (_, e) => { // Opens documentation in side panel when clicked normally, or in a new tab when clicked with the meta/command key if (!e.metaKey) { e.preventDefault() @@ -89,6 +85,10 @@ export const HelpButton = ({ serverInfo, fetchingServerInfo, onClick }: HelpButt } const handleActionMenuClick: HelpButtonActionMenuProps['onClick'] = (item, e) => { + handleAnalyticsEvent({ + category: 'Help Nav', + action: `HELP_${item.id.toUpperCase().replace('-', '_')}`, + }) switch (item.id) { case HelpMenuItems.GETTING_STARTED: handleGettingStartedClick() @@ -99,14 +99,6 @@ export const HelpButton = ({ serverInfo, fetchingServerInfo, onClick }: HelpButt case HelpMenuItems.GIVE_FEEDBACK: handleFeedbackClick() break - case HelpMenuItems.JOIN_DISCORD_COMMUNITY: - case HelpMenuItems.OPEN_NEW_TICKET: - case HelpMenuItems.VIEW_ALL_TICKETS: - case HelpMenuItems.CHAT_WITH_SUPPORT: - case HelpMenuItems.RAISE_ISSUE_REQUEST: - case HelpMenuItems.DEVTRON_GPT: - handleAnalytics(item, e) - break case HelpMenuItems.VIEW_DOCUMENTATION: handleViewDocumentationClick(item, e) break @@ -114,6 +106,23 @@ export const HelpButton = ({ serverInfo, fetchingServerInfo, onClick }: HelpButt } } + const getExpired = (): boolean => { + // Render Getting started tippy card if the time gets expired + const now = new Date().valueOf() + return now > expiryDate + } + + // USE-EFFECT + useEffect(() => { + setExpiryDate(+localStorage.getItem('clickedOkay')) + }, []) + + // CONSTANTS + const FEEDBACK_FORM_ID = `UheGN3KJ#source=${window.location.hostname}` + + const isGettingStartedVisible = + showGettingStartedCard && loginCount >= 0 && loginCount < MAX_LOGIN_COUNT && getExpired() + return ( <> @@ -137,16 +146,28 @@ export const HelpButton = ({ serverInfo, fetchingServerInfo, onClick }: HelpButt } : {})} > - + + {isEnterprise && ( { - const { - loginCount, - setLoginCount, - showGettingStartedCard, - setShowGettingStartedCard, - setSidePanelConfig, - sidePanelConfig, - } = useMainContext() + const { setLoginCount, setShowGettingStartedCard, setSidePanelConfig, sidePanelConfig } = useMainContext() const { showSwitchThemeLocationTippy, handleShowSwitchThemeLocationTippyChange } = useTheme() const { isTippyCustomized, tippyRedirectLink, TippyIcon, tippyMessage, onClickTippyButton, additionalContent } = @@ -69,7 +57,6 @@ const PageHeader = ({ fetchingServerInfo: false, }, ) - const [expiryDate, setExpiryDate] = useState(0) const getCurrentServerInfo = async () => { try { @@ -88,10 +75,6 @@ const PageHeader = ({ } } - useEffect(() => { - setExpiryDate(+localStorage.getItem('clickedOkay')) - }, []) - const hideGettingStartedCard = (count?: string) => { setShowGettingStartedCard(false) if (count) { @@ -119,7 +102,7 @@ const PageHeader = ({ setActionWithExpiry('clickedOkay', 1) hideGettingStartedCard() await handlePostHogEventUpdate(POSTHOG_EVENT_ONBOARDING.HELP) - ReactGA.event({ + handleAnalyticsEvent({ category: 'Main Navigation', action: `Help Clicked`, }) @@ -133,7 +116,7 @@ const PageHeader = ({ ) const onAskButtonClick = () => { - ReactGA.event({ + handleAnalyticsEvent({ category: 'AI', action: `HELP_ASK_DEVTRON_AI`, }) @@ -158,6 +141,7 @@ const PageHeader = ({ serverInfo={currentServerInfo.serverInfo} fetchingServerInfo={currentServerInfo.fetchingServerInfo} onClick={handleHelpButtonClick} + hideGettingStartedCard={hideGettingStartedCard} /> {!window._env_.K8S_CLIENT && ( ) - const getExpired = (): boolean => { - // Render Getting started tippy card if the time gets expired - const now = new Date().valueOf() - return now > expiryDate - } - - const renderBetaTag = (): JSX.Element => ( - Beta - ) - const renderIframeButton = () => return ( @@ -204,16 +178,6 @@ const PageHeader = ({ >

- {showCloseButton && ( - - )} {headerName} @@ -257,7 +221,6 @@ const PageHeader = ({ ))} - {markAsBeta && renderBetaTag()}
{showTabs && (
@@ -268,18 +231,6 @@ const PageHeader = ({ )}

{showTabs && renderHeaderTabs()} - {!window._env_.K8S_CLIENT && - showGettingStartedCard && - loginCount >= 0 && - loginCount < MAX_LOGIN_COUNT && - getExpired() && ( - - )} {!showTabs && (
{typeof renderActionButtons === 'function' && renderActionButtons()} diff --git a/src/Shared/Components/Header/types.ts b/src/Shared/Components/Header/types.ts index 23fca5bbd..5a6563a10 100644 --- a/src/Shared/Components/Header/types.ts +++ b/src/Shared/Components/Header/types.ts @@ -28,9 +28,6 @@ export interface PageHeaderType { isBreadcrumbs?: boolean breadCrumbs?: () => JSX.Element renderActionButtons?: () => JSX.Element - showCloseButton?: boolean - onClose?: () => void - markAsBeta?: boolean tippyProps?: Pick, 'additionalContent'> & { isTippyCustomized?: boolean tippyRedirectLink?: keyof typeof DOCUMENTATION @@ -55,6 +52,7 @@ export interface HelpButtonProps { serverInfo: ServerInfo fetchingServerInfo: boolean onClick: () => void + hideGettingStartedCard: () => void } export enum HelpMenuItems { diff --git a/src/Shared/Components/Icon/Icon.tsx b/src/Shared/Components/Icon/Icon.tsx index 56cd6901e..1d29db585 100644 --- a/src/Shared/Components/Icon/Icon.tsx +++ b/src/Shared/Components/Icon/Icon.tsx @@ -22,6 +22,7 @@ import { ReactComponent as ICBitbucket } from '@IconsV2/ic-bitbucket.svg' import { ReactComponent as ICBookOpen } from '@IconsV2/ic-book-open.svg' import { ReactComponent as ICBrain } from '@IconsV2/ic-brain.svg' import { ReactComponent as ICBrowser } from '@IconsV2/ic-browser.svg' +import { ReactComponent as ICBug } from '@IconsV2/ic-bug.svg' import { ReactComponent as ICBuildColor } from '@IconsV2/ic-build-color.svg' import { ReactComponent as ICCalendar } from '@IconsV2/ic-calendar.svg' import { ReactComponent as ICCancelled } from '@IconsV2/ic-cancelled.svg' @@ -33,10 +34,12 @@ import { ReactComponent as ICCd } from '@IconsV2/ic-cd.svg' import { ReactComponent as ICChatCircleDots } from '@IconsV2/ic-chat-circle-dots.svg' import { ReactComponent as ICChatCircleOnline } from '@IconsV2/ic-chat-circle-online.svg' import { ReactComponent as ICCheck } from '@IconsV2/ic-check.svg' +import { ReactComponent as ICCheckAll } from '@IconsV2/ic-check-all.svg' +import { ReactComponent as ICCheckSquare } from '@IconsV2/ic-check-square.svg' import { ReactComponent as ICChecks } from '@IconsV2/ic-checks.svg' import { ReactComponent as ICCiLinked } from '@IconsV2/ic-ci-linked.svg' -import { ReactComponent as ICCiWebhook } from '@IconsV2/ic-ci-webhook.svg' import { ReactComponent as ICCircleLoader } from '@IconsV2/ic-circle-loader.svg' +import { ReactComponent as ICCleanBrush } from '@IconsV2/ic-clean-brush.svg' import { ReactComponent as ICClock } from '@IconsV2/ic-clock.svg' import { ReactComponent as ICCloseLarge } from '@IconsV2/ic-close-large.svg' import { ReactComponent as ICCloseSmall } from '@IconsV2/ic-close-small.svg' @@ -45,6 +48,7 @@ import { ReactComponent as ICCluster } from '@IconsV2/ic-cluster.svg' import { ReactComponent as ICClusterIsolated } from '@IconsV2/ic-cluster-isolated.svg' import { ReactComponent as ICCode } from '@IconsV2/ic-code.svg' import { ReactComponent as ICContainer } from '@IconsV2/ic-container.svg' +import { ReactComponent as ICContainerRegistry } from '@IconsV2/ic-container-registry.svg' import { ReactComponent as ICCookr } from '@IconsV2/ic-cookr.svg' import { ReactComponent as ICCopy } from '@IconsV2/ic-copy.svg' import { ReactComponent as ICCpu } from '@IconsV2/ic-cpu.svg' @@ -54,6 +58,8 @@ import { ReactComponent as ICDelete } from '@IconsV2/ic-delete.svg' import { ReactComponent as ICDeleteDots } from '@IconsV2/ic-delete-dots.svg' import { ReactComponent as ICDeleteLightning } from '@IconsV2/ic-delete-lightning.svg' import { ReactComponent as ICDelhivery } from '@IconsV2/ic-delhivery.svg' +import { ReactComponent as ICDeployColor } from '@IconsV2/ic-deploy-color.svg' +import { ReactComponent as ICDeploySync } from '@IconsV2/ic-deploy-sync.svg' import { ReactComponent as ICDevtron } from '@IconsV2/ic-devtron.svg' import { ReactComponent as ICDevtronAi } from '@IconsV2/ic-devtron-ai.svg' import { ReactComponent as ICDevtronApp } from '@IconsV2/ic-devtron-app.svg' @@ -62,6 +68,7 @@ import { ReactComponent as ICDevtronJob } from '@IconsV2/ic-devtron-job.svg' import { ReactComponent as ICDisconnect } from '@IconsV2/ic-disconnect.svg' import { ReactComponent as ICDiscordFill } from '@IconsV2/ic-discord-fill.svg' import { ReactComponent as ICDockerhub } from '@IconsV2/ic-dockerhub.svg' +import { ReactComponent as ICDownload } from '@IconsV2/ic-download.svg' import { ReactComponent as ICEcr } from '@IconsV2/ic-ecr.svg' import { ReactComponent as ICEdit } from '@IconsV2/ic-edit.svg' import { ReactComponent as ICEmail } from '@IconsV2/ic-email.svg' @@ -76,6 +83,7 @@ import { ReactComponent as ICExpandSm } from '@IconsV2/ic-expand-sm.svg' import { ReactComponent as ICFailure } from '@IconsV2/ic-failure.svg' import { ReactComponent as ICFastForward } from '@IconsV2/ic-fast-forward.svg' import { ReactComponent as ICFile } from '@IconsV2/ic-file.svg' +import { ReactComponent as ICFileCode } from '@IconsV2/ic-file-code.svg' import { ReactComponent as ICFileEdit } from '@IconsV2/ic-file-edit.svg' import { ReactComponent as ICFileKey } from '@IconsV2/ic-file-key.svg' import { ReactComponent as ICFiles } from '@IconsV2/ic-files.svg' @@ -84,10 +92,12 @@ import { ReactComponent as ICFilterApplied } from '@IconsV2/ic-filter-applied.sv import { ReactComponent as ICFlask } from '@IconsV2/ic-flask.svg' import { ReactComponent as ICFolderColor } from '@IconsV2/ic-folder-color.svg' import { ReactComponent as ICFolderUser } from '@IconsV2/ic-folder-user.svg' +import { ReactComponent as ICGavel } from '@IconsV2/ic-gavel.svg' import { ReactComponent as ICGear } from '@IconsV2/ic-gear.svg' import { ReactComponent as ICGift } from '@IconsV2/ic-gift.svg' import { ReactComponent as ICGiftGradient } from '@IconsV2/ic-gift-gradient.svg' import { ReactComponent as ICGit } from '@IconsV2/ic-git.svg' +import { ReactComponent as ICGitBranch } from '@IconsV2/ic-git-branch.svg' import { ReactComponent as ICGithub } from '@IconsV2/ic-github.svg' import { ReactComponent as ICGitlab } from '@IconsV2/ic-gitlab.svg' import { ReactComponent as ICGoogle } from '@IconsV2/ic-google.svg' @@ -106,6 +116,7 @@ import { ReactComponent as ICHibernate } from '@IconsV2/ic-hibernate.svg' import { ReactComponent as ICHibernateCircle } from '@IconsV2/ic-hibernate-circle.svg' import { ReactComponent as ICInProgress } from '@IconsV2/ic-in-progress.svg' import { ReactComponent as ICInfoFilled } from '@IconsV2/ic-info-filled.svg' +import { ReactComponent as ICInfoFilledColor } from '@IconsV2/ic-info-filled-color.svg' import { ReactComponent as ICInfoOutline } from '@IconsV2/ic-info-outline.svg' import { ReactComponent as ICInstall } from '@IconsV2/ic-install.svg' import { ReactComponent as ICJobColor } from '@IconsV2/ic-job-color.svg' @@ -119,8 +130,10 @@ import { ReactComponent as ICLdap } from '@IconsV2/ic-ldap.svg' import { ReactComponent as ICLego } from '@IconsV2/ic-lego.svg' import { ReactComponent as ICLightning } from '@IconsV2/ic-lightning.svg' import { ReactComponent as ICLightningFill } from '@IconsV2/ic-lightning-fill.svg' +import { ReactComponent as ICLinkedBuildColor } from '@IconsV2/ic-linked-build-color.svg' import { ReactComponent as ICLivspace } from '@IconsV2/ic-livspace.svg' import { ReactComponent as ICLogout } from '@IconsV2/ic-logout.svg' +import { ReactComponent as ICLogs } from '@IconsV2/ic-logs.svg' import { ReactComponent as ICMagnifyingGlass } from '@IconsV2/ic-magnifying-glass.svg' import { ReactComponent as ICMediumDelete } from '@IconsV2/ic-medium-delete.svg' import { ReactComponent as ICMediumPaintbucket } from '@IconsV2/ic-medium-paintbucket.svg' @@ -145,6 +158,7 @@ import { ReactComponent as ICOutOfSync } from '@IconsV2/ic-out-of-sync.svg' import { ReactComponent as ICPaperPlane } from '@IconsV2/ic-paper-plane.svg' import { ReactComponent as ICPaperPlaneColor } from '@IconsV2/ic-paper-plane-color.svg' import { ReactComponent as ICPath } from '@IconsV2/ic-path.svg' +import { ReactComponent as ICPauseCircle } from '@IconsV2/ic-pause-circle.svg' import { ReactComponent as ICPencil } from '@IconsV2/ic-pencil.svg' import { ReactComponent as ICPlayOutline } from '@IconsV2/ic-play-outline.svg' import { ReactComponent as ICQuay } from '@IconsV2/ic-quay.svg' @@ -160,6 +174,7 @@ import { ReactComponent as ICSortDescending } from '@IconsV2/ic-sort-descending. import { ReactComponent as ICSortable } from '@IconsV2/ic-sortable.svg' import { ReactComponent as ICSparkleAiColor } from '@IconsV2/ic-sparkle-ai-color.svg' import { ReactComponent as ICSparkleColor } from '@IconsV2/ic-sparkle-color.svg' +import { ReactComponent as ICSpeedometer } from '@IconsV2/ic-speedometer.svg' import { ReactComponent as ICSpinny } from '@IconsV2/ic-spinny.svg' import { ReactComponent as ICSprayCan } from '@IconsV2/ic-spray-can.svg' import { ReactComponent as ICStack } from '@IconsV2/ic-stack.svg' @@ -186,6 +201,7 @@ import { ReactComponent as ICTimeoutDash } from '@IconsV2/ic-timeout-dash.svg' import { ReactComponent as ICTimer } from '@IconsV2/ic-timer.svg' import { ReactComponent as ICTrafficSignal } from '@IconsV2/ic-traffic-signal.svg' import { ReactComponent as ICTravclan } from '@IconsV2/ic-travclan.svg' +import { ReactComponent as ICTwoCubes } from '@IconsV2/ic-two-cubes.svg' import { ReactComponent as ICUbuntu } from '@IconsV2/ic-ubuntu.svg' import { ReactComponent as ICUnknown } from '@IconsV2/ic-unknown.svg' import { ReactComponent as ICUserCircle } from '@IconsV2/ic-user-circle.svg' @@ -193,6 +209,7 @@ import { ReactComponent as ICUserKey } from '@IconsV2/ic-user-key.svg' import { ReactComponent as ICUsers } from '@IconsV2/ic-users.svg' import { ReactComponent as ICViewVariableToggle } from '@IconsV2/ic-view-variable-toggle.svg' import { ReactComponent as ICWarning } from '@IconsV2/ic-warning.svg' +import { ReactComponent as ICWebhook } from '@IconsV2/ic-webhook.svg' import { ReactComponent as ICWifiSlash } from '@IconsV2/ic-wifi-slash.svg' import { ReactComponent as ICWorldGlobe } from '@IconsV2/ic-world-globe.svg' @@ -223,6 +240,7 @@ export const iconMap = { 'ic-book-open': ICBookOpen, 'ic-brain': ICBrain, 'ic-browser': ICBrowser, + 'ic-bug': ICBug, 'ic-build-color': ICBuildColor, 'ic-calendar': ICCalendar, 'ic-cancelled': ICCancelled, @@ -233,11 +251,13 @@ export const iconMap = { 'ic-cd': ICCd, 'ic-chat-circle-dots': ICChatCircleDots, 'ic-chat-circle-online': ICChatCircleOnline, + 'ic-check-all': ICCheckAll, + 'ic-check-square': ICCheckSquare, 'ic-check': ICCheck, 'ic-checks': ICChecks, 'ic-ci-linked': ICCiLinked, - 'ic-ci-webhook': ICCiWebhook, 'ic-circle-loader': ICCircleLoader, + 'ic-clean-brush': ICCleanBrush, 'ic-clock': ICClock, 'ic-close-large': ICCloseLarge, 'ic-close-small': ICCloseSmall, @@ -245,6 +265,7 @@ export const iconMap = { 'ic-cluster-isolated': ICClusterIsolated, 'ic-cluster': ICCluster, 'ic-code': ICCode, + 'ic-container-registry': ICContainerRegistry, 'ic-container': ICContainer, 'ic-cookr': ICCookr, 'ic-copy': ICCopy, @@ -255,6 +276,8 @@ export const iconMap = { 'ic-delete-lightning': ICDeleteLightning, 'ic-delete': ICDelete, 'ic-delhivery': ICDelhivery, + 'ic-deploy-color': ICDeployColor, + 'ic-deploy-sync': ICDeploySync, 'ic-devtron-ai': ICDevtronAi, 'ic-devtron-app': ICDevtronApp, 'ic-devtron-header-logo': ICDevtronHeaderLogo, @@ -263,6 +286,7 @@ export const iconMap = { 'ic-disconnect': ICDisconnect, 'ic-discord-fill': ICDiscordFill, 'ic-dockerhub': ICDockerhub, + 'ic-download': ICDownload, 'ic-ecr': ICEcr, 'ic-edit': ICEdit, 'ic-email': ICEmail, @@ -276,6 +300,7 @@ export const iconMap = { 'ic-expand-sm': ICExpandSm, 'ic-failure': ICFailure, 'ic-fast-forward': ICFastForward, + 'ic-file-code': ICFileCode, 'ic-file-edit': ICFileEdit, 'ic-file-key': ICFileKey, 'ic-file': ICFile, @@ -285,9 +310,11 @@ export const iconMap = { 'ic-flask': ICFlask, 'ic-folder-color': ICFolderColor, 'ic-folder-user': ICFolderUser, + 'ic-gavel': ICGavel, 'ic-gear': ICGear, 'ic-gift-gradient': ICGiftGradient, 'ic-gift': ICGift, + 'ic-git-branch': ICGitBranch, 'ic-git': ICGit, 'ic-github': ICGithub, 'ic-gitlab': ICGitlab, @@ -306,6 +333,7 @@ export const iconMap = { 'ic-hibernate-circle': ICHibernateCircle, 'ic-hibernate': ICHibernate, 'ic-in-progress': ICInProgress, + 'ic-info-filled-color': ICInfoFilledColor, 'ic-info-filled': ICInfoFilled, 'ic-info-outline': ICInfoOutline, 'ic-install': ICInstall, @@ -320,8 +348,10 @@ export const iconMap = { 'ic-lego': ICLego, 'ic-lightning-fill': ICLightningFill, 'ic-lightning': ICLightning, + 'ic-linked-build-color': ICLinkedBuildColor, 'ic-livspace': ICLivspace, 'ic-logout': ICLogout, + 'ic-logs': ICLogs, 'ic-magnifying-glass': ICMagnifyingGlass, 'ic-medium-delete': ICMediumDelete, 'ic-medium-paintbucket': ICMediumPaintbucket, @@ -346,6 +376,7 @@ export const iconMap = { 'ic-paper-plane-color': ICPaperPlaneColor, 'ic-paper-plane': ICPaperPlane, 'ic-path': ICPath, + 'ic-pause-circle': ICPauseCircle, 'ic-pencil': ICPencil, 'ic-play-outline': ICPlayOutline, 'ic-quay': ICQuay, @@ -361,6 +392,7 @@ export const iconMap = { 'ic-sortable': ICSortable, 'ic-sparkle-ai-color': ICSparkleAiColor, 'ic-sparkle-color': ICSparkleColor, + 'ic-speedometer': ICSpeedometer, 'ic-spinny': ICSpinny, 'ic-spray-can': ICSprayCan, 'ic-stack': ICStack, @@ -387,6 +419,7 @@ export const iconMap = { 'ic-timer': ICTimer, 'ic-traffic-signal': ICTrafficSignal, 'ic-travclan': ICTravclan, + 'ic-two-cubes': ICTwoCubes, 'ic-ubuntu': ICUbuntu, 'ic-unknown': ICUnknown, 'ic-user-circle': ICUserCircle, @@ -394,6 +427,7 @@ export const iconMap = { 'ic-users': ICUsers, 'ic-view-variable-toggle': ICViewVariableToggle, 'ic-warning': ICWarning, + 'ic-webhook': ICWebhook, 'ic-wifi-slash': ICWifiSlash, 'ic-world-globe': ICWorldGlobe, } diff --git a/src/Shared/Components/InfoBlock/InfoBlock.component.tsx b/src/Shared/Components/InfoBlock/InfoBlock.component.tsx index 0f5309242..194cd67a1 100644 --- a/src/Shared/Components/InfoBlock/InfoBlock.component.tsx +++ b/src/Shared/Components/InfoBlock/InfoBlock.component.tsx @@ -19,8 +19,9 @@ import { deriveBorderRadiusAndBorderClassFromConfig } from '@Shared/Helpers' import { Button } from '../Button' import { - CONTAINER_SIZE_TO_BUTTON_SIZE, CONTAINER_SIZE_TO_CLASS_MAP, + CONTAINER_SIZE_TO_ICON_BUTTON_SIZE, + CONTAINER_SIZE_TO_TEXT_BUTTON_SIZE, SIZE_TO_ICON_CLASS_MAP, VARIANT_TO_ICON_MAP, } from './constants' @@ -40,6 +41,9 @@ const InfoBlock = ({ const baseContainerClass = `${CONTAINER_SIZE_TO_CLASS_MAP[size]} ${VARIANT_TO_BG_MAP[variant]} ${VARIANT_TO_BORDER_MAP[variant]} ${deriveBorderRadiusAndBorderClassFromConfig({ borderConfig, borderRadiusConfig })} w-100 py-8 br-4 bw-1` const iconClass = `dc__no-shrink flex dc__fill-available-space ${SIZE_TO_ICON_CLASS_MAP[size]}` const icon = customIcon ?? VARIANT_TO_ICON_MAP[variant] + const buttonSize = buttonProps?.icon + ? CONTAINER_SIZE_TO_ICON_BUTTON_SIZE[size] + : CONTAINER_SIZE_TO_TEXT_BUTTON_SIZE[size] const renderIcon = () => {icon} @@ -99,7 +103,7 @@ const InfoBlock = ({ {renderContent()}
- {buttonProps &&
) } @@ -112,7 +116,7 @@ const InfoBlock = ({ {renderIcon()}
- {buttonProps &&
) } diff --git a/src/Shared/Components/InfoBlock/constants.tsx b/src/Shared/Components/InfoBlock/constants.tsx index 037ad7b23..26dace5b8 100644 --- a/src/Shared/Components/InfoBlock/constants.tsx +++ b/src/Shared/Components/InfoBlock/constants.tsx @@ -39,7 +39,12 @@ export const SIZE_TO_ICON_CLASS_MAP: Record = { [ComponentSizeType.medium]: 'icon-dim-18', } -export const CONTAINER_SIZE_TO_BUTTON_SIZE: Record = { +export const CONTAINER_SIZE_TO_TEXT_BUTTON_SIZE: Record = { [ComponentSizeType.large]: ComponentSizeType.medium, - [ComponentSizeType.medium]: ComponentSizeType.small, + [ComponentSizeType.medium]: ComponentSizeType.xs, +} + +export const CONTAINER_SIZE_TO_ICON_BUTTON_SIZE: Record = { + [ComponentSizeType.large]: ComponentSizeType.xxs, + [ComponentSizeType.medium]: ComponentSizeType.xxs, } diff --git a/src/Shared/Components/InvalidYAMLTippy/types.ts b/src/Shared/Components/InvalidYAMLTippy/types.ts index 9422c3a72..190bd89e7 100644 --- a/src/Shared/Components/InvalidYAMLTippy/types.ts +++ b/src/Shared/Components/InvalidYAMLTippy/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { TooltipProps } from '@Common/Tooltip/types' +import { TooltipProps } from '@Common/Tooltip' export interface InvalidYAMLTippyWrapperProps { parsingError: string diff --git a/src/Shared/Components/Popover/Popover.component.tsx b/src/Shared/Components/Popover/Popover.component.tsx index d332af886..f7e027e13 100644 --- a/src/Shared/Components/Popover/Popover.component.tsx +++ b/src/Shared/Components/Popover/Popover.component.tsx @@ -1,10 +1,9 @@ import { AnimatePresence, motion } from 'framer-motion' +import { Backdrop } from '../Backdrop' import { Button } from '../Button' import { PopoverProps } from './types' -import './popover.scss' - /** * Popover Component \ * This component serves as a base for creating popovers. It is not intended to be used directly. @@ -25,14 +24,14 @@ export const Popover = ({ {open && ( -
+
{children}
-
+
)} diff --git a/src/Shared/Components/Popover/popover.scss b/src/Shared/Components/Popover/popover.scss deleted file mode 100644 index 26caeb6e0..000000000 --- a/src/Shared/Components/Popover/popover.scss +++ /dev/null @@ -1,8 +0,0 @@ -.popover-overlay { - position: fixed; - top:0; - right:0; - bottom:0; - left:0; - z-index: var(--modal-index); -} diff --git a/src/Shared/Components/Popover/types.ts b/src/Shared/Components/Popover/types.ts index aff9c3406..b46f54c38 100644 --- a/src/Shared/Components/Popover/types.ts +++ b/src/Shared/Components/Popover/types.ts @@ -1,6 +1,7 @@ import { DetailedHTMLProps, KeyboardEvent, LegacyRef, MutableRefObject, ReactElement } from 'react' import { HTMLMotionProps } from 'framer-motion' +import { BackdropProps } from '../Backdrop' import { ButtonProps } from '../Button' export interface UsePopoverProps { @@ -77,9 +78,9 @@ export interface UsePopoverReturnType { } /** * Props to be spread onto the overlay element of the popover. - * These props include standard HTML attributes for a `div` element. + * These props include backdrop properties. */ - overlayProps: DetailedHTMLProps, HTMLDivElement> + overlayProps: Omit /** * Props to be spread onto the popover element itself. * Includes motion-related props for animations and a `ref` to the popover's `div` element. diff --git a/src/Shared/Components/Popover/usePopover.hook.ts b/src/Shared/Components/Popover/usePopover.hook.ts index e282d2d15..04db85cf5 100644 --- a/src/Shared/Components/Popover/usePopover.hook.ts +++ b/src/Shared/Components/Popover/usePopover.hook.ts @@ -1,4 +1,4 @@ -import { MouseEvent, useLayoutEffect, useRef, useState } from 'react' +import { useLayoutEffect, useRef, useState } from 'react' import { UsePopoverProps, UsePopoverReturnType } from './types' import { @@ -23,6 +23,7 @@ export const usePopover = ({ const [actualPosition, setActualPosition] = useState(position) const [actualAlignment, setActualAlignment] = useState(alignment) const [triggerBounds, setTriggerBounds] = useState(null) + const [isBackdropMounted, setIsBackdropMounted] = useState(false) // CONSTANTS const isAutoWidth = width === 'auto' @@ -38,9 +39,16 @@ export const usePopover = ({ onOpen?.(openState) } - const togglePopover = () => updateOpenState(!open) + const togglePopover = () => { + updateOpenState(!open) + } - const closePopover = () => updateOpenState(false) + const closePopover = () => { + updateOpenState(false) + const triggerButton = triggerRef.current?.querySelector('button') + triggerButton?.blur() + triggerRef.current?.blur() + } const handleTriggerKeyDown = (e: React.KeyboardEvent) => { if (!open && (e.key === 'Enter' || e.key === ' ')) { @@ -53,14 +61,12 @@ export const usePopover = ({ const handlePopoverKeyDown = (e: React.KeyboardEvent) => onPopoverKeyDown?.(e, open, closePopover) - const handleOverlayClick = (e: MouseEvent) => { - if (!popover.current?.contains(e.target as Node)) { - closePopover() - } + const handleOverlayClick = () => { + closePopover() } useLayoutEffect(() => { - if (!open || !triggerRef.current || !popover.current || !scrollableRef.current) { + if (!open || !isBackdropMounted || !triggerRef.current || !popover.current || !scrollableRef.current) { return } @@ -88,6 +94,9 @@ export const usePopover = ({ // update position on open updatePopoverPosition() + // focus on popover when it is opened, so that keyboard navigation works as expected + popover.current.focus() + // prevent scroll propagation unless scrollable const handleWheel = (e: WheelEvent) => { e.stopPropagation() @@ -110,30 +119,32 @@ export const usePopover = ({ scrollableRef.current.removeEventListener('wheel', handleWheel) window.removeEventListener('resize', updatePopoverPosition) } - }, [open, position, alignment]) + }, [open, position, alignment, isBackdropMounted]) return { open, triggerProps: { - role: 'button', ref: triggerRef, onClick: togglePopover, onKeyDown: handleTriggerKeyDown, 'aria-haspopup': 'listbox', 'aria-expanded': open, + className: 'flex', tabIndex: 0, bounds: triggerBounds ?? { left: 0, top: 0, height: 0, width: 0 }, }, overlayProps: { - role: 'dialog', + hasClearBackground: true, onClick: handleOverlayClick, - className: 'popover-overlay', + onEscape: closePopover, + onBackdropMount: setIsBackdropMounted, }, popoverProps: { id, ref: popover, role: 'listbox', - className: `dc__position-abs ${variant === 'menu' ? 'bg__menu--primary shadow__menu' : 'bg__overlay--primary shadow__overlay'} border__primary br-6 dc__overflow-hidden ${isAutoWidth ? 'dc_width-max-content dc__mxw-250' : ''}`, + tabIndex: 0, + className: `dc__position-abs dc__outline-none-imp ${variant === 'menu' ? 'bg__menu--primary shadow__menu' : 'bg__overlay--primary shadow__overlay'} border__primary br-6 dc__overflow-hidden ${isAutoWidth ? 'dc_width-max-content dc__mxw-250' : ''}`, onKeyDown: handlePopoverKeyDown, style: { width: !isAutoWidth ? `${width}px` : undefined, diff --git a/src/Shared/Components/Popover/utils.ts b/src/Shared/Components/Popover/utils.ts index c1d6f3928..3e0bda481 100644 --- a/src/Shared/Components/Popover/utils.ts +++ b/src/Shared/Components/Popover/utils.ts @@ -47,7 +47,7 @@ const getPopoverAnimationProps = (axisKey: 'x' | 'y', axisInitialValue: number, exit: { opacity: 0, [axisKey]: axisInitialValue }, transformTemplate: (isMiddleAlignment ? (params) => - axisKey === 'y' ? `translate(-50%, ${params[axisKey]})` : `translate(${params[axisKey]}, -50%,)` + axisKey === 'y' ? `translate(-50%, ${params[axisKey]})` : `translate(${params[axisKey]}, -50%)` : undefined) as HTMLMotionProps<'div'>['transformTemplate'], }) satisfies HTMLMotionProps<'div'> diff --git a/src/Shared/Components/RegistryIcon/RegistryIcon.tsx b/src/Shared/Components/RegistryIcon/RegistryIcon.tsx index bbc97b195..215ee1e79 100644 --- a/src/Shared/Components/RegistryIcon/RegistryIcon.tsx +++ b/src/Shared/Components/RegistryIcon/RegistryIcon.tsx @@ -31,9 +31,9 @@ const registryIconMap: Record = { [RegistryType.ECR]: 'ic-ecr', [RegistryType.ARTIFACT_REGISTRY]: 'ic-google-artifact-registry', [RegistryType.GCR]: 'ic-google-container-registry', - [RegistryType.OTHER]: 'ic-container', + [RegistryType.OTHER]: 'ic-container-registry', } export const RegistryIcon = ({ registryType, size = 20 }: RegistryIconProps) => ( - + ) diff --git a/src/Shared/Components/RegistryIcon/constants.tsx b/src/Shared/Components/RegistryIcon/constants.tsx index d464236c9..94f1c5d95 100644 --- a/src/Shared/Components/RegistryIcon/constants.tsx +++ b/src/Shared/Components/RegistryIcon/constants.tsx @@ -68,6 +68,30 @@ export const REGISTRY_TYPE_MAP: Record = { }, startIcon: , }, + gitlab: { + value: 'gitlab', + label: 'GitLab', + desiredFormat: '(desired format: username/repo-name)', + placeholderText: 'Eg. username/repo_name', + gettingStartedLink: 'https://docs.gitlab.com/ee/user/packages/container_registry/', + defaultRegistryURL: '', + registryURL: { + label: 'Registry URL', + defaultValue: 'registry.gitlab.com', + placeholder: 'Eg. registry.gitlab.com', + }, + id: { + label: 'Username', + defaultValue: '', + placeholder: '', + }, + password: { + label: 'Password/Token (Recommended: Token)', + defaultValue: '', + placeholder: '', + }, + startIcon: , + }, acr: { value: 'acr', label: 'Azure', diff --git a/src/Shared/Components/Security/SecurityModal/config/CodeScan.tsx b/src/Shared/Components/Security/SecurityModal/config/CodeScan.tsx index 8d89bdd68..fc911e5f0 100644 --- a/src/Shared/Components/Security/SecurityModal/config/CodeScan.tsx +++ b/src/Shared/Components/Security/SecurityModal/config/CodeScan.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ +import SeverityChip from '../../SeverityChip' import { getCVEUrlFromCVEName } from '../../utils' import { OpenDetailViewButton } from '../components' import IndexedTextDisplay from '../components/IndexedTextDisplay' @@ -29,6 +30,7 @@ import { OpenDetailViewButtonProps, ScanResultDTO, SecurityModalStateType, + SeveritiesDTO, StatusType, SUB_CATEGORIES, TablePropsType, @@ -77,11 +79,7 @@ export const getCodeScanVulnerabilities = (data: CodeScan['vulnerability'], hide cellContent: element.cveId, }, { - component: ( - - {element.severity} - - ), + component: , cellContent: element.severity, }, { @@ -137,11 +135,7 @@ export const getCodeScanLicense = (data: CodeScan['license']) => ({ cellContent: element.classification, }, { - component: ( - - {element.severity} - - ), + component: , cellContent: element.severity, }, { @@ -214,11 +208,7 @@ const getMisconfigurationsDetail = ( cellContent: '', }, { - component: ( - - {child.severity} - - ), + component: , cellContent: child.severity, }, { @@ -332,11 +322,7 @@ const getExposedSecretsDetail = ( cellContent: '', }, { - component: ( - - {child.severity} - - ), + component: , cellContent: child.severity, }, { diff --git a/src/Shared/Components/Security/SecurityModal/config/ImageScan.tsx b/src/Shared/Components/Security/SecurityModal/config/ImageScan.tsx index 393682510..1220a2c32 100644 --- a/src/Shared/Components/Security/SecurityModal/config/ImageScan.tsx +++ b/src/Shared/Components/Security/SecurityModal/config/ImageScan.tsx @@ -21,6 +21,7 @@ import { ReactComponent as ICSuccess } from '@Icons/ic-success.svg' import { Progressing } from '@Common/Progressing' import { DATE_TIME_FORMATS, ZERO_TIME_STRING } from '../../../../../Common/Constants' +import SeverityChip from '../../SeverityChip' import { OpenDetailViewButton } from '../components' import { SCAN_FAILED_EMPTY_STATE, SCAN_IN_PROGRESS_EMPTY_STATE, SEVERITY_DEFAULT_SORT_ORDER } from '../constants' import { @@ -34,6 +35,7 @@ import { OpenDetailViewButtonProps, ScanResultDTO, SecurityModalStateType, + SeveritiesDTO, StatusType, SUB_CATEGORIES, TablePropsType, @@ -232,11 +234,7 @@ const getLicenseDetailData = (element: ImageScanLicenseListType) => ({ cellContent: child.classification, }, { - component: ( - - {child.severity} - - ), + component: , cellContent: child.severity, }, { diff --git a/src/Shared/Components/Security/SeverityChip.tsx b/src/Shared/Components/Security/SeverityChip.tsx new file mode 100644 index 000000000..30e64b1ef --- /dev/null +++ b/src/Shared/Components/Security/SeverityChip.tsx @@ -0,0 +1,29 @@ +import { capitalizeFirstLetter } from '@Common/Helper' +import { ComponentSizeType } from '@Shared/constants' + +import { Badge, BadgeProps } from '../Badge' +import { SeveritiesDTO } from './SecurityModal' + +const SeverityChip = ({ severity, count }: { severity: SeveritiesDTO; count?: number }) => { + const label = count ? `${count} ${capitalizeFirstLetter(severity)}` : capitalizeFirstLetter(severity) + const commonProps: Pick = { + size: ComponentSizeType.xxs, + label, + } + switch (severity) { + case SeveritiesDTO.CRITICAL: + return + case SeveritiesDTO.HIGH: + return + case SeveritiesDTO.MEDIUM: + return + case SeveritiesDTO.LOW: + return + case SeveritiesDTO.UNKNOWN: + return + default: + return + } +} + +export default SeverityChip diff --git a/src/Shared/Components/SelectPicker/FilterSelectPicker.tsx b/src/Shared/Components/SelectPicker/FilterSelectPicker.tsx index db5ce8d1f..7210ef5d0 100644 --- a/src/Shared/Components/SelectPicker/FilterSelectPicker.tsx +++ b/src/Shared/Components/SelectPicker/FilterSelectPicker.tsx @@ -71,11 +71,6 @@ const FilterSelectPicker = ({ setSelectedOptions(structuredClone(selectedOptionsToUpdate) as SelectPickerOptionType[]) } - const handleMenuClose = () => { - closeMenu() - setSelectedOptions(structuredClone(appliedFilterOptions ?? [])) - } - const handleApplyClick: ButtonProps['onClick'] = (e) => { handleApplyFilter(selectedOptions) resetTriggerAutoClickTimestamp() @@ -113,7 +108,7 @@ const FilterSelectPicker = ({ isMulti menuIsOpen={isMenuOpen} onMenuOpen={openMenu} - onMenuClose={handleMenuClose} + onMenuClose={handleApplyClick as () => void} onChange={handleSelectOnChange} menuListFooterConfig={{ type: 'button', diff --git a/src/Shared/Components/SelectPicker/common.tsx b/src/Shared/Components/SelectPicker/common.tsx index 772593823..af8245887 100644 --- a/src/Shared/Components/SelectPicker/common.tsx +++ b/src/Shared/Components/SelectPicker/common.tsx @@ -36,8 +36,7 @@ import { Checkbox } from '@Common/Checkbox' import { ReactSelectInputAction } from '@Common/Constants' import { noop } from '@Common/Helper' import { Progressing } from '@Common/Progressing' -import { Tooltip } from '@Common/Tooltip' -import { TooltipProps } from '@Common/Tooltip/types' +import { Tooltip, TooltipProps } from '@Common/Tooltip' import { CHECKBOX_VALUE } from '@Common/Types' import { ComponentSizeType } from '@Shared/constants' import { isNullOrUndefined } from '@Shared/Helpers' diff --git a/src/Shared/Components/SelectPicker/type.ts b/src/Shared/Components/SelectPicker/type.ts index 2ef42c294..4052142d4 100644 --- a/src/Shared/Components/SelectPicker/type.ts +++ b/src/Shared/Components/SelectPicker/type.ts @@ -22,7 +22,7 @@ import { CreatableProps } from 'react-select/creatable' import { ResizableTagTextAreaProps } from '@Common/CustomTagSelector' import { ServerErrors } from '@Common/ServerError' -import { TooltipProps } from '@Common/Tooltip/types' +import { TooltipProps } from '@Common/Tooltip' import { OptionType } from '@Common/Types' import { ComponentSizeType } from '@Shared/constants' @@ -169,6 +169,7 @@ export type SelectPickerProps & Partial< Pick< diff --git a/src/Shared/Components/StatusComponent/AppStatus.tsx b/src/Shared/Components/StatusComponent/AppStatus.tsx index e20704efc..ee366dd84 100644 --- a/src/Shared/Components/StatusComponent/AppStatus.tsx +++ b/src/Shared/Components/StatusComponent/AppStatus.tsx @@ -45,7 +45,7 @@ export const AppStatus = ({ tooltipProps={{ alwaysShowTippyOnHover: true, placement: 'top', - content: 'To fetch app status for Helm based deployments open the app detail page', + content: 'To view app status open the app detail page', }} color="N600" /> diff --git a/src/Shared/Components/TabGroup/TabGroup.types.ts b/src/Shared/Components/TabGroup/TabGroup.types.ts index 619b9a064..9919ba196 100644 --- a/src/Shared/Components/TabGroup/TabGroup.types.ts +++ b/src/Shared/Components/TabGroup/TabGroup.types.ts @@ -16,7 +16,7 @@ import { LinkProps, NavLinkProps } from 'react-router-dom' -import { TooltipProps } from '@Common/Tooltip/types' +import { TooltipProps } from '@Common/Tooltip' import { ComponentSizeType } from '@Shared/constants' import { DataAttributes } from '@Shared/types' diff --git a/src/Shared/Components/Table/BulkSelectionActionWidget.tsx b/src/Shared/Components/Table/BulkSelectionActionWidget.tsx index 0e09b1f03..04b4e0b15 100644 --- a/src/Shared/Components/Table/BulkSelectionActionWidget.tsx +++ b/src/Shared/Components/Table/BulkSelectionActionWidget.tsx @@ -2,11 +2,10 @@ * Copyright (c) 2024. Devtron Inc. */ -import { useEffect } from 'react' +import { MouseEvent } from 'react' import { ReactComponent as ICClose } from '@Icons/ic-close.svg' import { DraggableButton, DraggablePositionVariant, DraggableWrapper } from '@Common/DraggableWrapper' -import { useRegisterShortcut } from '@Common/Hooks' import { ComponentSizeType } from '@Shared/constants' import { Button, ButtonComponentType, ButtonStyleType, ButtonVariantType } from '../Button' @@ -18,16 +17,15 @@ const BulkSelectionActionWidget = ({ handleClearBulkSelection, parentRef, BulkActionsComponent, + bulkActionsData, + setBulkActionState, }: BulkSelectionActionWidgetProps) => { - const { registerShortcut, unregisterShortcut } = useRegisterShortcut() - - useEffect(() => { - registerShortcut({ keys: ['Escape'], callback: handleClearBulkSelection }) - - return () => { - unregisterShortcut(['Escape']) - } - }, []) + const onActionClick = (event: MouseEvent) => { + const { + dataset: { key }, + } = event.currentTarget + setBulkActionState(key) + } return (
- +
- - - )} + {/* BODY */} +
+ {renderSourceTypeCards('Build Container Image', buildWorkflowCards)} + {renderSourceTypeCards('Receive Container Image', receiveWorkflowCards)} + {renderSourceTypeCards('Create Job', jobWorkflowCards)} +
- - + + ) } diff --git a/src/Shared/Components/WorkflowOptionsModal/constants.ts b/src/Shared/Components/WorkflowOptionsModal/constants.ts new file mode 100644 index 000000000..54d97d74c --- /dev/null +++ b/src/Shared/Components/WorkflowOptionsModal/constants.ts @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2024. Devtron Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { WorkflowNodeType } from '@Common/Types' +import { CIPipelineNodeType } from '@Shared/types' + +import { SourceTypeCardProps } from './types' + +export const SOURCE_TYPE_CARD_VARIANTS = { + BUILD: { + BUILD_AND_DEPLOY_FROM_SOURCE_CODE: { + title: 'Build & Deploy from Source Code', + subtitle: 'Build container image from a Git repo and deploy to an environment.', + dataTestId: 'build-and-deploy-from-source-code-button', + type: CIPipelineNodeType.CI_CD, + icons: [ + { name: 'ic-git-branch', color: 'N700' }, + { name: 'ic-build-color', color: null }, + { name: 'ic-deploy-color', color: null }, + ], + }, + BUILD_FROM_SOURCE_CODE: { + title: 'Build from Source Code', + subtitle: 'Build container image from a Git repo', + dataTestId: 'build-from-source-code-button', + type: CIPipelineNodeType.CI, + icons: [ + { name: 'ic-git-branch', color: 'N700' }, + { name: 'ic-build-color', color: null }, + ], + }, + JOB: { + title: 'Create a Job', + subtitle: 'Create and trigger a job. Such as trigger Jenkins build trigger', + dataTestId: 'job-ci-pipeline-button', + type: CIPipelineNodeType.JOB_CI, + icons: [{ name: 'ic-job-color', color: null }], + }, + }, + RECEIVE: { + EXTERNAL_SERVICE: { + title: 'Deploy Image from External Service', + subtitle: 'Receive images from an external service (eg. jenkins) & deploy to an environment.', + dataTestId: 'deploy-image-external-service-link', + type: WorkflowNodeType.WEBHOOK as const, + icons: [ + { name: 'ic-webhook', color: null }, + { name: 'ic-deploy-color', color: null }, + ], + }, + LINKED_PIPELINE: { + title: 'Linked Build Pipeline', + subtitle: 'Use image built by another build pipeline within Devtron.', + dataTestId: 'linked-build-pipeline-button', + type: CIPipelineNodeType.LINKED_CI, + icons: [{ name: 'ic-linked-build-color', color: null }], + }, + }, + JOB: { + JOB: { + title: 'Create a Job', + subtitle: 'Create and trigger a job. Such as trigger Jenkins build trigger', + dataTestId: 'job-ci-pipeline-button', + type: CIPipelineNodeType.JOB_CI, + icons: [{ name: 'ic-job-color', color: null }], + }, + }, +} satisfies Record< + string, + Record> +> + +export const NO_ENV_FOUND = 'No environment found. Please create a CD Pipeline first.' +export const REQUEST_IN_PROGRESS = 'Request in progress' + +export const TOAST_MESSAGES = { + SUCCESS_CHANGE_TO_WEBHOOK: 'Successfully changed CI to webhook', + WORKFLOW_NOT_AVAILABLE: 'Selected workflow not available', +} diff --git a/src/Shared/Components/WorkflowOptionsModal/constants.tsx b/src/Shared/Components/WorkflowOptionsModal/constants.tsx deleted file mode 100644 index 05d1be554..000000000 --- a/src/Shared/Components/WorkflowOptionsModal/constants.tsx +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2024. Devtron Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import ci from '@Icons/ic-source-build.svg' -import ciJobIcon from '@Icons/ic-source-job.svg' -import linkedPipeline from '@Icons/ic-source-linked-build.svg' -import webhook from '@Icons/ic-source-webhook.svg' -import { PipelineType } from '@Common/Types' -import { CIPipelineNodeType } from '@Shared/types' - -export const WORKFLOW_OPTIONS_MODAL = { - ACTION_TEXT: 'Select an image source for new workflow', - ACTION_NOTE: 'You can switch between image sources later', - CHANGE_CI_TEXT: 'Change image source', - CHANGE_CI_NOTE: 'Deploy to environments in the workflow from another image source', -} - -export const WORKFLOW_OPTIONS_MODAL_TYPES = { - DEFAULT: 'Build Container Image', - RECIEVE: 'Receive Container Image', - JOB: 'Create job pipeline', -} - -export const SOURCE_TYPE_CARD_VARIANTS = { - SOURCE_CODE: { - title: 'Build and Deploy from Source Code', - subtitle: 'Build container image from a Git repo and deploy to an environment.', - image: ci, - alt: 'CI', - dataTestId: 'build-deploy-from-source-code-button', - type: CIPipelineNodeType.CI, - }, - LINKED_PIPELINE: { - title: 'Linked Build Pipeline', - subtitle: 'Use image built by another build pipeline within Devtron.', - image: linkedPipeline, - alt: 'Linked-CI', - dataTestId: 'linked-build-pipeline-button', - type: CIPipelineNodeType.LINKED_CI, - }, - EXTERNAL_SERVICE: { - title: 'Deploy Image from External Service', - subtitle: 'Receive images from an external service (eg. jenkins) and deploy to an environment.', - image: webhook, - alt: 'External-CI', - dataTestId: 'deploy-image-external-service-link', - type: PipelineType.WEBHOOK, - }, - JOB: { - title: 'Create a Job', - subtitle: 'Create and trigger a job. Such as trigger Jenkins build trigger', - image: ciJobIcon, - alt: 'Job-CI', - dataTestId: 'job-ci-pipeline-button', - type: CIPipelineNodeType.JOB_CI, - }, -} - -export const NO_ENV_FOUND = 'No environment found. Please create a CD Pipeline first.' -export const CHANGE_SAME_CI = 'Cannot change to same source type' -export const REQUEST_IN_PROGRESS = 'Request in progress' - -export const TOAST_MESSAGES = { - SUCCESS_CHANGE_TO_WEBHOOK: 'Successfully changed CI to webhook', - WORKFLOW_NOT_AVAILABLE: 'Selected workflow not available', -} diff --git a/src/Shared/Components/WorkflowOptionsModal/index.tsx b/src/Shared/Components/WorkflowOptionsModal/index.ts similarity index 92% rename from src/Shared/Components/WorkflowOptionsModal/index.tsx rename to src/Shared/Components/WorkflowOptionsModal/index.ts index 468345e2a..23569fa26 100644 --- a/src/Shared/Components/WorkflowOptionsModal/index.tsx +++ b/src/Shared/Components/WorkflowOptionsModal/index.ts @@ -14,4 +14,5 @@ * limitations under the License. */ +export type { SourceTypeCardProps } from './types' export { default as WorkflowOptionsModal } from './WorkflowOptionsModal' diff --git a/src/Shared/Components/WorkflowOptionsModal/styles.scss b/src/Shared/Components/WorkflowOptionsModal/styles.scss new file mode 100644 index 000000000..02ad82b9c --- /dev/null +++ b/src/Shared/Components/WorkflowOptionsModal/styles.scss @@ -0,0 +1,30 @@ +.workflow-options-modal { + &__header { + background: linear-gradient(269deg, var(--B100, #{var(--B100)}) 0%, var(--bg-primary, #{var(--white)}) 99.9%); + } + + &__img { + top: 13px; + } + + &__cards-container { + grid-template-columns: 1fr 1fr 1fr; + } +} + +.source-type-card { + &__icons { + transition: + margin 0.2s, + padding 0.2s; + } + + &:hover { + box-shadow: var(--shadow-10); + + .source-type-card__icons { + margin: 0; + padding: 20px 16px; + } + } +} diff --git a/src/Shared/Components/WorkflowOptionsModal/types.tsx b/src/Shared/Components/WorkflowOptionsModal/types.ts similarity index 66% rename from src/Shared/Components/WorkflowOptionsModal/types.tsx rename to src/Shared/Components/WorkflowOptionsModal/types.ts index eb5ec2bff..f2d3d20ae 100644 --- a/src/Shared/Components/WorkflowOptionsModal/types.tsx +++ b/src/Shared/Components/WorkflowOptionsModal/types.ts @@ -14,26 +14,27 @@ * limitations under the License. */ +import { WorkflowNodeType } from '@Common/Types' import { ChangeCIPayloadType, CIPipelineNodeType, WorkflowType } from '@Shared/types' import { AppConfigProps } from '@Pages/index' -interface LinkedCDSourceVariant { +import { GenericModalProps } from '../GenericModal' +import { IconsProps } from '../Icon' + +export interface SourceTypeCardProps { title: string subtitle: string - image: string - alt: string dataTestId: string - type: string -} - -export interface SourceTypeCardProps extends LinkedCDSourceVariant { - handleCardAction: (e: React.MouseEvent | React.KeyboardEvent) => void + type: CIPipelineNodeType | WorkflowNodeType.WEBHOOK + disabled?: boolean disableInfo: string - isDisabled?: boolean + icons: Pick[] + onCardAction: (e: React.MouseEvent | React.KeyboardEvent) => void } -export interface WorkflowOptionsModalProps extends Required> { - handleCloseWorkflowOptionsModal: () => void +export interface WorkflowOptionsModalProps + extends Required>, + Pick { addCIPipeline: (type: CIPipelineNodeType, workflowId?: number | string) => void addWebhookCD: (workflowId?: number | string) => void addLinkedCD: (changeCIPayload?: ChangeCIPayloadType) => void @@ -43,6 +44,6 @@ export interface WorkflowOptionsModalProps extends Required void - linkedCDSourceVariant?: LinkedCDSourceVariant + linkedCDSourceVariant?: Pick isAppGroup?: boolean } diff --git a/src/Shared/Components/WorkflowOptionsModal/utils.ts b/src/Shared/Components/WorkflowOptionsModal/utils.ts new file mode 100644 index 000000000..40403fb4c --- /dev/null +++ b/src/Shared/Components/WorkflowOptionsModal/utils.ts @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2024. Devtron Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { PipelineType, WorkflowNodeType } from '@Common/Types' +import { ChangeCIPayloadType, CIPipelineNodeType, TriggerType } from '@Shared/types' + +import { SOURCE_TYPE_CARD_VARIANTS } from './constants' +import { SourceTypeCardProps, WorkflowOptionsModalProps } from './types' + +export const getSwitchToWebhookPayload = (changeCIPayload: ChangeCIPayloadType) => ({ + appId: changeCIPayload.appId, + pipelines: [ + { + // name and triggerType are useless to backend for this case + name: 'change-webhook-ci', + triggertype: TriggerType.Manual, + appWorkflowId: changeCIPayload.appWorkflowId, + environmentId: -1, + id: 0, + parentPipelineType: PipelineType.WEBHOOK, + switchFromCiPipelineId: changeCIPayload.switchFromCiPipelineId, + }, + ], +}) + +export const getCurrentPipelineType = ({ + workflows, + changeCIPayload, +}: Required>): SourceTypeCardProps['type'] => { + if (!workflows || !changeCIPayload) { + return null + } + + const currentWorkflow = workflows.find((workflow) => +workflow.id === changeCIPayload.appWorkflowId) + const currentCIPipeline = currentWorkflow.nodes.find((node) => node.type === WorkflowNodeType.CI) + const isWebhook = currentWorkflow.nodes.some((node) => node.type === WorkflowNodeType.WEBHOOK) + + if (isWebhook) { + return WorkflowNodeType.WEBHOOK + } + + if (currentCIPipeline) { + if (currentCIPipeline.isJobCI) { + return CIPipelineNodeType.JOB_CI + } + + if (currentCIPipeline.isLinkedCI) { + return CIPipelineNodeType.LINKED_CI + } + + if (currentCIPipeline.isExternalCI) { + return CIPipelineNodeType.EXTERNAL_CI + } + + if (currentCIPipeline.isLinkedCD) { + return CIPipelineNodeType.LINKED_CD + } + } + + return CIPipelineNodeType.CI +} + +export const getBuildWorkflowCardsConfig = ({ + currentPipelineType, + changeCIPayload, + isAppGroup, +}: { + currentPipelineType: CIPipelineNodeType | WorkflowNodeType.WEBHOOK +} & Required>) => + Object.values(SOURCE_TYPE_CARD_VARIANTS.BUILD) + .map>( + ({ type, ...restKeys }) => { + const hideCard = + currentPipelineType === type || + (type === CIPipelineNodeType.JOB_CI && !window._env_.ENABLE_CI_JOB) || + (type === CIPipelineNodeType.CI_CD && (isAppGroup || !!changeCIPayload)) + + return !hideCard + ? { + ...restKeys, + type, + disabled: type === CIPipelineNodeType.JOB_CI && isAppGroup, + } + : null + }, + ) + .filter(Boolean) + +export const getReceiveWorkflowCardsConfig = ({ + currentPipelineType, + linkedCDSourceVariant, + isAppGroup, +}: { + currentPipelineType: CIPipelineNodeType | WorkflowNodeType.WEBHOOK +} & Required>) => { + const config = Object.values(SOURCE_TYPE_CARD_VARIANTS.RECEIVE) + .map>( + ({ type, ...restKeys }) => { + const hideCard = currentPipelineType === type + + return !hideCard + ? { + ...restKeys, + type, + disabled: isAppGroup, + } + : null + }, + ) + .filter(Boolean) + + if (linkedCDSourceVariant && currentPipelineType !== CIPipelineNodeType.LINKED_CD) { + config.push(linkedCDSourceVariant) + } + + return config +} + +export const getJobWorkflowCardsConfig = ({ + currentPipelineType, + isAppGroup, +}: { + currentPipelineType: CIPipelineNodeType | WorkflowNodeType.WEBHOOK +} & Required>) => + Object.values(SOURCE_TYPE_CARD_VARIANTS.JOB) + .map>( + ({ type, ...restKeys }) => { + const hideCard = + currentPipelineType === type || (type === CIPipelineNodeType.JOB_CI && !window._env_.ENABLE_CI_JOB) + + return !hideCard + ? { + ...restKeys, + type, + disabled: type === CIPipelineNodeType.JOB_CI && isAppGroup, + } + : null + }, + ) + .filter(Boolean) diff --git a/src/Shared/Components/WorkflowOptionsModal/utils.tsx b/src/Shared/Components/WorkflowOptionsModal/utils.tsx deleted file mode 100644 index cab35981c..000000000 --- a/src/Shared/Components/WorkflowOptionsModal/utils.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2024. Devtron Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { PipelineType } from '@Common/Types' -import { ChangeCIPayloadType, TriggerType } from '@Shared/types' - -export const getSwitchToWebhookPayload = (changeCIPayload: ChangeCIPayloadType) => ({ - appId: changeCIPayload.appId, - pipelines: [ - { - // name and triggerType are useless to backend for this case - name: 'change-webhook-ci', - triggertype: TriggerType.Manual, - appWorkflowId: changeCIPayload.appWorkflowId, - environmentId: -1, - id: 0, - parentPipelineType: PipelineType.WEBHOOK, - switchFromCiPipelineId: changeCIPayload.switchFromCiPipelineId, - }, - ], -}) diff --git a/src/Shared/Components/index.ts b/src/Shared/Components/index.ts index 5900c486b..268c670b8 100644 --- a/src/Shared/Components/index.ts +++ b/src/Shared/Components/index.ts @@ -23,6 +23,7 @@ export * from './APIResponseHandler' export * from './AppStatusModal' export * from './ArtifactInfoModal' export * from './Backdrop' +export * from './Badge' export * from './BulkOperations' export * from './BulkSelection' export * from './Button' @@ -56,6 +57,7 @@ export * from './FlagImage' export * from './FloatingVariablesSuggestions' export * from './FramerComponents' export * from './GenericInfoCard' +export * from './GenericModal' export * from './GenericSectionErrorState' export * from './GitCommitInfoGeneric' export * from './GitProviderIcon' @@ -79,6 +81,7 @@ export * from './ModalSidebarPanel' export * from './NumbersCount' export * from './PhoneInput' export * from './Plugin' +export * from './Popover' export * from './ProgressBar' export { default as QRCode } from './QRCode' export * from './ReactSelect' diff --git a/src/Shared/Helpers.tsx b/src/Shared/Helpers.tsx index b11bccb57..bd157d487 100644 --- a/src/Shared/Helpers.tsx +++ b/src/Shared/Helpers.tsx @@ -61,6 +61,7 @@ import { GitTriggers, IntersectionChangeHandler, IntersectionOptions, + Node, Nodes, PreventOutsideFocusProps, TargetPlatformItemDTO, @@ -714,3 +715,22 @@ export const smoothScrollToTop = (scrollContainer: HTMLElement, targetPosition: return controls } + +export const getGroupVersionFromApiVersion = (apiVersion: string): Pick => { + if (!apiVersion || apiVersion === '/') { + return { group: '', version: '' } + } + + const parts = apiVersion.split('/') + + if (parts.length === 1) { + return { group: '', version: parts[0] } + } + + if (parts.length === 2) { + return { group: parts[0], version: parts[1] } + } + + // If the apiVersion has more than two parts, we consider the first part as group and the rest as version + return { group: parts[0], version: parts.slice(1).join('/') } +} diff --git a/src/Shared/Providers/MainContextProvider.tsx b/src/Shared/Providers/MainContextProvider/MainContextProvider.tsx similarity index 96% rename from src/Shared/Providers/MainContextProvider.tsx rename to src/Shared/Providers/MainContextProvider/MainContextProvider.tsx index b8f1238ab..e0ac48904 100644 --- a/src/Shared/Providers/MainContextProvider.tsx +++ b/src/Shared/Providers/MainContextProvider/MainContextProvider.tsx @@ -18,7 +18,6 @@ import { createContext, useContext } from 'react' import { MainContext, MainContextProviderProps } from './types' -// TODO: (Arun) - Move to separate folder const mainContext = createContext(null) export const useMainContext = () => { diff --git a/src/Shared/Providers/MainContextProvider/index.ts b/src/Shared/Providers/MainContextProvider/index.ts new file mode 100644 index 000000000..7bd1e1720 --- /dev/null +++ b/src/Shared/Providers/MainContextProvider/index.ts @@ -0,0 +1,3 @@ +export * from './MainContextProvider' +export type { MainContext, ReloadVersionConfigTypes, SidePanelConfig } from './types' +export { SidePanelTab } from './types' diff --git a/src/Shared/Providers/types.ts b/src/Shared/Providers/MainContextProvider/types.ts similarity index 92% rename from src/Shared/Providers/types.ts rename to src/Shared/Providers/MainContextProvider/types.ts index c1d1cd9c9..20687c703 100644 --- a/src/Shared/Providers/types.ts +++ b/src/Shared/Providers/MainContextProvider/types.ts @@ -16,9 +16,15 @@ import { Dispatch, MutableRefObject, ReactNode, SetStateAction } from 'react' -import { SERVER_MODE } from '../../Common' -import { ServerInfo } from '../Components/Header/types' -import { DevtronLicenseInfo, IntelligenceConfig, LicenseInfoDialogType, ToastManager } from '..' +import { SERVER_MODE } from '../../../Common' +import { + DevtronLicenseInfo, + EnvironmentDataValuesDTO, + IntelligenceConfig, + LicenseInfoDialogType, + ToastManager, +} from '../..' +import { ServerInfo } from '../../Components/Header/types' export interface ReloadVersionConfigTypes { bgUpdated: boolean @@ -48,6 +54,7 @@ type AIAgentContextType = { context: Record } +// Please make sure to make it optional if not required in gatekeeper type CommonMainContextProps = { setServerMode: (serverMode: SERVER_MODE) => void isHelpGettingStartedClicked: boolean @@ -90,7 +97,7 @@ type CommonMainContextProps = { setIntelligenceConfig: Dispatch> setAIAgentContext: (aiAgentContext: AIAgentContextType) => void setSidePanelConfig: Dispatch> -} +} & Pick export type MainContext = CommonMainContextProps & ( diff --git a/src/Shared/Providers/index.ts b/src/Shared/Providers/index.ts index 8ad4a382f..17f612fb7 100644 --- a/src/Shared/Providers/index.ts +++ b/src/Shared/Providers/index.ts @@ -17,6 +17,4 @@ export * from './ImageSelectionUtility' export * from './MainContextProvider' export * from './ThemeProvider' -export type { MainContext, ReloadVersionConfigTypes, SidePanelConfig } from './types' -export { SidePanelTab } from './types' export * from './UserEmailProvider' diff --git a/src/Shared/Services/types.ts b/src/Shared/Services/types.ts index 2d98e6c76..54ca9fc7c 100644 --- a/src/Shared/Services/types.ts +++ b/src/Shared/Services/types.ts @@ -60,4 +60,5 @@ export interface EnvironmentDataValuesDTO extends Pick = { + [ComponentSizeType.xxxs]: 'py-1 fs-12 lh-20', [ComponentSizeType.xxs_small_icon]: 'py-1 fs-12 lh-20', [ComponentSizeType.xxs]: 'py-1 fs-12 lh-20', [ComponentSizeType.xs]: 'py-1 fs-12 lh-20', @@ -445,6 +447,7 @@ export const COMPONENT_SIZE_TYPE_TO_FONT_AND_BLOCK_PADDING_MAP: Record = { + [ComponentSizeType.xxxs]: 'px-5', [ComponentSizeType.xxs_small_icon]: 'px-4', [ComponentSizeType.xxs]: 'px-5', [ComponentSizeType.xs]: 'px-5', @@ -455,6 +458,7 @@ export const COMPONENT_SIZE_TYPE_TO_INLINE_PADDING_MAP: Record = { + [ComponentSizeType.xxxs]: 14, [ComponentSizeType.xxs_small_icon]: 12, [ComponentSizeType.xxs]: 14, [ComponentSizeType.xs]: 14, diff --git a/src/Shared/types.ts b/src/Shared/types.ts index 5c74fe3aa..bd8c4a156 100644 --- a/src/Shared/types.ts +++ b/src/Shared/types.ts @@ -139,6 +139,7 @@ export enum Nodes { Overview = 'Overview', MonitoringDashboard = 'MonitoringDashboard', UpgradeCluster = 'UpgradeCluster', + ResourceRecommender = 'ResourceRecommender', } // FIXME: This should be `typeof Nodes[keyof typeof Nodes]` instead since the key and values are not the same. Same to be removed from duplications in dashboard @@ -892,6 +893,15 @@ interface CommonTabArgsType { * @default false */ shouldRemainMounted?: boolean + /** + * @default false + * If true, tab would contain alpha as badge next to the title + */ + isAlpha?: boolean + /** + * On tab stop, i.e by pressing cross icon on alive tab [fixed tab expanding on click of tab and remains expanded on other tab click], tab will reset the tab to this default URL if provided + */ + defaultUrl?: string | null } export type InitTabType = Omit & @@ -1034,6 +1044,7 @@ export enum CIPipelineNodeType { LINKED_CI = 'LINKED-CI', JOB_CI = 'JOB-CI', LINKED_CD = 'LINKED_CD', + CI_CD = 'CI_CD', } export interface ChangeCIPayloadType { @@ -1250,6 +1261,7 @@ export interface DeploymentStatusDetailsType { timelines: DeploymentStatusDetailsTimelineType[] wfrStatus?: WorkflowRunnerStatusDTO isDeploymentWithoutApproval: boolean + deploymentAppType: DeploymentAppTypes } export type DeploymentStatusTimelineType = @@ -1312,6 +1324,7 @@ export interface DeploymentStatusDetailsBreakdownDataType { deploymentErrorMessage: string nextTimelineToProcess: DeploymentStatusTimelineType } | null + deploymentAppType: DeploymentAppTypes } export interface IntelligenceConfig { diff --git a/src/index.ts b/src/index.ts index 4ad98de18..5939e8487 100644 --- a/src/index.ts +++ b/src/index.ts @@ -167,9 +167,14 @@ export interface customEnv { */ FEATURE_MANAGE_TRAFFIC_ENABLE?: boolean FEATURE_INFRA_PROVISION_INFO_BLOCK_HIDE?: boolean + /** + * If true, will add flux option to deployment types in devtron apps and devtron charts + * @default false + */ + FEATURE_FLUX_DEPLOYMENTS_ENABLE?: boolean + FEATURE_LINK_EXTERNAL_FLUX_ENABLE?: boolean /** * If true, online/offline connectivity banner is enabled - * * @default true */ FEATURE_INTERNET_CONNECTIVITY_ENABLE?: boolean