diff --git a/README.md b/README.md index 8ad469ed..21dbb3a7 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,14 @@ const { entries, currentBranch } = useYourPaginatedDataSource() /> ``` -## Grid System +## Graph Rendering Strategies -The implementation of the graph was designed with testing in mind. -The traditional way to draw such an image would with a HTML `canvas` element. Which, while efficient (and probably easier to implement), is hard to programmatically assert its correctness. +The commit history graph visual can be rendered in different ways depending on your needs. + +### HTML Grid + +This implementation of the graph was designed with testing in mind. +The traditional way to draw such an image would with a HTML `canvas` element. Which, while efficient (and easier to implement), is hard to programmatically assert its correctness. This graph uses a grid system. Each row has N number of columns rendered in it, where N is equal to the maximum number of concurrent active branches in the given git log entry data. This means that each column is aware of its state and what needs to be drawn (A commit node, vertical line, curved merge line etc.). @@ -65,6 +69,26 @@ Each column is responsive as its row is stretched vertically or horizontally. ![grid-system.gif](docs/images/grid-system.gif) +This strategy can be used by rendering the `` subcomponent under the ``. + +```typescript jsx + + + +``` + +### Canvas 2D + +This implementation uses a standard HTML `canvas` element with a `2d` rendering context. + +This strategy can be used by rendering the `` subcomponent under the ``. + +```typescript jsx + + + +``` + # Using the component 1. Install the package using your preferred package manager. @@ -107,7 +131,7 @@ Each column is responsive as its row is stretched vertically or horizontally. return ( - + ) @@ -127,7 +151,7 @@ Each column is responsive as its row is stretched vertically or horizontally. - =6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", + "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", "dev": true, "license": "MIT", "engines": { @@ -255,22 +255,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -309,14 +309,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -326,14 +326,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "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.26.5", - "@babel/helper-validator-option": "^7.25.9", + "@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" @@ -363,29 +363,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -395,9 +395,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -405,9 +405,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "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==", "dev": true, "license": "MIT", "engines": { @@ -415,9 +415,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "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": { @@ -425,27 +425,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.10" + "@babel/types": "^7.27.1" }, "bin": { "parser": "bin/babel-parser.js" @@ -455,45 +455,42 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", "dev": true, "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@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.26.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", - "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -512,14 +509,14 @@ } }, "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -535,73 +532,6 @@ "node": ">=18" } }, - "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz", - "integrity": "sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "cookie": "^0.7.2" - } - }, - "node_modules/@bundled-es-modules/statuses": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", - "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "statuses": "^2.0.1" - } - }, - "node_modules/@bundled-es-modules/tough-cookie": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", - "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "@types/tough-cookie": "^4.0.5", - "tough-cookie": "^4.1.4" - } - }, - "node_modules/@bundled-es-modules/tough-cookie/node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@bundled-es-modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/@chromatic-com/storybook": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-3.2.6.tgz", @@ -644,9 +574,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", - "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz", + "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==", "dev": true, "funding": [ { @@ -668,9 +598,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", - "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz", + "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==", "dev": true, "funding": [ { @@ -685,7 +615,7 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.2", - "@csstools/css-calc": "^2.1.2" + "@csstools/css-calc": "^2.1.3" }, "engines": { "node": ">=18" @@ -739,9 +669,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", "cpu": [ "ppc64" ], @@ -756,9 +686,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", "cpu": [ "arm" ], @@ -773,9 +703,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", "cpu": [ "arm64" ], @@ -790,9 +720,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", "cpu": [ "x64" ], @@ -807,9 +737,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", "cpu": [ "arm64" ], @@ -824,9 +754,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", "cpu": [ "x64" ], @@ -841,9 +771,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", "cpu": [ "arm64" ], @@ -858,9 +788,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", "cpu": [ "x64" ], @@ -875,9 +805,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", "cpu": [ "arm" ], @@ -892,9 +822,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", "cpu": [ "arm64" ], @@ -909,9 +839,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", "cpu": [ "ia32" ], @@ -926,9 +856,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", "cpu": [ "loong64" ], @@ -943,9 +873,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", "cpu": [ "mips64el" ], @@ -960,9 +890,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", "cpu": [ "ppc64" ], @@ -977,9 +907,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", "cpu": [ "riscv64" ], @@ -994,9 +924,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", "cpu": [ "s390x" ], @@ -1011,9 +941,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", "cpu": [ "x64" ], @@ -1028,9 +958,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", "cpu": [ "arm64" ], @@ -1045,9 +975,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", "cpu": [ "x64" ], @@ -1062,9 +992,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", "cpu": [ "arm64" ], @@ -1079,9 +1009,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", "cpu": [ "x64" ], @@ -1096,9 +1026,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", "cpu": [ "x64" ], @@ -1113,9 +1043,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", "cpu": [ "arm64" ], @@ -1130,9 +1060,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", "cpu": [ "ia32" ], @@ -1147,9 +1077,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", "cpu": [ "x64" ], @@ -1418,9 +1348,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1431,150 +1361,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@inquirer/confirm": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.8.tgz", - "integrity": "sha512-dNLWCYZvXDjO3rnQfk2iuJNL4Ivwz/T2+C3+WnNfJKsNGSuOs3wAo2F6e0p946gtSAk31nZMfW+MRmYaplPKsg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.9.tgz", - "integrity": "sha512-sXhVB8n20NYkUBfDYgizGHlpRVaCRjtuzNZA6xpALIUbkgfd2Hjz+DfEN6+h1BRnuxw0/P4jCIMjMsEOAMwAJw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.5", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@inquirer/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", - "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.5.tgz", - "integrity": "sha512-ZJpeIYYueOz/i/ONzrfof8g89kNdO2hjGuvULROo3O8rlB2CRtSseE5KeirnyE4t/thAn/EwvS/vuQeJCn+NZg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1709,19 +1495,19 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.52.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.52.1.tgz", - "integrity": "sha512-m3I5uAwE05orsu3D1AGyisX5KxsgVXB+U4bWOOaX/Z7Ftp/2Cy41qsNhO6LPvSxHBaapyser5dVorF1t5M6tig==", + "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.30.4", + "@microsoft/api-extractor-model": "7.30.6", "@microsoft/tsdoc": "~0.15.1", "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.12.0", + "@rushstack/node-core-library": "5.13.1", "@rushstack/rig-package": "0.5.3", - "@rushstack/terminal": "0.15.1", - "@rushstack/ts-command-line": "4.23.6", + "@rushstack/terminal": "0.15.3", + "@rushstack/ts-command-line": "5.0.1", "lodash": "~4.17.15", "minimatch": "~3.0.3", "resolve": "~1.22.1", @@ -1734,15 +1520,15 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.30.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.4.tgz", - "integrity": "sha512-RobC0gyVYsd2Fao9MTKOfTdBm41P/bCMUmzS5mQ7/MoAKEqy0FOBph3JOYdq4X4BsEnMEiSHc+0NUNmdzxCpjA==", + "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.1", "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.12.0" + "@rushstack/node-core-library": "5.13.1" } }, "node_modules/@microsoft/api-extractor/node_modules/brace-expansion": { @@ -1863,26 +1649,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@mswjs/interceptors": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.6.tgz", - "integrity": "sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1921,37 +1687,6 @@ "node": ">= 8" } }, - "node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@parcel/watcher": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", @@ -2288,9 +2023,9 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "dev": true, "license": "MIT" }, @@ -2324,10 +2059,17 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz", - "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", + "integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==", "cpu": [ "arm" ], @@ -2339,9 +2081,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz", - "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz", + "integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==", "cpu": [ "arm64" ], @@ -2353,9 +2095,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz", - "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz", + "integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==", "cpu": [ "arm64" ], @@ -2367,9 +2109,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz", - "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz", + "integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==", "cpu": [ "x64" ], @@ -2381,9 +2123,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz", - "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz", + "integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==", "cpu": [ "arm64" ], @@ -2395,9 +2137,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz", - "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz", + "integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==", "cpu": [ "x64" ], @@ -2409,9 +2151,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz", - "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz", + "integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==", "cpu": [ "arm" ], @@ -2423,9 +2165,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz", - "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz", + "integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==", "cpu": [ "arm" ], @@ -2437,9 +2179,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz", - "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz", + "integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==", "cpu": [ "arm64" ], @@ -2451,9 +2193,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz", - "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz", + "integrity": "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==", "cpu": [ "arm64" ], @@ -2465,9 +2207,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz", - "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz", + "integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==", "cpu": [ "loong64" ], @@ -2479,9 +2221,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz", - "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz", + "integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==", "cpu": [ "ppc64" ], @@ -2493,9 +2235,23 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz", - "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz", + "integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz", + "integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==", "cpu": [ "riscv64" ], @@ -2507,9 +2263,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz", - "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz", + "integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==", "cpu": [ "s390x" ], @@ -2521,9 +2277,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz", - "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz", + "integrity": "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==", "cpu": [ "x64" ], @@ -2535,9 +2291,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz", - "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz", + "integrity": "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==", "cpu": [ "x64" ], @@ -2549,9 +2305,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz", - "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz", + "integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==", "cpu": [ "arm64" ], @@ -2563,9 +2319,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz", - "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz", + "integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==", "cpu": [ "ia32" ], @@ -2577,9 +2333,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz", - "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", + "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", "cpu": [ "x64" ], @@ -2598,9 +2354,9 @@ "license": "MIT" }, "node_modules/@rushstack/node-core-library": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.12.0.tgz", - "integrity": "sha512-QSwwzgzWoil1SCQse+yCHwlhRxNv2dX9siPnAb9zR/UmMhac4mjMrlMZpk64BlCeOFi1kJKgXRkihSwRMbboAQ==", + "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": { @@ -2709,13 +2465,13 @@ } }, "node_modules/@rushstack/terminal": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.1.tgz", - "integrity": "sha512-3vgJYwumcjoDOXU3IxZfd616lqOdmr8Ezj4OWgJZfhmiBK4Nh7eWcv8sU8N/HdzXcuHDXCRGn/6O2Q75QvaZMA==", + "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.12.0", + "@rushstack/node-core-library": "5.13.1", "supports-color": "~8.1.1" }, "peerDependencies": { @@ -2744,13 +2500,13 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.23.6", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.6.tgz", - "integrity": "sha512-7WepygaF3YPEoToh4MAL/mmHkiIImQq3/uAkQX46kVoKTNOOlCtFGyNnze6OYuWw2o9rxsyrHVfIBKxq/am2RA==", + "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.15.1", + "@rushstack/terminal": "0.15.3", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" @@ -3155,6 +2911,44 @@ "storybook": "^8.6.14" } }, + "node_modules/@storybook/instrumenter/node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/instrumenter/node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/instrumenter/node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@storybook/manager-api": { "version": "8.6.14", "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.6.14.tgz", @@ -3338,6 +3132,74 @@ "@testing-library/dom": ">=7.21.4" } }, + "node_modules/@storybook/test/node_modules/@vitest/expect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/test/node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/test/node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/test/node_modules/@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/test/node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@storybook/theming": { "version": "8.6.14", "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.14.tgz", @@ -3574,6 +3436,19 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/@svgr/plugin-jsx": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", @@ -4006,9 +3881,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -4027,24 +3902,15 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@types/doctrine": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", @@ -4053,9 +3919,9 @@ "license": "MIT" }, "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==", + "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" }, @@ -4117,24 +3983,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@types/uuid": { "version": "9.0.8", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", @@ -4494,71 +4342,6 @@ } } }, - "node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/expect/node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/expect/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/@vitest/expect/node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@vitest/mocker": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.4.tgz", @@ -4609,29 +4392,6 @@ "@types/estree": "^1.0.0" } }, - "node_modules/@vitest/pretty-format": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", - "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@vitest/runner": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.4.tgz", @@ -4702,19 +4462,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/@vitest/ui": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.1.4.tgz", @@ -4743,105 +4490,100 @@ "integrity": "sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==", "dev": true, "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui/node_modules/@vitest/utils": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.4.tgz", - "integrity": "sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.1.4", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", - "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.9", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" + "dependencies": { + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/utils/node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "node_modules/@vitest/ui/node_modules/@vitest/utils": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.4.tgz", + "integrity": "sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@vitest/pretty-format": "3.1.4", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/@volar/language-core": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.12.tgz", - "integrity": "sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==", + "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.12" + "@volar/source-map": "2.4.14" } }, "node_modules/@volar/source-map": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.12.tgz", - "integrity": "sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==", + "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.12", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.12.tgz", - "integrity": "sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==", + "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.12", + "@volar/language-core": "2.4.14", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.14.tgz", + "integrity": "sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", + "@babel/parser": "^7.27.2", + "@vue/shared": "3.5.14", "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-core/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.14.tgz", + "integrity": "sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-core": "3.5.14", + "@vue/shared": "3.5.14" } }, "node_modules/@vue/compiler-vue2": { @@ -4881,9 +4623,9 @@ } }, "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.14.tgz", + "integrity": "sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==", "dev": true, "license": "MIT" }, @@ -4986,39 +4728,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -5298,9 +5007,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "dev": true, "funding": [ { @@ -5318,10 +5027,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -5414,9 +5123,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001706", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz", - "integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==", + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", "dev": true, "funding": [ { @@ -5495,9 +5204,9 @@ } }, "node_modules/chromatic": { - "version": "11.27.0", - "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.27.0.tgz", - "integrity": "sha512-jQ2ufjS+ePpg+NtcPI9B2eOi+pAzlRd2nhd1LgNMsVCC9Bzf5t8mJtyd8v2AUuJS0LdX0QVBgkOnlNv9xviHzA==", + "version": "11.28.2", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.28.2.tgz", + "integrity": "sha512-aCmUPcZUs4/p9zRZdMreOoO/5JqO2DiJC3md1/vRx8dlMRcmR/YI5ZbgXZcai2absVR+6hsXZ5XiPxV2sboTuQ==", "dev": true, "license": "MIT", "bin": { @@ -5524,96 +5233,6 @@ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5666,9 +5285,9 @@ "license": "MIT" }, "node_modules/confbox": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.1.tgz", - "integrity": "sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==", + "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" }, @@ -5679,18 +5298,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", @@ -5741,13 +5348,13 @@ "license": "MIT" }, "node_modules/cssstyle": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.0.tgz", - "integrity": "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz", + "integrity": "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^3.1.1", + "@asamuzakjp/css-color": "^3.1.2", "rrweb-cssom": "^0.8.0" }, "engines": { @@ -5843,9 +5450,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6022,9 +5629,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.120", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.120.tgz", - "integrity": "sha512-oTUp3gfX1gZI+xfD2djr2rzQdHCwHzPQrrK0CD7WpTdF0nPdQ/INcRVjWgLdCT4a9W3jFObR9DAfsuyFQnI8CQ==", + "version": "1.5.155", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", + "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", "dev": true, "license": "ISC" }, @@ -6043,9 +5650,9 @@ "license": "MIT" }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -6219,9 +5826,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6232,31 +5839,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" } }, "node_modules/esbuild-register": { @@ -6648,11 +6255,14 @@ } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/esutils": { "version": "2.0.3", @@ -6675,9 +6285,9 @@ } }, "node_modules/exsolve": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.4.tgz", - "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", + "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", "dev": true, "license": "MIT" }, @@ -6976,9 +6586,9 @@ } }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7041,18 +6651,6 @@ "node": ">=6.9.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -7167,19 +6765,6 @@ "node": ">=10.13.0" } }, - "node_modules/globals": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", - "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -7252,18 +6837,6 @@ "dev": true, "license": "MIT" }, - "node_modules/graphql": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", - "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -7368,15 +6941,6 @@ "he": "bin/he" } }, - "node_modules/headers-polyfill": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -7449,9 +7013,9 @@ } }, "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", + "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", "dev": true, "license": "MIT" }, @@ -7780,15 +7344,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -8076,6 +7631,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -8304,18 +7860,6 @@ "dev": true, "license": "MIT" }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/loupe": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", @@ -8547,91 +8091,17 @@ "dev": true, "license": "MIT" }, - "node_modules/msw": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.3.tgz", - "integrity": "sha512-+mycXv8l2fEAjFZ5sjrtjJDmm2ceKGjrNbBr1durRg6VkU9fNUE/gsmQ51hWbHqs+l35W1iM+ZsmOD9Fd6lspw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@bundled-es-modules/cookie": "^2.0.1", - "@bundled-es-modules/statuses": "^1.0.1", - "@bundled-es-modules/tough-cookie": "^0.1.6", - "@inquirer/confirm": "^5.0.0", - "@mswjs/interceptors": "^0.37.0", - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/until": "^2.1.0", - "@types/cookie": "^0.6.0", - "@types/statuses": "^2.0.4", - "graphql": "^16.8.1", - "headers-polyfill": "^4.0.2", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "path-to-regexp": "^6.3.0", - "picocolors": "^1.1.1", - "strict-event-emitter": "^0.5.1", - "type-fest": "^4.26.1", - "yargs": "^17.7.2" - }, - "bin": { - "msw": "cli/index.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.8.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/msw/node_modules/type-fest": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz", - "integrity": "sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "optional": true, - "peer": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/muggle-string": { "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, - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz", - "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -8682,9 +8152,9 @@ "license": "MIT" }, "node_modules/nwsapi": { - "version": "2.2.19", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.19.tgz", - "integrity": "sha512-94bcyI3RsqiZufXjkr3ltkI86iEl+I7uiHVDtcq9wJUTwYQJ5odHDeSzkkrRzi80jJ8MaeZgqKjH1bAWAFw9bA==", + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", "dev": true, "license": "MIT" }, @@ -8821,15 +8291,6 @@ "node": ">= 0.8.0" } }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -8930,13 +8391,13 @@ } }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -8993,15 +8454,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -9162,6 +8614,21 @@ "node": ">=18" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/polished": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", @@ -9276,21 +8743,6 @@ "node": ">= 6" } }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -9302,9 +8754,9 @@ } }, "node_modules/quansync": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.8.tgz", - "integrity": "sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", "dev": true, "funding": [ { @@ -9318,15 +8770,6 @@ ], "license": "MIT" }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9349,13 +8792,10 @@ "license": "MIT" }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } @@ -9422,16 +8862,15 @@ } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.1.0" } }, "node_modules/react-is": { @@ -9532,13 +8971,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "license": "MIT" - }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -9560,18 +8992,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -9582,15 +9002,6 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -9634,13 +9045,13 @@ } }, "node_modules/rollup": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz", - "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", + "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -9650,25 +9061,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.36.0", - "@rollup/rollup-android-arm64": "4.36.0", - "@rollup/rollup-darwin-arm64": "4.36.0", - "@rollup/rollup-darwin-x64": "4.36.0", - "@rollup/rollup-freebsd-arm64": "4.36.0", - "@rollup/rollup-freebsd-x64": "4.36.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", - "@rollup/rollup-linux-arm-musleabihf": "4.36.0", - "@rollup/rollup-linux-arm64-gnu": "4.36.0", - "@rollup/rollup-linux-arm64-musl": "4.36.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", - "@rollup/rollup-linux-riscv64-gnu": "4.36.0", - "@rollup/rollup-linux-s390x-gnu": "4.36.0", - "@rollup/rollup-linux-x64-gnu": "4.36.0", - "@rollup/rollup-linux-x64-musl": "4.36.0", - "@rollup/rollup-win32-arm64-msvc": "4.36.0", - "@rollup/rollup-win32-ia32-msvc": "4.36.0", - "@rollup/rollup-win32-x64-msvc": "4.36.0", + "@rollup/rollup-android-arm-eabi": "4.41.0", + "@rollup/rollup-android-arm64": "4.41.0", + "@rollup/rollup-darwin-arm64": "4.41.0", + "@rollup/rollup-darwin-x64": "4.41.0", + "@rollup/rollup-freebsd-arm64": "4.41.0", + "@rollup/rollup-freebsd-x64": "4.41.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", + "@rollup/rollup-linux-arm-musleabihf": "4.41.0", + "@rollup/rollup-linux-arm64-gnu": "4.41.0", + "@rollup/rollup-linux-arm64-musl": "4.41.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-musl": "4.41.0", + "@rollup/rollup-linux-s390x-gnu": "4.41.0", + "@rollup/rollup-linux-x64-gnu": "4.41.0", + "@rollup/rollup-linux-x64-musl": "4.41.0", + "@rollup/rollup-win32-arm64-msvc": "4.41.0", + "@rollup/rollup-win32-ia32-msvc": "4.41.0", + "@rollup/rollup-win32-x64-msvc": "4.41.0", "fsevents": "~2.3.2" } }, @@ -9800,18 +9212,15 @@ } }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -10066,18 +9475,6 @@ "dev": true, "license": "MIT" }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/std-env": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", @@ -10112,15 +9509,6 @@ } } }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -10473,22 +9861,22 @@ } }, "node_modules/tldts": { - "version": "6.1.84", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.84.tgz", - "integrity": "sha512-aRGIbCIF3teodtUFAYSdQONVmDRy21REM3o6JnqWn5ZkQBJJ4gHxhw6OfwQ+WkSAi3ASamrS4N4nyazWx6uTYg==", + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.84" + "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.84", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.84.tgz", - "integrity": "sha512-NaQa1W76W2aCGjXybvnMYzGSM4x8fvG2AN/pla7qxcg0ZHbooOPhA8kctmOZUDfZyhDL27OGNbwAeig8P4p1vg==", + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", "dev": true, "license": "MIT" }, @@ -10529,9 +9917,9 @@ } }, "node_modules/tr46": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.0.tgz", - "integrity": "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", "dependencies": { @@ -10777,9 +10165,9 @@ } }, "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "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" }, @@ -10874,19 +10262,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -11100,21 +10475,6 @@ } } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/vitest": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.4.tgz", @@ -11535,9 +10895,9 @@ } }, "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "dev": true, "license": "MIT", "engines": { @@ -11573,18 +10933,6 @@ "dev": true, "license": "MIT" }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -11592,80 +10940,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -11679,21 +10953,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "packages/demo": { "name": "@tomplum/react-git-log-demo", "version": "1.0.0", @@ -11714,8 +10973,8 @@ "@storybook/react": "^8.6.4", "@storybook/react-vite": "^8.6.4", "@storybook/test": "^8.6.4", - "@tanstack/react-query": "^5.79.0", - "@types/react": "^19.1.6", + "@tanstack/react-query": "^5.70.0", + "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "gh-pages": "^6.3.0", "playwright": "^1.51.0", @@ -11725,39 +10984,12 @@ "vite": "^6.2.0", "vite-plugin-svgr": "^4.3.0", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.1.4" - } - }, - "packages/demo/node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/demo/node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.0" + "vitest": "^3.0.9" } }, - "packages/demo/node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" - }, "packages/library": { "name": "@tomplum/react-git-log", - "version": "2.5.0", + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { "@uidotdev/usehooks": "^2.4.1", @@ -11765,24 +10997,24 @@ "dayjs": "^1.11.13", "fastpriorityqueue": "^0.7.5", "node-interval-tree": "^2.1.2", - "react": ">=18.0.0", - "react-dom": ">=18.0.0", + "react": ">=19.0.0", + "react-dom": ">=19.0.0", "react-tiny-popover": "^8.1.6" }, "devDependencies": { "@testing-library/dom": "^10.4.0", "@testing-library/react": "^16.2.0", "@testing-library/user-event": "^14.6.1", - "@types/node": "^22.15.29", - "@types/react": "^19.1.6", + "@types/node": "^22.13.10", + "@types/react": "^19.0.12", "@types/react-dom": "^19.0.4", - "@vitejs/plugin-react-swc": "^3.10.0", - "@vitest/browser": "^3.1.4", - "@vitest/coverage-v8": "^3.1.4", - "@vitest/ui": "^3.1.4", - "globals": "^16.2.0", + "@vitejs/plugin-react-swc": "^3.8.0", + "@vitest/browser": "^3.0.9", + "@vitest/coverage-v8": "^3.0.9", + "@vitest/ui": "^3.0.9", + "globals": "^16.0.0", "jsdom": "^26.0.0", - "sass": "^1.89.1", + "sass": "^1.85.1", "typescript": "~5.8.0", "vite": "^6.2.0", "vite-bundle-analyzer": "^0.22.0", @@ -11790,14 +11022,14 @@ "vite-plugin-lib-inject-css": "^2.2.1", "vite-plugin-svgr": "^4.3.0", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.1.4" + "vitest": "^3.0.9" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" }, "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" + "react": ">=19.0.0", + "react-dom": ">=19.0.0" }, "peerDependenciesMeta": { "react": { @@ -11812,6 +11044,19 @@ "version": "0.7.5", "license": "Apache-2.0" }, + "packages/library/node_modules/globals": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz", + "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/library/node_modules/node-interval-tree": { "version": "2.1.2", "license": "MIT", @@ -11822,33 +11067,6 @@ "node": ">= 14.0.0" } }, - "packages/library/node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/library/node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.0" - } - }, - "packages/library/node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" - }, "packages/library/node_modules/shallowequal": { "version": "1.1.0", "license": "MIT" diff --git a/package.json b/package.json index 139aa1cb..36da4630 100644 --- a/package.json +++ b/package.json @@ -20,5 +20,9 @@ "@stylistic/eslint-plugin": "^4.2.0", "@eslint/js": "^9.21.0", "typescript-eslint": "^8.24.1" + }, + "overrides": { + "react": "19.1.0", + "react-dom": "19.1.0" } } \ No newline at end of file diff --git a/packages/demo/src/GitLog.stories.tsx b/packages/demo/src/GitLog.stories.tsx index 816e2537..44c2ae0d 100644 --- a/packages/demo/src/GitLog.stories.tsx +++ b/packages/demo/src/GitLog.stories.tsx @@ -1,16 +1,17 @@ import type { Meta, StoryObj } from '@storybook/react' import styles from './GitLog.stories.module.scss' -import { type Commit, GitLog, type GitLogProps, GraphProps } from '@tomplum/react-git-log' +import { type Commit, GitLog, type GitLogProps, HTMLGridGraphProps, Canvas2DGraphProps } from '@tomplum/react-git-log' import { Loading } from 'components/Loading' import { useStoryState } from 'hooks/useStoryState' import { StoryHeader } from 'components/StoryHeader' -interface StoryProps extends GitLogProps, GraphProps { +interface StoryProps extends GitLogProps, HTMLGridGraphProps, Canvas2DGraphProps { pageSize?: number page?: number showTable: boolean showBranchesTags: boolean showCommitNodeHashes: boolean + renderStrategy: 'html-grid' | 'canvas' } const meta: Meta = { @@ -30,12 +31,13 @@ const meta: Meta = { showGitIndex: true, enableResize: false, nodeTheme: 'default', + renderStrategy: 'html-grid', nodeSize: 20, orientation: 'normal', onSelectCommit: (commit?: Commit) => { console.info(`Selected commit ${commit?.hash}`) }, - defaultGraphWidth: 200, + defaultGraphWidth: 120, rowSpacing: 0, page: 0, pageSize: 200 @@ -100,6 +102,17 @@ const meta: Meta = { category: 'Visibility' } }, + renderStrategy: { + name: 'Graph Render Strategy', + table: { + category: 'Visibility' + }, + control: 'radio', + options: { + 'HTML Grid': 'html-grid', + Canvas2D: 'canvas' + } + }, pageSize: { name: 'Page Size', table: { @@ -246,14 +259,26 @@ export const Demo: Story = { )} - + {args.renderStrategy === 'html-grid' && ( + + )} + + {args.renderStrategy === 'canvas' && ( + + )} {args.showTable && ( = { @@ -23,11 +24,11 @@ const meta: Meta = { showTable: true, branchName: 'release', showCommitNodeHashes: false, - showCommitNodeTooltips: false, showHeaders: true, enableResize: false, nodeTheme: 'default', showGitIndex: true, + renderStrategy: 'html-grid', nodeSize: 20, orientation: 'normal', onSelectCommit: (commit?: Commit) => { @@ -67,12 +68,6 @@ const meta: Meta = { category: 'Visibility' } }, - showCommitNodeTooltips: { - name: 'Show Commit Tooltips', - table: { - category: 'Visibility' - } - }, nodeTheme: { name: 'Node Style', table: { @@ -90,6 +85,17 @@ const meta: Meta = { category: 'Visibility' } }, + renderStrategy: { + name: 'Graph Render Strategy', + table: { + category: 'Visibility' + }, + control: 'radio', + options: { + 'HTML Grid': 'html-grid', + Canvas2D: 'canvas' + } + }, enableResize: { name: 'Enable Resize', table: { @@ -224,14 +230,25 @@ export const Demo: Story = { }} urls={buildUrls} > - + {args.renderStrategy === 'html-grid' && ( + + )} + + {args.renderStrategy === 'canvas' && ( + + )} {args.showTable && ( - + ) @@ -85,7 +85,7 @@ A flexible and interactive React component for visualising Git commit history. D - =18.0.0", - "react-dom": ">=18.0.0", + "react": ">=19.0.0", + "react-dom": ">=19.0.0", "react-tiny-popover": "^8.1.6" }, "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" + "react": ">=19.0.0", + "react-dom": ">=19.0.0" }, "peerDependenciesMeta": { "react": { @@ -83,7 +83,7 @@ "vitest": "^3.0.9" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" }, "browserslist": [ "defaults", diff --git a/packages/library/src/GitLog.integration.spec.tsx b/packages/library/src/GitLog.integration.spec.tsx index 510cf55c..baa7ddde 100644 --- a/packages/library/src/GitLog.integration.spec.tsx +++ b/packages/library/src/GitLog.integration.spec.tsx @@ -4,7 +4,7 @@ import sleepRepositoryData from 'test/data/sleep/sleep.txt?raw' import sleepRepositoryDataReleaseBranch from 'test/data/sleep-paginated/sleep-release-branch.txt?raw' import { parseGitLogOutput } from 'test/data/gitLogParser' import { sleepRepositoryRowColumnState } from 'test/data/sleep/sleepState' -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' import { graphColumn } from 'test/elements/GraphColumn' import { afterEach, beforeEach, describe } from 'vitest' import { render, within } from '@testing-library/react' @@ -72,8 +72,10 @@ const today = new Date(2025, 2, 24, 18, 0, 0) * To print columnData for graph column state for integration tests use * console.log(JSON.stringify(Object.fromEntries(columnData), null, 2)) * in Graph.tsx. + * + * Skipped in favour of the Vitest snapshot tests for now. */ -describe('GitLog Integration', () => { +describe.skip('GitLog Integration', () => { beforeEach(() => { vi.useFakeTimers() vi.setSystemTime(today) @@ -97,7 +99,7 @@ describe('GitLog Integration', () => { entries={gitLogEntries} > - + ) @@ -130,7 +132,7 @@ describe('GitLog Integration', () => { entries={gitLogEntries} > - + ) diff --git a/packages/library/src/GitLog.spec.tsx b/packages/library/src/GitLog.spec.tsx index 65aa0bcc..a97b5f14 100644 --- a/packages/library/src/GitLog.spec.tsx +++ b/packages/library/src/GitLog.spec.tsx @@ -35,7 +35,7 @@ describe('GitLog', () => { entries={[entry({ branch: 'test' })]} classes={{ containerClass: 'styles.customContainerClass' }} > - + ) @@ -55,7 +55,7 @@ describe('GitLog', () => { } }} > - + ) @@ -81,7 +81,7 @@ describe('GitLog', () => { urls={urlBuilderFunction} > - + ) @@ -100,7 +100,7 @@ describe('GitLog', () => { urls={urlBuilderFunction} > - + ) @@ -120,7 +120,7 @@ describe('GitLog', () => { urls={urlBuilderFunction} > - + ) @@ -137,7 +137,7 @@ describe('GitLog', () => { urls={urlBuilderFunction} > - + ) @@ -157,7 +157,7 @@ describe('GitLog', () => { urls={urlBuilderFunction} > - + ) @@ -176,7 +176,7 @@ describe('GitLog', () => { ) expect(consoleWarn).toHaveBeenCalledExactlyOnceWith( - 'react-git-log is not designed to work without a component.' + 'react-git-log is not designed to work without a or a component.' ) }) @@ -216,21 +216,57 @@ describe('GitLog', () => { ) }) - it('should throw an error if the graph subcomponent is rendered twice', () => { + it('should throw an error if the HTML grid graph subcomponent is rendered twice', () => { const renderBadComponent = () => { render( - - + + ) } expect(renderBadComponent).toThrow( - ' can only have one child.' + ' can only have one child.' + ) + }) + + it('should throw an error if the canvas graph subcomponent is rendered twice', () => { + const renderBadComponent = () => { + render( + + + + + ) + } + + expect(renderBadComponent).toThrow( + ' can only have one child.' + ) + }) + + it('should throw an error if graph subcomponent is rendered twice with different variants', () => { + const renderBadComponent = () => { + render( + + + + + ) + } + + expect(renderBadComponent).toThrow( + ' can only have one or child.' ) }) }) \ No newline at end of file diff --git a/packages/library/src/GitLog.tsx b/packages/library/src/GitLog.tsx index e9249aea..e5f93b2e 100644 --- a/packages/library/src/GitLog.tsx +++ b/packages/library/src/GitLog.tsx @@ -1,7 +1,7 @@ import { GitLogProps } from './types' import { PropsWithChildren } from 'react' import { Tags } from './modules/Tags' -import { Graph } from './modules/Graph' +import { GraphCanvas2D, GraphHTMLGrid } from './modules/Graph' import { Table } from './modules/Table' import { GitLogCore } from './components/GitLogCore' @@ -17,5 +17,6 @@ export const GitLog = ({ children, ...props }: PropsWithChildren) = } GitLog.Tags = Tags -GitLog.Graph = Graph +GitLog.GraphCanvas2D = GraphCanvas2D +GitLog.GraphHTMLGrid = GraphHTMLGrid GitLog.Table = Table \ No newline at end of file diff --git a/packages/library/src/GitLogPaged.spec.tsx b/packages/library/src/GitLogPaged.spec.tsx index 216fc924..dc309fcd 100644 --- a/packages/library/src/GitLogPaged.spec.tsx +++ b/packages/library/src/GitLogPaged.spec.tsx @@ -16,7 +16,7 @@ describe('GitLogPaged', () => { entries={gitLogEntries} > - + ) @@ -36,7 +36,7 @@ describe('GitLogPaged', () => { ) expect(consoleWarn).toHaveBeenCalledExactlyOnceWith( - 'react-git-log is not designed to work without a component.' + 'react-git-log is not designed to work without a or a component.' ) }) @@ -78,7 +78,7 @@ describe('GitLogPaged', () => { ) }) - it('should throw an error if the graph subcomponent is rendered twice', () => { + it('should throw an error if the HTML grid graph subcomponent is rendered twice', () => { const renderBadComponent = () => { render( { branchName='main' headCommitHash='123' > - - + + ) } expect(renderBadComponent).toThrow( - ' can only have one child.' + ' can only have one child.' + ) + }) + + it('should throw an error if the canvas graph subcomponent is rendered twice', () => { + const renderBadComponent = () => { + render( + + + + + ) + } + + expect(renderBadComponent).toThrow( + ' can only have one child.' + ) + }) + + it('should throw an error if the graph subcomponent is rendered twice with different variants', () => { + const renderBadComponent = () => { + render( + + + + + ) + } + + expect(renderBadComponent).toThrow( + ' can only have one or child.' ) }) }) \ No newline at end of file diff --git a/packages/library/src/GitLogPaged.tsx b/packages/library/src/GitLogPaged.tsx index ec3f72a4..376bddff 100644 --- a/packages/library/src/GitLogPaged.tsx +++ b/packages/library/src/GitLogPaged.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react' import { GitLogPagedProps } from './types' import { Tags } from './modules/Tags' -import { Graph } from './modules/Graph' +import { GraphCanvas2D, GraphHTMLGrid } from './modules/Graph' import { Table } from './modules/Table' import { GitLogCore } from './components/GitLogCore' @@ -19,5 +19,6 @@ export const GitLogPaged = ({ children, branchName, ...props }: PropsWithChildre } GitLogPaged.Tags = Tags -GitLogPaged.Graph = Graph +GitLogPaged.GraphCanvas2D = GraphCanvas2D +GitLogPaged.GraphHTMLGrid = GraphHTMLGrid GitLogPaged.Table = Table \ No newline at end of file diff --git a/packages/library/src/_test/data/sleep-paginated/sleepStatePaginated.ts b/packages/library/src/_test/data/sleep-paginated/sleepStatePaginated.ts index 2b1447bc..d68ccd7b 100644 --- a/packages/library/src/_test/data/sleep-paginated/sleepStatePaginated.ts +++ b/packages/library/src/_test/data/sleep-paginated/sleepStatePaginated.ts @@ -1,4 +1,4 @@ -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' export const sleepRowColumnStatePaginated: Record = { 1: [ diff --git a/packages/library/src/_test/data/sleep/sleepState.ts b/packages/library/src/_test/data/sleep/sleepState.ts index 01a6d1d8..ad223e8f 100644 --- a/packages/library/src/_test/data/sleep/sleepState.ts +++ b/packages/library/src/_test/data/sleep/sleepState.ts @@ -1,4 +1,4 @@ -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' export const sleepRepositoryRowColumnState: Record = { 1: [ diff --git a/packages/library/src/_test/stubs.ts b/packages/library/src/_test/stubs.ts index 7e5c8af2..d879aeb3 100644 --- a/packages/library/src/_test/stubs.ts +++ b/packages/library/src/_test/stubs.ts @@ -3,7 +3,7 @@ import { GitContextBag } from 'context/GitContext' import DataIntervalTree from 'node-interval-tree' import { ThemeFunctions } from 'hooks/useTheme' import { GraphData } from 'data' -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' import { GraphContextBag } from 'modules/Graph/context' import { ThemeContextBag } from 'context/ThemeContext' @@ -76,6 +76,8 @@ export const graphContextBag = (bag?: Partial): GraphContextBag graphWidth: 200, nodeSize: 20, orientation: 'normal', + visibleCommits: [], + columnData: new Map(), ...bag }) @@ -89,6 +91,11 @@ export const themeFunctions = (response?: Partial): ThemeFunctio getCommitColour: vi.fn(), getTooltipBackground: vi.fn(), hoverTransitionDuration: 500, + getCommitNodeColours: vi.fn().mockReturnValue({ + borderColour: 'black', + backgroundColor: 'gray' + }), + getGraphColumnSelectedBackgroundColour: vi.fn(), ...response }) diff --git a/packages/library/src/components/GitLogCore/GitLogCore.tsx b/packages/library/src/components/GitLogCore/GitLogCore.tsx index 8b765a90..6e2a1f19 100644 --- a/packages/library/src/components/GitLogCore/GitLogCore.tsx +++ b/packages/library/src/components/GitLogCore/GitLogCore.tsx @@ -3,7 +3,7 @@ import { Children, isValidElement, PropsWithChildren, ReactElement, useCallback, import { GitContext, GitContextBag } from 'context/GitContext' import { computeNodePositions, computeRelationships, GraphData, temporalTopologicalSort } from 'data' import { Tags } from 'modules/Tags' -import { Graph, GraphOrientation } from 'modules/Graph' +import { GraphCanvas2D, GraphHTMLGrid, GraphOrientation } from 'modules/Graph' import { Table } from 'modules/Table' import { Layout } from 'components/Layout' import { Commit } from 'types/Commit' @@ -42,21 +42,32 @@ export const GitLogCore = ({ } tags = child - } else if (child.type === GitLogCore.Graph) { - if (graph) { - throw new Error(`<${componentName} /> can only have one <${componentName}.Graph /> child.`) + } else if (child.type === GitLogCore.GraphCanvas2D || child.type === GitLogCore.GraphHTMLGrid) { + if (graph && graph.type === GitLogCore.GraphCanvas2D && child.type === GitLogCore.GraphCanvas2D) { + throw new Error(`<${componentName} /> can only have one <${componentName}.GraphCanvas2D /> child.`) + } + + if (graph && graph.type === GitLogCore.GraphHTMLGrid && child.type === GitLogCore.GraphHTMLGrid) { + throw new Error(`<${componentName} /> can only have one <${componentName}.GraphHTMLGrid /> child.`) + } + + if (graph && graph.type !== child.type) { + throw new Error(`<${componentName} /> can only have one <${componentName}.GraphHTMLGrid /> or <${componentName}.GraphCanvas2D /> child.`) } graph = child } else if (child.type === GitLogCore.Table) { - if (table) throw new Error(`<${componentName} /> can only have one <${componentName}.Table /> child.`) + if (table) { + throw new Error(`<${componentName} /> can only have one <${componentName}.Table /> child.`) + } + table = child } } }) if (!graph) { - console.warn(`react-git-log is not designed to work without a <${componentName}.Graph /> component.`) + console.warn(`react-git-log is not designed to work without a <${componentName}.GraphCanvas2D /> or a <${componentName}.GraphHTMLGrid /> component.`) } return { tags, graph, table } @@ -216,5 +227,6 @@ export const GitLogCore = ({ } GitLogCore.Tags = Tags -GitLogCore.Graph = Graph +GitLogCore.GraphCanvas2D = GraphCanvas2D +GitLogCore.GraphHTMLGrid = GraphHTMLGrid GitLogCore.Table = Table \ No newline at end of file diff --git a/packages/library/src/context/GitContext/types.ts b/packages/library/src/context/GitContext/types.ts index eba39ee1..07338827 100644 --- a/packages/library/src/context/GitContext/types.ts +++ b/packages/library/src/context/GitContext/types.ts @@ -190,19 +190,7 @@ export interface GitContextBag { * a window of the given size from the * set of git log entries. */ - paging?: { - /** - * The zero-based index of the row - * to show from in the log. - */ - startIndex: number - - /** - * The zero-based index of the row - * to show to in the log. - */ - endIndex: number - } + paging?: GraphPaging /** * Whether the git index pseudo-commit @@ -211,4 +199,18 @@ export interface GitContextBag { * pagination config. */ isIndexVisible: boolean +} + +export interface GraphPaging { + /** + * The zero-based index of the row + * to show from in the log. + */ + startIndex: number + + /** + * The zero-based index of the row + * to show to in the log. + */ + endIndex: number } \ No newline at end of file diff --git a/packages/library/src/hooks/useSelectCommit/useSelectCommit.ts b/packages/library/src/hooks/useSelectCommit/useSelectCommit.ts index 97279c17..38a1e0c2 100644 --- a/packages/library/src/hooks/useSelectCommit/useSelectCommit.ts +++ b/packages/library/src/hooks/useSelectCommit/useSelectCommit.ts @@ -4,23 +4,29 @@ import { useGitContext } from 'context/GitContext' import { SelectCommitHandler } from './types' export const useSelectCommit = (): SelectCommitHandler => { - const { selectedCommit, setPreviewedCommit, setSelectedCommit } = useGitContext() + const { selectedCommit, previewedCommit, setPreviewedCommit, setSelectedCommit } = useGitContext() const handleMouseOver = useCallback((commit: Commit) => { - setPreviewedCommit(commit) - }, [setPreviewedCommit]) + if (commit.hash !== selectedCommit?.hash) { + setPreviewedCommit(commit) + } + }, [selectedCommit?.hash, setPreviewedCommit]) const handleMouseOut = useCallback(() => { setPreviewedCommit(undefined) }, [setPreviewedCommit]) const handleClickCommit = useCallback((commit: Commit) => { + if (commit.hash === previewedCommit?.hash){ + setPreviewedCommit(undefined) + } + if (selectedCommit?.hash === commit.hash) { setSelectedCommit(undefined) } else { setSelectedCommit(commit) } - }, [selectedCommit, setSelectedCommit]) + }, [previewedCommit?.hash, selectedCommit?.hash, setPreviewedCommit, setSelectedCommit]) return { selectCommitHandler: { diff --git a/packages/library/src/hooks/useTheme/types.ts b/packages/library/src/hooks/useTheme/types.ts index a143cc64..32e48f27 100644 --- a/packages/library/src/hooks/useTheme/types.ts +++ b/packages/library/src/hooks/useTheme/types.ts @@ -1,10 +1,39 @@ import { Commit } from 'types/Commit' export interface ThemeFunctions { + /** + * The current active theme mode. + * @xample light, dark + */ theme: ThemeMode + + /** + * An rgb() colour string for + * text that is being hovered over + * relative to the currently active + * {@link theme}. + */ hoverColour: string + + /** + * An rgb() colour string for + * text relative to the currently + * active {@link theme}. + */ textColour: string + + /** + * An rgb() colour string for + * background of a tooltip relative + * to the currently active {@link theme}. + */ getTooltipBackground: (commit: Commit) => string + + /** + * The duration, in milliseconds, of + * the animation for hover transition + * effects. + */ hoverTransitionDuration: number /** @@ -34,9 +63,48 @@ export interface ThemeFunctions { */ reduceOpacity: (rbg: string, opacity: number) => string + /** + * Gets an rgb() colour string for the + * given {@link Commit} relative to the + * given colours of the git log. + * + * @param commit The commit to get the colour for. + */ getCommitColour: (commit: Commit) => string + /** + * Gets an rgb() colour string for the + * given column index relative to the + * given colours of the git log. + * + * @param columnIndex The index to get the colour for. + */ getGraphColumnColour: (columnIndex: number) => string + + /** + * Gets rgb() colour strings for styling a commit node + * from the given base column colour. + * + * @param args Args to get the colour. + */ + getCommitNodeColours: (args: GetCommitNodeColoursArgs) => CommitNodeColours + + /** + * Gets an rgb() colour string for the background + * colour of a graph column when its row is selected. + * + * @param columnIndex The index of the column where the node is. + */ + getGraphColumnSelectedBackgroundColour: (columnIndex: number) => string +} + +export interface GetCommitNodeColoursArgs { + columnColour: string +} + +export interface CommitNodeColours { + backgroundColour: string + borderColour: string } export type ThemeMode = 'light' | 'dark' diff --git a/packages/library/src/hooks/useTheme/useTheme.ts b/packages/library/src/hooks/useTheme/useTheme.ts index 3c244736..9c11fed7 100644 --- a/packages/library/src/hooks/useTheme/useTheme.ts +++ b/packages/library/src/hooks/useTheme/useTheme.ts @@ -1,5 +1,5 @@ import { useGitContext } from 'context/GitContext' -import { ThemeFunctions } from './types' +import { GetCommitNodeColoursArgs, ThemeFunctions } from './types' import { useCallback, useMemo } from 'react' import { Commit } from 'types/Commit' import { useThemeContext } from 'context/ThemeContext' @@ -72,6 +72,17 @@ export const useTheme = (): ThemeFunctions => { return 'rgb(0, 0, 0)' }, [getGraphColumnColour, graphData.positions]) + const getCommitNodeColours = useCallback((args: GetCommitNodeColoursArgs) => { + return { + backgroundColour: shiftAlphaChannel(args.columnColour, 0.15), + borderColour: args.columnColour + } + }, [shiftAlphaChannel]) + + const getGraphColumnSelectedBackgroundColour = useCallback((columnIndex: number) => { + return reduceOpacity(getGraphColumnColour(columnIndex), 0.15) + }, [getGraphColumnColour, reduceOpacity]) + const getTooltipBackground = useCallback((commit: Commit) => { if (theme === 'dark') { return shiftAlphaChannel(getCommitColour(commit), 0.2) @@ -89,6 +100,8 @@ export const useTheme = (): ThemeFunctions => { getCommitColour, shiftAlphaChannel, getGraphColumnColour, + getCommitNodeColours, + getGraphColumnSelectedBackgroundColour, hoverTransitionDuration: 0.3 } } \ No newline at end of file diff --git a/packages/library/src/modules/Graph/Graph.tsx b/packages/library/src/modules/Graph/Graph.tsx deleted file mode 100644 index ff8b42ea..00000000 --- a/packages/library/src/modules/Graph/Graph.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import { useEffect, useMemo } from 'react' -import { GraphRow } from 'modules/Graph/components/GraphRow' -import styles from './Graph.module.scss' -import { useGitContext } from 'context/GitContext' -import { IndexPseudoRow } from 'modules/Graph/components/IndexPseudoRow' -import { useColumnData } from 'modules/Graph/hooks/useColumnData' -import { SkeletonGraph } from 'modules/Graph/components/SkeletonGraph' -import { useResize } from 'hooks/useResize' -import { DEFAULT_NODE_SIZE, ROW_HEIGHT } from 'constants/constants' -import { placeholderCommits } from 'modules/Graph/hooks/usePlaceholderData/data' -import { GraphProps } from './types' -import { GraphContext, GraphContextBag } from './context' - -export const Graph = ({ - nodeSize = DEFAULT_NODE_SIZE, - nodeTheme = 'default', - orientation = 'normal', - enableResize = false, - showCommitNodeHashes = false, - showCommitNodeTooltips = false -}: GraphProps) => { - const { - paging, - rowSpacing, - setNodeSize, - isIndexVisible, - setGraphOrientation, - graphData: { graphWidth, commits } - } = useGitContext() - - useEffect(() => { - // Informs the wrapping GitContext about the - // change in certain props so other components can respond. - setNodeSize(nodeSize) - setGraphOrientation(orientation) - }, [nodeSize, orientation, setGraphOrientation, setNodeSize]) - - const { width, ref, startResizing } = useResize() - - const visibleCommits = useMemo(() => { - if (paging) { - return commits.slice(paging.startIndex, paging.endIndex) - } - - return commits - }, [commits, paging]) - - const { columnData, getEmptyColumnState, virtualColumns } = useColumnData({ - visibleCommits: visibleCommits.length - }) - - const virtualisedGraphWidth = graphWidth + virtualColumns - - const commitQuantity = useMemo(() => { - // If there is no data being shown, then we'll - // be rendering the skeleton graph placeholder which - // shows fake commits. - if (visibleCommits.length === 0) { - return placeholderCommits.length - } - - // If the index node is visible then we show one - // extra commit in the form of the index pseudo-node. - if (isIndexVisible) { - return visibleCommits.length + 1 - } - - // Else, just the number of visible commits, relative - // to the current pagination configuration. - return visibleCommits.length - }, [isIndexVisible, visibleCommits.length]) - - const contextValue = useMemo(() => ({ - showCommitNodeTooltips, - showCommitNodeHashes, - nodeTheme, - nodeSize, - graphWidth: virtualisedGraphWidth, - orientation - }), [showCommitNodeTooltips, showCommitNodeHashes, nodeTheme, nodeSize, virtualisedGraphWidth, orientation]) - - return ( - -
-
- {visibleCommits.length === 0 && ( - - )} - - {isIndexVisible && ( - - )} - - {visibleCommits.map((commit, index) => { - const empty = getEmptyColumnState() - const rowIndex = paging ? index + paging?.startIndex + 1 : index - const columns = columnData.get(rowIndex) ?? empty - - return ( - - ) - })} -
- - {enableResize && ( -
- )} -
- - ) -} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/GraphCanvas2D.tsx b/packages/library/src/modules/Graph/GraphCanvas2D.tsx new file mode 100644 index 00000000..69b7537d --- /dev/null +++ b/packages/library/src/modules/Graph/GraphCanvas2D.tsx @@ -0,0 +1,11 @@ +import { GraphCore } from 'modules/Graph/core' +import { Canvas2DGraph } from 'modules/Graph/strategies/Canvas' +import { Canvas2DGraphProps } from './types' + +export const GraphCanvas2D = (props: Canvas2DGraphProps) => { + return ( + + + + ) +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/GraphHTMLGrid.tsx b/packages/library/src/modules/Graph/GraphHTMLGrid.tsx new file mode 100644 index 00000000..7f663573 --- /dev/null +++ b/packages/library/src/modules/Graph/GraphHTMLGrid.tsx @@ -0,0 +1,11 @@ +import { GraphCore } from 'modules/Graph/core' +import { HTMLGridGraph } from 'modules/Graph/strategies/Grid' +import { HTMLGridGraphProps } from './types' + +export const GraphHTMLGrid = (props: HTMLGridGraphProps) => { + return ( + + + + ) +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/context/GraphContext.ts b/packages/library/src/modules/Graph/context/GraphContext.ts index a32b23dc..63050a23 100644 --- a/packages/library/src/modules/Graph/context/GraphContext.ts +++ b/packages/library/src/modules/Graph/context/GraphContext.ts @@ -7,5 +7,7 @@ export const GraphContext = createContext({ nodeTheme: 'default', nodeSize: 24, graphWidth: 0, - orientation: 'normal' + orientation: 'normal', + visibleCommits: [], + columnData: new Map() }) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/context/types.ts b/packages/library/src/modules/Graph/context/types.ts index 0ad5099a..7162ada5 100644 --- a/packages/library/src/modules/Graph/context/types.ts +++ b/packages/library/src/modules/Graph/context/types.ts @@ -1,24 +1,26 @@ import { NodeTheme } from 'hooks/useTheme' import { GraphOrientation } from 'modules/Graph' +import { Commit } from 'types/Commit' +import { RowIndexToColumnStates } from 'modules/Graph/strategies/Grid/hooks/useColumnData' export interface GraphContextBag { /** * Whether to show the commit hash * to the side of the node in the graph. */ - showCommitNodeHashes?: boolean + showCommitNodeHashes: boolean /** * Whether to show tooltips when hovering * over a commit node in the graph. */ - showCommitNodeTooltips?: boolean + showCommitNodeTooltips: boolean /** * The theme to apply the commit node * elements in the graph. */ - nodeTheme?: NodeTheme + nodeTheme: NodeTheme /** * The diameter, in pixels, of the @@ -47,5 +49,18 @@ export interface GraphContextBag { * right to left with the checked-out * branch on the right-hand side. */ - orientation?: GraphOrientation + orientation: GraphOrientation + + /** + * The commits that are currently being + * rendered on the graph relative to the + * pagination configuration. + */ + visibleCommits: Commit[] + + /** + * A map of row indices to their + * respective column states. + */ + columnData: RowIndexToColumnStates } \ No newline at end of file diff --git a/packages/library/src/modules/Graph/Graph.module.scss b/packages/library/src/modules/Graph/core/GraphCore.module.scss similarity index 100% rename from packages/library/src/modules/Graph/Graph.module.scss rename to packages/library/src/modules/Graph/core/GraphCore.module.scss diff --git a/packages/library/src/modules/Graph/core/GraphCore.tsx b/packages/library/src/modules/Graph/core/GraphCore.tsx new file mode 100644 index 00000000..7c829ea5 --- /dev/null +++ b/packages/library/src/modules/Graph/core/GraphCore.tsx @@ -0,0 +1,72 @@ +import { PropsWithChildren, useEffect, useMemo } from 'react' +import styles from './GraphCore.module.scss' +import { useGitContext } from 'context/GitContext' +import { useColumnData } from 'modules/Graph/strategies/Grid/hooks/useColumnData' +import { useResize } from 'hooks/useResize' +import { DEFAULT_NODE_SIZE } from 'constants/constants' +import { GraphContext, GraphContextBag } from '../context' +import { GraphCoreProps } from 'modules/Graph/core/types' + +export const GraphCore = ({ + children, + nodeSize = DEFAULT_NODE_SIZE, + nodeTheme = 'default', + orientation = 'normal', + enableResize = false, + showCommitNodeHashes = false, + showCommitNodeTooltips = false +}: PropsWithChildren) => { + const { + paging, + setNodeSize, + setGraphOrientation, + graphData: { graphWidth, commits } + } = useGitContext() + + useEffect(() => { + // Informs the wrapping GitContext about the + // change in certain props so other components can respond. + setNodeSize(nodeSize) + setGraphOrientation(orientation) + }, [nodeSize, orientation, setGraphOrientation, setNodeSize]) + + const { width, ref, startResizing } = useResize() + + const visibleCommits = useMemo(() => { + if (paging) { + return commits.slice(paging.startIndex, paging.endIndex) + } + + return commits + }, [commits, paging]) + + const { columnData, virtualColumns } = useColumnData({ + visibleCommits: visibleCommits.length + }) + + const contextValue = useMemo(() => ({ + showCommitNodeTooltips, + showCommitNodeHashes, + nodeTheme, + nodeSize, + graphWidth: graphWidth + virtualColumns, + orientation, + visibleCommits, + columnData + }), [showCommitNodeTooltips, showCommitNodeHashes, nodeTheme, nodeSize, graphWidth, virtualColumns, orientation, visibleCommits, columnData]) + + return ( + +
+ {children} + + {enableResize && ( +
+ )} +
+ + ) +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/core/index.ts b/packages/library/src/modules/Graph/core/index.ts new file mode 100644 index 00000000..ad91f294 --- /dev/null +++ b/packages/library/src/modules/Graph/core/index.ts @@ -0,0 +1 @@ +export * from './GraphCore' \ No newline at end of file diff --git a/packages/library/src/modules/Graph/core/types.ts b/packages/library/src/modules/Graph/core/types.ts new file mode 100644 index 00000000..e82bf540 --- /dev/null +++ b/packages/library/src/modules/Graph/core/types.ts @@ -0,0 +1,3 @@ +import { Canvas2DGraphProps, HTMLGridGraphProps } from 'modules/Graph' + +export type GraphCoreProps = HTMLGridGraphProps & Canvas2DGraphProps \ No newline at end of file diff --git a/packages/library/src/modules/Graph/hooks/useColumnData/types.ts b/packages/library/src/modules/Graph/hooks/useColumnData/types.ts deleted file mode 100644 index 00e00711..00000000 --- a/packages/library/src/modules/Graph/hooks/useColumnData/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' - -export interface GraphColumnDataProps { - visibleCommits: number -} - -export interface GraphColumnData { - columnData: Map - virtualColumns: number - getEmptyColumnState: () => GraphColumnState[] -} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/index.ts b/packages/library/src/modules/Graph/index.ts index 84fa652e..47ee08ee 100644 --- a/packages/library/src/modules/Graph/index.ts +++ b/packages/library/src/modules/Graph/index.ts @@ -1,2 +1,3 @@ export * from './types' -export * from './Graph' \ No newline at end of file +export * from './GraphCanvas2D' +export * from './GraphHTMLGrid' \ No newline at end of file diff --git a/packages/library/src/modules/Graph/strategies/Canvas/Canvas2DGraph.module.scss b/packages/library/src/modules/Graph/strategies/Canvas/Canvas2DGraph.module.scss new file mode 100644 index 00000000..a88f765e --- /dev/null +++ b/packages/library/src/modules/Graph/strategies/Canvas/Canvas2DGraph.module.scss @@ -0,0 +1,5 @@ +.canvas { + &:hover { + cursor: pointer; + } +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/strategies/Canvas/Canvas2DGraph.tsx b/packages/library/src/modules/Graph/strategies/Canvas/Canvas2DGraph.tsx new file mode 100644 index 00000000..537401b1 --- /dev/null +++ b/packages/library/src/modules/Graph/strategies/Canvas/Canvas2DGraph.tsx @@ -0,0 +1,170 @@ +import { useGitContext } from 'context/GitContext' +import { useGraphContext } from 'modules/Graph/context' +import { useCallback, useEffect, useRef } from 'react' +import { ROW_HEIGHT } from 'constants/constants' +import { useTheme } from 'hooks/useTheme' +import { + CanvasRenderer, + GetCanvasRendererColoursFunction +} from 'modules/Graph/strategies/Canvas/CanvasRenderer' +import { useSelectCommit } from 'hooks/useSelectCommit' +import styles from './Canvas2DGraph.module.scss' + +export const Canvas2DGraph = () => { + const { selectCommitHandler } = useSelectCommit() + const { graphWidth, visibleCommits, nodeSize, nodeTheme, orientation } = useGraphContext() + + const { + hoverColour, + shiftAlphaChannel, + getGraphColumnColour, + getCommitNodeColours, + getGraphColumnSelectedBackgroundColour + } = useTheme() + + const { + graphData, + showTable, + rowSpacing, + headCommit, + indexCommit, + isIndexVisible, + selectedCommit, + previewedCommit + } = useGitContext() + + const getNodeColours = useCallback((columnIndex: number) => { + const graphColumnColour = getGraphColumnColour(columnIndex) + + return { + commitNode: getCommitNodeColours({ + columnColour: graphColumnColour + }), + selectedColumnBackgroundColour: getGraphColumnSelectedBackgroundColour(columnIndex), + indexCommitColour: shiftAlphaChannel(graphColumnColour, 0.5) + } + }, [getCommitNodeColours, getGraphColumnColour, getGraphColumnSelectedBackgroundColour, shiftAlphaChannel]) + + const canvasRef = useRef(null) + const rendererRef = useRef(null) + + const canvasWidth = (4 + nodeSize) * graphWidth + const canvasHeight = (ROW_HEIGHT + rowSpacing) * (visibleCommits.length + (isIndexVisible ? 1 : 0)) + + useEffect(() => { + const canvas = canvasRef.current + if (!canvas) return + + const ctx = canvas.getContext('2d') + if (!ctx) return + + const dpr = window.devicePixelRatio || 1 + canvas.width = canvasWidth * dpr + canvas.height = canvasHeight * dpr + canvas.style.width = `${canvasWidth}px` + canvas.style.height = `${canvasHeight}px` + ctx.scale(dpr, dpr) + + ctx.clearRect(0, 0, canvas.width, canvas.height) + + const canvasRenderer = new CanvasRenderer({ + ctx, + nodeSize, + graphData, + nodeTheme, + showTable, + rowSpacing, + headCommit, + orientation, + canvasWidth, + canvasHeight, + indexCommit, + isIndexVisible, + commits: visibleCommits, + getColours: getNodeColours, + previewBackgroundColour: hoverColour, + selectedCommitHash: selectedCommit?.hash, + previewedCommitHash: previewedCommit?.hash + }) + + rendererRef.current = canvasRenderer + + canvasRenderer.draw() + }, [ + canvasWidth, + canvasHeight, + nodeSize, + graphData, + nodeTheme, + showTable, + rowSpacing, + orientation, + isIndexVisible, + getNodeColours, + selectedCommit?.hash, + previewedCommit?.hash, + visibleCommits, + hoverColour, + headCommit, + indexCommit + ]) + + useEffect(() => { + const canvas = canvasRef.current + if (!canvas) return + + const handleMouseMove = (e: MouseEvent) => { + if (!rendererRef.current) return + + const rect = canvas.getBoundingClientRect() + const x = e.clientX - rect.left + const y = e.clientY - rect.top + + const commit = rendererRef.current.getCommitAtPosition({ x, y }) + + const hoveredIsNotPreviewed = previewedCommit?.hash !== commit?.hash + const hoveredIsNotSelected = selectedCommit?.hash !== commit?.hash + + if (commit && hoveredIsNotPreviewed && hoveredIsNotSelected) { + selectCommitHandler.onMouseOver(commit) + } + } + + const handleMouseOut = () => { + selectCommitHandler.onMouseOut() + } + + const handleClick = (e: MouseEvent) => { + if (!rendererRef.current) return + + const rect = canvas.getBoundingClientRect() + const x = e.clientX - rect.left + const y = e.clientY - rect.top + + const commit = rendererRef.current.getCommitAtPosition({ x, y }) + + if (commit) { + selectCommitHandler.onClick(commit) + } + } + + canvas.addEventListener('mousemove', handleMouseMove) + canvas.addEventListener('mouseout', handleMouseOut) + canvas.addEventListener('click', handleClick) + + return () => { + canvas.removeEventListener('mousemove', handleMouseMove) + canvas.removeEventListener('mouseout', handleMouseOut) + canvas.removeEventListener('click', handleClick) + } + }, [previewedCommit?.hash, selectCommitHandler, selectedCommit?.hash]) + + return ( + + ) +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/strategies/Canvas/CanvasRenderer.ts b/packages/library/src/modules/Graph/strategies/Canvas/CanvasRenderer.ts new file mode 100644 index 00000000..d458023f --- /dev/null +++ b/packages/library/src/modules/Graph/strategies/Canvas/CanvasRenderer.ts @@ -0,0 +1,370 @@ +import { Commit } from 'types/Commit' +import { CommitNodeLocation, GraphData } from 'data' +import { CommitNodeColours, NodeTheme } from 'hooks/useTheme' +import { NODE_BORDER_WIDTH, ROW_HEIGHT } from 'constants/constants' +import { getMergeNodeInnerSize } from 'modules/Graph/utils/getMergeNodeInnerSize' +import { GraphOrientation } from 'modules/Graph' +import { getColumnBackgroundSize } from 'modules/Graph/utils/getColumnBackgroundSize' +import { MousePosition } from 'modules/Graph/strategies/Canvas/types' + +export interface CanvasRendererProps { + ctx: CanvasRenderingContext2D + commits: Commit[] + rowSpacing: number + graphData: GraphData + nodeSize: number + nodeTheme: NodeTheme + canvasHeight: number + canvasWidth: number + showTable: boolean + selectedCommitHash?: string + previewedCommitHash?: string + previewBackgroundColour: string + orientation: GraphOrientation + isIndexVisible: boolean + indexCommit?: Commit + headCommit?: Commit + getColours: GetCanvasRendererColoursFunction +} + +export type GetCanvasRendererColoursFunction = (columnIndex: number) => CanvasRenderersColours + +export interface CanvasRenderersColours { + commitNode: CommitNodeColours + selectedColumnBackgroundColour: string + indexCommitColour: string +} + +export class CanvasRenderer { + private readonly ctx: CanvasRenderingContext2D + + private readonly commits: Commit[] + private readonly graphData: GraphData + private readonly rowToCommitHash = new Map + private readonly rowToCommitColumn = new Map + + private readonly nodeSize: number + private readonly nodeTheme: NodeTheme + private readonly rowSpacing: number + private readonly orientation: GraphOrientation + private readonly isIndexVisible: boolean + private readonly showTable: boolean + + private readonly canvasHeight: number + private readonly canvasWidth: number + + private readonly getColours: GetCanvasRendererColoursFunction + private readonly previewBackgroundColour: string + + private readonly previewedCommitHash: string | undefined + private readonly selectedCommitHash: string | undefined + private readonly headCommit: Commit | undefined + private readonly indexCommit: Commit | undefined + private readonly indexCommitLocation: CommitNodeLocation = [0, 0] + + constructor(props: CanvasRendererProps) { + this.ctx = props.ctx + this.commits = props.commits + this.rowSpacing = props.rowSpacing + this.graphData = props.graphData + this.nodeSize = props.nodeSize + this.nodeTheme = props.nodeTheme + this.orientation = props.orientation + this.isIndexVisible = props.isIndexVisible + this.showTable = props.showTable + this.getColours = props.getColours + this.canvasHeight = props.canvasHeight + this.canvasWidth = props.canvasWidth + this.previewedCommitHash = props.previewedCommitHash + this.selectedCommitHash = props.selectedCommitHash + this.headCommit = props.headCommit + this.indexCommit = props.indexCommit + this.previewBackgroundColour = props.previewBackgroundColour; + + [...props.graphData.positions.entries()].forEach(([hash, location]) => { + this.rowToCommitColumn.set(location[0], location[1]) + this.rowToCommitHash.set(location[0], hash) + }) + } + + public draw() { + this.ctx.lineWidth = NODE_BORDER_WIDTH + + // Backgrounds are drawn first so they're underneath other elements + if (this.previewedCommitHash) { + this.drawColumnBackground(this.previewedCommitHash, this.previewBackgroundColour) + } + + // Backgrounds are drawn first so they're underneath other elements + if (this.selectedCommitHash) { + const backgroundColour = this.getSelectedCommitBackgroundColour(this.selectedCommitHash) + this.drawColumnBackground(this.selectedCommitHash, backgroundColour) + } + + if (this.isIndexVisible) { + this.drawGitIndex() + } + + // Then edges, so they sit under the commit nodes + this.drawEdges() + + // Then finally the commit nodes on top + this.drawCommitNodes() + } + + public getCommitAtPosition(position: MousePosition) { + const location = this.getRowColFromCoordinates(position.x, position.y) + + if (location !== null) { + if (location.rowIndex === 0 && this.indexCommit) { + return this.indexCommit + } + + const commitHash = this.rowToCommitHash.get(location.rowIndex) + return commitHash ? this.graphData.hashToCommit.get(commitHash) : undefined + } + + return undefined + } + + private drawGitIndex() { + const [x, y] = this.indexCommitLocation + const lineDash = [2, 2] + + this.ctx.beginPath() + + const { x: xStart, y: yStart } = this.getNodeCoordinates(x, y) + this.ctx.moveTo(xStart, yStart) + + const [headRow, headCol] = this.graphData.positions.get(this.headCommit!.hash)! + const { x: xHead, y: yHead } = this.getNodeCoordinates(headRow, headCol) + + this.ctx.lineTo(xHead, yHead) + this.ctx.strokeStyle = this.getColours(y).indexCommitColour + this.ctx.setLineDash(lineDash) + this.ctx.stroke() + + this.ctx.beginPath() + this.drawCommitNode(x, y, lineDash, true) + this.ctx.fill() + } + + private drawColumnBackground(commitHash: string, colour: string) { + const location = commitHash === 'index' + ? this.indexCommitLocation + : this.graphData.positions.get(commitHash) + + if (!location) { + return + } + + const rowIndex = location[0] + const gitIndexColumn = this.normaliseColumnIndex(0) + const nodeColumn = commitHash === 'index' ? gitIndexColumn : this.rowToCommitColumn.get(rowIndex)! + const nodeCoordinates = this.getNodeCoordinates(rowIndex, nodeColumn) + + if (this.showTable) { + const height = ROW_HEIGHT - 4 // Doesn't seem to be correct in the canvas + const leftOffset = 8 + const cornerRadius = height / 2 + const nodeRadius = this.nodeSize / 2 + const x = nodeCoordinates.x - nodeRadius - leftOffset + const y = nodeCoordinates.y - (height / 2) + + this.ctx.beginPath() + this.ctx.moveTo(x + cornerRadius, y) + this.ctx.lineTo(this.canvasWidth, y) + this.ctx.lineTo(this.canvasWidth, y + height) + this.ctx.lineTo(x + cornerRadius, y + height) + this.ctx.arcTo(x, y + height, x, y + height - cornerRadius, cornerRadius) + this.ctx.lineTo(x, y + cornerRadius) + this.ctx.arcTo(x, y, x + cornerRadius, y, cornerRadius) + this.ctx.closePath() + this.ctx.globalAlpha = 1 + this.ctx.fillStyle = colour + this.ctx.fill() + } else { + const radius = getColumnBackgroundSize({ nodeSize: this.nodeSize }) + + this.ctx.beginPath() + this.ctx.arc(nodeCoordinates.x, nodeCoordinates.y, radius, 0, 2 * Math.PI) + this.ctx.closePath() + this.ctx.fillStyle = colour + this.ctx.fill() + } + } + + private drawCommitNodes() { + this.graphData.positions.forEach(([rowIndex, columnIndex], hash) => { + this.drawCommitNode(rowIndex, columnIndex) + + const commit = this.graphData.hashToCommit.get(hash)! + const isMergeCommit = commit.parents.length > 1 && this.nodeTheme === 'default' + if (isMergeCommit) { + this.drawMergeNodeInner(rowIndex, columnIndex) + } + }) + } + + private drawEdges() { + this.graphData.edges.search(0, this.commits.length).forEach(([[rowStart, colStart], [rowEnd, colEnd], edgeType]) => { + this.ctx.beginPath() + + const { x: x0, y: y0, r } = this.getNodeCoordinates(rowStart, colStart) + const { x: x1, y: y1 } = this.getNodeCoordinates(rowEnd, colEnd) + + this.ctx.moveTo(x0, y0) + + const strokeColumn = colStart != colEnd && edgeType === 'Merge' ? colEnd : colStart + const strokeColour = this.getColours(strokeColumn).commitNode.borderColour + + const edgeIsTargetingOffScreenNode = rowEnd > this.commits.length + + if (edgeIsTargetingOffScreenNode) { + this.ctx.strokeStyle = this.createFadeGradient(x1, x0, y1, y0, strokeColour) + } else { + this.ctx.strokeStyle = strokeColour + } + + // If we're drawing a line between two nodes that + // are in different branches (columns) + if (colStart !== colEnd) { + const isNormalOrientation = this.orientation === 'normal' + const isMerge = edgeType === 'Merge' + const isForward = colStart < colEnd + + const dir = isForward ? 1 : -1 + const flip = isNormalOrientation ? 1 : -1 + + if (isMerge) { + this.ctx.lineTo(x1 - r * dir * flip, y0) + this.ctx.quadraticCurveTo(x1, y0, x1, y0 + r) + } else { + this.ctx.lineTo(x0, y1 - r) + this.ctx.quadraticCurveTo(x0, y1, x0 + r * dir * flip, y1) + } + } + + // Else, we're drawing a straight line down one column. + if (edgeIsTargetingOffScreenNode) { + this.ctx.lineTo(x1, this.canvasHeight) + } else { + this.ctx.lineTo(x1, y1) + } + + this.ctx.setLineDash([]) + this.ctx.stroke() + }) + } + + private createFadeGradient(x1: number, x0: number, y1: number, y0: number, strokeColour: string) { + const dx = x1 - x0 + const dy = y1 - y0 + const length = Math.hypot(dx, dy) + + const ux = dx / length + const uy = dy / length + + const fadeLength = ROW_HEIGHT + const fadeStartX = x1 - ux * fadeLength + const fadeStartY = y1 - uy * fadeLength + + const gradient = this.ctx.createLinearGradient(fadeStartX, fadeStartY, x1, y1) + gradient.addColorStop(0, strokeColour) + gradient.addColorStop(1, 'rgba(0, 0, 0, 0)') + + return gradient + } + + private getNodeCoordinates(rowIndex: number, columnIndex: number) { + const xOffset = 4 + const leftOffset = (this.nodeSize / 2) + NODE_BORDER_WIDTH + const normalisedColIndex = this.normaliseColumnIndex(columnIndex) + const x = leftOffset + ((xOffset + this.nodeSize) * normalisedColIndex) + + const yOffset = (ROW_HEIGHT / 2) + this.rowSpacing + const rowIndex2 = this.isIndexVisible ? rowIndex : rowIndex - 1 + const y = yOffset + (rowIndex2 * ROW_HEIGHT) + + const nodeRadius = this.nodeSize / 2 // nodeSize is diameter + + return { + x, + y, + r: nodeRadius + } + } + + private getRowColFromCoordinates(x: number, y: number): { rowIndex: number, columnIndex: number } | null { + const xOffset = 4 + const leftOffset = (this.nodeSize / 2) + NODE_BORDER_WIDTH + const nodeStrideX = this.nodeSize + xOffset + + const yOffset = (ROW_HEIGHT / 2) + this.rowSpacing + const nodeStrideY = ROW_HEIGHT + + const columnIndex = Math.floor((x - leftOffset + (nodeStrideX / 2)) / nodeStrideX) + if (columnIndex < 0 || columnIndex >= this.graphData.graphWidth) { + return null + } + + const normalisedColIndex = this.normaliseColumnIndex(columnIndex) + + const rawRowIndex = Math.floor((y - yOffset + (ROW_HEIGHT / 2)) / nodeStrideY) + const rowIndex = this.isIndexVisible ? rawRowIndex : rawRowIndex + 1 + + if (rowIndex < 0 || rowIndex >= this.canvasHeight) { + return null + } + + return { + rowIndex, + columnIndex: normalisedColIndex + } + } + + private drawCommitNode(rowIndex: number, columnIndex: number, lineStyle: number[] = [], isIndex: boolean = false) { + this.ctx.beginPath() + + const { x, y, r } = this.getNodeCoordinates(rowIndex, columnIndex) + this.ctx.arc(x, y, r, 0, 2 * Math.PI) + + const defaultColours = this.getColours(columnIndex) + const { backgroundColour, borderColour } = isIndex + ? { backgroundColour: defaultColours.commitNode.backgroundColour, borderColour: defaultColours.indexCommitColour } + : defaultColours.commitNode + + this.ctx.fillStyle = backgroundColour + this.ctx.fill() + + this.ctx.strokeStyle = borderColour + this.ctx.setLineDash(lineStyle) + this.ctx.stroke() + } + + private drawMergeNodeInner(rowIndex: number, columnIndex: number) { + this.ctx.beginPath() + const { x, y } = this.getNodeCoordinates(rowIndex, columnIndex) + const innerDiameter = getMergeNodeInnerSize({ nodeSize: this.nodeSize }) + this.ctx.arc(x, y, innerDiameter / 2, 0, 2 * Math.PI) + + const { borderColour } = this.getColours(columnIndex).commitNode + this.ctx.fillStyle = borderColour + this.ctx.fill() + } + + private getSelectedCommitBackgroundColour(hash: string) { + if (hash === 'index') { + return this.getColours(0).selectedColumnBackgroundColour + } + + const commitColourIndex = this.graphData.positions.get(hash)![1] + return this.getColours(commitColourIndex).selectedColumnBackgroundColour + } + + private normaliseColumnIndex(columnIndex: number) { + return this.orientation === 'normal' + ? columnIndex + : this.graphData.graphWidth - 1 - columnIndex + } +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/strategies/Canvas/index.ts b/packages/library/src/modules/Graph/strategies/Canvas/index.ts new file mode 100644 index 00000000..044a7439 --- /dev/null +++ b/packages/library/src/modules/Graph/strategies/Canvas/index.ts @@ -0,0 +1 @@ +export * from './Canvas2DGraph' \ No newline at end of file diff --git a/packages/library/src/modules/Graph/strategies/Canvas/types.ts b/packages/library/src/modules/Graph/strategies/Canvas/types.ts new file mode 100644 index 00000000..d21595e1 --- /dev/null +++ b/packages/library/src/modules/Graph/strategies/Canvas/types.ts @@ -0,0 +1,4 @@ +export interface MousePosition { + x: number + y: number +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/strategies/Grid/HTMLGridGraph.tsx b/packages/library/src/modules/Graph/strategies/Grid/HTMLGridGraph.tsx new file mode 100644 index 00000000..681468ef --- /dev/null +++ b/packages/library/src/modules/Graph/strategies/Grid/HTMLGridGraph.tsx @@ -0,0 +1,67 @@ +import styles from 'modules/Graph/core/GraphCore.module.scss' +import { ROW_HEIGHT } from 'constants/constants' +import { SkeletonGraph } from 'modules/Graph/strategies/Grid/components/SkeletonGraph' +import { IndexPseudoRow } from 'modules/Graph/strategies/Grid/components/IndexPseudoRow' +import { GraphRow } from 'modules/Graph/strategies/Grid/components/GraphRow' +import { useGraphContext } from 'modules/Graph/context' +import { useGitContext } from 'context/GitContext' +import { getEmptyColumnState } from 'modules/Graph/strategies/Grid/utility/getEmptyColumnState' +import { useMemo } from 'react' +import { placeholderCommits } from 'modules/Graph/strategies/Grid/hooks/usePlaceholderData/data' + +export const HTMLGridGraph = () => { + const { isIndexVisible, rowSpacing, paging } = useGitContext() + const { graphWidth, visibleCommits, columnData } = useGraphContext() + + const commitQuantity = useMemo(() => { + // If there is no data being shown, then we'll + // be rendering the skeleton graph placeholder which + // shows fake commits. + if (visibleCommits.length === 0) { + return placeholderCommits.length + } + + // If the index node is visible then we show one + // extra commit in the form of the index pseudo-node. + if (isIndexVisible) { + return visibleCommits.length + 1 + } + + // Else, just the number of visible commits, relative + // to the current pagination configuration. + return visibleCommits.length + }, [isIndexVisible, visibleCommits.length]) + + return ( +
+ {visibleCommits.length === 0 && ( + + )} + + {isIndexVisible && ( + + )} + + {visibleCommits.map((commit, index) => { + const empty = getEmptyColumnState({ columns: graphWidth }) + const rowIndex = paging ? index + paging?.startIndex + 1 : index + const columns = columnData.get(rowIndex) ?? empty + + return ( + + ) + })} +
+ ) +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.module.scss b/packages/library/src/modules/Graph/strategies/Grid/components/ColumnBackground/ColumnBackground.module.scss similarity index 100% rename from packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.module.scss rename to packages/library/src/modules/Graph/strategies/Grid/components/ColumnBackground/ColumnBackground.module.scss diff --git a/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/ColumnBackground/ColumnBackground.tsx similarity index 92% rename from packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/ColumnBackground/ColumnBackground.tsx index 8bbb5351..92aa5e6a 100644 --- a/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/ColumnBackground/ColumnBackground.tsx @@ -5,14 +5,14 @@ import { CSSProperties, useMemo } from 'react' import { BACKGROUND_HEIGHT_OFFSET, ROW_HEIGHT } from 'constants/constants' import { useGitContext } from 'context/GitContext' import { useGraphContext } from 'modules/Graph/context' +import { getColumnBackgroundSize } from 'modules/Graph/utils/getColumnBackgroundSize' export const ColumnBackground = ({ id, index, colour, commitNodeIndex }: ColumnBackgroundProps) => { const { showTable } = useGitContext() const { nodeSize, orientation } = useGraphContext() const style = useMemo(() => { - // 4 or 8 pixels either side of the node - const offset = (nodeSize <= 16 ? 6 : 8) * 2 + const offset = getColumnBackgroundSize({ nodeSize }) if (!showTable) { const backgroundSize = nodeSize + offset diff --git a/packages/library/src/modules/Graph/components/ColumnBackground/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/ColumnBackground/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/ColumnBackground/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/ColumnBackground/index.ts diff --git a/packages/library/src/modules/Graph/components/ColumnBackground/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/ColumnBackground/types.ts similarity index 100% rename from packages/library/src/modules/Graph/components/ColumnBackground/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/ColumnBackground/types.ts diff --git a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.module.scss b/packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/CommitNode.module.scss similarity index 100% rename from packages/library/src/modules/Graph/components/CommitNode/CommitNode.module.scss rename to packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/CommitNode.module.scss diff --git a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.spec.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/CommitNode.spec.tsx similarity index 90% rename from packages/library/src/modules/Graph/components/CommitNode/CommitNode.spec.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/CommitNode.spec.tsx index 3ba4db29..289f73cf 100644 --- a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.spec.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/CommitNode.spec.tsx @@ -5,7 +5,7 @@ import * as themeHook from 'hooks/useTheme' import { commit, gitContextBag, graphContextBag, themeFunctions } from 'test/stubs' import { render, screen, waitFor } from '@testing-library/react' import { userEvent } from '@testing-library/user-event' -import { CommitNode } from 'modules/Graph/components/CommitNode/CommitNode' +import { CommitNode } from 'modules/Graph/strategies/Grid/components/CommitNode/CommitNode' import { commitNode } from 'test/elements/CommitNode' import { expect } from 'vitest' @@ -125,7 +125,7 @@ describe('CommitNode', () => { expect(hashLabelStyle.color).toBe(expectedTextColour) expect(hashLabelStyle.top).toBe('calc(50% - 10px)') expect(hashLabelStyle.height).toBe('20px') - expect(hashLabelStyle.left).toBe('calc(50% + 12px + 5px)') + expect(hashLabelStyle.left).toBe('calc(50% + 17px)') expect(hashLabelStyle.background).toBe('rgb(26, 26, 26)') }) @@ -210,7 +210,15 @@ describe('CommitNode', () => { } }) - vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions()) + const expectedBackgroundColour = 'rgb(56, 79, 240)' + const expectedBorderColour = 'rgb(28, 66, 146)' + const getCommitNodeColours = vi.fn().mockReturnValue({ + backgroundColour: expectedBackgroundColour, + borderColour: expectedBorderColour + }) + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ + getCommitNodeColours: getCommitNodeColours + })) const commitObject = commit({ hash: '0e22d17a', @@ -230,7 +238,8 @@ describe('CommitNode', () => { const mergeCircle = commitNode.mergeCircle({ hash: '0e22d17a' }) expect(mergeCircle).toBeInTheDocument() - expect(getComputedStyle(mergeCircle).background).toBe(commitColour) + expect(getCommitNodeColours).toHaveBeenCalledWith({ columnColour: commitColour }) + expect(getComputedStyle(mergeCircle).background).toBe(expectedBorderColour) }) it('should not render an inner circle element when the commit is a merge commit but the node theme is plain', async () => { @@ -278,9 +287,13 @@ describe('CommitNode', () => { }) const expectedNodeBackgroundColour = 'rgb(254, 200, 67)' - const shiftAlphaChannel = vi.fn().mockReturnValue(expectedNodeBackgroundColour) + const expectedNodeBorderColour = 'rgb(28, 66, 146)' + const getCommitNodeColours = vi.fn().mockReturnValue({ + backgroundColour: expectedNodeBackgroundColour, + borderColour: expectedNodeBorderColour + }) vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ - shiftAlphaChannel + getCommitNodeColours: getCommitNodeColours })) const commitColour = 'rgb(78, 12, 90)' @@ -292,7 +305,7 @@ describe('CommitNode', () => { /> ) - expect(shiftAlphaChannel).toHaveBeenCalledWith(commitColour, 0.15) + expect(getCommitNodeColours).toHaveBeenCalledWith({ columnColour: commitColour }) const commitNodeElement = commitNode.withHash({ hash: 'abc123' }) expect(commitNodeElement).toBeInTheDocument() @@ -300,7 +313,7 @@ describe('CommitNode', () => { const commitNodeStyle = getComputedStyle(commitNodeElement) expect(commitNodeStyle.backgroundColor).toBe(expectedNodeBackgroundColour) expect(commitNodeStyle.borderWidth).toBe('2px') - expect(commitNodeStyle.borderColor).toBe(commitColour) + expect(commitNodeStyle.borderColor).toBe(expectedNodeBorderColour) expect(commitNodeStyle.borderStyle).toBe('solid') }) diff --git a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/CommitNode.tsx similarity index 86% rename from packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/CommitNode.tsx index a884cce6..f07c4b63 100644 --- a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/CommitNode.tsx @@ -8,16 +8,18 @@ import { useSelectCommit } from 'hooks/useSelectCommit' import { NODE_BORDER_WIDTH } from 'constants/constants' import { useGraphContext } from 'modules/Graph/context' import { useGitContext } from 'context/GitContext' +import { getMergeNodeInnerSize } from 'modules/Graph/utils/getMergeNodeInnerSize' export const CommitNode = ({ commit, colour }: CommitNodeProps) => { const { selectCommitHandler } = useSelectCommit() const { remoteProviderUrlBuilder } = useGitContext() - const { textColour, shiftAlphaChannel, theme } = useTheme() + const { textColour, theme, getCommitNodeColours } = useTheme() const { showCommitNodeTooltips, showCommitNodeHashes, nodeTheme, nodeSize } = useGraphContext() const commitHashLabelHeight = 20 const isMergeCommit = nodeTheme === 'default' && commit.parents.length > 1 const commitUrl = remoteProviderUrlBuilder?.({ commit })?.commit + const { borderColour, backgroundColour } = getCommitNodeColours({ columnColour: colour }) const [showTooltip, setShowTooltip] = useState(false) @@ -35,21 +37,21 @@ export const CommitNode = ({ commit, colour }: CommitNodeProps) => { return { width: nodeSize, height: nodeSize, - backgroundColor: shiftAlphaChannel(colour, 0.15), - border: `${NODE_BORDER_WIDTH}px solid ${colour}`, + backgroundColor: backgroundColour, + border: `${NODE_BORDER_WIDTH}px solid ${borderColour}`, } - }, [colour, nodeSize, shiftAlphaChannel]) + }, [borderColour, nodeSize, backgroundColour]) const mergeInnerNodeStyles = useMemo(() => { - const diameter = nodeSize > 10 ? nodeSize - 6 : nodeSize - 2 + const diameter = getMergeNodeInnerSize({ nodeSize }) return { - background: colour, + background: borderColour, width: diameter, height: diameter, top: `calc(50% - ${diameter / 2}px)`, left: `calc(50% - ${diameter / 2}px)` } - }, [colour, nodeSize]) + }, [borderColour, nodeSize]) const handleClickNode = useCallback(() => { selectCommitHandler.onClick(commit) @@ -68,14 +70,14 @@ export const CommitNode = ({ commit, colour }: CommitNodeProps) => { content={({ position, childRect, popoverRect }: PopoverState) => ( )} diff --git a/packages/library/src/modules/Graph/components/CommitNode/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/CommitNode/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/index.ts diff --git a/packages/library/src/modules/Graph/components/CommitNode/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/types.ts similarity index 100% rename from packages/library/src/modules/Graph/components/CommitNode/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/CommitNode/types.ts diff --git a/packages/library/src/modules/Graph/components/CommitNodeTooltip/CommitNodeTooltip.module.scss b/packages/library/src/modules/Graph/strategies/Grid/components/CommitNodeTooltip/CommitNodeTooltip.module.scss similarity index 100% rename from packages/library/src/modules/Graph/components/CommitNodeTooltip/CommitNodeTooltip.module.scss rename to packages/library/src/modules/Graph/strategies/Grid/components/CommitNodeTooltip/CommitNodeTooltip.module.scss diff --git a/packages/library/src/modules/Graph/components/CommitNodeTooltip/CommitNodeTooltip.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/CommitNodeTooltip/CommitNodeTooltip.tsx similarity index 100% rename from packages/library/src/modules/Graph/components/CommitNodeTooltip/CommitNodeTooltip.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/CommitNodeTooltip/CommitNodeTooltip.tsx diff --git a/packages/library/src/modules/Graph/components/CommitNodeTooltip/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/CommitNodeTooltip/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/CommitNodeTooltip/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/CommitNodeTooltip/index.ts diff --git a/packages/library/src/modules/Graph/components/CommitNodeTooltip/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/CommitNodeTooltip/types.ts similarity index 100% rename from packages/library/src/modules/Graph/components/CommitNodeTooltip/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/CommitNodeTooltip/types.ts diff --git a/packages/library/src/modules/Graph/components/CurvedEdge/CurvedEdge.module.scss b/packages/library/src/modules/Graph/strategies/Grid/components/CurvedEdge/CurvedEdge.module.scss similarity index 100% rename from packages/library/src/modules/Graph/components/CurvedEdge/CurvedEdge.module.scss rename to packages/library/src/modules/Graph/strategies/Grid/components/CurvedEdge/CurvedEdge.module.scss diff --git a/packages/library/src/modules/Graph/components/CurvedEdge/CurvedEdge.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/CurvedEdge/CurvedEdge.tsx similarity index 100% rename from packages/library/src/modules/Graph/components/CurvedEdge/CurvedEdge.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/CurvedEdge/CurvedEdge.tsx diff --git a/packages/library/src/modules/Graph/components/CurvedEdge/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/CurvedEdge/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/CurvedEdge/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/CurvedEdge/index.ts diff --git a/packages/library/src/modules/Graph/components/CurvedEdge/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/CurvedEdge/types.ts similarity index 100% rename from packages/library/src/modules/Graph/components/CurvedEdge/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/CurvedEdge/types.ts diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.module.scss b/packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/GraphColumn.module.scss similarity index 90% rename from packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.module.scss rename to packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/GraphColumn.module.scss index 9342ecc4..d5588f07 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.module.scss +++ b/packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/GraphColumn.module.scss @@ -3,7 +3,6 @@ align-items: center; justify-content: center; position: relative; - width: 100%; &:hover { cursor: pointer; diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/GraphColumn.spec.tsx similarity index 95% rename from packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/GraphColumn.spec.tsx index 9f5f49f8..867ab0e7 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/GraphColumn.spec.tsx @@ -342,13 +342,10 @@ describe('GraphColumn', () => { const commitNodeIndex = 3 const expectedColour = 'rgb(123, 123, 123)' - const graphColumnColour = 'graph-column-colour' - const getGraphColumnColour = vi.fn().mockReturnValue(graphColumnColour) - const reduceOpacity = vi.fn().mockReturnValue(expectedColour) + const getGraphColumnSelectedBackgroundColour = vi.fn().mockReturnValue(expectedColour) vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ - getGraphColumnColour, - reduceOpacity + getGraphColumnSelectedBackgroundColour })) render( @@ -361,8 +358,7 @@ describe('GraphColumn', () => { /> ) - expect(getGraphColumnColour).toHaveBeenCalledWith(commitNodeIndex) - expect(reduceOpacity).toHaveBeenCalledWith(graphColumnColour, 0.15) + expect(getGraphColumnSelectedBackgroundColour).toHaveBeenCalledWith(commitNodeIndex) const background = graphColumn.withSelectedBackground({ column: 5 }) expect(background).toBeInTheDocument() @@ -522,7 +518,7 @@ describe('GraphColumn', () => { expect(backgroundStyle.right).toBe('0px') expect(backgroundStyle.borderTopLeftRadius).toBe('50%') expect(backgroundStyle.borderBottomLeftRadius).toBe('50%') - expect(backgroundStyle.width).toBe('calc(50% + 12px + 8px)') + expect(backgroundStyle.width).toBe('calc(50% + 20px)') expect(backgroundStyle.background).toBe(expectedBackgroundColour) expect(backgroundStyle.height).toBe('40px') @@ -629,6 +625,8 @@ describe('GraphColumn', () => { const getGraphColumnColour = vi.fn() vi.spyOn(themeHook, 'useTheme').mockReturnValue({ getGraphColumnColour, + getGraphColumnSelectedBackgroundColour: vi.fn(), + getCommitNodeColours: vi.fn(), shiftAlphaChannel: vi.fn(), hoverColour: 'hoverColour', theme: 'dark', @@ -689,17 +687,9 @@ describe('GraphColumn', () => { it('should render a dotted left-down curve if the column has a left down curve element and is a placeholder', () => { const shiftAlphaChannel = vi.fn() - vi.spyOn(themeHook, 'useTheme').mockReturnValue({ - getGraphColumnColour: vi.fn(), - shiftAlphaChannel, - hoverColour: 'hoverColour', - theme: 'dark', - textColour: 'textColour', - reduceOpacity: vi.fn(), - getCommitColour: vi.fn(), - getTooltipBackground: vi.fn(), - hoverTransitionDuration: 500 - }) + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ + shiftAlphaChannel + })) const placeholderColour = 'rgb(255, 255, 255)' shiftAlphaChannel.mockReturnValue(placeholderColour) @@ -749,17 +739,9 @@ describe('GraphColumn', () => { describe('Left Up Curve', () => { it('should render a left-up curve if the column has a left up curve element', () => { const getGraphColumnColour = vi.fn() - vi.spyOn(themeHook, 'useTheme').mockReturnValue({ - getGraphColumnColour, - shiftAlphaChannel: vi.fn(), - hoverColour: 'hoverColour', - theme: 'dark', - textColour: 'textColour', - reduceOpacity: vi.fn(), - getCommitColour: vi.fn(), - getTooltipBackground: vi.fn(), - hoverTransitionDuration: 500 - }) + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ + getGraphColumnColour + })) const graphColumnColour = 'rgb(124, 6, 168)' getGraphColumnColour.mockReturnValue(graphColumnColour) @@ -811,17 +793,9 @@ describe('GraphColumn', () => { it('should render a dotted left-up curve if the column has a left up curve element and is a placeholder', () => { const shiftAlphaChannel = vi.fn() - vi.spyOn(themeHook, 'useTheme').mockReturnValue({ - getGraphColumnColour: vi.fn(), - shiftAlphaChannel, - hoverColour: 'hoverColour', - theme: 'dark', - textColour: 'textColour', - reduceOpacity: vi.fn(), - getCommitColour: vi.fn(), - getTooltipBackground: vi.fn(), - hoverTransitionDuration: 500 - }) + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ + shiftAlphaChannel + })) const placeholderColour = 'rgb(255, 255, 255)' shiftAlphaChannel.mockReturnValue(placeholderColour) diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/GraphColumn.tsx similarity index 87% rename from packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/GraphColumn.tsx index f5333712..2af68c04 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/GraphColumn.tsx @@ -1,17 +1,17 @@ import { GraphColumnProps } from './types' -import { CommitNode } from 'modules/Graph/components/CommitNode' +import { CommitNode } from 'modules/Graph/strategies/Grid/components/CommitNode' import styles from './GraphColumn.module.scss' import { useTheme } from 'hooks/useTheme' import { CSSProperties, useMemo } from 'react' import { useGitContext } from 'context/GitContext' import { useSelectCommit } from 'hooks/useSelectCommit' -import { ColumnBackground } from 'modules/Graph/components/ColumnBackground' -import { LeftDownCurve } from 'modules/Graph/components/LeftDownCurve' -import { LeftUpCurve } from 'modules/Graph/components/LeftUpCurve' -import { HorizontalLine } from 'modules/Graph/components/HorizontalLine' -import { VerticalLine } from 'modules/Graph/components/VerticalLine' -import { HeadCommitVerticalLine } from 'src/modules/Graph/components/HeadCommitVerticalLine' -import { IndexPseudoCommitNode } from 'modules/Graph/components/IndexPseudoCommitNode' +import { ColumnBackground } from 'modules/Graph/strategies/Grid/components/ColumnBackground' +import { LeftDownCurve } from 'modules/Graph/strategies/Grid/components/LeftDownCurve' +import { LeftUpCurve } from 'modules/Graph/strategies/Grid/components/LeftUpCurve' +import { HorizontalLine } from 'modules/Graph/strategies/Grid/components/HorizontalLine' +import { VerticalLine } from 'modules/Graph/strategies/Grid/components/VerticalLine' +import { HeadCommitVerticalLine } from 'modules/Graph/strategies/Grid/components/HeadCommitVerticalLine' +import { IndexPseudoCommitNode } from 'modules/Graph/strategies/Grid/components/IndexPseudoCommitNode' import { useGraphContext } from 'modules/Graph/context' export const GraphColumn = ({ @@ -24,7 +24,7 @@ export const GraphColumn = ({ const { selectCommitHandler } = useSelectCommit() const { nodeSize, orientation } = useGraphContext() const { headCommit, selectedCommit, previewedCommit, showTable } = useGitContext() - const { getGraphColumnColour, shiftAlphaChannel, textColour, hoverColour, reduceOpacity } = useTheme() + const { getGraphColumnColour, shiftAlphaChannel, textColour, hoverColour, getGraphColumnSelectedBackgroundColour } = useTheme() const columnColour = state.isPlaceholderSkeleton ? shiftAlphaChannel(textColour, 0.8) @@ -144,7 +144,7 @@ export const GraphColumn = ({ commitNodeIndex={commitNodeIndex} colour={state.isPlaceholderSkeleton ? hoverColour - : reduceOpacity(getGraphColumnColour(commitNodeIndex), 0.15) + : getGraphColumnSelectedBackgroundColour(commitNodeIndex) } /> )} diff --git a/packages/library/src/modules/Graph/components/GraphColumn/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/GraphColumn/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/index.ts diff --git a/packages/library/src/modules/Graph/components/GraphColumn/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/types.ts similarity index 100% rename from packages/library/src/modules/Graph/components/GraphColumn/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/GraphColumn/types.ts diff --git a/packages/library/src/modules/Graph/components/GraphRow/GraphRow.spec.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/GraphRow/GraphRow.spec.tsx similarity index 100% rename from packages/library/src/modules/Graph/components/GraphRow/GraphRow.spec.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/GraphRow/GraphRow.spec.tsx diff --git a/packages/library/src/modules/Graph/components/GraphRow/GraphRow.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/GraphRow/GraphRow.tsx similarity index 83% rename from packages/library/src/modules/Graph/components/GraphRow/GraphRow.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/GraphRow/GraphRow.tsx index 4500eff5..91a112e2 100644 --- a/packages/library/src/modules/Graph/components/GraphRow/GraphRow.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/GraphRow/GraphRow.tsx @@ -1,6 +1,6 @@ import { GraphRowProps } from './types' -import { GraphColumn } from 'modules/Graph/components/GraphColumn' -import { getEmptyColumnState } from 'modules/Graph/utility/getEmptyColumnState' +import { GraphColumn } from 'modules/Graph/strategies/Grid/components/GraphColumn' +import { getEmptyColumnState } from 'modules/Graph/strategies/Grid/utility/getEmptyColumnState' import { useGraphContext } from 'modules/Graph/context' export const GraphRow = ({ id, commit, columns }: GraphRowProps) => { diff --git a/packages/library/src/modules/Graph/components/GraphRow/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/GraphRow/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/GraphRow/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/GraphRow/index.ts diff --git a/packages/library/src/modules/Graph/components/GraphRow/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/GraphRow/types.ts similarity index 60% rename from packages/library/src/modules/Graph/components/GraphRow/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/GraphRow/types.ts index e8a7fd7d..46399361 100644 --- a/packages/library/src/modules/Graph/components/GraphRow/types.ts +++ b/packages/library/src/modules/Graph/strategies/Grid/components/GraphRow/types.ts @@ -1,5 +1,5 @@ import { Commit } from 'types/Commit' -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' export interface GraphRowProps { id: number diff --git a/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.module.scss b/packages/library/src/modules/Graph/strategies/Grid/components/HeadCommitVerticalLine/HeadCommitVerticalLine.module.scss similarity index 100% rename from packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.module.scss rename to packages/library/src/modules/Graph/strategies/Grid/components/HeadCommitVerticalLine/HeadCommitVerticalLine.module.scss diff --git a/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx similarity index 100% rename from packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx diff --git a/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/HeadCommitVerticalLine/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/HeadCommitVerticalLine/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/HeadCommitVerticalLine/index.ts diff --git a/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/HeadCommitVerticalLine/types.ts similarity index 100% rename from packages/library/src/modules/Graph/components/HeadCommitVerticalLine/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/HeadCommitVerticalLine/types.ts diff --git a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.module.scss b/packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/HorizontalLine.module.scss similarity index 100% rename from packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.module.scss rename to packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/HorizontalLine.module.scss diff --git a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.spec.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/HorizontalLine.spec.tsx similarity index 96% rename from packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.spec.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/HorizontalLine.spec.tsx index a3fd90d2..0b9f485c 100644 --- a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.spec.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/HorizontalLine.spec.tsx @@ -1,6 +1,6 @@ import { describe } from 'vitest' import { render } from '@testing-library/react' -import { HorizontalLine } from 'modules/Graph/components/HorizontalLine/HorizontalLine' +import { HorizontalLine } from 'modules/Graph/strategies/Grid/components/HorizontalLine/HorizontalLine' import { graphColumn } from 'test/elements/GraphColumn' import * as themeHook from 'hooks/useTheme' import { ThemeFunctions } from 'hooks/useTheme' diff --git a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/HorizontalLine.tsx similarity index 96% rename from packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/HorizontalLine.tsx index a19eb66b..451792bc 100644 --- a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/HorizontalLine.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames' import styles from './HorizontalLine.module.scss' import { CSSProperties, useMemo } from 'react' -import { HorizontalLineProps } from 'modules/Graph/components/HorizontalLine/types' +import { HorizontalLineProps } from 'modules/Graph/strategies/Grid/components/HorizontalLine/types' import { useTheme } from 'hooks/useTheme' import { useGraphContext } from 'modules/Graph/context' diff --git a/packages/library/src/modules/Graph/components/HorizontalLine/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/HorizontalLine/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/index.ts diff --git a/packages/library/src/modules/Graph/components/HorizontalLine/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/types.ts similarity index 61% rename from packages/library/src/modules/Graph/components/HorizontalLine/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/types.ts index 65b119cf..c62c4cb2 100644 --- a/packages/library/src/modules/Graph/components/HorizontalLine/types.ts +++ b/packages/library/src/modules/Graph/strategies/Grid/components/HorizontalLine/types.ts @@ -1,4 +1,4 @@ -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' export interface HorizontalLineProps { columnIndex: number diff --git a/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.module.scss b/packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoCommitNode/IndexPseudoCommitNode.module.scss similarity index 100% rename from packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.module.scss rename to packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoCommitNode/IndexPseudoCommitNode.module.scss diff --git a/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx similarity index 87% rename from packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx index c567c9b1..6e61c4ab 100644 --- a/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames' import styles from './IndexPseudoCommitNode.module.scss' import { useTheme } from 'hooks/useTheme' -import { IndexPseudoCommitNodeProps } from 'modules/Graph/components/IndexPseudoCommitNode/types' +import { IndexPseudoCommitNodeProps } from 'modules/Graph/strategies/Grid/components/IndexPseudoCommitNode/types' import { useGraphContext } from 'modules/Graph/context' export const IndexPseudoCommitNode = ({ animate, columnColour }: IndexPseudoCommitNodeProps) => { diff --git a/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoCommitNode/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/IndexPseudoCommitNode/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoCommitNode/index.ts diff --git a/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoCommitNode/types.ts similarity index 100% rename from packages/library/src/modules/Graph/components/IndexPseudoCommitNode/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoCommitNode/types.ts diff --git a/packages/library/src/modules/Graph/components/IndexPseudoRow/IndexPseudoRow.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoRow/IndexPseudoRow.tsx similarity index 80% rename from packages/library/src/modules/Graph/components/IndexPseudoRow/IndexPseudoRow.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoRow/IndexPseudoRow.tsx index b3f8bb32..e02261ad 100644 --- a/packages/library/src/modules/Graph/components/IndexPseudoRow/IndexPseudoRow.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoRow/IndexPseudoRow.tsx @@ -1,5 +1,5 @@ -import { GraphRow } from 'modules/Graph/components/GraphRow' -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphRow } from 'modules/Graph/strategies/Grid/components/GraphRow' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' import { useMemo } from 'react' import { useGitContext } from 'context/GitContext' import { useGraphContext } from 'modules/Graph/context' diff --git a/packages/library/src/modules/Graph/components/IndexPseudoRow/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoRow/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/IndexPseudoRow/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/IndexPseudoRow/index.ts diff --git a/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.module.scss b/packages/library/src/modules/Graph/strategies/Grid/components/LeftDownCurve/LeftDownCurve.module.scss similarity index 100% rename from packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.module.scss rename to packages/library/src/modules/Graph/strategies/Grid/components/LeftDownCurve/LeftDownCurve.module.scss diff --git a/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/LeftDownCurve/LeftDownCurve.tsx similarity index 94% rename from packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/LeftDownCurve/LeftDownCurve.tsx index ae051533..44806ca9 100644 --- a/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/LeftDownCurve/LeftDownCurve.tsx @@ -1,6 +1,6 @@ import styles from './LeftDownCurve.module.scss' import { CURVE_SIZE, ROW_HEIGHT } from 'constants/constants' -import { CurvedEdge } from 'modules/Graph/components/CurvedEdge' +import { CurvedEdge } from 'modules/Graph/strategies/Grid/components/CurvedEdge' import { useGitContext } from 'context/GitContext' import { LeftDownCurveProps } from './types' diff --git a/packages/library/src/modules/Graph/components/LeftDownCurve/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/LeftDownCurve/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/LeftDownCurve/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/LeftDownCurve/index.ts diff --git a/packages/library/src/modules/Graph/components/LeftDownCurve/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/LeftDownCurve/types.ts similarity index 100% rename from packages/library/src/modules/Graph/components/LeftDownCurve/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/LeftDownCurve/types.ts diff --git a/packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.module.scss b/packages/library/src/modules/Graph/strategies/Grid/components/LeftUpCurve/LeftUpCurve.module.scss similarity index 100% rename from packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.module.scss rename to packages/library/src/modules/Graph/strategies/Grid/components/LeftUpCurve/LeftUpCurve.module.scss diff --git a/packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/LeftUpCurve/LeftUpCurve.tsx similarity index 94% rename from packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/LeftUpCurve/LeftUpCurve.tsx index b74ac3c4..2fd9e853 100644 --- a/packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/LeftUpCurve/LeftUpCurve.tsx @@ -1,6 +1,6 @@ import styles from './LeftUpCurve.module.scss' import { CURVE_SIZE, ROW_HEIGHT } from 'constants/constants' -import { CurvedEdge } from 'modules/Graph/components/CurvedEdge' +import { CurvedEdge } from 'modules/Graph/strategies/Grid/components/CurvedEdge' import { useGitContext } from 'context/GitContext' import { LeftUpCurveProps } from './types' diff --git a/packages/library/src/modules/Graph/components/LeftUpCurve/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/LeftUpCurve/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/LeftUpCurve/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/LeftUpCurve/index.ts diff --git a/packages/library/src/modules/Graph/components/LeftUpCurve/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/LeftUpCurve/types.ts similarity index 100% rename from packages/library/src/modules/Graph/components/LeftUpCurve/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/LeftUpCurve/types.ts diff --git a/packages/library/src/modules/Graph/components/SkeletonGraph/SkeletonGraph.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/SkeletonGraph/SkeletonGraph.tsx similarity index 65% rename from packages/library/src/modules/Graph/components/SkeletonGraph/SkeletonGraph.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/SkeletonGraph/SkeletonGraph.tsx index 3b507d10..4a0c05c0 100644 --- a/packages/library/src/modules/Graph/components/SkeletonGraph/SkeletonGraph.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/SkeletonGraph/SkeletonGraph.tsx @@ -1,5 +1,5 @@ -import { GraphRow } from 'modules/Graph/components/GraphRow' -import { usePlaceholderData } from 'modules/Graph/hooks/usePlaceholderData' +import { GraphRow } from 'modules/Graph/strategies/Grid/components/GraphRow' +import { usePlaceholderData } from 'modules/Graph/strategies/Grid/hooks/usePlaceholderData' export const SkeletonGraph = () => { const { placeholderData } = usePlaceholderData() diff --git a/packages/library/src/modules/Graph/components/SkeletonGraph/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/SkeletonGraph/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/SkeletonGraph/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/SkeletonGraph/index.ts diff --git a/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.module.scss b/packages/library/src/modules/Graph/strategies/Grid/components/VerticalLine/VerticalLine.module.scss similarity index 100% rename from packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.module.scss rename to packages/library/src/modules/Graph/strategies/Grid/components/VerticalLine/VerticalLine.module.scss diff --git a/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.tsx b/packages/library/src/modules/Graph/strategies/Grid/components/VerticalLine/VerticalLine.tsx similarity index 97% rename from packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.tsx rename to packages/library/src/modules/Graph/strategies/Grid/components/VerticalLine/VerticalLine.tsx index 6c2a7a48..3ee36b90 100644 --- a/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.tsx +++ b/packages/library/src/modules/Graph/strategies/Grid/components/VerticalLine/VerticalLine.tsx @@ -112,7 +112,7 @@ export const VerticalLine = ({ state, columnIndex, columnColour, commit, indexCo ...border } } - }, [commit.hash, commit.parents.length, commit.isBranchTip, headCommit?.hash, state.isNode, state.isColumnBelowEmpty, state.isColumnAboveEmpty, isServerSidePaginated, headCommitHash, columnIndex, border, indexCommitNodeBorder]) + }, [commit.hash, commit.parents.length, commit.isBranchTip, headCommit?.hash, state.isNode, state.isColumnBelowEmpty, state.isColumnAboveEmpty, isIndexVisible, isServerSidePaginated, headCommitHash, columnIndex, border, indexCommitNodeBorder]) return ( diff --git a/packages/library/src/modules/Graph/components/VerticalLine/index.ts b/packages/library/src/modules/Graph/strategies/Grid/components/VerticalLine/index.ts similarity index 100% rename from packages/library/src/modules/Graph/components/VerticalLine/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/VerticalLine/index.ts diff --git a/packages/library/src/modules/Graph/components/VerticalLine/types.ts b/packages/library/src/modules/Graph/strategies/Grid/components/VerticalLine/types.ts similarity index 71% rename from packages/library/src/modules/Graph/components/VerticalLine/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/components/VerticalLine/types.ts index c77f94f2..b51a6621 100644 --- a/packages/library/src/modules/Graph/components/VerticalLine/types.ts +++ b/packages/library/src/modules/Graph/strategies/Grid/components/VerticalLine/types.ts @@ -1,4 +1,4 @@ -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' import { Commit } from 'types/Commit' export interface VerticalLineProps { diff --git a/packages/library/src/modules/Graph/hooks/useColumnData/index.ts b/packages/library/src/modules/Graph/strategies/Grid/hooks/useColumnData/index.ts similarity index 100% rename from packages/library/src/modules/Graph/hooks/useColumnData/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/hooks/useColumnData/index.ts diff --git a/packages/library/src/modules/Graph/strategies/Grid/hooks/useColumnData/types.ts b/packages/library/src/modules/Graph/strategies/Grid/hooks/useColumnData/types.ts new file mode 100644 index 00000000..9e167c5a --- /dev/null +++ b/packages/library/src/modules/Graph/strategies/Grid/hooks/useColumnData/types.ts @@ -0,0 +1,13 @@ +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' + +export interface GraphColumnDataProps { + visibleCommits: number +} + +export type RowIndexToColumnStates = Map + +export interface GraphColumnData { + columnData: RowIndexToColumnStates + virtualColumns: number + getEmptyColumnState: () => GraphColumnState[] +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/hooks/useColumnData/useColumnData.ts b/packages/library/src/modules/Graph/strategies/Grid/hooks/useColumnData/useColumnData.ts similarity index 97% rename from packages/library/src/modules/Graph/hooks/useColumnData/useColumnData.ts rename to packages/library/src/modules/Graph/strategies/Grid/hooks/useColumnData/useColumnData.ts index 16a405ca..63d170ca 100644 --- a/packages/library/src/modules/Graph/hooks/useColumnData/useColumnData.ts +++ b/packages/library/src/modules/Graph/strategies/Grid/hooks/useColumnData/useColumnData.ts @@ -1,9 +1,9 @@ import { useCallback, useMemo } from 'react' -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' import { useGitContext } from 'context/GitContext' import { GraphColumnData, GraphColumnDataProps } from './types' -import { isColumnEmpty } from 'modules/Graph/utility/isColumnEmpty' -import { getEmptyColumnState as createEmptyColumn } from 'modules/Graph/utility/getEmptyColumnState' +import { isColumnEmpty } from 'modules/Graph/strategies/Grid/utility/isColumnEmpty' +import { getEmptyColumnState as createEmptyColumn } from 'modules/Graph/strategies/Grid/utility/getEmptyColumnState' export const useColumnData = ({ visibleCommits }: GraphColumnDataProps): GraphColumnData => { const { @@ -331,7 +331,7 @@ export const useColumnData = ({ visibleCommits }: GraphColumnDataProps): GraphCo rowToColumnState, virtualColumns } - }, [positions, edges, commits, headCommit, isServerSidePaginated, paging, getEmptyColumnState, visibleCommits, graphWidth, headCommitHash]) + }, [positions, edges, commits, headCommit, isIndexVisible, isServerSidePaginated, paging, getEmptyColumnState, visibleCommits, graphWidth, headCommitHash]) return { getEmptyColumnState, diff --git a/packages/library/src/modules/Graph/hooks/usePlaceholderData/data.ts b/packages/library/src/modules/Graph/strategies/Grid/hooks/usePlaceholderData/data.ts similarity index 98% rename from packages/library/src/modules/Graph/hooks/usePlaceholderData/data.ts rename to packages/library/src/modules/Graph/strategies/Grid/hooks/usePlaceholderData/data.ts index 5cca4f9b..e7385de8 100644 --- a/packages/library/src/modules/Graph/hooks/usePlaceholderData/data.ts +++ b/packages/library/src/modules/Graph/strategies/Grid/hooks/usePlaceholderData/data.ts @@ -1,5 +1,5 @@ import { Commit } from 'types/Commit' -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' export const placeholderCommits: Commit[] = [ { diff --git a/packages/library/src/modules/Graph/hooks/usePlaceholderData/index.ts b/packages/library/src/modules/Graph/strategies/Grid/hooks/usePlaceholderData/index.ts similarity index 100% rename from packages/library/src/modules/Graph/hooks/usePlaceholderData/index.ts rename to packages/library/src/modules/Graph/strategies/Grid/hooks/usePlaceholderData/index.ts diff --git a/packages/library/src/modules/Graph/hooks/usePlaceholderData/types.ts b/packages/library/src/modules/Graph/strategies/Grid/hooks/usePlaceholderData/types.ts similarity index 69% rename from packages/library/src/modules/Graph/hooks/usePlaceholderData/types.ts rename to packages/library/src/modules/Graph/strategies/Grid/hooks/usePlaceholderData/types.ts index 687b4bac..204f84e6 100644 --- a/packages/library/src/modules/Graph/hooks/usePlaceholderData/types.ts +++ b/packages/library/src/modules/Graph/strategies/Grid/hooks/usePlaceholderData/types.ts @@ -1,5 +1,5 @@ import { Commit } from 'types/Commit' -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' export interface PlaceholderDatum { commit: Commit diff --git a/packages/library/src/modules/Graph/hooks/usePlaceholderData/usePlaceholderData.ts b/packages/library/src/modules/Graph/strategies/Grid/hooks/usePlaceholderData/usePlaceholderData.ts similarity index 100% rename from packages/library/src/modules/Graph/hooks/usePlaceholderData/usePlaceholderData.ts rename to packages/library/src/modules/Graph/strategies/Grid/hooks/usePlaceholderData/usePlaceholderData.ts diff --git a/packages/library/src/modules/Graph/strategies/Grid/index.ts b/packages/library/src/modules/Graph/strategies/Grid/index.ts new file mode 100644 index 00000000..be969973 --- /dev/null +++ b/packages/library/src/modules/Graph/strategies/Grid/index.ts @@ -0,0 +1 @@ +export * from './HTMLGridGraph' \ No newline at end of file diff --git a/packages/library/src/modules/Graph/utility/getEmptyColumnState.ts b/packages/library/src/modules/Graph/strategies/Grid/utility/getEmptyColumnState.ts similarity index 60% rename from packages/library/src/modules/Graph/utility/getEmptyColumnState.ts rename to packages/library/src/modules/Graph/strategies/Grid/utility/getEmptyColumnState.ts index 91478633..c43dbf2d 100644 --- a/packages/library/src/modules/Graph/utility/getEmptyColumnState.ts +++ b/packages/library/src/modules/Graph/strategies/Grid/utility/getEmptyColumnState.ts @@ -1,4 +1,4 @@ -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' export const getEmptyColumnState = ({ columns }: { columns: number }) => { return new Array(columns).fill({}) diff --git a/packages/library/src/modules/Graph/utility/isColumnEmpty.spec.ts b/packages/library/src/modules/Graph/strategies/Grid/utility/isColumnEmpty.spec.ts similarity index 95% rename from packages/library/src/modules/Graph/utility/isColumnEmpty.spec.ts rename to packages/library/src/modules/Graph/strategies/Grid/utility/isColumnEmpty.spec.ts index 0d7d008b..32854a26 100644 --- a/packages/library/src/modules/Graph/utility/isColumnEmpty.spec.ts +++ b/packages/library/src/modules/Graph/strategies/Grid/utility/isColumnEmpty.spec.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest' import { isColumnEmpty } from './isColumnEmpty' -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' describe('isColumnEmpty', () => { it('returns true when all non-ignored values are falsy', () => { diff --git a/packages/library/src/modules/Graph/utility/isColumnEmpty.ts b/packages/library/src/modules/Graph/strategies/Grid/utility/isColumnEmpty.ts similarity index 79% rename from packages/library/src/modules/Graph/utility/isColumnEmpty.ts rename to packages/library/src/modules/Graph/strategies/Grid/utility/isColumnEmpty.ts index 349822e9..30787800 100644 --- a/packages/library/src/modules/Graph/utility/isColumnEmpty.ts +++ b/packages/library/src/modules/Graph/strategies/Grid/utility/isColumnEmpty.ts @@ -1,4 +1,4 @@ -import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { GraphColumnState } from 'modules/Graph/strategies/Grid/components/GraphColumn' const keysToIgnore: (keyof GraphColumnState)[] = [ 'isFirstRow', diff --git a/packages/library/src/modules/Graph/types.ts b/packages/library/src/modules/Graph/types.ts index a48f4ab1..26b73cb4 100644 --- a/packages/library/src/modules/Graph/types.ts +++ b/packages/library/src/modules/Graph/types.ts @@ -1,8 +1,10 @@ -import { NodeTheme } from '../../hooks/useTheme' +import { NodeTheme } from 'hooks/useTheme' export type GraphOrientation = 'normal' | 'flipped' -export interface GraphProps { +export type Canvas2DGraphProps = GraphPropsCommon + +export interface HTMLGridGraphProps extends GraphPropsCommon { /** * Whether to show the commit hash * to the side of the node in the graph. @@ -14,7 +16,9 @@ export interface GraphProps { * over a commit node in the graph. */ showCommitNodeTooltips?: boolean +} +interface GraphPropsCommon { /** * The theme to apply the commit node * elements in the graph. diff --git a/packages/library/src/modules/Graph/utils/getColumnBackgroundSize.spec.ts b/packages/library/src/modules/Graph/utils/getColumnBackgroundSize.spec.ts new file mode 100644 index 00000000..b38bb141 --- /dev/null +++ b/packages/library/src/modules/Graph/utils/getColumnBackgroundSize.spec.ts @@ -0,0 +1,18 @@ +import { getColumnBackgroundSize } from './getColumnBackgroundSize' + +describe('getColumnBackgroundSize', () => { + it('should return the correct column background size if the nodeSize is less than 16', () => { + const columnBackgroundSize = getColumnBackgroundSize({ nodeSize: 15 }) + expect(columnBackgroundSize).toBe(12) + }) + + it('should return the correct column background size if the nodeSize is 16', () => { + const columnBackgroundSize = getColumnBackgroundSize({ nodeSize: 16 }) + expect(columnBackgroundSize).toBe(12) + }) + + it('should return the correct column background size if the nodeSize is greater than 16', () => { + const columnBackgroundSize = getColumnBackgroundSize({ nodeSize: 17 }) + expect(columnBackgroundSize).toBe(16) + }) +}) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/utils/getColumnBackgroundSize.ts b/packages/library/src/modules/Graph/utils/getColumnBackgroundSize.ts new file mode 100644 index 00000000..1d6f8f5a --- /dev/null +++ b/packages/library/src/modules/Graph/utils/getColumnBackgroundSize.ts @@ -0,0 +1,7 @@ +export interface GetColumnBackgroundSizeProps { + nodeSize: number +} + +export const getColumnBackgroundSize = ({ nodeSize }: GetColumnBackgroundSizeProps) => { + return (nodeSize <= 16 ? 6 : 8) * 2 +} diff --git a/packages/library/src/modules/Graph/utils/getMergeNodeInnerSize.spec.ts b/packages/library/src/modules/Graph/utils/getMergeNodeInnerSize.spec.ts new file mode 100644 index 00000000..bae0afd0 --- /dev/null +++ b/packages/library/src/modules/Graph/utils/getMergeNodeInnerSize.spec.ts @@ -0,0 +1,18 @@ +import { getMergeNodeInnerSize } from 'modules/Graph/utils/getMergeNodeInnerSize' + +describe('getMergeNodeInnerSize', () => { + it('should return the correct diameter for a nodeSize greater than 10', () => { + const diameter = getMergeNodeInnerSize({ nodeSize: 11 }) + expect(diameter).to.equal(5) + }) + + it('should return the correct diameter for a nodeSize less than 10', () => { + const diameter = getMergeNodeInnerSize({ nodeSize: 9 }) + expect(diameter).to.equal(7) + }) + + it('should return the correct diameter for a nodeSize equal to 10', () => { + const diameter = getMergeNodeInnerSize({ nodeSize: 10 }) + expect(diameter).to.equal(8) + }) +}) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/utils/getMergeNodeInnerSize.ts b/packages/library/src/modules/Graph/utils/getMergeNodeInnerSize.ts new file mode 100644 index 00000000..c35f3c7c --- /dev/null +++ b/packages/library/src/modules/Graph/utils/getMergeNodeInnerSize.ts @@ -0,0 +1,7 @@ +export interface GetMergeNodeInnerSizeProps { + nodeSize: number +} + +export const getMergeNodeInnerSize = ({ nodeSize }: GetMergeNodeInnerSizeProps) => { + return nodeSize > 10 ? nodeSize - 6 : nodeSize - 2 +} \ No newline at end of file diff --git a/packages/library/src/modules/Table/Table.tsx b/packages/library/src/modules/Table/Table.tsx index 3ffb0ee3..7336209a 100644 --- a/packages/library/src/modules/Table/Table.tsx +++ b/packages/library/src/modules/Table/Table.tsx @@ -6,7 +6,7 @@ import { useTheme } from 'hooks/useTheme' import advancedFormat from 'dayjs/plugin/advancedFormat' import relativeTime from 'dayjs/plugin/relativeTime' import { useGitContext } from 'context/GitContext' -import { usePlaceholderData } from 'modules/Graph/hooks/usePlaceholderData' +import { usePlaceholderData } from 'modules/Graph/strategies/Grid/hooks/usePlaceholderData' import { TableRow } from 'modules/Table/components/TableRow' import { TableContainer } from 'modules/Table/components/TableContainer' import { TableProps } from './types' diff --git a/packages/library/src/modules/Table/components/TableContainer/TableContainer.tsx b/packages/library/src/modules/Table/components/TableContainer/TableContainer.tsx index 98c1cab0..77e0a1e1 100644 --- a/packages/library/src/modules/Table/components/TableContainer/TableContainer.tsx +++ b/packages/library/src/modules/Table/components/TableContainer/TableContainer.tsx @@ -2,7 +2,7 @@ import classNames from 'classnames' import styles from './TableContainer.module.scss' import { PropsWithChildren, useMemo } from 'react' import { useGitContext } from 'context/GitContext' -import { placeholderCommits } from 'modules/Graph/hooks/usePlaceholderData/data' +import { placeholderCommits } from 'modules/Graph/strategies/Grid/hooks/usePlaceholderData/data' import { ROW_HEIGHT } from 'constants/constants' import { HEADER_ROW_HEIGHT, TABLE_MARGIN_TOP } from 'modules/Table/constants' import { TableContainerProps } from 'modules/Table/components/TableContainer/types' diff --git a/packages/library/src/modules/Table/components/TableRow/TableRow.tsx b/packages/library/src/modules/Table/components/TableRow/TableRow.tsx index 255738fc..43c65854 100644 --- a/packages/library/src/modules/Table/components/TableRow/TableRow.tsx +++ b/packages/library/src/modules/Table/components/TableRow/TableRow.tsx @@ -38,7 +38,7 @@ export const TableRow = ({ return hoverColour } - return reduceOpacity(colour, 0.15) + return reduceOpacity(colour, 0.15) } if (previewedCommit?.hash === commit.hash) { diff --git a/packages/library/tsconfig.build.json b/packages/library/tsconfig.build.json index 7d0ed6a2..cc1dc5a1 100644 --- a/packages/library/tsconfig.build.json +++ b/packages/library/tsconfig.build.json @@ -8,7 +8,8 @@ "src/modules/Graph/index.ts", "src/modules/Graph/types.ts", - "src/modules/Graph/Graph.tsx", + "src/modules/Graph/GraphCanvas2D.tsx", + "src/modules/Graph/GraphHTMLGrid.tsx", "src/modules/Table/index.ts", "src/modules/Table/types.ts",